Connect your agents to Kept Workplace.
One MCP server your team’s agents write into: Claude Code, Codex, and anything else that speaks MCP. A person approves the connection and the exact access it gets. Nothing reaches done without proof, checked by Kept, not narrated by the agent.
https://mcp.enterprise.kept.do/mcp41 tools, 22 scopes
21 read tools, 20 write tools. Every call is scope-checked at dispatch, rate-limited, and written to the Ledger. There is no delete tool and no tool that sets a todo's state directly · the evidence gate below is the only door to done.
searchreadSearch documents, plans, todos, the Brief, and attention items for ChatGPT and other read clients.
fetchreadFetch one search result by stable id with complete text and a user-openable source URL.
kept_searchreadSearch the workspace and get one ranked list across documents, todos, projects, files, comments, and the roster. Runs under any read scope the token holds, and returns only the kinds that scope already reaches.
kept_brief_getreadRead the org's Sealed Brief, the standing context Kept keeps, at session start.
kept_member_listreadList the organization's Roster: every human member and every registered agent.
kept_space_listreadList the organization's spaces: durable, organizational filing that never finishes.
kept_space_createwriteCreate a space. Owner or admin only.
kept_project_listreadList the organization's projects: bounded, operational work with a state and a lead.
kept_project_getreadRead one project by id.
kept_project_createwriteCreate a project in a space. Any active member or agent may file one.
kept_project_updatewriteEdit a project's name, summary, lead, goal, plan doc, or target date.
kept_project_set_statewriteMove a project among active, paused, done, and dropped.
kept_memory_rememberwriteWrite one durable statement into organization memory, with provenance. Lands quarantined until a human promotes it.
kept_memory_recallreadRetrieve promoted, ambient-truth memory, before answering from your own recollection.
kept_memory_investigatereadEscalate into unpromoted, unconfirmed memory once recall has abstained. Ledgered and billed to the org's meter.
kept_plan_createwriteCreate a plan and file its todos in one call, so the writing and the work never drift apart.
kept_plan_getreadRead a plan: its sections, and the live state of every todo filed under each one.
kept_doc_getreadRead one exact document revision, with every block's identity and revision addressable.
kept_doc_apply_opswriteApply block-addressed edits against an exact base revision. Rebase is tried first; conflicts come back with full context.
kept_doc_blamereadSee who last changed each block, when, and under what intent, without scanning history.
kept_comment_listreadList the comments on a todo, document, project, or file, flat and threaded into roots with replies.
kept_comment_createwritePost a comment or reply. Any active member or agent may comment; unknown mentions are dropped, not refused.
kept_comment_resolvewriteResolve a comment thread: its author, an owner or admin, or the project's lead.
kept_file_listreadList files filed in a space or a project, or attached to a todo, doc, project, evidence, or comment.
kept_file_getreadMint a five-minute signed URL to read one file's bytes.
kept_file_attachwriteAttach an agent-produced artifact by URL. Kept fetches and hashes the bytes itself, on its own credentials, capped at 50 MB and 10 attaches per session.
kept_file_linkwriteAttach an already-committed file to one more todo, doc, project, evidence, or comment.
kept_inbox_listreadRead your own inbox: mentions, assignments, replies, Desk cards, invitations, and receipts, split today and earlier.
kept_inbox_readwriteMark one or more of your own inbox rows read. Act-free; reading is not ledgered.
kept_todo_listreadFind work held by this connection, or list available, overdue and blocked todos.
kept_todo_createwriteFile one todo. Kept fixes its evidence class from the work it describes; a weaker request is ignored.
kept_todo_updatewriteEdit a todo's title, body, due date, priority, labels, project, or space, or move it among backlog, ready, blocked, and dropped.
kept_todo_assignwriteAssign a todo to a person or agent on the Roster, or unassign it.
kept_todo_promote_from_taskwritePromote personal work only through the explicit, enabled promotion flow.
kept_todo_claimwriteClaim a todo on a lease before working it, so two sessions never double-work the same row.
kept_todo_heartbeatwriteRenew this connection's existing claim while the agent is working.
kept_todo_releasewritePut down a claim without finishing the work, so the todo goes back in the pool now instead of waiting out its lease.
kept_todo_complete_with_evidencewriteThe only door to done. Submit receipts; Kept fetches every ref on its own credentials and computes its own hashes.
kept_paper_getreadRead the Morning Paper: orphaned work, decisions waiting, what ran overnight. No model in its path.
kept_corpus_listreadList the organization's imported document corpus before asking a person something it already wrote down.
kept_corpus_getreadRead one imported document, whole or one block subtree deep.
The 22 scopes
brief:readThe Sealed Briefmemory:readPromoted organization memorymemory:writeNew memory writes, always quarantinedplans:readPlans and their sectionsplans:writeCreate plans and their todosdocs:readDocument revisions and block blamedocs:writeBlock-addressed document editstodos:readTodo state and liststodos:writeCreate, claim, renew, and complete todospaper:readThe Morning Papercorpus:readThe imported Markdown corpusspaces:readThe organization's spacesspaces:writeCreate spacesprojects:readThe organization's projectsprojects:writeCreate and update projectsmembers:readThe organization's Roster (members and agents)comments:readComments on todos, documents, projects, and filescomments:writePost and resolve commentsfiles:readFiles and a short-lived signed read URLfiles:writeAttach a URL as a file, or link an existing fileinbox:readYour own inbox: mentions, assignments, replies, receiptsinbox:writeMark your own inbox rows readmemory:write is deliberately left off both default bundles below: every memory write lands quarantined no matter who wrote it, so granting the scope by default would not do anything for you · it would just make the consent screen longer.
What a cold session needs to orient itself. Nothing here can change a row.
Read-only, plus the write scopes: plan, file and claim todos, and edit documents.
However your agent authenticates
The agent registers itself, then a person approves it in a browser. No pre-shared credential ever touches a config file.
- PKCE (S256), refresh-token rotation, and reuse detection on every grant.
- The consent screen names the client, its callback host, and the exact scopes requested.
- Bound to an active organization membership and its human Roster principal, never to a model-supplied identity.
- Verified end to end against Codex CLI on 2026-08-16, including DCR, PKCE, refresh rotation, and revocation.
Shaped kept_ent_<random>. Minted locally by a human operator, never by an agent, for principals that need a static credential (a scripted job, a CI runner).
- The plaintext prints exactly once, to the operator's terminal. Kept stores only its sha256.
- Every token carries a label and a scope list chosen at mint time, full, read, or a custom comma list.
- Lost it? Mint another and revoke the old one. That is the rotation path working, not a recovery gap.
- Adding a new scope later does not widen an existing token. It reads the scopes it was minted with until reminted.
Minting a PAT is an operator action, run locally, never by an agent:
pnpm --filter kept-enterprise-mcp mint -- \
--org <org-uuid> --principal <principal-uuid> \
--label "claude-code laptop" --scopes full --days 90Exact commands, by client
The server is https://mcp.enterprise.kept.do/mcp for all of them.
Fast path: paste one sentence to your agent, then approve its bounded read grant in the browser.
Fetch https://kept.do/workplace/agent-setup/prompt.md and follow its instructions to connect Kept Workplace to this agent over MCP.Open the one-paste setup page for a human-readable copy of the same instructions.
Claude (claude.ai and Desktop)
Settings → Connectors → Add custom connector. Paste the server URL, leave the OAuth Client ID and Client Secret fields empty, then Add and Connect.
https://mcp.enterprise.kept.do/mcpThe empty credential fields are correct, not an omission. Kept registers Claude automatically and accepts public clients only, so a pasted secret is refused. One connector covers claude.ai, Claude Desktop, and mobile.
Claude opens Kept’s sign-in page. Sign in with a Workplace account holding an active seat, pick the organization if you hold seats in more than one, then read the consent screen: it names the client, the hostname its callback returns to, the organization, and every scope in plain words, and it carries the disclosure “Kept supplies standing context (the Imperative Brief) to this agent.” with a link to read the current Brief before you approve.
A Claude connector is read-only unless you widen it. Kept asks for the read-only bundle and nothing else. Writing, filing, and claiming work require the organization to grant the write scopes deliberately.
On Team or Enterprise, an Owner can add it once for everyone at https://claude.ai/admin-settings/connectors(Add → Custom → type Web, same URL); members then connect from their own https://claude.ai/customize/connectors.
Verified: discovery and OAuth shape.Every document Claude looks for answers, the unauthenticated refusal carries the exact challenge Anthropic documents, Claude’s callback registers, and the full sign-in, consent, token, and refresh flow completes against this server. Not yet verified: a real connection made from inside claude.ai.
Claude Code
claude mcp add --transport http kept-workplace https://mcp.enterprise.kept.do/mcpThen, inside the session, sign in:
/mcpA browser opens for OAuth. Approve the scopes shown, then Claude Code can call Kept Workplace tools for the rest of the session.
Codex
codex mcp add --url https://mcp.enterprise.kept.do/mcp kept_workplaceRead-only login, enough for a session to orient:
codex mcp login --scopes brief:read,plans:read,docs:read,todos:read,paper:read,spaces:read,projects:read,members:read,comments:read,files:read,inbox:read,offline_access kept_workplaceOr, for an agent that also files and claims work:
codex mcp login --scopes brief:read,plans:read,docs:read,todos:read,paper:read,spaces:read,projects:read,members:read,comments:read,files:read,inbox:read,memory:read,memory:write,plans:write,docs:write,todos:write,corpus:read,spaces:write,projects:write,comments:write,files:write,inbox:write,offline_access kept_workplaceVerified end to end against Codex CLI 0.147.0-alpha.6.5 on 2026-08-16: dynamic registration, the consent page, and a bounded read-only tool call all completed.
Cursor
In .cursor/mcp.json (or global ~/.cursor/mcp.json), add under "mcpServers":
"kept-workplace": { "url": "https://mcp.enterprise.kept.do/mcp" }Not yet verified against Kept Workplace. This is the standard MCP config shape; Kept has not run an end-to-end connection test with Cursor against this server.
ChatGPT
Documented, not yet verified end to end.In ChatGPT, open Settings → Apps → Advanced settings, enable Developer mode, then create an app with the server URL below. Kept supports OAuth dynamic client registration and PKCE S256. It registers ChatGPT as a public client with token_endpoint_auth_method: none and accepts the callback below.
https://mcp.enterprise.kept.do/mcpChatGPT OAuth callback:
https://chatgpt.com/connector_platform_oauth_redirectThe connector discovers two read tools: search returns stable ids, titles, snippets, and source URLs. fetch accepts one returned id and returns complete text with the same source URL. Optional Apps SDK metadata is not required for this read connector.
Nothing reaches done without proof
kept_todo_complete_with_evidence is the only door to done. Kept fetches every reference on its own credentials and computes its own hashes. Narrative is stored as activity, but it is never evidence, and it never closes a box.
A submission that does not hold up bounces back to the agent rather than closing. Every rejected item carries the same four fields, so a bounce is something an agent can repair, not a dead end:
admissibletrue or false. The one bit that decides whether the todo closes.ruleWhich admissibility rule made the call, by name.reasonWhy this specific submission failed that rule.repairWhat the agent can actually do about it. Never "try again."The lease stays open when a submission bounces, so the same agent can read the repair and try again with a better receipt · it is not locked out by its own failed attempt.
The consent screen shows this line, word for word, before anyone approves a connection:
“Kept supplies standing context (the Imperative Brief) to this agent.”
It links to a fenced preview of the current Brief, so the person approving can read exactly what the agent is about to receive before they click approve.
- SSO
- Scope-level step-up after connecting (a client asks once, for everything it wants)
- claude.ai custom connectors, ChatGPT, and Cursor connected end to end by a person. The server meets every published requirement for all three, and for claude.ai the discovery documents, the refusal challenge, dynamic registration, consent, and token refresh are all proven against this server. Only Claude Code and Codex have actually been driven against it by this fleet.
Questions before you connect an agent? jessie@kept.do.