The DidWork MCP server

An agent that reports on its own work has one source: its own execution. The MCP server gives it a second one. It forms a claim — this refund settled, this PR merged, this endpoint is up — and DidWork answers from the system that can actually prove it.

Published as @didwork/mcp and listed in the MCP registry as sh.didwork/didwork.

Install

npx -y @didwork/mcp

Stdio transport, no arguments. Every host below is a way of getting that command run with an API key in its environment.

The tools

ToolWhat it does
did_verifySend a claim, get a verdict with evidence
did_getFetch a verification by id — how you poll an unknown
did_listRecent verifications for this key
did_watchRe-verify a claim on an interval; hear when the verdict changes
did_watchesList running watches
did_unwatchStop one
did_usageVerifications performed, by month
did_inspect_toolCapability Trust: what a project's own agent tools can affect

Keys

The server looks for a key in three places, in order:

  1. DIDWORK_API_KEY in the environment
  2. the file named by DIDWORK_API_KEY_FILE
  3. ~/.didwork/api_key

The key file matters more than it sounds. An app launched from the Dock or Start menu never sees the environment variables your shell exports, so a key set in .zshrc is invisible to a desktop agent. The file works everywhere:

mkdir -p ~/.didwork
printf '%s\n' 'dk_your_key' > ~/.didwork/api_key
chmod 600 ~/.didwork/api_key

With no key at all the server still runs, and only http.ok claims verify — keyless, rate limited, and never stored.

Host configuration

For Cursor or Claude Code, one command writes the config and the rule for you, merging into whatever is already there:

npx @didwork/inspect init

The rest of this section is what it writes, for doing it by hand.

Claude Code

claude mcp add didwork -e DIDWORK_API_KEY=dk_your_key -- npx -y @didwork/mcp

Or install the plugin, which adds the rule and a Stop gate on top of the tools.

Cursor.cursor/mcp.json, or the one-click link shown next to a new key in the console:

{
  "mcpServers": {
    "didwork": {
      "command": "npx",
      "args": ["-y", "@didwork/mcp"],
      "env": { "DIDWORK_API_KEY": "dk_your_key" }
    }
  }
}

Claude Desktop — the same object, in claude_desktop_config.json.

Anything else — any MCP host that can run a stdio server: command npx, args ["-y", "@didwork/mcp"].

The rule that matters

Tools alone change nothing; an agent with a verifier it never reaches for still grades its own work. Whatever the host calls its instructions file, this is the part that does the work:

Before reporting a task complete, verify each outcome you claim
with did_verify. Report done only on VERIFIED. Surface FAILED and
UNKNOWN instead of retrying silently.

The third sentence is the one that gets dropped and shouldn't be. UNKNOWN means the evidence could not be reached — which is not the same as the outcome being false, and nothing like it being true.

Claim types

Nearly forty types across Stripe, GitHub, GitLab, Linear, Jira, Sentry, Slack, email and any public URL. Provider-backed claims need that provider connected with read-only credentials at didwork.sh/console/providers; http.ok needs nothing. The full table with each type's exact semantics is in the docs.

Capability Trust

did_inspect_tool answers the question that comes before the work: what can this agent tool actually affect? It reads the MCP tool handlers in a TypeScript project and reports each tool's evidenced capabilities with file:line evidence, a risk level, a separate confidence level, and a DECLARATION_MISMATCH when the implementation exceeds what the tool declares.

Analysis is local and reads source only; nothing is uploaded and no key is needed. It is provided by @didwork/inspect, an optional peer — it carries the TypeScript compiler, so plain npx -y @didwork/mcp stays small. To enable it:

npx -y -p @didwork/mcp -p @didwork/inspect didwork-mcp

Needs @didwork/mcp 0.0.11 or later. Earlier versions declare the peer as ^0.0.1, which npm reads as >=0.0.1 <0.0.2 — so pairing them with a current @didwork/inspect fails outright with ERESOLVE rather than degrading. If you see that, upgrade the server.

Until then the tool answers in-band with that instruction rather than inferring anything. unknown means "not shown to be safe", never "low risk".

Troubleshooting

The tools do not appear. MCP servers load at host startup — restart it. Then check the host's MCP log for a spawn error; the usual cause is npx not being on the PATH that a GUI-launched app sees.

Every provider claim is unknown but http.ok works. That is the keyless signature: the server is running without a key. Use the key file above — especially for desktop apps, which never see your shell environment.

did_inspect_tool says it is not installed. Run the server with the -p @didwork/inspect form above.

Next

Host-specific guides: Claude Code, Cursor. To gate merges on the same verdicts, DidWork for GitHub Actions.

DidWork: verification infrastructure for software outcomes