agent-harnesses MCP server
Recommends, compares and searches agent harnesses from the curated best-of-Agent-Harnesses list
Local MCP server that tracks specs, tasks, handoffs and health-gated completion for coding agents
By Enmanuel Magallanes Pinargote (individual) TypeScript Local · stdio Developer toolsProductivity
50 popularity score ★ 184 ↓ 397/wk
Opens the app, which asks before it adds the server.
npm install -g @cardor/agent-harness-kit
ahk initclaude mcp add agent-harness-kit -- ahk serve{
"mcpServers": {
"agent-harness-kit": {
"command": "ahk",
"args": [
"serve"
]
}
}
}{
"mcpServers": {
"agent-harness-kit": {
"command": "ahk",
"args": [
"serve"
]
}
}
}{
"servers": {
"agent-harness-kit": {
"type": "stdio",
"command": "ahk",
"args": [
"serve"
]
}
}
}[mcp_servers.agent-harness-kit]
command = "ahk"
args = ["serve"]gemini mcp add --scope user agent-harness-kit ahk -- serveAgent Harness Kit (AHK) is a command-line tool, `ahk`, that gives AI coding agents in one project a shared way of working. You run `ahk init` once, and it writes the native MCP config plus agent and skill files for six coding clients, among them Claude Code and Codex CLI. After that each client starts `ahk serve`, a local stdio MCP server that holds the record of the work.
Specs and use cases stay as Markdown under `docs/`. Tasks, logged actions and handoffs between the five roles (lead, explorer, consultant, builder, reviewer) go into a SQLite database, either `.harness/harness.db` in the project or a per-user store. Claiming a task runs your own health script first. If that fails the task is blocked, and code fixes then need a recorded repair authorisation. Marking it done reruns the script and only closes the task on a pass.
OpenCode V2 is a separate provider from the older `opencode` one. New projects pick it in `ahk init`, and existing ones move with `ahk migrate --to opencode-v2`, which backs up the v1 files first.
The server registers 69 tools. 37 of them live in `src/core/mcp-tools.ts` and handle specs, tasks and handoffs along with health runs. The other 32 are `ahk.*` tools generated in `src/core/maintenance-tools.ts` from a list of CLI operations, from init and build to exports, the dashboard and sounds. Sync, the migrations and reset are split into a plan tool and an apply tool. Model changes are not: `ahk.models.apply_defaults` overwrites the saved model choice of all five roles in one call and regenerates their files, keeping backups. Codex roles get models from the live catalog. Claude Code, Cursor and OpenCode V2 roles get `inherit`. Paging is capped in code. `specs.list` returns 50 documents unless asked for up to 100, and `specs.get` returns 8000 characters of a body per call, 12000 at most.
The makers are clear that the instructions AHK writes for agents are not a security boundary. The model and its permissions come from your coding client.
| Runtime | Node.js 22.14+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
Node.js 22.14.0 or newer on the 22.x line, or 23.6.0 or newer (earlier 23.x releases are excluded). Install the package globally with npm, pnpm or Bun, then run `ahk init` in the project. Your client has to start the server inside that project folder.
Suits a developer or team on Claude Code, Codex CLI, Cursor, Grok Build or OpenCode (v1 or V2) who wants specs, tracked tasks, role handoffs and a test-gated "done" kept in one local place. It runs on your machine with no sign-in. It is as much a workflow framework as a tool server: it writes agent and skill files and expects you to follow its roles and approval steps. If you only need an assistant to read or edit files, a plain file-system server is lighter. It is not published by any of the clients it supports.
17 only read, 21 change things. A ? marks an optional parameter.
specs.listspecKind?: enumstatus?: stringquery?: stringoffset?: integerlimit?: integerspecs.getslug: stringoffset?: integerlimit?: integerspecs.searchquery: stringspecKind?: enumstatus?: stringoffset?: integerlimit?: integerspecs.relatedslug: stringrelationships?: arrayspecs.create changesslug: stringtitle: stringdescription: stringspecKind: enumstatus?: stringsourceSpec?: stringsourceUseCases?: arraycontent: stringspecs.update_metadata changesslug: stringtitle?: stringdescription?: stringstatus?: stringsourceSpec?: stringsourceUseCases?: arrayspecs.update_content changesslug: stringcontent: stringspecs.transition changesslug: stringstatus: stringspecs.link changesslug: stringtargetSlug: stringrelationship: enumspecs.unlink changesslug: stringtargetSlug: stringrelationship: enumspecs.validatehealth.run changestaskId: numberactions.start changestaskId: numberagent: stringactions.write changesactionId: numbersectionType: stringcontent: stringactions.complete changesactionId: numbersummary: stringactions.gettaskId: numberactions.listtaskId: numberagent?: stringstatus?: enumcursor?: stringlimit?: integeractions.get_by_idactionId: numberactions.sections.listactionId: numbertypes?: arraycursor?: stringlimit?: integeractions.sections.getsectionId: numberoffset?: integerlength?: integeractions.handoff.write changesactionId: numberrecipient: enumgoal: stringcompleted: arraydecisions: arrayfiles: arrayverification: arrayblockers: arraynextStep: stringactions.handoff.gettaskId: numberrecipient?: enumtasks.getstatus?: enumincludeArchived?: booleanarchivedOnly?: booleantasks.claim changesid: numberagent: stringtasks.repair.begin changestaskId: numberactor: stringreason: stringscope: stringtasks.update changesid: anystatus: enumdocs.searchquery: stringtasks.acceptance.update changescriterionId: numbertasks.acceptance.gettaskId: numbertasks.add changestitle: stringslug?: stringdescription?: stringacceptance?: arraytasks.edit changesid: anytitle?: stringdescription?: stringacceptance?: arraytasks.archive changesid: numbertasks.unarchive changesid: numberpermissions.checkdeps.snapshot changesdeps.checkahk.doctordb?: booleanahk.models.apply_defaults changesprovider?: enum