StratOps

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.

00Contents
  1. What StratOps isThe idea, and how it differs from a database with a chat box on it.
  2. Connecting it in ClaudeSettings, Connectors, the /mcp URL, signing in.
  3. The 44 toolsGrouped by what you'd actually be trying to do.
  4. ModulesWhat each one owns, its default, and how to switch it off.
  5. The dashboardWhat's at /app, page by page.
  6. How editing worksApproval in conversation, the closed form registry on the dashboard, and undo.
  7. The audit logWhat it records, what it deliberately never records, and what it doesn't cover yet.
  8. Where it stopsThe plain list, not the pitch.
01Orientation

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.

02Setup

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.

  1. Open Settings.In Claude, go to Settings, then Connectors.
  2. Add a custom connector.Choose "Add custom connector" and give it a URL ending in /mcp — the live one is https://stratops.stratops.workers.dev/mcp.
  3. 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.
  4. 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.

03The tool surface

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.

ToolWhat it answers
list_workspacesWhich workspaces exist in this account, and which is the default.
get_workspace_setupHow one workspace is wired up: metrics, integrations, alerts, standing instructions. The right first call when everything else comes back empty.
search_recordsKeyword search across every kind of record in a workspace.
get_today_briefingWhat to work on now — overdue, due today, in flight, stalled, and the load curve ahead.
get_weekly_reviewWhat happened over a period that already finished — shipped, completed, stalled, hours, decisions, deals moved.
get_open_loopsThe 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_statusHealth, momentum, north-star progress and workstreams — for one initiative, or every one side by side.
list_solutionsWorkstreams under one initiative, or every workstream in the workspace, each with its own task counts.
get_dossierEverything on record about one person, company or deal.
get_decision_logPast decisions — the context, the option taken, the reasoning, the outcome.
get_pipelineDeals by stage, with raw and probability-weighted totals.
get_inboxNotes, ideas and signals not yet sorted, plus fired alerts and decisions due for review.
list_tasksOne filtered slice of tasks — a status, a tag, a workstream, overdue only.
list_ideasEvery idea regardless of status, including ones already triaged and dropped from the inbox.
list_signalsEvery signal regardless of status, for the same reason.
list_documentsDocument metadata — name, type, size, sensitivity. Not the file contents; those aren't stored here.
list_feedbackFeedback recorded about StratOps itself, not about your business.
get_audit_logWhat changed in the record and when. See the section below for exactly what this does and doesn't cover.
get_calibrationHow 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.

ToolWhat it doesType
log_meetingA 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_inboxA raw note or an idea, kept as it was said, sorted later.Write
log_timeTime 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_taskA task, optionally under a workstream, optionally attributed to the decision, idea, signal or meeting it came from.Write, can overwrite
record_decisionA decision with its context, the option taken, and the reasoning. Outcome starts unrecorded.Write
record_shippedA changelog entry for something that shipped, completed, released or won.Write
record_metric_valueA new number for a metric. Previous values are kept, not overwritten, so trend stays derivable.Write
submit_feedbackFeedback 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.

ToolWhat it doesType
set_task_statusMoves a task between not_started, in_progress, blocked, backlog and completed, with an optional reason.Write, can overwrite
record_decision_outcomeHow a decision actually turned out — worked, failed, mixed.Write, can overwrite
triage_inbox_itemDispositions one note, idea or signal out of the inbox; can link it to whatever it became.Write, can overwrite
save_contactCreates a person or company, or updates the one that matches by name.Write, can overwrite
update_dealCreates a deal, or moves an existing one to a new stage, value or probability.Write, can overwrite
save_knowledgeCreates or revises a titled SOP, how-to, reference or policy entry.Write, can overwrite
retract_captureUndoes 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.

ToolWhat it doesType
batch_triage_inboxOne disposition, or a short list of different ones, applied to a set of inbox items in one call.Write, can overwrite
batch_record_decision_outcomesCloses 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_candidatesReports which old, unreferenced notes and ideas would lapse, and why. Changes nothing.Free
lapse_recordsLapses 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.

ToolWhat it doesType
set_agent_instructionA standing preference for how a recurring situation should be handled — "always log client calls against Franchise Ramp."Write, can overwrite
set_alertA 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_modulesSwitches one or more modules on or off for the account. Lives in the core module so it can never disable itself.Write
link_recordsA typed connection between any two records, using an open vocabulary — "introduced_by," "blocks," "produced."Write
setup_workspaceA 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_initiativeAn initiative, its workstreams and its north-star metric, created or revised together in one call.Write, can overwrite
04Configuration

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.

ModuleDefaultOwnsDashboard pages
coreAlways onWorkspaces, tasks, initiatives, workstreams, search, the two standing briefings, the module switch itselfToday, Initiatives, Solutions, Tasks, Settings
inboxOnCapture-to-inbox, triage, undo, batch triage, lapsingInbox
salesOnContacts, deals, pipeline, dossiersDeals, Contacts
knowledgeOnKnowledge entries (SOPs, how-tos, references)Knowledge
decisionsOnRecording decisions, their outcomes, batch closingDecisions
meetingsOnlog_meetingMeetings
timeOfflog_timeNone yet — no read over time entries exists, so there's nothing for a page to show
metricsOnrecord_metric_valueNone yet, same reason
changelogOnrecord_shippedChangelog
alertsOnset_alertNone yet, same reason
agent_instructionsOnset_agent_instructionNone yet, same reason
ideasOnlist_ideasIdeas
signalsOnlist_signalsSignals
documentsOfflist_documentsDocuments — off by default because two rows in production isn't a feature yet, and there's no upload path to fill it
feedbackOnsubmit_feedback, list_feedbackNone yet — the widget in the dashboard shell covers it
loopsOnget_open_loops, get_calibrationLoops, Calibration
auditOn in the codeget_audit_logAudit — 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.

05Looking, not talking

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:

GroupPageShows
OverviewToday (/app)The open-loops question and today's briefing, rolled up across every workspace.
InboxUnsorted notes, ideas and signals, with a form to triage one at a time.
LoopsThe full ranked list get_open_loops returns.
CalibrationDecision accuracy, once there's a large enough closed sample to report one.
StrategyInitiativesHealth and momentum per initiative, with the breakdown behind each score.
SolutionsEvery workstream in the workspace and its task counts.
TasksA filtered task list with status counts, and a form to move a task's status.
SalesDealsPipeline by stage, with a form to move a deal.
ContactsThe contact list, drawn from dossier data.
KnowledgeKnowledgeSaved SOPs, how-tos and reference entries.
Documents off by defaultDocument metadata — name, type, size.
InsightsDecisionsThe decision log, with a form to close one's outcome.
MeetingsMeeting records.
ChangelogWhat's been recorded as shipped.
IdeasEvery idea, including ones already triaged.
SignalsEvery signal, same reason.
AccountSettingsModule toggles.
AuditThe 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.

06Changing what's recorded

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 actionCallsWhere you'll meet it
Change a task's statusset_task_statusTasks
Move a deal's stageupdate_dealDeals
Close a decision's outcomerecord_decision_outcomeDecisions
Triage an inbox itemtriage_inbox_itemInbox
Switch a module on or offset_modulesSettings
Send feedbacksubmit_feedbackThe 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.

07Accountability

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_briefing issues 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.

08The part other docs leave out

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_alert writes 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_documents and create_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 the documents module 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_capture undoes 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.

Write to Jake