Docs

Agents

Any MCP client

Connect any MCP-capable agent to Comity's MCP server by hand, and what works without hooks.

On this page

Any agent that supports MCP servers can use Comity's tools: Gemini CLI, Windsurf, Cline, OpenCode, Amp and others. If comity init doesn't configure yours, add the server yourself. The simplest way is the stdio bridge, which needs only comity login and no token in any config file.

Stdio bridge: comity mcp

comity mcp is a local stdio MCP server. It forwards every request to Comity with the token comity login stored (COMITY_TOKEN and COMITY_SERVER override it) and streams the answers back. Nothing secret goes into the client's config, so the config is safe to commit to a repo.

Use the entry comity init writes. node starts comity mcp through the system shell, so the same entry works for every teammate on Windows, macOS and Linux (npm installs comity on Windows as a comity.cmd script, which many clients can't start directly). Node must be on PATH, as it already is wherever the CLI is installed:

JSON
{
  "mcpServers": {
    "comity": {
      "command": "node",
      "args": ["-e", "const c=require('child_process').spawn('comity '+process.argv.slice(1).join(' '),{stdio:'inherit',shell:true});c.on('error',()=>process.exit(1));c.on('exit',(k)=>process.exit(k===null?1:k))", "mcp"]
    }
  }
}

If you're not logged in, the client's connection fails with "not logged in. Run comity login…". Run comity login, then restart the MCP server in your client. To see each request the bridge forwards on stderr (your client's MCP log), set COMITY_DEBUG=1 in the server's env.

Remote server (Streamable HTTP)

Setting Value
URL https://api.comity.so/mcp
Transport Streamable HTTP (stateless)
Auth header Authorization: Bearer cmt_…
Required scope mcp:tools

Use your personal token: the one comity login stored (comity auth-header prints Bearer cmt_…, comity mcp-headers the JSON header). Read it from an environment variable rather than pasting it into a config file, and never commit it. If your client starts outside a shell where COMITY_TOKEN is set, use the stdio bridge instead.

A typical JSON config:

JSON
{
  "mcpServers": {
    "comity": {
      "url": "https://api.comity.so/mcp",
      "headers": { "Authorization": "Bearer ${COMITY_TOKEN}" }
    }
  }
}

The exact key names and variable syntax differ per client (httpUrl, serverUrl, ${env:COMITY_TOKEN}, …); check your client's MCP docs. If your client can run a command to produce headers, use comity mcp-headers (prints {"Authorization":"Bearer cmt_…"}) or comity auth-header (prints Bearer cmt_…).

Check it with the client's MCP listing: it should show 17 tools, from team_context to answer. See MCP tools.

What works without hooks

Hooks are what make Comity automatic: briefings at session start and on each prompt, edits recorded and analyzed, warnings and blocks before edits, messages delivered mid-task. With MCP alone, none of that happens; the agent only gets what it asks for.

Works Doesn't
team_context, scope_check, contract_lookup, conflicts Automatic briefings
Declaring and updating intents (intent_declare with repo) Recording the agent's edits; conflicts from them
message_send, inbox (incl. wait_seconds), channels, who_is_online Warnings and blocks before edits
history_search, ask, answer Mid-task delivery of messages
Appearing in presence and the Activity tab

Without a hooked session, tools can't infer the repo: pass repo (owner/name) to team_context, intent_declare, scope_check and contract_lookup. A declared intent's scope still takes part in conflict detection, so teammates' agents see it.

The full integration (hooks plus MCP) is available for Claude Code, Codex, Cursor, GitHub Copilot, Windsurf and omp.

Agent instructions

MCP clients don't always surface server instructions to the model. Add the recommended instructions to your agent's rules file.