REAL PRODUCT STATEDoneOS
live proofTurn a sentence into tracked execution.
Ask an agent to create a goal, add work, start it, or explain a blocker. DoneOS writes the change, reads the board back, and shows the same state in the app.
OpenAPI → reviewed tools → visible state
MCP is not a side project here. It is a capability inside DoneOS and Inner Quest—generated from each product’s real API, constrained by product judgment, and verified with read-back.
A person asks. The client chooses a tool from the reviewed MCP contract.
The evidence ladder
Discovery proves a server answered. The useful proof is the chain from a model-visible tool to persisted product state.
A 401 with correct OAuth metadata proves discovery—not authentication, tool execution, persistence, or visible product state.
Live DoneOS sandbox
This invokes the deployed generated MCP route against a short-lived, private fictional board, then opens the real DoneOS web client in a mobile frame against that exact sandbox. No credential or code path reaches DoneOS production data.
created when you runReset step: press Run again fresh. A new token starts from a clean fictional board and loads a matching DoneOS view.
MCP inside the products
The adapter is infrastructure. The point is what a person can now ask the product to understand or do.
The reusable pattern
OpenAPI removes repetitive adapter work. Product judgment still decides access, language, confirmation, and recovery.
Expose a reviewed product surface, not every route by default.
Tell the model what changes, who sees it, and what success means.
Keep scopes, schemas, confirmation, and validation in the contract.
Read important writes back through the same authenticated boundary.
Do this on your app
The generator is open source and deliberately not an npm package. Clone it, point it at your spec, commit the output. Nothing it writes depends on it afterwards — the HTTP client and dispatch loop are vendored into your app as ordinary source.
github.com/alibad/openapi-mcp ↗DoneOS had a 61-operation OpenAPI spec sitting in docs/next to a hand-written 23-tool server. Nobody had checked.
find . -iname '*openapi*' -not -path '*/node_modules/*'Writes nothing. If the surface comes back mostly reads, your API is the limit, not the generator.
git clone https://github.com/alibad/openapi-mcp
cd openapi-mcp && npm install && npm run build
node dist/cli.js inspect ../your-app/docs/openapi.yamlFour booleans in the spec, next to the API definition instead of in a parallel server that drifts. Credentials, account deletion and OAuth callbacks are never tools.
/v1/goals:
post:
operationId: createGoal
description: Create a goal. Say what it does
AND what it does not.
x-mcp-idempotent: true
delete:
x-mcp-ignore: trueA file that typechecks can still publish a surface no client accepts. One bad output schema makes the SDK reject everytool on the server.
node dist/cli.js generate --config openapi-mcp.config.json
node scripts/verify-generated-server.mjs ../your-app/mcpThe generator is the easy half. Writing the descriptions is the work — 42 of DoneOS’s operations had none, so every tool published its own operationId back at the model. The rules for that live in the skill, next to the generator.
Where the human stays
Connect a client
Connect directly to the Human Quest MCP endpoint. Each throwaway token creates an isolated fictional board for the live proof.
{
"mcpServers": {
"doneos-demo": {
"type": "http",
"url": "https://mcp.humanquest.net/api/mcp/doneos",
"headers": {
"Authorization": "Bearer pick-a-demo-string"
}
}
}
}list_goalsGET /v1/goalsreadcreate_goalPOST /v1/goalswriteget_goalGET /v1/goals/{goalId}readupdate_goalPATCH /v1/goals/{goalId}writelist_work_itemsGET /v1/work-itemsreadcreate_work_itemPOST /v1/work-itemswriteget_work_itemGET /v1/work-items/{workItemId}readupdate_work_itemPATCH /v1/work-items/{workItemId}writestart_work_itemPOST /v1/work-items/{workItemId}/executewriteclaim_work_itemPOST /v1/work-items/{workItemId}/executewritemove_work_item_to_nextPOST /v1/work-items/{workItemId}/executewritemark_work_item_waitingPOST /v1/work-items/{workItemId}/executewriteblock_work_itemPOST /v1/work-items/{workItemId}/executewritesend_work_item_to_reviewPOST /v1/work-items/{workItemId}/executewritecomplete_work_itemPOST /v1/work-items/{workItemId}/executewritereopen_work_itemPOST /v1/work-items/{workItemId}/executewritemove_work_item_to_backlogPOST /v1/work-items/{workItemId}/executewriteheartbeat_work_itemPOST /v1/work-items/{workItemId}/heartbeatwritelist_execution_eventsGET /v1/eventsreadrecord_execution_eventPOST /v1/eventswritelist_recent_doneGET /v1/recent-donereadsummarize_status_for_slackGET /v1/status/dailyreadpublish_status_to_slackPOST /v1/integrations/slack/publishwrite