Skip to main content
Beyond being an MCP client (consuming external tools — see MCP Integration), ChatCLI can also be a server: other agents/clients — Claude Code, Claude Desktop, IDEs, editors, even another ChatCLI — can drive ChatCLI over the protocol.
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 (alias mcp-serve) — an MCP (Model Context Protocol) server. Negotiates revision 2025-03-26 or 2024-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 readOnlyHint annotation 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 through prompts/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 the elicitation 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

Or in a JSON config:
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_chunk and plan frames; the IDE renders collapsible tool calls and a live plan instead of a streamed transcript.
  • Slash commands/coder, /config, /model and a headless allowlist are advertised to the client and work from the IDE prompt box.
  • Permission dialogs — dangerous commands and security-policy ask rules raise session/request_permission (native Allow/Reject in the IDE) instead of blanket auto-approve/block.
  • Cancellationsession/cancel interrupts an in-flight prompt and closes any open tool call.
  • Session restoresession/load (capability loadSession: true) brings a prior session id back to life (live state, or its mcp-<id> autosave mirror after a restart) and replays the conversation into the client; /session from the prompt box operates per session and binds to named sessions for cross-surface continuity.
Full setup (JetBrains ~/.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