C:\src\… vs /home/…). The remote and first commit match, so it is the same space automatically, with the memory already there.Q-35 · adopted in the build plan (M-106) · built in stages 1l–1t Research done · recommendation ready Extended to all AI tools 2026-10-05 Automatic saving + two-way sync 2026-10-08 Risk list 2026-10-08
Raised and analysed 2026-10-04; web research by four research agents the same day. Extended 2026-10-05 (all AI tools) and 2026-10-08 (automatic saving and two-way sync). When this was written nothing was built; it has since been built as stages 1l–1t (M-109, M-111), and the build plan records where the build differs.
Update 2026-10-05: the same design now covers every AI tool, not only Claude: OpenAI Codex and ChatGPT, Gemini, GitHub Copilot, Cursor, Groq, local apps and more. The Claude plugin becomes one adapter of a small cmcp helper. See Every AI tool.
Update 2026-10-08: a third part answers two more questions. How does memory reach cMCP without anyone remembering to save it? How does any agent or bot tell cMCP who, where and in which conversation it is, so it gets the latest memory back? See Automatic saving and two-way sync. In short: identity from the sign-in, a small envelope for place and conversation, a cursor for "what changed", and saving at checkpoints by hooks and bot libraries, private first.
/cmcp command. It is one install line on Windows, Linux and macOS, and the company can push it to everyone through managed settings.place=./cmcp import reads the Claude memory already on that machine, removes secrets before upload and files everything privately for review.claude mcp login cmcp --no-browser.Four more research agents looked at about 40 AI tools from OpenAI, Google, Microsoft / GitHub, JetBrains and Groq, IDE coding agents, chat apps, local model apps and automation tools. The Claude design holds, but the client part becomes a small cmcp helper shared by every tool:
cmcp setup: one command that finds the AI tools installed on the machine (Claude Code, Codex, Gemini CLI, Cursor, VS Code / Copilot, Kiro, Cline, Windsurf, Zed, OpenCode …) and writes each one's cMCP settings. One sign-in serves them all.cmcp hook <tool>: one session-start / session-end script with a small adapter per tool. Claude Code, Codex, Gemini CLI, Cursor, Kiro / Amazon Q and Cline all have hooks with nearly the same shape: they get the folder, and can add context and save a summary.cmcp bridge: a local stdio MCP server that forwards to the remote cMCP. It sees the folder and adds the project fingerprint itself. It covers tools without hooks (Continue, Zed, Roo, Junie, Warp, Augment, Copilot in VS Code) and tools that can't sign in on their own.cmcp import: one importer for every tool's memory and rules files (list below), with the local secret scan and private-first review.cmcp search / save / context) for tools with no MCP at all (Ollama CLI, DeepSeek app, Aider, scripts). Open WebUI can use the OpenAPI description directly.| Family | Tools | Connects with | Knows the project by | Gets updates by |
|---|---|---|---|---|
| 1. Coding agents with hooks | Claude Code, OpenAI Codex (CLI / IDE), Gemini CLI, Cursor (+ cursor-agent), Kiro / Amazon Q CLI, Cline, (Windsurf / Devin: hooks unverified) | Remote MCP with OAuth on laptops; personal key in headless runs | Hook fingerprint (automatic) | Session-start and prompt hooks pull changes; session-end saves a summary |
| 2. Coding agents without hooks | GitHub Copilot (VS Code, CLI, JetBrains), Continue, Zed, Roo Code, JetBrains AI / Junie, Warp, Augment, OpenCode, Crush | Remote MCP (OAuth or key), or cmcp bridge | Bridge fingerprint, or the open-folder list (VS Code and Cursor send it today), or a place header in the repo's committed MCP config | memory_refresh at task start (server instructions), list-changed notices |
| 3. Cloud coding agents | Claude Code on the web, Copilot coding agent, Codex cloud, Cursor background agents, Warp Oz, Devin | Key only. Copilot's cloud agent can't do OAuth to remote servers; others have no browser | The repo is known, so the place header goes in the repo's committed MCP config | Setup / session-start script where allowed |
| 4. Chat apps | claude.ai (web, desktop, mobile), ChatGPT (developer mode: Plus, Pro, Business, Enterprise), Mistral Le Chat, Perplexity, Microsoft Copilot Studio / M365, Gemini Enterprise, Open WebUI, LibreChat, LM Studio, Jan, AnythingLLM | OAuth through Keycloak (dynamic registration now, client metadata documents later). ChatGPT takes OAuth only, no key | No folder: per-connection default place, recent places, or the model asks; a place argument on every tool | Pull per question |
| 5. Model APIs, frameworks, automation | Groq, xAI Grok, OpenAI Responses API / Agents SDK, LangChain, LlamaIndex, Pydantic AI, CrewAI, n8n, Zapier / Make (via REST) | Key in a header (Groq and xAI send headers on every call; no OAuth) | Place header or argument set by the developer | Change feed (/v1/changes?since=) |
Tools with no remote MCP at all: Ollama (app / CLI), DeepSeek app, Meta AI, consumer Microsoft Copilot, and probably Aider. They use REST, the CLI or the bridge through another client.
/mcp must work without sessions under both the old and new spec versions. The new subscriptions/listen stream is the right base for live change updates in stage 1l.conversations.json. Copilot Memory has no export either.cmcp import reads, per tool| Tool | Files and stores |
|---|---|
| Claude Code | ~/.claude/CLAUDE.md, project CLAUDE.md, .claude/rules/, auto-memory ~/.claude/projects/*/memory/ |
| OpenAI Codex | ~/.codex/AGENTS.md, repo AGENTS.md (Codex memories: to check) |
| Gemini CLI | ~/.gemini/GEMINI.md (where save_memory writes), project GEMINI.md |
| Cursor | .cursor/rules/*.mdc, AGENTS.md |
| Windsurf / Devin | .devin/rules/, .windsurf/rules/, memories in ~/.codeium/windsurf/memories/ |
| GitHub Copilot | .github/copilot-instructions.md, .github/instructions/*.instructions.md (Copilot Memory: no export) |
| Cline / Roo | .clinerules, .roo/rules, memory-bank/ |
| Kiro / Amazon Q | .kiro/steering/*.md, .amazonq/rules |
| Others | Continue .continue/rules, Zed .rules, Junie .junie/guidelines.md, Augment .augment/rules, Aider CONVENTIONS.md |
| ChatGPT | Pasted "Manage memories" list; optional conversations.json from the data export |
requirements.toml plus committed .codex/config.toml./etc/cursor/hooks.json).managed-settings.json, since 2026-08).cmcp.C:\src\… vs /home/…). The remote and first commit match, so it is the same space automatically, with the memory already there.The research confirmed that tools which recognise a project by its folder path break when the same project sits in a different folder on another machine or in a worktree. Claude Code has open issues about exactly that. The recommended approach copies WakaTime's ordered detection and keeps every name found as an alias of one place:
| Order | Signal | Why |
|---|---|---|
| 1 | .cmcp-place marker file in the folder or a parent folder | Explicit choice. Works for folders without git and travels with the folder |
| 2 | All git remotes, written in one standard form (cMCP already does this) | The same repo on GitHub and Bitbucket gives two aliases of one place |
| 3 | First commit id(s) of the repo | The same in every clone and machine, and links a mirror. Weak spots: shallow clones, rewritten history, forks. It is used as an alias and to make suggestions, never alone to grant shared access |
| 4 | Host repo id (Bitbucket repo id, GitHub numeric id), learned from a connector | Survives renames. A fork gets a new id, and a local clone cannot know the id without the host's API, so it is an extra alias |
| 5 | Jira key from the branch name (ABC-123-…, key pattern [A-Z][A-Z0-9_]+) | Jira's own convention. Jira has no API listing the repos linked to a project, so the branch is the practical source |
| 6 | Folder name, plus a per-machine path alias | Last resort. Never the identity on its own |
place_mappings, set by someone with the mappings power), now matched on any aliasThe fingerprint arrives in two ways: in a header set by the plugin (X-CMCP-Place: auto:… through Claude Code's headersHelper), or by the session-start hook calling a new /v1/places/resolve. The hook also puts a short context pack into the session (additionalContext). A declared place still never widens access (DD-09).
max_projects. Never a back door to shared places: shared places still need the create-places power and the limits.A read-only Bitbucket catalogue connector, set up by the ADMIN with a workspace access token or API token (Bitbucket app passwords are blocked from 9 June 2026):
For personal GitHub, the same works per person with a read-only token; it only links to that person's spaces.
| Source on the machine | Goes to | Note |
|---|---|---|
Auto-memory ~/.claude/projects/<folder>/memory/*.md: types user and feedback | User memory | About the person |
| Same, type project | The space or project of that folder's repo (the folder name is matched back to the path, then fingerprinted) | Pending until reviewed |
| Same, type reference | Resource catalogue (resource_lookup) | Locations only, never passwords |
~/.claude/CLAUDE.md, .claude/rules, repo CLAUDE.md | Facts → memory. Working rules stay in the files; optionally "my preferences" (decision 5) | cMCP keeps memory as data, not instructions |
Secret scan and redaction run on the machine before upload. Duplicates found on several machines are merged on the server. In real company accounts, any processing on the server uses the local model only. A session-end hook keeps new local memories flowing in afterwards. Only changed files are sent.
| Product or tool | How it saves | What we copy |
|---|---|---|
| Mem0 | The app sends the messages and the server extracts facts in the background. Since 2026 it only adds, and marks older facts with time instead of overwriting them. Org and project come from the API key. The user, agent, app and run ids are only declared by the caller. | Background extraction; the key decides the org; a run id per job |
| Zep / Graphiti | Messages are added to a thread. Facts get "valid from" and "invalid from" dates instead of being deleted. One call returns a ready context block, and a save can return context in the same call. | Replace with dates; "save and get what's new" in one call |
| Letta | The agent edits its own memory, and a background "sleep-time" agent tidies it up. An optional step lets someone review before changes apply. | Background tidy-up; review step |
| Supermemory, Hindsight, Cognee, MemOS | The same document or session id means an update, not a new copy. Claude Code plugins recall memory on each prompt and save every few turns. | A stable conversation id with update-in-place; hooks |
| LangMem (LangGraph) | Extraction runs in the background with a delay. A new message cancels the waiting job and starts it again with the whole conversation. | One delayed extraction per conversation |
| Claude Code | The model decides what to save and writes local markdown files ("Saved 2 memories"). Memory is per repo and per machine. | Copy these files into cMCP |
| ChatGPT, claude.ai, Gemini, Microsoft 365 Copilot | Background memory with a "Memory updated" notice. None has a memory export API. In Microsoft 365, admins can export memory through eDiscovery. | Notice plus undo. Chat apps can only save through the cMCP connector |
| GitHub Copilot Memory | Repo facts carry citations that are checked against the current code. Unused facts are deleted after 28 days. | Show where each item came from; ageing |
| Devin Knowledge | Devin suggests knowledge, and the person edits or dismisses each suggestion. | Suggest, then approve, for shared memory |
None of these products has an API that the others copy. The closest shared interface is LangGraph's memory store. Licences: Mem0, Graphiti, Letta, Cognee and MemOS are Apache-2.0; Supermemory, LangMem and Hindsight are MIT. Honcho is AGPL, so it can't be used in our core. Memory poisoning is real: published attacks in 2025 and 2026 planted lasting instructions through ordinary chats. So automatic memory needs to show where every item came from and must never act as instructions.
| Tool | Events cMCP can use | Conversation id it gives | Can ask the model for notes | Watch out |
|---|---|---|---|---|
| Claude Code | SessionStart, UserPromptSubmit, Stop, PreCompact, SessionEnd, subagent events | session_id | Yes: a Stop hook can "block" with a reason, and there are prompt and agent hooks | Hooks can call HTTP or an MCP tool directly. SessionEnd gets only 1.5 s, so hand the work to a background upload. Cloud sessions run only hooks committed in the repo |
| OpenAI Codex | The same set as Claude Code | session_id | Yes: Stop "block" | Command hooks only, and SessionEnd gets 1 s. Codex's own memory may skip chats that used MCP tools |
| Gemini CLI | SessionStart, BeforeAgent, AfterAgent, PreCompress, SessionEnd | session_id | Yes: AfterAgent "deny" | Its save_memory writes to GEMINI.md, so we can copy that file |
| Cursor | sessionStart, beforeSubmitPrompt, afterAgentResponse, stop, preCompact, sessionEnd | conversation_id, plus the user's e-mail and open folders | Yes: a follow-up message on stop | Its built-in memories were removed in 2.1. Cloud agents have no session start or end events |
| GitHub Copilot (VS Code, CLI) | SessionStart, UserPromptSubmit, Stop, PreCompact | sessionId | Yes | The CLI has HTTP hooks. In VS Code, hooks are still in preview |
| Cline, Kiro | Task, prompt and stop events | taskId / session_id | Not documented | Fewer guarantees; the bridge is the fallback |
| claude.ai, ChatGPT, Gemini app, Microsoft 365 Copilot | No hooks | None | Only when the model calls the connector | Enterprise routes for later: Claude inference hooks (beta) and the Compliance API, ChatGPT Compliance Logs, Microsoft 365 eDiscovery |
| Field | Meaning | Comes from | Trusted? | Standard it lines up with |
|---|---|---|---|---|
| Account / org | Which company | The token or bot key | Yes | None (our own claim) |
| Principal | The person or the bot | The token or bot key | Yes | OAuth sub |
| App | Which AI app or key | The registered client or key. The tool name the caller declares is a label only | Yes (the label: no) | OAuth azp / client_id |
| Acting for | The person an app works for | The token, or a stored grant | Yes | OAuth token exchange act |
| Device | Which machine or install | A personal device key (stage 1n); otherwise declared | Yes with a key, otherwise a label | None |
| Place | Project, team, client, space or repo fingerprint | Declared, or found by the hook | No. Used only if the caller belongs there, and it only narrows | None (MCP "roots" are deprecated) |
| Conversation | This chat, session or thread | The tool's own id: Claude session_id, Cursor conversation_id, OpenAI conv_…, LangGraph thread_id | No. Kept apart per app, and never gives access | OpenTelemetry gen_ai.conversation.id, A2A contextId |
| Run | One run of a bot or job | Declared | No | Mem0 run_id, A2A taskId |
| Tool, version, model | What is calling | Declared | No. Used for display and audit only | OpenTelemetry gen_ai.agent.* |
| Cursor | "What I already have" | Issued by cMCP and sent back by the caller | Tied to the credential | Microsoft Graph delta link, Kubernetes resourceVersion |
| Idempotency key | "Same save again; don't make a copy" | Declared, one per write | Per request | IETF Idempotency-Key draft |
| Trace | Debugging only | Declared | Logs only | W3C traceparent |
How it travels:
X-CMCP-* headers that exist today, plus X-CMCP-Conversation, X-CMCP-Run, X-CMCP-Cursor and Idempotency-Key./mcp has to start reading them; today it ignores them.com.example.cmcp/envelope entry in _meta, for bots that build their own MCP requests. The July 2026 MCP spec removed protocol sessions, says per-conversation ids must be sent on every request, and reserves no key for them._meta disagree, the call is refused, the same way MCP handles its own headers.The OpenTelemetry names are still marked "development", so cMCP keeps its own names and maps them only in logs.
The change list is worked out for that credential when it is read, so a cursor can never show rows the bot isn't allowed to see. A retry with the same idempotency key returns the first answer instead of saving twice. A long-running agent may keep a stream or a webhook open, but only as a wake-up call; after a gap it always pulls from its last cursor. Bots built on the Claude API can use the Claude memory tool with a handler that stores into cMCP. Python bots get a small client library: start → work → checkpoint.
| Topic | Suggestion |
|---|---|
| Ways in ("lanes") |
|
| Where it lands | The person's User memory, the bot's own memory, or the private space for that repo. Never directly in a shared place: there it becomes a suggestion or a change request |
| Review | Set per account:
|
| Labels | Every item shows the tool, the model, the conversation and "auto-saved". It is never must-apply and never an instruction |
| Quality gate | Drop:
|
| Updates | In private memory, a newer fact that contradicts an older one replaces it, with a date. In shared memory it becomes a change request. A duplicate adds a confirmation instead of a copy |
| Ageing | Unreviewed items are dropped after 14 days. Automatic items that are never used for 90 days are archived |
| Poisoning | Every item shows where it came from. The injection check (exists today) runs on every item. Nothing reaches shared memory without a person's approval |
| Cost and limits | One checkpoint per conversation at a time, delayed so it covers the whole stretch. The per-prompt "anything new?" check gets its own small budget, so it doesn't use up a bot's 500 calls an hour |
| Real accounts | Extraction only on the local model (M-46). Model notes only from AI apps on the account's allowed list (decision 7) |
| Where the conversation happens | How cMCP can get the whole conversation | Needs |
|---|---|---|
| Claude Code, Codex, Gemini CLI, Cursor, Copilot (VS Code and CLI) | The hooks receive the transcript file path. The hook uploads only the new part at stop, before compaction and at session end, in the background | Any plan; our hook installed |
| claude.ai, Claude Desktop and mobile, Claude Code | Claude Compliance API (the company pulls chats and Claude Code sessions) or inference hooks (beta: each prompt with its conversation is sent to the company's address) | Claude Enterprise; an admin sets it up |
| ChatGPT | Compliance Logs: conversation exports by time window | ChatGPT Enterprise |
| Microsoft 365 Copilot | An interaction export API for admins (not fully verified) | An admin and a licence |
| Bots and our own agents | They send their own messages with the conversation id | Nothing extra |
| Personal or Pro chat plans | No route. Only what the model saves through the cMCP connector | Not possible |
Default rules (cMCP follows these unless noted): fixed means no switch can change it. ADMIN may change means changing it shows a risk notice first.
What it gives: search across a person's past conversations in every tool, better extraction later (with a better model run again on the same text), facts that cite their source, and an archive for compliance. What it costs: little storage, because text compresses and tool output is capped. Extra model time is only needed if extraction runs on the transcripts. Build: a transcripts table (owner-only, retention, legal-hold flag), an append-only upload /v1/conversations/{id}/transcript (idempotent by position), the policy switches with risk notices, owner search, a purge job and a break-glass view. It fits stage 1m (the same hooks) if decided; the Enterprise routes belong in 1o.
| Already there | Missing for this design |
|---|---|
| Identity from the token or key: account, person or bot, app, acting-for, sponsor | An app per tool and per machine. Claude Code and Claude Desktop share one "app" when they use the same sign-in |
Declared place, model, purpose and token budget as X-CMCP-* headers on REST | /mcp ignores these headers. memory_save over MCP takes no place or model, so the model is never recorded |
Context pack with manifest and delta, must-apply notice, and the cmcp://context resource with subscriptions |
|
memory_save_session_summary with the person's confirmation | Bug: a summary saved without the in-tool confirmation stays "unconfirmed" forever. There is no confirm button or endpoint; only connector imports have one |
| Source records keep the app and the model | The context pack doesn't show which app or model wrote an item. There is no capture or hook switch per level, although DD-11 asks for one |
| Bot rate limit of 500 calls an hour | Every call counts, so a check on every prompt would use it up |
exists means the switch is in cMCP today; planned means it is proposed in this issue. Levels: High means data leaves the company, much wider reading, or invasive access. Medium means wrong memory or standing access. Low means a small, contained effect.
| Switch | Level | Risk for the company (ADMIN) | What people should know | Stays protected |
|---|---|---|---|---|
| Cloud model for fact extraction (Groq or any cloud API) exists, test accounts only | High | Memory text goes to an outside AI provider: their retention, their staff and their country's law. Real accounts need company approval (M-46) | Text you save is processed by an outside AI service | Server operator setting only; real accounts are local-only and tested |
| Allowing a cloud-hosted AI app (ChatGPT, Gemini, Copilot, claude.ai …) on a real account planned (decision 7) | High | Company memory that the app reads goes into that vendor's cloud model. OpenAI says MCP data falls outside its zero-retention promise | This app sends the company memory it reads to its vendor | Allow-list per account; enforced at sign-in and on keys |
| Mailbox connector (IMAP) exists, off | High |
| Mail from the connected box becomes suggestions that leads approve | Read-only; approval queue; raw text purged 30 days after decisions; credentials in OpenBao |
| Database-view connector exists, off | High | Customer or personal data from business databases can enter memory; a view may expose more columns than intended | Rows can become memory suggestions | Read-only views; approval queue; four eyes on client connections |
| Webhooks to bots' addresses planned | Medium | Calls go to outside addresses: they leak ids and metadata, and could be abused to reach internal hosts | None | Signed; ids only, no memory text; address allow-list |
| Generated context file in repos planned (decision 9) | Medium | Memory text sits on disk in a repo and can be committed and pushed, even to a public repo | Don't remove the git-ignore line | Git-ignored; off by default |
| Switch | Level | Risk for the company (ADMIN) | What people should know | Stays protected |
|---|---|---|---|---|
| Keep whole conversations planned | High | The most sensitive store cMCP would hold, with secrets, personal talk and client details. Breach impact is high, and legal duties apply | Your conversations are kept for the set period; only you can read them | The default rules above |
| Enterprise transcript routes (Claude Compliance API / inference hooks, ChatGPT Compliance Logs, Microsoft 365 export) planned | High | Every employee's chats flow in, including ones unrelated to work and ones from tools without our hooks | Chats in company AI apps are archived, not only those in coding tools | The same rules as whole conversations; owner-only |
| People can't pause conversation keeping ("off the record" disabled) planned | High | People lose control. Use it only for legal or regulatory needs | You can't pause keeping in this place | Notice on every session |
| Break-glass reading of a person's Personal memory or conversations planned (M-33) | High | Invasive by design; a misuse risk from insiders | Your private items can be read in a logged emergency, and you will be told | Reason, audit, notice to the person; second ADMIN |
| Lateral synthesis exists, off | Medium | Combining several teams' memory can show a lead things across team boundaries | Your team's items can feed a draft for another lead | Drafts only; the lead decides; local model only |
| Promotion to team memory exists, on | Medium | A neutral rewrite may still reveal a personal detail when few people are involved | What three or more of you save may be suggested to the team, without names | At least 3 people; the lead approves and sees only the count; Personal memory never promoted |
| Automatic link of a repo to a company project planned (decision 6) | Low | Forks or mirrors can match the wrong project | Check the suggested project | Members only; items move only after approval |
| Switch | Level | Risk for the company (ADMIN) | What people should know | Stays protected |
|---|---|---|---|---|
| Automatic saving "automatic with undo" instead of "review first" planned (decision 11) | Medium | Unreviewed facts are used at once, so noise and planted text reach AI answers before anyone checks | Items marked "auto-saved" weren't checked by a person | Private memory only; labels; undo; ageing |
| Facts pulled from raw transcripts planned | Medium | Much more noise (97.8% junk in one Mem0 audit) and more model time | More automatic items to review | Opt-in; quality gate; review |
| AI apps write shared memory exists, on with a grant | Medium | Text planted in a web page or repo can reach team or project memory through a person's AI app | What your AI saves in shared places is visible to the team and shows your name | Grant of at most 8 hours; injection check; audit |
| Bots write shared memory exists, on with a grant | Medium | No person in the loop: a faulty or hijacked bot writes wrong facts that everyone's AI uses | Items from bots carry a bot badge | Grant of at most 90 days; sponsor; rate limit; kill switch |
| Bots send requests to Organization memory exists, off | Low | Spam or poisoned proposals in the ADMIN's queue | None | Requests only; the ADMIN decides |
Longer context-pack age (pack_max_age_hours, up to 168) exists | Low | A removed or corrected fact keeps being used for longer | Use Re-sync if something looks old | Must-apply items show a notice at once |
| Switch | Level | Risk for the company (ADMIN) | What people should know | Stays protected |
|---|---|---|---|---|
| People may elevate their own AI app exists, off in real accounts | High | For up to 90 days, an injected or hijacked app can change and delete memory as the person | Your app acts with your memory powers; check Activity and end it any time | Memory only, never Org; 50 changes and 20 deletes an hour, then paused; audit |
| Personal device keys (more keys or longer life) planned | Medium | A key leaked from a cloud sandbox or cron job works until it expires or is revoked | Treat a key like a password; revoke unused ones | Expiry of 30–90 days; ended after 14 days unused; at most 5; "last used" shown; never elevated |
Longer grant limits (ai_grant_max_hours, bot_grant_max_days) exists | Medium | Write access stays open for longer than the task needs | Grants you give last longer | Never more than the giver; revocable |
Longer approval cover (approval_cover_max_days, up to 30) exists | Medium | Deciding rights sit with a colleague for longer | A colleague may decide your requests | One cover at a time; decisions only; ends at once |
| Web-admin full control of an account's switches exists, accepted risk for pilot | High | The platform operator can loosen any switch. This is not acceptable for SaaS customers | None | Audit; the account's ADMINs will be told (new rule) |
| Public access switch exists, server operator | High | The login, console and MCP become reachable from the internet | None | One-time codes; rate limits; firewall |
| Switch | Level | Risk for the company (ADMIN) | What people should know | Stays protected |
|---|---|---|---|---|
| Conversation retention over 30 days planned | Medium | More data at risk and longer legal exposure | Your conversations are kept longer | A maximum of 365 days; legal hold separate |
| Saving free text exists, on | Low | Raw text with possible secrets is stored as source and processed by the model | The text you ask to save is kept as its source | Local model for real accounts; private sources; injection check |
| Personal memory exists, on | Low | People may put company data where the company can't review it | Personal memory is yours; only a logged break-glass can read it | Never promoted; never seen by apps without permission |
Shorter client purge time (client_purge_days) exists | Low | A wrongly erased client can't be restored after the purge | None | Cancel possible until the purge |
New decisions 20–22 (second ADMIN, end dates, telling people first) are in the Decisions table.
| Where Claude runs | How it connects | Project detection | Status |
|---|---|---|---|
| Claude Code CLI on laptop or desktop (Windows PowerShell, Linux, macOS) | Plugin + browser sign-in (OAuth, exists) | Automatic (hook) | Plugin to build |
| Claude Code over SSH or PuTTY | claude mcp login cmcp --no-browser: the link is opened on another device | Automatic | Works with OAuth today; plugin to build |
Claude Code on the web (cloud sandbox), claude -p, cron | Committed .mcp.json with header Authorization: Bearer ${CMCP_KEY}; key in the environment's secrets. Plugins from user settings do not load in cloud sessions, so the repo carries the config | Automatic (hook runs in cloud sessions too) | Needs personal device keys |
| claude.ai web, Claude Desktop, mobile apps | cMCP added as a custom connector. On Team/Enterprise plans the org owner adds it once, then each person signs in | None (no folder): app default place, recent places, or the model asks | Needs a Keycloak connector setup + test |
cmcp login shows a code, a link and a QR code.cmcp_pat_…, shown once and stored only as a hash. This reuses the bot-key code from stage 1j.Rules:
The same keys could replace the cron "automated bot" question asked earlier.
claude.ai connector checklist:
resource_metadata;resource exactly matches the MCP address;https://claude.ai/api/mcp/auth_callback allowed;160.79.104.0/21;| Area | Change |
|---|---|
| Database |
|
| API |
|
| Client | New clients/claude-code-plugin/:
|
| Web | "My places" (spaces, links, suggestions), "My keys", a suggestions banner, ADMIN "Repo catalogue" screen |
| Keycloak | Device-flow client for key approval; connector registration policy for claude.ai |
| Manual | One page per surface (laptop, SSH, cloud, claude.ai/mobile), import guide |
| Automatic saving and sync (2026-10-08) |
|
| Stage | Content | Why in this order |
|---|---|---|
| 1l two-way sync (already next, widened 2026-10-08) | Change notices in tool answers, subscriptions/listen (spec 2026-07-28), /mcp without sessions; plus the envelope (headers read on /mcp too, conversation and run ids, idempotency keys), the cursor change feed /v1/changes, the "To review" list (fixes stuck summaries), tool and model shown in the pack, first Claude Code hooks (start and prompt) | Base for everything below. Every tool pulls, so the cursor and the envelope matter most |
| 1m places that find themselves | cmcp helper: login, fingerprint, setup, hooks for Claude Code / Codex / Gemini CLI / Cursor, bridge; server: aliases, private spaces, ask-once links, place header on /mcp; plus automatic saving for Claude Code: checkpoint hooks, copying of auto-memory, model notes, capture modes, quality gate, replace / de-duplicate / ageing | Solves A and B for every coding agent on laptops and SSH, and C for Claude Code |
| 1n every surface | Personal device keys + device flow; chat-app connectors (claude.ai, ChatGPT, Le Chat, Copilot Studio) through Keycloak; per-account allowed-AI-apps list; cmcp import for all tools; plus bots and other tools: a Python bot library (start, checkpoint, changes), a LangGraph store adapter, a Claude memory-tool handler, capture adapters for Codex / Gemini CLI / Cursor / Copilot, signed webhooks | Cloud agents, cron, phones, chat apps, any bot (C and D everywhere), safe use with real accounts |
| 1o later | More hook adapters (Kiro, Cline, Windsurf), optional generated context file, Bitbucket / GitHub repo catalogue, MCP Registry listing, client metadata documents; facts from raw transcripts (needs a GPU or an approved cloud model); Enterprise transcript routes (Claude inference hooks / Compliance API, ChatGPT Compliance Logs, Microsoft 365 eDiscovery) | Nice to have once the core works |
| # | Question | Suggestion |
|---|---|---|
| 1 | Spaces visible only to the person, or also to the ADMIN? | Only the person (counts and names visible to the ADMIN, not contents) |
| 2 | Personal GitHub work: a private space in the company account, or a separate personal account (a second sign-in; the plugin routes github.com/<you> to it)? | A separate personal account for truly personal work; spaces for company work not yet set up |
| 3 | Personal device keys for cloud sessions and cron? | Yes, with the rules above |
| 4 | May an import ever write to shared places directly? | No: always private first, then reviewed or approved |
| 5 | "My preferences" sync: may the plugin bring the person's own saved working rules into their own sessions on every machine? | Yes, only from the person's User memory, written by them in person, never from shared memory or apps |
| 6 | Automatic link when the first commit and remote both match a company mapping, or always ask? | Automatic for reading, ask before moving any items |
| 7 | Which AI apps may read a real account's memory? Cloud-hosted tools (ChatGPT, Groq, Copilot, Gemini, claude.ai …) put memory text into a cloud model | A per-account allow-list set by the ADMIN; real accounts start with only the apps the company has approved; enforced on sign-in and keys |
| 8 | How is the cmcp helper shipped: Python (pipx / uv) first, or a single file per platform (Windows, Linux, macOS)? | Python first (matches the server code), single file later |
| 9 | May cMCP write a generated context file into repos for tools without hooks? | Only into a git-ignored file, off by default |
| 10 | Which tools get first-class support in 1m? | Claude Code, Codex, Gemini CLI, Cursor, VS Code / Copilot (the ones in use); the rest through bridge |
| 11 | Automatic saving default per account: off, review first, or automatic with undo? | Review first for real accounts, automatic with undo for test accounts |
| 12 | May automatic memory ever land directly in a shared place? | No: only User memory, the bot's own memory or a private space; shared places get suggestions or change requests |
| 13 | Who writes what is saved: copies of the tools' own memory files, short notes from the tool's own model, or cMCP's local model reading the raw transcript? | Start with files and model notes (curated, low noise); raw transcripts later, opt-in, once there is a GPU or an approved cloud model |
| 14 | Keep whole conversations (transcripts) in cMCP? | Decided by the user 2026-10-08: yes, only as a company policy and always under the default rules in Whole conversations; the ADMIN sees a risk notice before switching it on (Risk notices) |
| 15 | Accept the tool's own conversation id (Claude session_id, Cursor conversation_id, OpenAI conv_…, thread_id)? | Yes, kept apart per app and never used to give access |
| 16 | A caller names a different org or user than its sign-in: refuse or ignore? | Refuse with an error; a place the caller doesn't belong to falls back with a notice, as today |
| 17 | How do bots get changes? | Cursor feed first; signed webhooks later; MCP subscriptions only as a wake-up |
| 18 | Should the per-prompt "anything new?" check count against the hourly call limit? | No: give it its own small budget |
| 19 | Ageing of automatic items | Unreviewed items dropped after 14 days; automatic items never used for 90 days archived |
| 20 | Second ADMIN approval for High-risk switches? | Yes when the account has two or more ADMINs; otherwise a fresh sign-in, typed confirmation and reason |
| 21 | End dates on High-risk switches? | Yes: 90 days by default, renewable, with a reminder 7 days before |
| 22 | Tell people before a switch that keeps or shares more of their data takes effect? | Yes: keeping or sharing starts only after people have been told |
codex exec, gemini -p, Copilot CLI -p, the Cursor CLI and Kiro headless;_meta or support subscriptions/listen;.wakatime-project file → central project map → git folder name.Patterns copied:
Pitfalls avoided:
cwd and session_id and can inject additionalContext at session start and on each prompt. An http hook can call cMCP directly. Hooks also run in cloud sessions (CLAUDE_CODE_REMOTE=true), and PowerShell is supported. docsclaude mcp add --transport http … --header, ${VAR} in .mcp.json, headersHelper for dynamic headers, claude mcp login NAME --no-browser for SSH. Cloud sessions load only the repo's .mcp.json. docsclaude.ai/api/mcp/auth_callback; egress 160.79.104.0/21; 10-second limit; no client-credentials grant./rest/api/3/project/search. Project key pattern [A-Z][A-Z0-9_]+.git rev-list --max-parents=0 HEAD): stable across clones. Can be several commits, missing in shallow clones, or changed by rewritten history. So it is one alias among others.Today the first match wins:
git_repo, jira_project, chat_channel, set by someone with the mappings power);An unmapped repo falls back to the home team or Org for reading, and writes go to User memory. Nothing is created automatically, on purpose: the limits are projects 0 by default and at most 5 places a person may create.
The first suggestion already proposed private spaces, the first commit id as an identity, a marker file for folders without git, an import command with a local secret scan, and promotion through the approval queue. The research above refines it: several names per project instead of one, the plugin and headersHelper instead of relying on the model, ask-once suggestions, personal device keys, and the claude.ai connector checklist.
Problems to keep in mind: