Skip to content
Apothem
Reference

MCP servers

Model Context Protocol server configuration — operator-owned and registered through each tool's native MCP mechanism; a few adapters project the shared profile's MCP inventory, the rest author no server entries.

Model Context Protocol (MCP) servers are operator-owned. Apothem carries the MCP inventory in the shared profile (mcp_servers). An adapter whose tool keeps its MCP servers in a config file Apothem already writes projects that inventory into the file; every other adapter authors no server entries, and the servers stay yours to register through the tool.

Which adapters project the inventory

The table below is generated from the harness registry's mcp_servers capability cell for each adapter.

HarnessMCP inventoryNote
Antigravity (antigravity)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.
Claude Code (claude-code)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.
CodeBuddy (codebuddy)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.
Codex (codex)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.
Cursor (cursor)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.
Gemini CLI (gemini-cli)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.
GitHub Copilot (github-copilot)Not projected (unsupported)Copilot MCP is configured in repository settings, the IDE, the Copilot CLI, or a custom agent profile; the adapter authors none of them.
GLM (Z.ai) (glm)Not projected (unsupported)GLM is a model backend configured via Anthropic/OpenAI-compatible env; it exposes no native MCP-server surface.
Hermes (hermes)Projected: written into the tool's MCP config—
Kimi Code (kimi-code)Not projected (discovery-pending).kimi-code/mcp.json is the recognized operator-owned MCP surface; Apothem names it but defers authoring entries.
Kiro (kiro)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.
Open-Claw (open-claw)Not projected (unsupported)Open-Claw MCP lives in the mcp.servers config block managed via the openclaw mcp CLI; the adapter authors no entries.
OpenCode (opencode)Projected: written into the tool's MCP config—
Qwen Code (qwen-code)Projected: written into the tool's MCP config—
Trae (trae)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.
Windsurf (windsurf)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.
Zed (zed)Not projected (discovery-pending)MCP lives in an operator-owned config surface (file / CLI / service state); the adapter names it but authors no entries.

Where MCP servers register

Each tool registers MCP servers through its own native mechanism, and Apothem honors that surface rather than overwriting it. On Claude Code, servers register with claude mcp add into ~/.claude.json (user or local scope) and a project-level .mcp.json; the Claude Code adapter writes neither file, and Apothem's managed Claude Code settings never carry an mcpServers block.

Give a helper access to MCP servers

The read-only research agents (research-scout, citation-auditor) ship with an explicit tools list of Read, Glob, Grep, WebSearch, WebFetch. Claude Code admits an MCP tool to a subagent's explicit list only when an entry names the server, in the form mcp__<server>__*. The profile's agent_mcp_servers key names those servers per agent:

agent_mcp_servers:
  research-scout:
    - "your-scholarly-server"
  citation-auditor:
    - "your-scholarly-server"

The Claude Code install adds one mcp__<server>__* entry per named server to each listed agent's tools line, and changes no other agent or line. With no key every agent keeps the plain list, so no agent reaches an MCP tool. Write each server name as /mcp shows it. Claude Code writes : and . as _ in tool names, so the install renders the server plugin:bio-research:biorxiv as mcp__plugin_bio-research_biorxiv__*. A name holds letters, digits, -, _, : and ., starts and ends with a letter or digit, and never has two of _, : and . in a row (the rendered entry would hold a __); *, whitespace and every other character are rejected. A grant names every tool of that server, including any that writes, so grant only a server you trust for lookups; the agents' instructions limit them to lookups, but the harness enforces only the names you list. A grant for an agent that does not exist, or one without an explicit tools list, is reported and skipped. A per-harness override under harnesses.claude-code adds to the shared lists.

The grant applies to the engine install (apothem install) on Claude Code and on Gemini CLI. On Gemini CLI the install adds one mcp_<server>_* entry per named server to the listed agent's tools allowlist, for example mcp_your-scholarly-server_*, and changes no other agent or line. Gemini CLI names every MCP tool mcp_{serverName}_{toolName} and reads the server from the text up to the first underscore after mcp_, so a server name with an underscore cannot be addressed there. Apothem writes a Gemini CLI grant only for a name of letters, digits and -: a name with an underscore, colon or period is valid for Claude Code but is skipped for Gemini CLI and reported, never rewritten into another name. An agent that already reaches every MCP server (no tools list, or one that holds mcp_*) is left unchanged and reported. Gemini CLI has no deny list, so a server the agent's own disallowedTools names gets no entry and is reported: the denial wins, as it does on Claude Code. The Gemini grant reads the shared agent_mcp_servers lists and the harnesses.gemini-cli override, not the harnesses.claude-code one. Other harnesses ignore the key: Qwen Code documents no per-server entry for tools; OpenCode controls tools through permissions; Codex and Antigravity emit no tool list.

The Claude Code plugin is assembled without a profile, so its two agents keep the plain list. To give them connector access without editing plugin files, define a user-level agent of your own in ~/.claude/agents/, under a name of your choosing, that carries the same read-only tools list plus the mcp__<server>__* entries you want.

Adding a server

Register a server through your tool's native mechanism; the canonical entry shape is one key under mcpServers:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/some/path"]
    }
  }
}

The tool's runtime loads the registered servers on session start; restart the tool to pick up new servers.

Naming convention

MCP tools surface to the assistant as mcp__<server>__<tool> per the tool's standard MCP-tool naming convention.

On this page