Turns Claude Code into an orchestratable sub-agent by spawning and controlling headless sessions through the claude-wrap library. You get eight tools: spawn sessions in a working directory, send prompts with claude_ask and wait for parsed state, fire raw input with claude_send for long tasks, poll status for busy/mode/tokens/permissions, grab transcript snapshots, list all sessions, and approve or deny permission prompts explicitly instead of bypassing them. Built on node-pty, requires the claude CLI on your PATH. The primary use case is letting one Claude instance manage a fleet of other Claude Code sessions as workers, with full lifecycle control and state parsing for each.
An MCP server that lets any MCP-capable agent
(Claude Code, Claude Desktop, Cursor, …) spawn and drive Claude Code sessions
— effectively turning Claude Code into an orchestratable sub-agent fleet. Built
on the claude-wrap library.
claude CLI on your PATH (the sessions run real Claude Code).claude-wrap pulls the native node-pty
addon, so a prebuilt binary or a C/C++ toolchain is needed at install time.npm install -g claude-wrap-mcp
# then, in Claude Code:
claude mcp add claude-wrap -- claude-wrap-mcp
Or via JSON config (.mcp.json / claude_desktop_config.json):
{
"mcpServers": {
"claude-wrap": { "command": "npx", "args": ["-y", "claude-wrap-mcp"] }
}
}
Once published, it's also discoverable in the MCP Registry as io.github.Alex-Kaff/claude-wrap-mcp.
| Tool | What it does |
|---|---|
claude_spawn | Start a headless session in an absolute cwd. Returns a sessionId. |
claude_ask | Send a prompt, wait for idle, return transcript tail + parsed state. Returns status:"busy" on timeout (not an error). |
claude_send | Send raw input (text / line / key) without waiting — for long tasks; then poll. |
claude_status | Parsed state: busy, mode, tokens, pending permission prompt, todos, tool calls. |
claude_snapshot | The rendered transcript lines. |
claude_list | All sessions — in-process (spawned here) and external (discovered windows). |
claude_resolve_permission | approve / deny a pending permission prompt. |
claude_stop | Shut down an in-process session. |
Permission prompts are surfaced, not auto-bypassed: when claude_ask /
claude_status report a pending permissionPrompt, resolve it with
claude_resolve_permission.
claude-wrap ClaudeManager and
drives headless sessions directly — full parsed state and lifecycle.claude-wrap-inject bin. Best-effort; claude_stop is
declined for instances this server did not spawn.pnpm install
pnpm --filter claude-wrap-mcp build # tsup -> dist/ (ESM + .d.ts, shebang on the bin)
pnpm --filter claude-wrap-mcp test # vitest, in-memory MCP client against fakes
pnpm --filter claude-wrap-mcp inspect # @modelcontextprotocol/inspector on the built server
MIT © Alex Kaffetzakis