Agents
Nine tools, three surfaces
MCP server, Pi extension and OMP extension all call the same executors in src/tool-operations.ts, with the same schemas from src/tool-schemas.ts. They answer identically and a fix lands once.
| Tool | Kind | Does |
|---|---|---|
harnesses_detect | read | Installed harnesses and versions, scanned from PATH |
harnesses_info | read | Full metadata for one id, or a batch of up to 20 ids |
harnesses_models | exec | Models a harness can use now, optionally filtered |
harnesses_run | exec | One prompt through another harness |
harnesses_mcp_list | read | MCP servers in every config, normalized |
harnesses_mcp_add | write | Add or replace one MCP server |
harnesses_mcp_remove | write | Remove one MCP server |
harnesses_mcp_sync | write | Reset user scope configs to ~/.config/agntn/mcp.jsonc |
harnesses_agents_sync | write | Link global instructions files to the master bundle, or check |
harnesses_info with a list keeps the input order and returns an error entry beside the successful ones for an unknown id, so one typo doesn't fail the batch.
MCP
harnesses mcp
claude mcp add harnesses --scope user -- npx -y @agntn/harnesses mcp
Or in a client's config, or on the master list that mcp-servers sync distributes:
{
"mcpServers": {
"harnesses": { "command": "npx", "args": ["-y", "@agntn/harnesses", "mcp"] }
}
}
The server speaks MCP over stdio and validates every call against the published JSON Schema. Read tools are annotated read-only and idempotent; harnesses_run is marked destructive and open world, because it is.
Running another harness from an agent
harnesses_run takes id, prompt, and tools as a required boolean. The model has to choose. tools: false is the advisor without tools, tools: true the full agent, readOnly: true beside it demands a native read-only sandbox. A mode the target harness cannot provide comes back as a tool error with the retry that would work; it never widens access on its own. timeoutSeconds defaults to 600.
Cancellation follows the host's request signal, the one MCP, Pi and OMP hand to a tool when the user interrupts. It is not a JSON argument, because a model would forget to pass it.
Pi and OMP
pi install npm:@agntn/harnesses
Both extensions are declared in package.json. Results render as a collapsed preview in the terminal, with the full text once you expand the row. harnesses_run output from a long review is where that matters.
harnesses_run, what comes back is text to check against the code, not a verdict to paste. The tool returns it as text on purpose.