perch-agent
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@perch-agentfix the failing tests in ./app and show me the command output"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
⚡ perch-agent
Delegate tasks from Claude Code / opencode to Perch AI as an autonomous worker agent.
One MCP server. Your orchestrator keeps the plan — Perch does the work, verifies it, and comes back with evidence.
Architecture · Quick Start · Tools · Benchmarks · Troubleshooting
🏗 Architecture
Claude Code (or opencode) stays the orchestrator. This server translates one MCP tool call into the
official perch CLI (perch run "<task>" --json) — no unofficial internal APIs, no session-token
proxying — and returns a structured result: final answer, thread id, model identity and token usage.
Related MCP server: outsrc
✨ Features
🔁 Async job model — long tasks return a
job_idin seconds; pollperch_job_statusor cancel withperch_job_cancel(kills the whole process tree).🧭 Karpathy guidelines baked in — every delegated task is prepended with working discipline: surface assumptions, minimal change, surgical scope, verification with real command output. (
guidelines: falseto disable.)📊 Live progress —
notifications/progressevery 5s while a task runs; renders in Claude Code.🧵 Thread continuation — pass a previous
thread_idand the worker remembers the conversation.🎯 Model pinning — tier (
standard/pro) or pin id (qwen-3.8-max,glm-5.3-flash-starter, …).🧾 Evidence-first output —
assistant_text,model_id,usage,thread_id, exit codes, and human-readable plan-gate errors instead of raw stack traces.🔒 Local-first — everything runs on your machine; the only network hop is the official CLI → Perch's own API, using your existing login. No keys to manage.
🧪 Battle-tested — unit + E2E suite, plus a real benchmark harness (Exercism polyglot, agentic coding, differential reasoning) included in
bench/.
🚀 Quick Start (3 Steps)
Step 1 — Prerequisites
Node.js 20+
Perch CLI installed and logged in (the MCP reuses this session — no API key):
npm i -g perchai-cli
perch login # browser sign-in (Google/GitHub)
perch status # must show "Signed in as …"Step 2 — Get this repo
git clone https://github.com/DMCconnect/perch-agent-mcp.git
cd perch-agent-mcp
npm install
npm test # parser self-checkStep 3 — Register with your harness
Claude Code (user scope):
claude mcp add --scope user perch-agent \
-e PERCH_AGENT_MODEL=qwen-3.8-max \
-e PERCH_AGENT_EFFORT=high \
-- node "C:/path/to/perch-agent-mcp/index.js"
claude mcp list # → perch-agent: ✓ connectedFor long delegations also set
MCP_TOOL_TIMEOUT=900000in your environment (Claude Code's default MCP call timeout is short).
opencode (~/.config/opencode/opencode.json):
{
"mcp": {
"perch-agent": {
"type": "local",
"command": ["node", "C:/path/to/perch-agent-mcp/index.js"],
"enabled": true,
"timeout": 1200000
}
}
}Any other MCP client — it's a plain stdio server:
command: node <path>/index.jsDone. In your harness, say: "Use perch-agent to fix the failing tests in ./app".
🛠️ Tools
Tool | What it does |
| Spawn a Perch worker run. Params: |
| Live status/result of a job: state, elapsed, |
| Kill a running job's whole process tree ( |
| Free local check: CLI version, sign-in state, live job list. |
Result shape (success):
{
"job_id": "pj-95c583b8",
"status": "finished",
"perch_status": "completed",
"ok": true,
"thread_id": "cli-cwd-a713c141ff2d4ddb",
"assistant_text": "…final worker answer…",
"model_id": "Qwen/Qwen3.8-Max",
"usage": { "input_tokens": 15761, "output_tokens": 30, "total_tokens": 24495 }
}🎛️ Environment
Variable | Default | Purpose |
|
| Default model pin for every delegation. |
|
| Default reasoning effort. |
| OS temp dir | Fallback |
| auto-resolve | Explicit path to the CLI's JS entry (see Troubleshooting #1). |
🔥 The free Qwen 3.8 Max pin
Qwen 3.8 Max is free on the Perch Starter plan until Nov 20, 2026 (announcement). To make it the default worker:
PERCH_AGENT_MODEL=qwen-3.8-max PERCH_AGENT_EFFORT=highAfter the promo expires, the CLI rejects the pin with a clear plan error — switch back to
standard (or any current Starter pin) with one env change.
🧠 The karpathy preamble
Every delegate_to_perch task ships with this discipline header (the whole point of a worker —
it must not wander, and it must prove it finished):
1. Think before coding — state your assumptions explicitly…
2. Simplicity first — the minimum change that solves the problem…
3. Surgical changes — touch only what the task requires…
4. Goal-driven verification — run the tests/builds, quote the real command
and its output as evidence. Never claim verification without evidence.Disable per-call with guidelines: false.
📈 Benchmarks
Real runs by this repo's harness against the live Perch service (Starter plan), graded objectively — pytest/exit-codes/answer-checking, never the model's self-report:
Suite | Items | standard (Qwen 3.6-35B) | qwen-3.8-max |
Math / logic / JS-reasoning | 16 | 16/16 | 16/16 |
Exercism polyglot (pytest-graded) | 3 exercises | ✅ bowling·rectangles·zebra (84–126s) | ✅ all (127–153s) |
Agentic coding (build / debug-tests / stateful CLI) | 3 | ✅ 3/3 | ✅ 3/3 (agentic run 2.5× faster) |
Mid-run cancellation | — | ✅ clean kill | ✅ clean kill |
Is the pinned model real? Perch's own accounting reports
Qwen/Qwen3.8-Maxper turn and the timing fingerprint differs fromstandardper task type — while short-form reasoning scores are tied. Harness:bench/· methodology borrowed from aider's polyglot benchmark (Exercism + pytest, self-correction loop).
🧪 Testing
npm test # parser hardening self-check
npm run e2e # full MCP E2E: happy path, threads, error surfacing, async+cancel
npm run bench:polyglot # Exercism exercises, pytest-graded (needs: python + pytest)The E2E covers: inline completion, thread continuation, plan-gate error surfacing,
async job_id handoff, and mid-run cancellation.
🔧 Troubleshooting
Symptom | Cause / fix |
| Node ≥ 20.12 refuses |
| Harness-side timeout. Claude Code: set |
| Your plan doesn't cover that surface or model pin. The CLI's plan-gate message is surfaced verbatim in |
Status says "not signed in" but runs work | Stale access token — |
Worker asks instead of writing files | Don't override |
Headless | The 5.5-model safeguard classifies project context, not just prompts — aggressive |
🤖 For agents (machine-readable)
llms.txt— condensed install + tool contract for LLM agents.Tool schemas are standard MCP (
tools/list); this server speaks plain stdio JSON-RPC.Safe to auto-install: no telemetry, no keys, no network beyond the official CLI → Perch.
📄 License
MIT — free to use, modify, and share.
🙏 Credits
Discipline header from the karpathy-guidelines pattern.
Benchmark methodology from aider's polyglot benchmark (Exercism + pytest).
Diagram style inspired by Cocoon-AI/architecture-diagram-generator.
Reliability patterns studied from glm-mcp and opencode-mcp.
Available Tools
4 toolsdelegate_to_perchDelegate task to Perch AIADestructive
Delegate a task to Perch AI (worker agent) via the official perch CLI. Perch runs autonomously in the given working directory with its own tools (bash, file read/write, skills) on the signed-in Perch plan. Karpathy working guidelines (assumptions, simplicity, surgical scope, evidence-based verification) are prepended to every task by default (guidelines:false to disable). Returns the final answer, thread id, and status. Long-running tasks: pass wait_seconds to bound blocking; if still running you get a job_id — poll perch_job_status.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Working directory Perch operates in (default: temp dir). | |
| mode | No | agents = autonomous execution with tools; ask = answer only; plan = plan only. | agents |
| task | Yes | Natural-language task for Perch to execute autonomously. | |
| model | No | Model tier or pinned model id: "standard", "standard 1m", "pro", "pro 1m", or a pin id like "qwen-3.8-max" (free on Starter until 2026-11-20, effort off..high). Defaults to $PERCH_AGENT_MODEL or "standard". | standard |
| effort | No | Reasoning effort. Defaults to $PERCH_AGENT_EFFORT or "high". Starter plans cap effort at high; some promo models only accept off..high. | high |
| persona | No | Perch persona. | |
| thread_id | No | Continue an existing Perch thread (from a previous result's thread_id). | |
| guidelines | No | Prepend the karpathy working guidelines (assumptions, simplicity, surgical scope, evidence-based verification) to the task. | |
| permission | No | Perch permission mode. take_the_wheel = never asks before writes/commands (required for autonomous delegation; auto_review makes the worker stop and ask, ending the turn). | take_the_wheel |
| wait_seconds | No | Seconds to block waiting for completion before returning a running job_id. | |
| timeout_seconds | No | Hard limit; the Perch process tree is killed after this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring destructive/openWorld/non-idempotent, the description still adds substantial context: the worker has its own bash and file read/write tools, runs against the signed-in Perch plan, and permission=take_the_wheel means it never asks before writes or commands. It also discloses the return shape and the job_id escape hatch, which is exactly the kind of behavioral detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the execution model, then the guidelines flag, then the long-running flow — a sensible order with little filler. Minor redundancy: the guideline contents are listed in both the description and the guidelines parameter's schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter open-world delegating tool with no output schema, the description covers the execution model, permission implications, billing surface, return values, and the async continuation path. Nothing an agent needs in order to call it correctly is missing, and secondary params (model, effort, persona) are fully documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns above that by tying two parameters to an workflow: guidelines toggles the prepended guideline block and wait_seconds bounds blocking before a job_id is returned. That causal link is not spelled out in the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delegate a task to Perch AI (worker agent) via the official perch CLI") and immediately characterizes the resource: it runs autonomously in a working directory with its own tools. That framing distinguishes it from the sibling polling/status tools, which the description also names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: use wait_seconds to bound blocking on long tasks, and poll perch_job_status when a job_id comes back; also explains that guidelines:false disables the prepended guidelines. It stops short of saying when not to delegate (e.g., trivial work better handled inline) or when perch_status beats this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
perch_job_cancelCancel Perch jobBDestructiveIdempotent
Kill a running delegated Perch job (process tree).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the risk profile is known. The description adds one genuinely useful behavioral detail beyond them: cancellation kills the whole process tree, not just the job record. It does not say whether the call errors on a completed job or whether it waits for termination, and idempotentHint=true is left unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the action and target come first and the parenthetical scope detail is placed right where it is needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema tool with an undocumented parameter, the description is thin: no return behavior, no handling of already-finished or nonexistent jobs, no source for job_id, and no note that repeated calls are safe despite idempotentHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter has 0% schema description coverage (just a string with minLength 1), so the description carries the full burden and says nothing about job_id. It does not state where a job_id comes from (presumably the delegate_to_perch response) or whether a name or prefix could be passed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Kill a running delegated Perch job" gives a specific verb (kill) and a specific resource (a delegated Perch job), and "(process tree)" scopes what kill means. It is clearly distinguishable from the sibling status/delegate tools, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no mention of alternatives such as checking perch_job_status first. The only guidance is implied by the word "running," which hints the job must be active, but nothing says what happens if it already finished.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
perch_job_statusPerch job statusCRead-onlyIdempotent
Get status/result of a delegated Perch job by job_id.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds modest value by indicating the call returns both status and, once ready, the result, but says nothing about whether results expire, whether polling is required, or what terminal states exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb and resource, with no filler or redundancy. It is efficient, though efficiency here comes partly from under-specification rather than tight editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one required parameter, no output schema and no result-format documentation, the description does far too little: it never describes what a 'status' value looks like, whether the call is safe to poll repeatedly (though annotations imply idempotence), or how it relates to perch_job_cancel. The annotations carry the safety story, but the return semantics remain unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description only restates the parameter name ('by job_id') without format, provenance, or validation details. Since the sole input is required, the description should clarify where the job_id comes from (presumably delegate_to_perch) and that it is not a job name or index.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource pair ('Get status/result of a delegated Perch job') and ties it to a job_id, so the agent knows exactly what the tool returns. It stops short of differentiating itself from the sibling perch_status, leaving the boundary between the two ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this versus perch_status or perch_job_cancel, both of which are plausibly relevant to a non-terminal job. The phrase 'delegated Perch job' hints that it follows delegate_to_perch, but that is inference rather than stated guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
perch_statusPerch CLI & server statusARead-onlyIdempotent
Free local check (no model call): perch CLI presence and sign-in state, plus this server's live job list. Call before delegating if unsure the worker is ready.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds genuinely new context: the check runs locally and costs no model call, which is the key operational fact for an agent deciding whether to probe first.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight clauses: what it returns, then when to call it. The cost note ('no model call') is front-loaded alongside the capability, and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, no-output-schema probe, the description covers what is inspected and when to use it. It stops short of describing the result shape or what state means 'not ready' (e.g., whether an unsigned CLI is a hard blocker), which would fully close the loop for an agent gating a delegation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the schema is empty and fully consistent with the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States precisely what the tool reports: perch CLI presence, sign-in state, and this server's live job list. That enumeration of returned facts distinguishes it from perch_job_status (single-job) and delegate_to_perch (work dispatch) without needing the schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit call condition — 'Call before delegating if unsure the worker is ready' — which ties it directly to delegate_to_perch. It does not state when to skip it (e.g., if readiness is already known), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.0- First observed
delegate_to_perch - First observed
perch_job_cancel - First observed
perch_job_status - First observed
perch_status
TDQS
Scored across 4 tools
Each tool maps to a distinct phase of the delegation lifecycle: delegate, poll a job, cancel a job, and check local CLI readiness. The only mild overlap is between perch_status and perch_job_status, but descriptions make clear one is a per-job query and the other a free local sign-in/health check.
All names are snake_case and share a perch_ namespace, but the verb/noun ordering is mixed: delegate_to_perch is verb-first, while perch_job_status and perch_job_cancel are noun-first. It is still readable but not a single predictable pattern.
Four tools is thin but well-matched to a focused delegation wrapper: one action plus the poll/cancel/health trio needed to operate it. Nothing feels redundant or gratuitous.
The delegated-job lifecycle is covered end to end: readiness check, launch with optional bounded wait, status polling, and cancellation. Minor gaps like explicit job listing or cleanup are largely absorbed by perch_status reporting the live job list.
Maintenance
Related MCP Connectors
Hand tasks, bugs and finished work to AI coding agents, and get back a write-up with evidence.
Autonomous AI developers on your own infrastructure: assign a task, get a pull request.
AI work orchestration for plans, tasks, teams, and coding-agent dispatch.
Hire AI workers that run on schedule, report back and act with your OK. Or deploy private models.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables orchestrators to drive Claude Code as a structured software-engineering worker over HTTP, with tools to submit coding tasks, poll for normalized results, resume, review, and cancel jobs.-
- AlicenseNot gradedqualityCmaintenanceLets an agent delegate coding tasks and reviews to Claude Code, Codex or Grok Build CLIs running locally in isolated git worktrees, then poll an inbox for the status, question or final answer. Each caller sees only its own threads.17 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables Codex or Claude Code to orchestrate persistent Antigravity CLI workers as independent implementers and testers within restricted workspace roots. It supports asynchronous task dispatch, progress polling, result inspection, follow-up messages, and cancellation with bounded, audited local event logging.32 npm4MIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude Code, Cursor, and Codex users to orchestrate plan/build/review workflows across host or CLI models with a spec gate, tool vetting, hard per-run and per-day cost/token limits, safe defaults, and clear logs.0MIT