MCP server
The MCP server is the worktree mode of frites: a Model Context Protocol server that dispatches a coding task to multiple full agents in isolated git worktrees, vets each with the repo's tests, and returns one recommended diff. The package is @frites/mcp (apps/mcp); its binary is frites-mcp and it talks to the MCP client over stdio.
For the full tool input/output schemas, see ../reference/mcp-tools.md.
How it runs (read this first)
@frites/mcp is deliberately unbuilt and unpublished:
apps/mcp/package.jsonhas nodescriptionand nobuildscript: there is notsconfig.build.jsonstep and no compiled output.It is marked
"private": true, so it is not published to npm.Both
mainandbinpoint at the TypeScript source (./src/index.ts), and the shebang is#!/usr/bin/env -S npx tsx, so it is executed directly throughtsx.
There is no apps/mcp/dist, so do not configure a client to run apps/mcp/dist/index.js. The MCP client launches the server through a wrapper chain (pnpm → tsx → node) against the source file.
Because that wrapper chain does not forward shutdown to the grandchild server, the server self-terminates the moment its client goes away. It watches every disconnect path: stdin end/close (the client closed the pipe), SIGTERM/SIGINT, and reparenting to PID 1 (the launcher died and orphaned it, polled every 5s). This prevents stray servers from piling up across sessions. stdout is the MCP channel, so all logging goes to stderr.
Tools
The server registers two tools (apps/mcp/src/index.ts):
frites_implement
Dispatches a coding task to multiple full agents (claude/codex) in isolated git worktrees, filters them with the repo's tests, and returns one vetted diff plus a comparison. It is long-running (minutes).
Inputs: task (what to implement or fix), repoPath (absolute path to the target git repo), optional n (1–10 agents), optional agents (comma list of kinds, e.g. claude,codex), optional acceptanceCriteria, and optional baseRef (git ref to branch from, default HEAD).
It loads config from repoPath, builds the engine dependencies, runs the engine, and forwards engine events as MCP notifications/progress (when the client supplied a progressToken). On completion it persists the run under <repoPath>/.frites/runs/<runId>/ (one .diff per candidate plus a result.json) and returns a formatted comparison text, a resource_link to each candidate diff, and structured content. On failure it returns an error result with the message.
frites_apply
Applies a diff from a previous frites_implement run onto a fresh branch frites/<runId>. It applies the recommended candidate by default, or a specific one via candidateId (e.g. to land a tighter passing child instead of the synthesized result). It requires a clean working tree and never pushes.
Inputs: runId, repoPath, optional candidateId. It reads the persisted result.json, resolves the chosen candidate (erroring clearly if the named candidate is missing or has no diff), and applies it to a new branch via the worktree manager, returning the branch name for review and commit.
Runtime
The runtime helpers live in apps/mcp/src/runtime.ts:
buildEngineDepswires the worktree manager (@frites/isolation), the agent runner (makeRunAgentoverdefaultRunnersfrom@frites/agents, honoringpassApiKeys/FRITES_PASS_API_KEYS), the oracle (auto-detected per repo viadetectOracle), and a run-id generator. It threads the MCP request'sAbortSignalinto the engine so a cancelled call cancels the run.parseAgentsturns aclaude,codexstring into agent specs (prefix-matched toclaude-cli/codex-cli).persistRun/readResultown the on-disk run record under.frites/runs/<runId>/.describeEventmaps each engine event to a one-line progress message;formatResultTextrenders the human-facing comparison table (agent, kind, status, files, Δlines, tokens, oracle) and the synthesis/cost summary;toStructuredproduces the machine-readable result returned asstructuredContent.
The actual council/synthesis/reconciliation logic is the shared engine in @frites/core (see core.md), not reimplemented here.
Dependencies
@frites/mcp depends on @frites/agents, @frites/core, @frites/isolation, the MCP SDK (@modelcontextprotocol/sdk), and zod for the tool input schemas.
Last updated