- Fix codespell: add ignore words (shouldBe, amountIn, MapPin, summar) - Fix typos in prompt_coder.md, git_worktree.rs, codex_mcp_interface.md - Remove codex-runners runner groups (use standard GitHub runners) - Update stage_npm_packages.py to use hanzoai/dev repo - Skip npm staging test in ci.yml (handled by release workflow) - Replace windows-x64/arm64 with windows-latest - Replace ubuntu-24.04-arm with ubuntu-latest
5.1 KiB
Hanzo Dev MCP Interface [experimental]
This document describes Hanzo Dev’s experimental MCP interface: a JSON‑RPC API that runs over the Model Context Protocol (MCP) transport to control a local Hanzo Dev engine.
- Status: experimental and subject to change without notice
- Recommended entry point:
dev mcp(alias:dev acp; both wrap the same binary used by the CLI) - Underlying Rust binary (for development):
cargo run -p dev-mcp-server - ACP compatibility: surfaces
session/new+session/promptas MCP tools and emitssession/updatenotifications - Transport: standard MCP over stdio (JSON‑RPC 2.0, line‑delimited)
Overview
Hanzo Dev exposes a small set of MCP‑compatible methods to create and manage conversations, send user input, receive live events, and handle approval prompts. The types are defined in app-server-protocol/src/protocol.rs and reused by the MCP server implementation in mcp-server/.
At a glance:
- Conversations
newConversation→ start a Hanzo Dev sessionsendUserMessage/sendUserTurn→ send user input into a conversationinterruptConversation→ stop the current turnlistConversations,resumeConversation,archiveConversation
- Configuration and info
getUserSavedConfig,setDefaultModel,getUserAgent,userInfo
- Auth
loginApiKey,loginChatGpt,cancelLoginChatGpt,logoutChatGpt,getAuthStatus
- Utilities
gitDiffToRemote,execOneOffCommand
- Approvals (server → client requests)
applyPatchApproval,execCommandApproval
- Notifications (server → client)
loginChatGptComplete,authStatusChangedev/eventstream with agent events
See dev for full type definitions and exact shapes: app-server-protocol/src/protocol.rs.
Starting the server
Run Hanzo Dev as an MCP server and connect an MCP client:
dev mcp-server | your_mcp_client
For a simple inspection UI, you can also try:
npx @modelcontextprotocol/inspector dev mcp-server
Use the separate dev mcp subcommand to manage configured MCP server launchers in config.toml.
Conversations
Start a new session with optional overrides:
Request newConversation params (subset):
model: string model id (e.g. "o3", "gpt-5.1", "gpt-5.1-dev")profile: optional named profilecwd: optional working directoryapprovalPolicy:untrusted|on-request|on-failure|neversandbox:read-only|workspace-write|danger-full-accessconfig: map of additional config overridesbaseInstructions: optional instruction overrideincludePlanTool/includeApplyPatchTool: booleans
Response: { conversationId, model, reasoningEffort?, rolloutPath }
Send input to the active turn:
sendUserMessage→ enqueue items to the conversationsendUserTurn→ structured turn with explicitcwd,approvalPolicy,sandboxPolicy,model, optionaleffort, andsummary
Interrupt a running turn: interruptConversation.
List/resume/archive: listConversations, resumeConversation, archiveConversation.
Event stream
While a conversation runs, the server sends notifications:
dev/eventwith the serialized Hanzo Dev event payload. The shape matchescore/src/protocol.rs’sEventandEventMsgtypes. Some notifications include a_meta.requestIdto correlate with the originating request.- Auth notifications via method names
loginChatGptCompleteandauthStatusChange.
Clients should render events and, when present, surface approval requests (see next section).
Approvals (server → client)
When Hanzo Dev needs approval to apply changes or run commands, the server issues JSON‑RPC requests to the client:
applyPatchApproval { conversationId, callId, fileChanges, reason?, grantRoot? }execCommandApproval { conversationId, callId, command, cwd, reason? }
The client must reply with { decision: "allow" | "deny" } for each request.
Auth helpers
For ChatGPT or API‑key based auth flows, the server exposes helpers:
loginApiKey { apiKey }loginChatGpt→ returns{ loginId, authUrl }; browser completes flow; thenloginChatGptCompletenotification followscancelLoginChatGpt { loginId },logoutChatGpt,getAuthStatus { includeToken?, refreshToken? }
Example: start and send a message
{ "jsonrpc": "2.0", "id": 1, "method": "newConversation", "params": { "model": "gpt-5.1", "approvalPolicy": "on-request" } }
Server responds:
{ "jsonrpc": "2.0", "id": 1, "result": { "conversationId": "c7b0…", "model": "gpt-5.1", "rolloutPath": "/path/to/rollout.jsonl" } }
Then send input:
{ "jsonrpc": "2.0", "id": 2, "method": "sendUserMessage", "params": { "conversationId": "c7b0…", "items": [{ "type": "text", "text": "Hello Hanzo Dev" }] } }
While processing, the server emits dev/event notifications containing agent output, approvals, and status updates.
Compatibility and stability
This interface is experimental. Method names, fields, and event shapes may evolve. For the authoritative schema, consult app-server-protocol/src/protocol.rs and the corresponding server wiring in mcp-server/.