Claudexor
Routes coding tasks to Claude Code, Codex, Cursor, OpenCode, Antigravity or Grok Build and tracks quota
Puts budgets, verifier gates and run receipts around coding-agent jobs started from an MCP host
By Keesan (individual) JavaScript Local · stdio Developer toolsAI and MLGit and code hosting
43 popularity score ★ 296 ↓ 473/wk
Opens the app, which asks before it adds the server.
claude mcp add martinloop -- npx -y @martinloop/mcp{
"mcpServers": {
"martinloop": {
"command": "npx",
"args": [
"-y",
"@martinloop/mcp"
]
}
}
}{
"mcpServers": {
"martinloop": {
"command": "npx",
"args": [
"-y",
"@martinloop/mcp"
]
}
}
}{
"servers": {
"martinloop": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@martinloop/mcp"
]
}
}
}[mcp_servers.martinloop]
command = "npx"
args = ["-y", "@martinloop/mcp"]gemini mcp add --scope user martinloop npx -- -y @martinloop/mcpMartinLoop is a control layer for coding agents, and @martinloop/mcp is its MCP server. You give it an objective, a verifier command such as `npm test`, a spend ceiling and an attempt cap. It then hands the work to an agent CLI (Claude Code, Codex or Gemini CLI) and re-runs the verifier after each attempt. It stops when the checks pass, when the budget or attempt limit is reached, or when a policy check blocks the run. Every run ends with a VERIFIED, STOPPED or NEEDS REVIEW outcome and a stored receipt.
The server walks a host through set steps: martin_doctor, martin_plan and martin_preflight, then martin_run. In server.ts, martin_run checks the recorded workflow first and fails with policy_blocked, listing the missing steps, if the host skipped any. Further tools pause, continue or cancel a live run, read saved runs, attempts and verifier evidence, grade a run, check a PR body against the evidence, and draft or open a GitHub pull request from the receipts. Run records are kept as local JSONL files, each signed with HMAC, so later edits to a record can be detected.
In v0.8.10 the default full profile lists 24 tools, while the MCP tool reference names only 21. Missing from the reference are martin_estimate, which gives a read-only cost and route estimate, and two Arcade tools defined in arcade/capabilities.ts. martin_arcade opens a view-only panel in hosts that support MCP Apps, and martin_arcade_status reads the evidence behind that panel. The server also offers 26 martin:// resources and 16 prompts. It talks over stdio by default. Pass --http and it serves Streamable HTTP on 127.0.0.1:3033 at /mcp instead (--host, --port and --path change that), and --tool-profile directory trims the tool list.
| Runtime | Node.js 20+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Claude Code, Codex or Gemini CLI | An agent CLI signed in to its provider, for martin_run. Its model usage is billed by that provider. |
| GitHub | FreeOnly for martin_create_pr with execute=true, through a signed-in gh CLI. |
| Also |
|
npx needs Node.js 20 or later. The package brings no agent CLI: install and sign in to Claude Code, Codex or Gemini CLI yourself before calling martin_run. Install and sign in to the GitHub CLI (gh) before calling martin_create_pr with execute=true. Runs only finish as VERIFIED when you give a verifier command that your workspace can run.
Developers who already use Claude Code, Codex or Gemini CLI and want hard spend and attempt limits, a required test pass, and an auditable record around each delegated task, started from inside their MCP host. It writes code through the agent it starts and can open pull requests, so it is a poor fit if you only want read-only help. The `directory` tool profile or a host allow-list narrows what it exposes. It does not take the place of CI, code review or the coding agent itself. It is not published by Anthropic, OpenAI or Google.
19 only read, 5 change things. A ? marks an optional parameter.
martin_doctorworkingDirectory?: stringrunsDir?: stringengine?: enummartin_estimateobjective: stringengine?: enumbudgetUsd?: numberfileScope?: arrayworkingDirectory?: stringmartin_planobjective: stringworkingDirectory?: stringcontext?: stringpolicyPack?: enumverificationPlan?: arrayallowedPaths?: arraydeniedPaths?: arraymaxUsd?: numbermaxIterations?: integermaxTokens?: integermaxMinutes?: integermaxFilesChanged?: integermaxCommands?: integermartin_preflightobjective: stringworkingDirectory?: stringengine?: enummodel?: stringcontext?: stringpolicyPack?: enummaxUsd?: numbermaxIterations?: integermaxTokens?: integermaxMinutes?: integermaxFilesChanged?: integermaxCommands?: integerverificationPlan?: arrayallowedPaths?: arraydeniedPaths?: arrayworkspaceId?: stringprojectId?: stringmartin_run changesobjective: stringworkingDirectory?: stringengine?: enummodel?: stringfallbackEngines?: arraymaxUsd?: numbermaxIterations?: integermaxTokens?: integerverifyTimeoutMs?: integerproviderExecutionTimeoutMs?: integerverificationPlan?: arrayallowedPaths?: arraydeniedPaths?: arrayworkspaceId?: stringprojectId?: stringmartin_statusloopJson?: stringfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanmartin_logsfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanlimit?: integermartin_pause changesfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanreason?: stringrequestedBy?: stringmartin_continue changesfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanreason?: stringrequestedBy?: stringmartin_cancel changesfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanreason?: stringrequestedBy?: stringmartin_inspectfile?: stringrunsDir?: stringmartin_list_runsrunsDir?: stringlimit?: integerstatus?: stringlifecycleState?: stringadapterId?: stringmodel?: stringupdatedAfter?: stringmartin_triage_runsrunsDir?: stringlimit?: integerstatus?: stringlifecycleState?: stringadapterId?: stringmodel?: stringupdatedAfter?: stringincludeHealthy?: booleanmartin_get_runfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanmartin_get_attemptfile?: stringloopId?: stringrunsDir?: stringattemptIndex?: integermartin_get_verification_resultsfile?: stringloopId?: stringrunsDir?: stringmartin_run_dossierfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanmartin_dossierfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanformat?: enummartin_evalfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanmartin_pr_summaryfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanformat?: enummartin_create_pr changesfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanformat?: enumtitle?: stringbase?: stringexecute?: booleanmartin_review_prfile?: stringloopId?: stringrunsDir?: stringlatest?: booleanformat?: enumprBody?: stringmartin_arcademartin_arcade_statusloopId?: stringmartin://server/healthmartin://runs/recentmartin://runs/triagemartin://runs/latestmartin://runs/latest/summarymartin://runs/latest/proof-cardmartin://runs/latest/budget-statusmartin://runs/latest/verifier-evidencemartin://runs/latest/rollback-evidencemartin://verifiers/resultsmartin://policies/currentmartin://repo/risk-mapmartin://agent/next-stepmartin://agent/governance-statusmartin://agent/mode-statusmartin://agent/memory-summarymartin://guides/mcp-usagemartin://guides/agent-startmartin://guides/command-mapmartin://guides/ide-onboardingmartin://guides/operating-rulesmartin://guides/publish-readinessmartin://runs/{loopId}martin://runs/{loopId}/dossiermartin://runs/{loopId}/attempts/{attemptIndex}martin://runs/{loopId}/verificationui://martinloop/arcade/index.htmlmartin_startmartin_preflightmartin_triagemartin_resumemartin_provemartin_release_checkmartin_governed_coding_kickoffmartin_debug_failed_runmartin_publish_readiness_reviewmartin_triage_run_storesafe_bug_fixwrite_tests_firstsmall_refactorsecurity_reviewpr_reviewrelease_check