Reference
Docs.
What StratOps is, how to connect it, what its 44 tools do, how to turn parts of it off, what the dashboard shows, how editing and undo actually work, and what the audit log does and does not see. Written for the one person who runs it, not for a reviewer.
44
Tools
36
Tables
17
Modules
546
Automated checks
Something below is wrong or has gone stale — write to jake@aifrontdesk.com and say what page.
- What StratOps isThe idea, and how it differs from a database with a chat box on it.
- Connecting it in ClaudeSettings, Connectors, the /mcp URL, signing in.
- The 44 toolsGrouped by what you'd actually be trying to do.
- ModulesWhat each one owns, its default, and how to switch it off.
- The dashboardWhat's at /app, page by page.
- How editing worksApproval in conversation, the closed form registry on the dashboard, and undo.
- The audit logWhat it records, what it deliberately never records, and what it doesn't cover yet.
- Where it stopsThe plain list, not the pitch.
What StratOps is
StratOps is a system of record that you talk to instead of typing into. It runs as a single Cloudflare Worker over one D1 database and speaks MCP — there is no separate app to install. You connect it to Claude once, and from then on it is a set of tools Claude can call in the course of an ordinary conversation.
The distinction worth holding onto: this is not a database with a chat
interface bolted on. A chat interface over a database still asks you to
describe what you want in terms of rows and fields. StratOps' tools are
named for the sentence you'd actually say — log_meeting,
record_decision, update_deal — and each one writes
everything that sentence implies in a single call. Say you just got off a
call with someone, and the meeting, the contact, the task you owe them and
the deal it moved can all land in one approval.
Reads never ask permission; writes always do, once, naming what they are about to record. That split, across the 44 tools and five layers described in full below, is the entire design. There is no dashboard-only feature and no conversation-only feature except four things that need a browser by nature: connecting an external account, switching a module, issuing a credential, and uploading a file. Everything else is reachable by talking.
Connecting it in Claude
There is no install, no download, no app store listing. You add StratOps as a custom connector, the same way you'd add any MCP server.
- Open Settings.In Claude, go to Settings, then Connectors.
- Add a custom connector.Choose "Add custom connector" and give it a URL ending in
/mcp— the live one ishttps://stratops.stratops.workers.dev/mcp. - Sign in with Google.Claude opens a browser tab for the OAuth flow. Approve it, and Claude holds a token it presents on every call from then on.
- Start talking.Claude now has whatever tools your enabled modules grant — up to 44 of them. Reads run without asking; writes ask once, before anything is saved.
Who can actually do this today
The Google OAuth client behind sign-in is in Testing mode with exactly one test user on its consent screen — the one address that already runs this account. A second Google identity cannot complete sign-in until that changes. There is also no self-serve signup: a fresh account still needs an operator to create it and hand over the connector URL by hand. This is a one-person product today, not a setting that happens to default that way.
It answers before you connect anything
$ curl https://stratops.stratops.workers.dev/health
{"ok":true,"environment":"production","foreign_keys":"enforced"}
/mcp refuses any request carrying a browser Origin
header, with a 403 — Claude's own infrastructure sends none, so this stops a
page in a tab from reaching your record, including this one. It is not
authentication; the bearer token from the OAuth flow is what actually
determines which account a call resolves to.
The 44 tools, grouped by what you're trying to do
Not grouped by which file they live in — grouped by the question or the sentence that would make you reach for one. Every write tool names, in its own description inside Claude, the nearest neighbour it might be confused with, so the model (and you) can tell them apart without reading source. "Type" below is Free for a read that never prompts, Write for one that always asks once, and Write, can overwrite for a write that can revise or retire a row that already existed — the case CLAUDE.md's own rule says deserves the bigger warning.
Asking questions — 19 tools, all free
Every one of these runs without a permission prompt. That's deliberate: asking should cost nothing, so there can be a lot of them and each can be precise.
| Tool | What it answers |
|---|---|
list_workspaces | Which workspaces exist in this account, and which is the default. |
get_workspace_setup | How one workspace is wired up: metrics, integrations, alerts, standing instructions. The right first call when everything else comes back empty. |
search_records | Keyword search across every kind of record in a workspace. |
get_today_briefing | What to work on now — overdue, due today, in flight, stalled, and the load curve ahead. |
get_weekly_review | What happened over a period that already finished — shipped, completed, stalled, hours, decisions, deals moved. |
get_open_loops | The single question the record most wants answered right now, plus the ranked rest: overdue decision reviews, stale pending decisions, metrics that have never actually synced, stalled tasks. |
get_initiative_status | Health, momentum, north-star progress and workstreams — for one initiative, or every one side by side. |
list_solutions | Workstreams under one initiative, or every workstream in the workspace, each with its own task counts. |
get_dossier | Everything on record about one person, company or deal. |
get_decision_log | Past decisions — the context, the option taken, the reasoning, the outcome. |
get_pipeline | Deals by stage, with raw and probability-weighted totals. |
get_inbox | Notes, ideas and signals not yet sorted, plus fired alerts and decisions due for review. |
list_tasks | One filtered slice of tasks — a status, a tag, a workstream, overdue only. |
list_ideas | Every idea regardless of status, including ones already triaged and dropped from the inbox. |
list_signals | Every signal regardless of status, for the same reason. |
list_documents | Document metadata — name, type, size, sensitivity. Not the file contents; those aren't stored here. |
list_feedback | Feedback recorded about StratOps itself, not about your business. |
get_audit_log | What changed in the record and when. See the section below for exactly what this does and doesn't cover. |
get_calibration | How well past decisions have held up — scored only from ones with a recorded outcome, and refuses to score below five. |
Recording what happened — 8 tools, one approval each
Named for the past-tense verb in your own sentence. Each one writes everything that sentence implies in a single call.
| Tool | What it does | Type |
|---|---|---|
log_meeting | A conversation and everything it produced: attendees, decisions, tasks, ideas, notes, a deal it opened or moved — all linked back to it. | Write, can overwrite |
capture_to_inbox | A raw note or an idea, kept as it was said, sorted later. | Write |
log_time | Time against a task or initiative for a calendar day. Can also mark the task complete and log what shipped, in the same call. | Write, can overwrite |
create_task | A task, optionally under a workstream, optionally attributed to the decision, idea, signal or meeting it came from. | Write, can overwrite |
record_decision | A decision with its context, the option taken, and the reasoning. Outcome starts unrecorded. | Write |
record_shipped | A changelog entry for something that shipped, completed, released or won. | Write |
record_metric_value | A new number for a metric. Previous values are kept, not overwritten, so trend stays derivable. | Write |
submit_feedback | Feedback about StratOps itself, with an optional 1–5 rating. | Write |
Correcting the record — 7 tools
These change something that already exists, rather than adding something new. Every one writes the state-history trail throughput and stuck-work reporting are derived from.
| Tool | What it does | Type |
|---|---|---|
set_task_status | Moves a task between not_started, in_progress, blocked, backlog and completed, with an optional reason. | Write, can overwrite |
record_decision_outcome | How a decision actually turned out — worked, failed, mixed. | Write, can overwrite |
triage_inbox_item | Dispositions one note, idea or signal out of the inbox; can link it to whatever it became. | Write, can overwrite |
save_contact | Creates a person or company, or updates the one that matches by name. | Write, can overwrite |
update_deal | Creates a deal, or moves an existing one to a new stage, value or probability. | Write, can overwrite |
save_knowledge | Creates or revises a titled SOP, how-to, reference or policy entry. | Write, can overwrite |
retract_capture | Undoes the single most recent capture — and only that one. See "How editing works" below. | Write, can overwrite |
Working through a backlog — 4 tools
Capture on this account is well used — 506 tasks, 51 ideas, 190 observations, 112 decisions on record. Closing them one at a time is not: 211 of those tasks are done, but 0 observations have been triaged and 0 decisions carry an outcome. These four tools exist because a backlog that size needs a verb that acts on a set, not one more single-item tool.
| Tool | What it does | Type |
|---|---|---|
batch_triage_inbox | One disposition, or a short list of different ones, applied to a set of inbox items in one call. | Write, can overwrite |
batch_record_decision_outcomes | Closes a set of pending decisions in one call. With 112 decisions and 0 outcomes on record, this is the highest-value write on the whole surface — closing even a handful is what lets get_calibration report a number at all. | Write, can overwrite |
get_lapse_candidates | Reports which old, unreferenced notes and ideas would lapse, and why. Changes nothing. | Free |
lapse_records | Lapses exactly the named set a caller already chose — never inferred, never a background sweep. | Write, can overwrite |
Setting things up — 6 tools
Rare, and kept away from capture on purpose, so configuring how StratOps behaves never competes for selection with recording what just happened.
| Tool | What it does | Type |
|---|---|---|
set_agent_instruction | A standing preference for how a recurring situation should be handled — "always log client calls against Franchise Ramp." | Write, can overwrite |
set_alert | A condition to watch — an initiative going red, a metric under a threshold, a task stuck too long. See "Where it stops" for why these never fire on their own. | Write, can overwrite |
set_modules | Switches one or more modules on or off for the account. Lives in the core module so it can never disable itself. | Write |
link_records | A typed connection between any two records, using an open vocabulary — "introduced_by," "blocks," "produced." | Write |
setup_workspace | A new workspace from a template, seeded with its initiatives, workstreams, metrics and standing alerts — or the same defaults added to a workspace that already exists. | Write, can overwrite |
plan_initiative | An initiative, its workstreams and its north-star metric, created or revised together in one call. | Write, can overwrite |
Modules, and how to switch them off
A module is a slice of the product — a set of tools, and whatever dashboard
pages go with them — that can be turned on or off for the account. Nothing
is deleted when a module goes off: its rows sit exactly as they were,
unreachable until it comes back on. Say, in conversation, "turn off Time
tracking" or "I don't use Signals," and it's set_modules that
does it — the same tool is what you'd use to turn one back on.
core cannot be switched off. It holds the tools every other
module depends on, including the switch itself — a control panel able to
disable its own switch has no way back in short of someone editing the
database by hand.
| Module | Default | Owns | Dashboard pages |
|---|---|---|---|
core | Always on | Workspaces, tasks, initiatives, workstreams, search, the two standing briefings, the module switch itself | Today, Initiatives, Solutions, Tasks, Settings |
inbox | On | Capture-to-inbox, triage, undo, batch triage, lapsing | Inbox |
sales | On | Contacts, deals, pipeline, dossiers | Deals, Contacts |
knowledge | On | Knowledge entries (SOPs, how-tos, references) | Knowledge |
decisions | On | Recording decisions, their outcomes, batch closing | Decisions |
meetings | On | log_meeting | Meetings |
time | Off | log_time | None yet — no read over time entries exists, so there's nothing for a page to show |
metrics | On | record_metric_value | None yet, same reason |
changelog | On | record_shipped | Changelog |
alerts | On | set_alert | None yet, same reason |
agent_instructions | On | set_agent_instruction | None yet, same reason |
ideas | On | list_ideas | Ideas |
signals | On | list_signals | Signals |
documents | Off | list_documents | Documents — off by default because two rows in production isn't a feature yet, and there's no upload path to fill it |
feedback | On | submit_feedback, list_feedback | None yet — the widget in the dashboard shell covers it |
loops | On | get_open_loops, get_calibration | Loops, Calibration |
audit | On in the code | get_audit_log | Audit — see the caveat in the audit section below |
An account that has never touched set_modules gets every
default-on module — the product as it ships today, not a stripped-down
trial. time and documents are the two exceptions.
The dashboard
Talking is the primary surface, but six months of record is 8,724 rows, and
no amount of good prose makes that browsable. The dashboard at
/app is the other half: a place to sign in with the same Google
account and look at the whole record at once, plus the handful of things
that need a browser by nature — connecting an external account, switching a
module, issuing a credential, uploading a file.
Signing in sets an HMAC-signed session cookie. It is not a credential
/mcp can accept — that endpoint only takes a bearer token
resolved against the credential table, and a browser session is
never allowed to become a row there. The identity behind a session is
re-checked against the database on every page view rather than trusted from
the cookie, which is what makes revoking access possible at all: a
stateless session has no row to delete, so this is where cutting someone off
actually happens.
Pages, grouped the way the sidebar groups them:
| Group | Page | Shows |
|---|---|---|
| Overview | Today (/app) | The open-loops question and today's briefing, rolled up across every workspace. |
| Inbox | Unsorted notes, ideas and signals, with a form to triage one at a time. | |
| Loops | The full ranked list get_open_loops returns. | |
| Calibration | Decision accuracy, once there's a large enough closed sample to report one. | |
| Strategy | Initiatives | Health and momentum per initiative, with the breakdown behind each score. |
| Solutions | Every workstream in the workspace and its task counts. | |
| Tasks | A filtered task list with status counts, and a form to move a task's status. | |
| Sales | Deals | Pipeline by stage, with a form to move a deal. |
| Contacts | The contact list, drawn from dossier data. | |
| Knowledge | Knowledge | Saved SOPs, how-tos and reference entries. |
| Documents off by default | Document metadata — name, type, size. | |
| Insights | Decisions | The decision log, with a form to close one's outcome. |
| Meetings | Meeting records. | |
| Changelog | What's been recorded as shipped. | |
| Ideas | Every idea, including ones already triaged. | |
| Signals | Every signal, same reason. | |
| Account | Settings | Module toggles. |
| Audit | The audit trail — see the caveat below. |
A disabled module's page 404s outright rather than merely disappearing from the sidebar menu — a hidden link with a live route is one bookmark away from being visible again, and that is not the same thing as access being actually withdrawn.
How editing works
There are exactly two ways to change what's recorded, and they are built very differently on purpose.
In conversation
Claude picks a write tool, shows what it is about to record, and you approve
once. Every write tool validates everything it can before writing anything:
log_meeting checks every attendee, every task title and every
workstream reference before the first row lands, so a call that would fail
on its fifth task fails before the first four are written — a rejected call
costs zero rows, not a half-written meeting. When a name is ambiguous — two
contacts both plausibly "Sarah" — the tool refuses and names both
candidates rather than guessing, because a wrong guess creates a duplicate
that silently splits that person's deals and meetings across two records.
If a multi-part write partly succeeds — a database fault after the third of five tasks, say — the error names exactly what was already written and what wasn't, so nothing has to be re-entered or double-recorded to recover.
On the dashboard
The dashboard's forms do not post a tool name and its own arguments to the
Worker — that would let any page reach any of the write tools with
arguments of its choosing, which is a code-execution surface wearing a
form's clothes. Instead every form on /app names one of exactly
six predefined actions, each of which calls exactly one tool with arguments
the server itself reads out of the submission:
| Dashboard action | Calls | Where you'll meet it |
|---|---|---|
| Change a task's status | set_task_status | Tasks |
| Move a deal's stage | update_deal | Deals |
| Close a decision's outcome | record_decision_outcome | Decisions |
| Triage an inbox item | triage_inbox_item | Inbox |
| Switch a module on or off | set_modules | Settings |
| Send feedback | submit_feedback | The widget in the shell, on every page |
Every submission is checked against a CSRF token and the same re-verified session the page itself required, and no dashboard action ever deletes anything — that stays a deliberate limit while there's no general undo behind it. The other thirty-eight tools, including every destructive one that isn't in that list of six, are reachable only in conversation, where Claude states what it's about to do before it does it.
Undo
retract_capture reaches back exactly one step: the most recent
capture, named by the id that call returned, and nothing older. It deletes
only the rows that call itself created — a contact the meeting merely
matched, rather than created, is left alone even though the meeting
mentions them, because deleting anything a later call also touched is how
this tool once produced real data loss during development. Once anything
else has been recorded after it, the newer records are named and nothing is
deleted; correcting an older mistake means saying the correction, not
undoing it. A contact update has no undo at all, which is exactly why an
ambiguous name is refused rather than guessed at write time.
The audit log
get_audit_log reads an append-only, account-scoped trail of
writes — never reads, and it exists specifically to answer "what changed and
when," not "who looked at what."
What it records
Only the shape of a write: which row changed, what kind of row it was, what happened to it (created, updated, status changed), and which fields moved. It never records a field's actual value, and never a token or a secret — the same line the separate sign-in audit trail already draws for authentication events, applied here to the record itself. Every audit row is written in the exact same atomic batch as the change it describes, so the two can never disagree: an audit row written as a separate step could commit while the change it claims to describe rolled back, or the reverse, and a trail that can be wrong is worse than no trail, because it would still be trusted.
What it deliberately never records
- Reads. A single call to
get_today_briefingissues dozens of SELECTs; logging those would roughly double the write volume of the most-used tools, for a log almost nobody would ever query. - Values. Only which fields changed, never what they changed to or from.
- Anything past 180 days. Rows older than that are pruned automatically — opportunistically, on every write, since nothing in this deployment runs on a schedule that could do it any other way.
What it doesn't cover yet
Coverage is partial by design, not by accident, and today it's partial in
a specific way worth stating exactly: only five write tools currently
push a row here — create_task, set_task_status,
save_contact, record_decision and
record_decision_outcome. An empty or short result for a write
outside that set means the action genuinely isn't audited yet, not that
nothing happened.
One more thing worth being exact about, since this whole product's
argument rests on not overstating a number: the audit module
ships switched on by default in the code that runs today, but the table
get_audit_log reads from is created by a migration numbered
after the last one this page can independently confirm is applied to the
live database — the table count above, 36, does not include it. If that
migration hasn't shipped yet when you read this, calling
get_audit_log will fail outright rather than return an empty
log: unlike the module-switch check, which has to tolerate a missing
table because it runs on every single request, the audit store does not.
Ask before relying on it.
Where it stops
Facts about today, not a roadmap.
- One person per account, and it isn't a setting. No user, session, member or role table exists separately from the account row itself. A second person cannot get a credential today short of an operator running SQL by hand, and the Google consent screen behind sign-in lists exactly one test user.
-
Alerts are stored faithfully and never fire.
set_alertwrites the condition correctly, but no checker exists anywhere in this deployment, and nothing runs on a schedule — no[triggers]in the Worker config, no scheduled handler. Nothing arrives while you're not asking. -
Documents are metadata, not files.
list_documentsandcreate_task's sibling tools can record a document's name, type and size, but the file's actual bytes are never stored or searched by anything here, and there's no upload path. That's also why thedocumentsmodule ships off by default. - The dashboard can change six things. Conversation can change everything. The closed action registry in the "How editing works" section above is the entire dashboard write surface. Every other tool, including every genuinely destructive one, is reachable only by talking to Claude.
- The audit log covers five tools out of forty-four. See the section above. A write outside that set leaves no trail today, and the table itself may not exist on the live database yet.
-
Undo reaches one step back.
retract_captureundoes the single most recent capture and nothing older. There is no general undo, no version history, no trash. - No export tool. There's no button and no route that hands your data back to you in a file. What exists instead is the shape of the storage: the rows sit in a D1 database, which is plain SQL, reachable by whoever holds the Cloudflare account.