These are two external subcommands, both speaking JSON-RPC over stdio (stdin/stdout carry the protocol; all logging goes to the file logger):
chatcli mcp-server(aliasmcp-serve) — an MCP (Model Context Protocol) server. Negotiates revision2025-03-26or2024-11-05.chatcli acp— an ACP (Agent Client Protocol) server, for editors (Zed) and agent-to-agent use.
chatcli mcp-server
Exposes ChatCLI’s entire capability surface — not a curated subset:
Harness tools
The
quality parameter maps to the CHATCLI_QUALITY_* namespace, so a caller can turn on plan, refine, verify, reflexion, convergence and lessons for a single run:
Every plugin tool
All registered built-in and external plugins are advertised individually (37 on a default build): files (read, search, tree, coder), web (websearch, webfetch, http, api-explorer), memory (memory, recall), knowledge (knowledge, context, compress, docs-flatten), visuals (diagram, graphview, image), plus moa, lsp, scheduler, session, osv, wikipedia, registry-tags, todo, tools, channels, send, proc, skill, speak…
- Each tool carries its usage embedded in the description and a
readOnlyHintannotation derived from ChatCLI’s per-plugin capability metadata. - Arguments follow the same contract the agent uses: a JSON envelope (
{"cmd":"read","args":{...}}) or a flat string. - Interactive tools that require a live terminal (
ask,voice,park) are never exposed — over stdio they would hang forever.
Exposure policy — CHATCLI_MCP_TOOLS
Skills as MCP prompts
Every installed skill is served throughprompts/list / prompts/get — the client can pull ChatCLI’s whole skill catalog as ready-to-use prompts.
Local state as MCP resources — chatcli://
Everything the user built in ChatCLI is browsable read-only through resources/list / resources/read:
Mutations go through the tools surface (
memory, context, manage_session, …). CHATCLI_MCP_RESOURCES=off disables the resources surface entirely.
Cross-channel continuity — the conversation hub
The server joins the conversation hub in resume mode: it adopts the principal’s active conversation instead of rotating it, so a thread started in the interactive REPL or on a gateway channel (Telegram, Slack…) continues seamlessly from any MCP client — and the turns made over MCP show up back in the REPL.CHATCLI_MCP_HUB=off opts out; CHATCLI_MCP_HUB_PRINCIPAL isolates the MCP thread under its own principal.
Unattended safety — CHATCLI_MCP_DANGER
stdin carries the protocol, so the server runs unattended (every interactive confirmation auto-approves, like the gateway daemon). Dangerous commands in coder_task exec calls are always hard-blocked regardless of policy; for the remaining shell-command gate, CHATCLI_MCP_DANGER=block declines dangerous commands in-band (the model sees the refusal and replans) instead of auto-approving. Default is allow, matching the gateway.
Approval prompts via elicitation
Clients that declare theelicitation capability at initialize get a better contract: coder-policy ask rules and dangerous coder_task exec commands raise an elicitation/create approval form in the client instead of the blanket behavior above. Only an explicit accept with approve: true runs the action — decline, cancel or a transport failure denies, and the model replans in-band. Clients without the capability (most wrapped CLIs) keep the exact contract of the previous section; no server→client request is ever sent to them.
No provider configured? Still useful
An MCP client brings its own model — ChatCLI’s direct tools don’t need a local LLM. Without any key/OAuth in ChatCLI, the LLM-backed tools (ask_chatcli, agent_task, coder_task) are simply hidden from tools/list, and every direct tool keeps working (persistent memory, knowledge bases, LSP, diagrams, scheduler… driven by the caller’s model). Configure a provider and restart to enable the harness tools.
Connecting from Claude Code
The agent and coder render to stdout; the backend captures that output during the run and returns it as the tool result. Direct tool calls are stdout-captured too, so a chatty plugin can never corrupt the protocol channel. Long-running calls don’t block the read loop — requests dispatch concurrently, which is what makes cancellation work.
chatcli acp
A full Agent Client Protocol server: sessions with chat/agent/coder modes, structured tool calls and plan updates, slash commands and native IDE permission dialogs — the way to run ChatCLI inside JetBrains IDEs and Zed.
- Structured updates — agent/coder runs emit native
tool_call/tool_call_update,agent_thought_chunkandplanframes; the IDE renders collapsible tool calls and a live plan instead of a streamed transcript. - Slash commands —
/coder,/config,/modeland a headless allowlist are advertised to the client and work from the IDE prompt box. - Permission dialogs — dangerous commands and security-policy
askrules raisesession/request_permission(native Allow/Reject in the IDE) instead of blanket auto-approve/block. - Cancellation —
session/cancelinterrupts an in-flight prompt and closes any open tool call. - Session restore —
session/load(capabilityloadSession: true) brings a prior session id back to life (live state, or itsmcp-<id>autosave mirror after a restart) and replays the conversation into the client;/sessionfrom the prompt box operates per session and binds to named sessions for cross-surface continuity.
~/.jetbrains/acp.json, Zed agent_servers), the command surface, security model and protocol details live on the dedicated page: ACP — ChatCLI inside your IDE.
See also
- ACP — ChatCLI inside your IDE — the ACP server in depth: IDE setup, slash commands, permission dialogs
- MCP Integration — ChatCLI as an MCP client, including
chatcli mcp add - Environment Variables —
LLM_PROVIDER,LLM_MODEL,CHATCLI_MCP_TOOLS - Command Reference — external subcommands