← Docs · Optional Tools

MCP access

Every MCP server added to a runtime is another process to keep alive, another entry in a configuration file, and another thing holding credentials. This page covers the three ways that surface is managed here: a proxy daemon that consolidates servers behind one endpoint, the managed connectors that do the same thing without a local process, and the class of server that runs commands on your machine — which is worth evaluating carefully rather than installing because it is convenient.

mcporter (MCP proxy daemon)

mcporter consolidates all KI-owned MCP servers behind a single keep-alive daemon and exposes them through a single HTTP MCP endpoint, reducing the ~/.claude.json mcpServers block from many stdio entries to one URL entry.

brew install steipete/tap/mcporter

Two LaunchAgents are deployed and activated by chezmoi:

LaunchAgent label Command Purpose
sh.mcporter.daemon mcporter daemon start --foreground Keep-alive process manager for all servers
sh.mcporter.http-bridge mcporter serve --http 3333 HTTP MCP endpoint at http://localhost:3333/mcp

mcporter's config lives at ~/.mcporter/mcporter.json (chezmoi-managed). It embeds full server definitions with "lifecycle": "keep-alive" for each server, resolved from the same mcp-servers-json chezmoi template that generates the Claude Desktop config.

After chezmoi apply loads the plists, activate them:

launchctl load ~/Library/LaunchAgents/sh.mcporter.daemon.plist
launchctl load ~/Library/LaunchAgents/sh.mcporter.http-bridge.plist

Tools are exposed as server__tool (double underscore). ~/.claude.json should contain only a single ki-mcporter URL entry under mcpServers:

"ki-mcporter": { "type": "url", "url": "http://localhost:3333/mcp" }

Verify with:

mcporter daemon status          # all servers idle/running
curl http://localhost:3333/mcp  # should return a valid MCP JSON response

Both mcporter's config add and Claude Code's own claude mcp add only accept http / sse / stdio transports — a server that speaks raw WebSocket only (no HTTP/SSE/stdio front end) cannot be registered through either, mcporter included. It is not a universal bridge between transports; confirm a candidate server's transport before assuming mcporter can front it.

claude.ai connectors — the managed alternative

For a third-party SaaS integration (GitHub, Linear, Slack, Notion, the Google and Microsoft suites, and the like) there are two ways to get its tools into a session, and a local MCP server is only one of them. The other is a claude.ai managed connector, authorised once in claude.ai connector settings. Given this setup, the managed route is often the lower-friction one: Anthropic handles the OAuth, so there is no local OAuth flow to complete, no keep-alive daemon or secrets on the machine, and it works on surfaces where an interactive OAuth flow cannot run (a non-interactive Claude Code session, for instance, cannot complete one — it can only use a connector that is already authorised). Managed-connector schemas load on the claude.ai web / Desktop surface, where you toggle them per-conversation in the compose-bar tools menu, rather than into the Claude Code local surface.

Which route to prefer, per integration:

Prefer When
claude.ai connector A hosted connector exists and you mainly use that integration on claude.ai web / Desktop — least setup, no local OAuth.
Local MCP server You need it in the Claude Code CLI, need tools no connector offers, or need a KI server's own access gate + audit log †

† The KI-owned mcp-* servers (workspace MCPs with the annotation-driven access-level gate and audit logging) are always the local route — there is no managed equivalent.

Do not wire the same integration both ways on the same surface — that loads two copies of its tool schemas. ki-binding governs which surface runs which server from the single mcps.yaml source and audits that the surfaces agree; see Tuning for the leanness view of the same choice.

VS Code command-execution MCP servers — evaluate before installing

A recurring want on this surface: letting the agent trigger a VS Code command directly (e.g. "Developer: Reload Web Views" after a session /rename, since the extension does not refresh its own UI on rename). Community MCP servers exist that expose vscode.commands.executeCommand() as a callable tool — for example louisfghbvc/mcp-vscode-commands. Before adopting one, check two things: whether it ships a signed .vsix/verified publisher (unsigned third-party extensions granting arbitrary command execution over an unauthenticated local socket are a real trust boundary, not a formality), and which transport it speaks — Claude Code's claude mcp add and mcporter's config add both only accept http / sse / stdio, so a WebSocket-only server (as mcp-vscode-commands currently is) cannot be wired into either regardless of how it is packaged. No such server is currently adopted here; this is a note for the next time the want resurfaces, not a recommendation.