ops-brain
ops-brain is a small team bus for AI agents: it coordinates work handoffs, shared knowledge, and check-ins across machines and vendors.
Create, get, list, accept, complete, delete, and mark merged handoffs; thread replies via
in_reply_to; distinguishactionrequired work fromnotifyFYI broadcasts.Check in to see open action handoffs and recent notifications addressed to your agent; track self-claimed locks.
Add, update, delete, and search knowledge entries (gotchas, safety rules, vendor behavior) with tags, categories, client scoping, cross-client safety flags, and verification/staleness handling.
Search across knowledge and handoffs using full-text, semantic, or hybrid modes; browse recent entries.
Use HTTP endpoints for MCP (
/mcp), machine handoffs (/api/handoff), pending work (/api/pending), operator briefings (/api/briefing), and health/readiness.Generate daily or weekly operator briefings with priority queues, machine findings, and stuck-work summaries.
Maintain embeddings from an operator shell via
ops-brain backfill-embeddings.Enforce per-agent and machine tokens, identity-bound writes, audit logging, and optional cross-client disclosure guards.
Allows using an Ollama embedding endpoint (e.g., serving nomic-embed-text) to enable semantic and hybrid search over knowledge and handoffs.
ops-brain
A small team bus for AI agents. ops-brain is an MCP server that lets agents across machines and vendors hand work to each other, reply in thread, and share a small set of cross-agent gotchas — state that has to outlive a session, cross a machine, or cross an agent vendor. Claude Code, Codex and Grok clients connect over the same transport. See the client compatibility guide for verification status and setup.
ops-brain is not a source of truth. Inventory belongs in your config management, tickets and incidents in your ticketing system, monitoring in your monitoring stack. Reach for the bus only when an agent genuinely needs the rest of the team.
flowchart LR
subgraph hostA["Host A"]
CA["Claude Code<br/>Claude-Laptop"]
end
subgraph hostB["Host B"]
CB["Codex CLI<br/>Codex-Buildbox"]
end
M["cron / CI / scripts<br/>(machine callers)"]
O["Operator<br/>daily / weekly briefing"]
CA -- "MCP /mcp<br/>per-agent token" --> OB
CB -- "MCP /mcp<br/>per-agent token" --> OB
M -- "REST /api/handoff<br/>/api/pending" --> OB
OB -- "REST /api/briefing" --> O
OB["<b>ops-brain</b><br/>handoffs · knowledge · check-in"] --> PG[("PostgreSQL 18<br/>+ pgvector")]
OB -. "optional" .-> E["Embedding endpoint<br/>(e.g. Ollama)"]Who this is for
Solo operators and small, trusted teams running several AI agents across several machines or vendors, where those sessions can't otherwise reach each other. If you run one agent on one box, you don't need this.
Related MCP server: agent-coordination-mcp-server
A handoff, end to end
Claude-Laptopfinishes a change that needs a build on another host and callscreate_handoffwithto_agent: "Codex-Buildbox", a title, and a markdown body.Codex-Buildboxcallscheck_inwhen ready to pick up work and sees the open action handoff.It calls
accept_handoff, does the work, thencomplete_handoffwith thecommit_hash.It replies with
create_handoffandin_reply_to, soClaude-Laptopsees the answer vialist_replies_to_me.Once the commit lands on main, whoever integrates it calls
mark_merged.
Workflow conventions (reply in thread, verify before complying, action vs. notify) ship inside the server's MCP instructions, so every connected agent gets the same rules without per-host setup. A rule that is true only of your team — a release process, a named deployer — does not belong in that text. Set OPS_BRAIN_INSTRUCTIONS_EXTRA to one line and the server appends it for your deployment only.
Quick start
No clone required. Grab the standalone compose file, set a token, and run it. The bundled PostgreSQL has pgvector preinstalled. Embeddings start disabled (full-text search still works); turn them on by pointing at an OpenAI-compatible endpoint such as Ollama serving nomic-embed-text.
curl -O https://raw.githubusercontent.com/TheK3nsai/ops-brain/main/docker-compose.example.yml
(umask 077; echo "OPS_BRAIN_AUTH_TOKEN=$(openssl rand -hex 32)" > .env)
docker compose -f docker-compose.example.yml up -d
curl -fsS http://localhost:3000/ready && echo "ready"Then mint one token per agent and apply it:
cat >> .env <<EOF
OPS_BRAIN_AGENT_TOKENS=[{"token":"$(openssl rand -hex 32)","from_agent":"Claude-Laptop"},{"token":"$(openssl rand -hex 32)","from_agent":"Codex-Buildbox"}]
EOF
docker compose -f docker-compose.example.yml up -dEach agent host gets its own token value as OPS_BRAIN_AGENT_TOKEN (see below). Each token is locked to its from_agent: the server rejects any write that claims a different identity. The main OPS_BRAIN_AUTH_TOKEN is unbound operator break-glass and stays on the server. Do not point an agent at it. Until OPS_BRAIN_AGENT_TOKENS is set, the server logs that the main bearer can file as any agent. Details and the full onboarding checklist: docs/agent-tokens.md. A checkout also provides scripts/setup-self-host.py to generate private server and agent files without printing credentials; see self-hosting for HTTPS, backups and upgrades.
Images are multi-arch (linux/amd64, linux/arm64) at ghcr.io/thek3nsai/ops-brain. Pin :vX.Y.Z rather than :latest for anything you depend on.
The standalone example pins :v6.3.1 and binds 127.0.0.1:3000. Set OPS_BRAIN_IMAGE to another published release or a local build. latest moves on every release; pin the tag you intend to run.
Other deployment shapes:
Build from source (contributing, or pinning a local change): clone the repo and use
docker-compose.yml, which builds the Dockerfile against the same bundled PostgreSQL.Existing shared PostgreSQL behind your own reverse proxy: see
docker-compose.prod.yml. Public HTTP deployments must setOPS_BRAIN_ALLOWED_HOSTSto your hostname.
Connect your agents
ops-brain speaks MCP over stdio (the default) or streamable HTTP. Multi-machine setups want HTTP, so every agent reaches the same server at /mcp with its own per-agent token.
Claude Code: add to ~/.claude.json under mcpServers:
"ops-brain": {
"type": "http",
"url": "https://your-host.example.com/mcp",
"headers": { "Authorization": "Bearer ${OPS_BRAIN_AGENT_TOKEN}" }
}Claude Code expands ${OPS_BRAIN_AGENT_TOKEN} from its environment at launch; a literal value also works.
Codex CLI: add to ~/.codex/config.toml:
[mcp_servers.ops-brain]
url = "https://your-host.example.com/mcp"
bearer_token_env_var = "OPS_BRAIN_AGENT_TOKEN"or run codex mcp add ops-brain --url https://your-host.example.com/mcp --bearer-token-env-var OPS_BRAIN_AGENT_TOKEN.
Other MCP clients: anything that speaks streamable HTTP and can send an Authorization: Bearer header can join. Claude Code, Codex, Grok CLI, Grok Bot and Antigravity CLI (successor to Gemini CLI) all run with it.
Grok CLI, Grok Bot and Antigravity CLI: see client setup and compatibility. Grok Bot is xAI's desktop agent product, set up separately from Grok CLI.
Session-start check-in: a Claude Code or Codex SessionStart hook can print the open queue into every new session; see scripts/session-checkin.sh.
Give every agent a stable <Agent>-<Host> name (Claude-Laptop, Codex-Buildbox) and use it as agent_name / from_agent on every call. Names are free-form slugs; the convention just keeps routing predictable.
Host can also be a cloud workspace or logical seat. Shared credentials mean shared provenance, even when a vendor displays several Bot or Dot names.
Tools (13)
Group | Tools | What they're for |
Handoffs (8) |
|
|
Knowledge (4) |
| Cross-agent gotchas, safety warnings, compliance rules, and vendor behavior, with per-agent provenance. |
Team bus (1) |
| Open action handoffs (pending and accepted) plus recent notifications addressed to your |
The tool list is small on purpose: every tool and field costs tokens in every agent's context, every session. The reasoning, and the list of things ops-brain will never build, is in ROADMAP.md.
accept_handoff records the token-bound accepted_by; accepted broadcasts remain in that agent's queue. Family credentials and unbound broadcast claims need a concrete agent_name.
Briefings stay off the MCP surface. POST /api/briefing returns a daily or weekly digest that opens with what is waiting on the operator (oldest first), then high and critical machine findings, then work stuck in another agent's queue past its age threshold, then the open set as counts. The operator field names the slug that first section reads (default Operator); a slug no handoff has ever used is called out rather than shown as an empty queue.
Embedding maintenance runs from an operator shell, not an agent:
ops-brain backfill-embeddings [--table knowledge|handoffs] [--batch-size 10]HTTP endpoints
POST /mcp MCP streamable HTTP per-agent token (or main bearer)
POST /api/handoff file a machine handoff machine token with `create` scope
GET /api/pending poll for waiting work machine token with `read` scope
POST /api/briefing daily / weekly digest main bearer; { "type": "daily" | "weekly", "operator"?: "<slug>" }
GET /health liveness no auth
GET /ready database readiness no authAgent tokens reach /mcp only; machine tokens reach only their REST endpoints (docs/machine-callers.md). /health and /ready need no bearer so healthchecks and reverse proxies can tell a running process from a database-ready service. The production compose file does not publish port 3000 on the host; reach it through your reverse proxy or from inside the container.
Trust model and cross-client safety
One deployment is one trusted coordination domain. Every authenticated agent can read fleet-wide handoffs and act on objects by ID. Per-agent tokens prove who filed something; they don't isolate tenants. Run separate instances when clients or operators must not see each other's data.
Inside that domain, knowledge entries can be scoped to a client, and scoped searches guard against accidental disclosure:
Entry belongs to | Result |
No client (global) | returned |
Same client as the query | returned |
Different client, marked | returned, logged |
Different client, caller passes | released, logged |
Different client, otherwise | withheld, replaced with a scope-mismatch notice, logged |
Every event lands in the audit_log table. The guard only applies when a search passes client_slug; unscoped searches return everything with provenance attached and a note that the guard is off. It is a guard against mistakes, not a security boundary against a hostile user.
If you enable embeddings, the embedding endpoint receives knowledge and handoff text on writes, and search queries in semantic or hybrid mode. Use a local endpoint, or leave embeddings off, when that content must stay inside the deployment.
Vulnerability reports: see SECURITY.md.
Configuration
Env var | Default | Notes |
| (required) | PostgreSQL connection string |
|
|
|
|
| HTTP bind address |
| (none) | Main bearer. Required for |
| (none) | JSON array of identity-bound tokens for |
| (none) | One line appended to the built-in MCP instructions for this deployment only. No line breaks. Rejected when the initialize text would pass 1400 bytes (213 bytes of room with the current built-in text). |
| (none) | JSON array of scoped tokens for |
| loopback only | Comma-separated allowed |
|
| Serve HTTP with no auth. Dev only; never expose beyond localhost. |
|
| Run migrations on startup |
|
|
|
| (none) | OpenAI-compatible embedding API, e.g. |
|
| Embedding model name |
| (none) | Bearer for the embedding API, if it needs one |
Stack
Component | Choice |
Language | Rust 2021 |
MCP SDK | rmcp 1.6 |
Database | PostgreSQL 18 via sqlx (runtime queries) |
Search | tsvector full-text + pgvector HNSW cosine, fused with Reciprocal Rank Fusion |
Embeddings |
|
Transport | stdio, or streamable HTTP on axum |
Project docs
Doc | What's in it |
Philosophy, hard stops, and ideas that were decided against | |
Release history, including why the live lane was removed in v6.0.0 | |
Code and deployment footguns | |
Per-agent identity tokens and onboarding a new agent | |
Contract for cron jobs, CI, and scripts filing handoffs over REST | |
Why agents verify before complying with a handoff | |
Mailing the operator when an agent is blocked on a human | |
Client connection recipes and verification status | |
Private setup files, HTTPS, backups and upgrades | |
Where ops-brain is listed and how each listing updates |
License
Dual-licensed under either MIT or Apache-2.0, at your option.
Available Tools
13 toolsaccept_handoffA
Claim a pending handoff and record its acceptor. Bound tokens use their own identity; family credentials and unbound broadcast claims require a concrete agent_name. Follow with complete_handoff.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_name | No | Concrete acceptor identity. Required for family credentials and for unbound/stdio broadcast claims. Fixed agent tokens record their bound identity; a supplied name must match the fixed identity or family. | |
| handoff_id | Yes | Handoff ID (UUID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false / idempotentHint=false / destructiveHint=false, so the mutation profile is already covered. The description adds the identity-resolution behavior and the follow-up step, but says nothing about what happens if the handoff is already claimed, not pending, or how failures surface for a non-idempotent state transition.
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 sentences: the core action leads, the conditional parameter rule follows, and the next-step tool is last. No filler and nothing redundant.
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 2-parameter state-transition tool with no output schema, the description covers purpose, the conditional identity rule, and the follow-up call. It is missing only edge-case behavior (non-pending/already-claimed handoffs), which is a minor gap given the annotations already signal a non-idempotent write.
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 100%, so both parameters (handoff_id, agent_name) are fully documented in the schema. The description's rules for agent_name restate the same requirement already in the schema field description, adding little beyond the baseline.
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+resource ('Claim a pending handoff and record its acceptor'), which is clearly distinguishable from create_handoff, get_handoff and delete_handoff. It does not explicitly contrast itself with those siblings, but the transition semantics are unambiguous.
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?
Provides a concrete rule for when agent_name is needed (family credentials, unbound/stdio broadcast claims) versus bound tokens. It also names the required follow-up tool (complete_handoff), giving the agent the workflow context. No explicit exclusion of alternatives such as complete_handoff, but the sequencing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_knowledgeA
Add a knowledge entry. Cross-agent only: gotchas, safety/compliance rules, verified patterns, vendor behaviour. Host-local lessons belong in your own docs, not here. Requires author (your agent slug). Near-duplicates are returned instead of created unless force.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Free-form tags for retrieval. Keep them few and reusable. | |
| force | No | Skip duplicate detection check. Set to true if you've already seen the warning and want to create anyway. | |
| title | Yes | ||
| author | Yes | Your agent identifier (free-form slug, 1–80 chars, [a-zA-Z0-9._-]). Examples: "Claude-Laptop", "Codex-Buildbox". Immutable once set — provenance cannot be rewritten via the tool surface. | |
| content | Yes | ||
| category | No | Free-form grouping label, e.g. "gotcha", "pattern", "vendor". Used by browse-mode filtering in `search_bus`. | |
| client_slug | No | Scope this entry to the owning client (slug). Leave `cross_client_safe` false unless the content is genuinely global. | |
| cross_client_safe | No | Allow this entry to surface in other clients' contexts (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-destructive, non-idempotent, but the description adds the genuinely useful behavior: near-duplicates are returned rather than created unless `force` is set. It also flags that `author` is required. Return format and any auth/rate constraints are left unstated, keeping it out of the top band.
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?
Four tight sentences with zero filler; the purpose, scope constraint, and duplicate-handling caveat are all front-loaded. Every sentence carries distinct information an agent needs before calling.
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 8-parameter mutation tool with no output schema, the description covers the essential decision points: what belongs here, the required author, and duplicate semantics. It omits what a successful call returns and how the scoping parameters (client_slug, cross_client_safe) interact, though the schema covers those fields.
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 75%, so most parameters are already documented (notably `force`, whose conditional use is fully explained by the schema). The description's mentions of `author` and `force` largely restate structured data, adding little syntax or format meaning beyond it. Baseline 3 is appropriate.
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 ('Add a knowledge entry') and immediately scopes the content to cross-agent material (gotchas, safety/compliance rules, verified patterns, vendor behaviour). The scope statement cleanly separates it from siblings like update_knowledge and delete_knowledge, which an agent can tell apart without opening 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 explicit inclusion criteria ('Cross-agent only...') and an explicit exclusion plus redirect ('Host-local lessons belong in your own docs, not here'). It stops short of naming alternative tools (e.g. update_knowledge for edits), so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_inARead-onlyIdempotent
Pending-work query: open action handoffs addressed to you or to nobody in particular (max 20), plus recent notify-class handoffs to you or broadcast (max 5, compact). has_more on a section means the cap was hit — use list_handoffs for the rest. Accepted handoffs you filed to yourself are locks: counted in self_claims_held, not listed. Next step is get_handoff for the full body, then accept_handoff. Pass agent_name (your free-form agent slug — e.g. 'Claude-Laptop', 'Codex-Buildbox').
| Name | Required | Description | Default |
|---|---|---|---|
| agent_name | Yes | Your agent identifier (free-form slug, 1–80 chars, [a-zA-Z0-9._-]). Examples: "Claude-Laptop", "Codex-Buildbox". Used to filter handoffs addressed to you. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds real behavioral detail beyond them: the 20/5 result caps, the meaning of `has_more`, the compact form of notify-class entries, and the non-obvious rule that self-filed accepted handoffs become locks tracked in `self_claims_held` rather than being listed. It stops short of describing per-item fields in full, so a 4 rather than 5.
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?
The scoping and caps are front-loaded and the follow-up routing comes immediately after, which is good structure. It is dense and leans on domain shorthand ('locks', 'self_claims_held', 'notify-class') that a first-time caller must parse, keeping it from a 5.
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?
There is no output schema, so the description carries the return-value burden and does so: it names the subsections, their caps, the `has_more` sentinel, and `self_claims_held`. Combined with the annotation-covered safety profile and the complete single-parameter schema, an agent has everything needed to call and interpret this tool.
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?
With a single parameter at 100% schema description coverage, the schema already documents the format, character class, and examples for `agent_name`, so the baseline is 3. The description only restates that it is a free-form slug and that it filters handoffs addressed to you, adding little beyond the schema.
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 states a precise verb+resource framing ('pending-work query' returning 'open action handoffs addressed to you or to nobody in particular') with the exact sectioning and caps. It is clearly distinct from siblings like list_handoffs and get_handoff, naming each where relevant.
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?
It states the triggering situation (checking pending work), routes the agent explicitly when results are truncated ('has_more ... use list_handoffs for the rest'), and spells out the follow-up chain ('Next step is get_handoff for the full body, then accept_handoff'). No ambiguity about when to reach for this tool versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_handoffA
Mark a handoff as completed. Optional commit_hash records the work ref (typically a git SHA) so mark_merged can later flip the same handoff to merged when the bundle reaches main.
| Name | Required | Description | Default |
|---|---|---|---|
| handoff_id | Yes | Handoff ID (UUID) | |
| commit_hash | No | Optional commit ref (typically a git SHA) recording the work that closed this handoff. When set, lets `mark_merged` link this handoff to a merge commit later. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the important traits (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the safety profile is covered. The description adds real behavioral context by explaining that commit_hash enables a later `mark_merged` transition, but it says nothing about repeat-call behavior, permissions, or whether a completion can be undone — notable gaps given idempotentHint=false.
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 tightly written sentences, front-loaded with the action and followed by the optional-parameter consequence. Slight redundancy with the schema's commit_hash wording costs it the top mark but nothing is padded.
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 simple state-transition tool with no output schema, the description covers the action, the optional parameter's downstream purpose, and names the follow-up tool. Missing only edge-case behavior (already-completed handoffs, failure modes), which would round it out.
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 100%, so both parameters are already documented in the schema, which sets the baseline at 3. The description's 'commit_hash records the work ref (typically a git SHA)' essentially restates the schema text rather than adding new syntax, format, or validation detail.
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+resource ('Mark a handoff as completed') and names the related sibling 'mark_merged' that later flips the same handoff to merged, so the agent can place it in the lifecycle. It stops short of distinguishing itself from the closer cousin 'accept_handoff', which is a plausible alternative an agent might otherwise confuse it with.
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 clear context for invoking it and explicitly routes the later stage of the workflow to `mark_merged`, which is useful condition-based guidance. There is no explicit 'when not to use' or guidance against calling this on an already-completed handoff.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_handoffA
Create a handoff for another agent; this is sufficient notification. Category action = the recipient must do it; notify = FYI, pruned from operational queries after 7 days. Replying? Pass in_reply_to to stay in the existing thread instead of opening a parallel handoff.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Detailed body, markdown supported (max 100,000 bytes) | |
| title | Yes | Short title for the handoff (max 200 bytes) | |
| context | No | Optional structured context: a JSON object, max 8,192 bytes serialized. Point at evidence (paths, IDs, URLs) instead of inlining it. | |
| category | No | Category: "action" (default — persistent until completed) or "notify" (ephemeral FYI, auto-pruned from operational queries after 7 days). Use "notify" for introductions, "I just shipped X" announcements — anything the recipient doesn't need to act on. | |
| priority | No | Priority: low, normal, high, or critical | |
| to_agent | No | Target agent (free-form slug, same form as `from_agent`). Omit to broadcast: the handoff then appears in every other agent's `check_in` until one of them accepts it. | |
| from_agent | Yes | Sender agent (free-form slug, 1–80 chars, [a-zA-Z0-9._-]). Examples: "Claude-Laptop", "Codex-Buildbox". | |
| in_reply_to | No | Parent handoff ID (UUID) when this handoff is a reply to another. Enables threaded discovery via `list_replies_to_me`. The reply's `category` is preserved as written — a reply can legitimately be `action` (it requires a response) or `notify` (pure FYI). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive writes, and the description adds real value beyond that: 'this is sufficient notification' (no separate notify call needed) and the 7-day pruning of notify-category handoffs. It stops short of describing the return value or failure modes.
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?
Three dense clauses, zero filler, with the core purpose front-loaded and the reply-routing tip positioned as the closing actionable instruction.
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 write tool with no output schema, the description covers notification semantics, category persistence, and threading. It omits what the caller gets back (handoff ID) and any error/permission conditions, which is a minor gap given rich annotations and full schema coverage.
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 100%, so the schema already documents every parameter in detail. The description restates category semantics and adds the threading rationale for in_reply_to, but largely mirrors schema content, so the baseline 3 is appropriate.
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 ('Create a handoff for another agent') and immediately scopes the two behavioral modes (action vs notify). An agent can distinguish this from siblings like accept_handoff or complete_handoff without inspecting 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 explicit when-to-use guidance for the two categories and, crucially, routes replies: 'Replying? Pass in_reply_to to stay in the existing thread instead of opening a parallel handoff' names the alternative behavior. It does not clarify when to prefer this over add_knowledge or other siblings, so it falls short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_handoffADestructiveIdempotent
Permanently delete a handoff by ID (hard delete). The delete is audited: audit_log keeps a tombstone with the handoff id, who deleted it, and its sender, recipient, title and status
| Name | Required | Description | Default |
|---|---|---|---|
| handoff_id | Yes | Handoff ID (UUID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new behavioral context: the deletion is audited and audit_log retains a tombstone containing the handoff id, deleter identity, sender, recipient, title, and status. It does not state whether related replies or dependent records are also removed, which is the main remaining gap.
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 sentences, zero filler, with the irreversible nature of the operation front-loaded ahead of the audit side effect. Every clause carries information.
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 one-parameter destructive tool with annotations covering safety, the description covers the two things an agent most needs: that the delete is permanent and what survives it. It stops short of explaining cascading effects (replies to the handoff) or permission requirements, which would make it fully complete.
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 100% for the single handoff_id parameter, so the schema already documents the UUID format. The description only restates "by ID" and adds no syntax or format detail beyond the schema, which is the expected baseline when the schema does the heavy lifting.
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 gives a specific verb and resource ("delete a handoff by ID") and immediately qualifies the semantics as a hard, permanent delete, which is the key distinction an agent needs. The resource name and the hard-delete qualifier separate it from the sibling delete_knowledge and from complete_handoff without opening the schema.
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, when-not-to-use, or alternative guidance. Given siblings like complete_handoff, accept_handoff, and mark_merged, an agent would benefit from knowing when deletion is the correct action versus closing a handoff out normally, and the description never addresses that choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_knowledgeBDestructiveIdempotent
Delete a knowledge base entry by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Knowledge entry ID (UUID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is fully covered by structured data. The description adds no behavioral context beyond that: it does not say deletion is irreversible, whether dependent records are affected, or whether a missing ID is an error.
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?
One short sentence, front-loaded with the verb and resource, with zero filler or redundancy. Nothing could be removed without losing meaning.
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 single-parameter destructive delete whose safety semantics are fully carried by annotations and whose parameter is fully documented by the schema, the description is essentially sufficient. A minor gap is the absence of any note about irreversibility or outcome, though destructiveHint partly compensates.
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 100%, so the single 'id' parameter (UUID format) is fully documented in the schema. The description only restates that the ID identifies the entry, adding no syntax or format detail beyond the schema — the baseline 3 for full coverage applies.
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 (Delete) and resource (knowledge base entry) plus the lookup key (by ID), which clearly separates it from add_knowledge and update_knowledge. It does not explicitly name a sibling or a scope boundary, so it falls short of a 5.
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 when-to-use or when-not-to-use guidance, and no prerequisites (e.g. permission requirements) are mentioned. Usage is only implied by the verb 'Delete', matching the calibration level for 'no when-to-use, no prerequisites'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_handoffARead-onlyIdempotent
Get one handoff by its full UUID, including its complete body and context.
| Name | Required | Description | Default |
|---|---|---|---|
| handoff_id | Yes | Full handoff UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered. The description adds only that the full body and context are returned, which is useful payload context but does not describe error behavior for an unknown UUID or whether the response is paginated.
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?
One sentence, front-loaded with the verb and resource, and it also front-loads the key constraint (full UUID) and the payload. Nothing is padded or redundant.
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 single-parameter read tool whose annotations cover the safety profile, the description is nearly sufficient. The only gaps are routing to siblings and failure behavior on an invalid or missing UUID, which are minor for this level of complexity.
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 100% and the single parameter is fully documented as 'Full handoff UUID'. The description's 'by its full UUID' restates the same requirement without adding format, sourcing, or error-handling detail, so this sits at the schema-covered baseline.
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 (get) and resource (one handoff) plus the lookup key (full UUID) and the payload returned (complete body and context). It is clear on its own, but never names the sibling it is distinct from (list_handoffs, search_bus), so an agent gets no explicit routing signal.
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?
Usage is only implied: the phrase 'by its full UUID' hints you need a known identifier rather than a search, which distinguishes it loosely from list_handoffs and search_bus. There is no explicit when-to-use, when-not-to-use, or prerequisite statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_handoffsARead-onlyIdempotent
List handoffs with optional filters. Use status='pending' to see what needs attention.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20, clamped to 1..=200) | |
| status | No | Filter by status: pending, accepted, completed, or merged | |
| compact | No | Truncate body to 200 chars (default: true). Set false for full bodies. | |
| category | No | Filter by category: "action" or "notify". Overrides include_notify when set. Omit to use the default action-only view. | |
| to_agent | No | Filter by target agent (free-form slug; exact match, case-insensitive). | |
| from_agent | No | Filter by source agent (free-form slug; exact match, case-insensitive). | |
| include_notify | No | Include notify-class handoffs alongside action ones (default: false). Ignored when `category` is set explicitly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds no behavioral context beyond that — it omits the default action-only view, the compact=true truncation default, and result ordering — so it does not clear the higher bar.
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 short sentences, purpose front-loaded and the actionable hint second. Nothing is wasted or buried.
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 read-only list tool with a fully documented schema and no output schema, the essentials are covered. However it leaves the default result shape (action-only, truncated bodies) and the distinction from search_bus/list_replies_to_me to the agent's inference.
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 100%, so all seven parameters (limit clamping, status values, compact, category, agent slugs, include_notify) are already fully documented. The description's status='pending' example is a minor reinforcement of existing schema content rather than new meaning. Baseline 3 applies.
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+resource ('List handoffs') plus the filtering affordance, which is clear on its own. It does not distinguish itself from siblings like get_handoff, list_replies_to_me, or search_bus, so it falls short of a 5.
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?
Offers one concrete usage hint ('Use status="pending" to see what needs attention'), which gives implied context. It never states when to use this over get_handoff (single item) or search_bus (free-text search), so the alternative-selection guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_replies_to_meARead-onlyIdempotent
List handoffs that reply to ones you sent. Returns handoffs whose in_reply_to references a handoff with your agent_name as from_agent. Optional ISO-8601 since filters by reply timestamp.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20, clamped to 1..=200) | |
| since | No | Optional ISO-8601 timestamp; only replies created after this time are returned. | |
| agent_name | Yes | Your agent identifier (free-form slug). Returns handoffs whose `in_reply_to` references a handoff you originally sent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior, so the safety profile is covered. The description adds genuine value by exposing the underlying query semantics (the `in_reply_to` ↔ `from_agent` join) and the timestamp-based filtering behavior, though it says nothing about pagination or result ordering.
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?
Three tight sentences, front-loaded with the core purpose followed by precise semantics. Every sentence earns its place with no redundancy or filler.
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?
With no output schema, the description correctly explains what the tool returns (handoffs whose `in_reply_to` references one of yours). For a simple, read-only list tool this is nearly complete, though it omits default result count and ordering, which are relevant to the caller.
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 all three parameters are already documented in the schema, including `since` and `limit`. The description largely restates the `since` semantics rather than adding format or syntax detail beyond the schema, so the baseline of 3 applies.
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 states a specific verb (List) and resource (handoffs) with a precise scope: only replies to handoffs you sent. The second sentence defines the exact join condition (`in_reply_to` referencing a handoff with your `agent_name` as `from_agent`), which clearly distinguishes it from the sibling `list_handoffs`.
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?
Usage is implied by the scoping (use when you want replies to your own handoffs), but the description never explicitly names alternatives like `list_handoffs` or `search_bus`, nor states when not to use it. A reader can infer the context but gets no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_mergedAIdempotent
Flip a handoff to status=merged and record the merge commit. Typically called by an integrator script after the bundle containing the handoff's commit_hash lands in main. Idempotent on identical merge_commit; refuses to overwrite a different one.
| Name | Required | Description | Default |
|---|---|---|---|
| handoff_id | Yes | Handoff ID (UUID) to mark as merged. | |
| merge_commit | Yes | Merge commit ref (typically the merge-to-main SHA that bundled the work). Free-form — any opaque identifier works. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false. The description goes beyond this by specifying the exact idempotency semantics ('idempotent on identical merge_commit; refuses to overwrite a different one'), which is the concrete behavior an agent needs to predict outcomes on repeat calls.
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?
Three tight sentences, front-loaded with the action, then the calling context, then the idempotency edge case. No filler, though the calling-context sentence could be trimmed without loss for a purely mechanical caller.
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 2-required-param mutation with full schema coverage and annotations carrying the safety profile, the description covers what changes, when it is invoked, and how repeat calls behave. No output schema exists, but the state transition is plain enough that return details are not critical.
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 100%, so both handoff_id and merge_commit are already documented, and merge_commit's 'free-form — any opaque identifier works' is captured in the schema. The description adds no format or syntax detail beyond what the schema provides, so the baseline of 3 applies.
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+resource+state change: 'Flip a handoff to status=merged and record the merge commit.' This is clearly distinguishable from siblings like complete_handoff, accept_handoff, or create_handoff, which represent different lifecycle transitions.
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 clear usage context: 'Typically called by an integrator script after the bundle containing the handoff's commit_hash lands in main.' This explains the trigger condition well, but never names a sibling alternative or an explicit when-not-to-use case (e.g., vs complete_handoff).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_busBRead-onlyIdempotent
Search knowledge and/or handoffs. Set tables param for multi-table. Modes: fts/semantic/hybrid (default). Empty query or '*' browses recent entries.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | fts, semantic, or hybrid (default). Ignored for browse. | |
| limit | No | Max results per table (default 20, clamped to 1..=200) | |
| query | No | Search query. Use empty string or "*" to browse recent entries across tables. | |
| tables | No | Tables to search: knowledge (default), handoffs | |
| compact | No | Snippets instead of full bodies. Default: true multi-table, false single-table. | |
| category | No | Exact knowledge category filter in browse mode (`query` empty or `*`). Category filtering is not applied to ranked searches or handoffs. | |
| client_slug | No | Scope to client. Cross-client results withheld unless acknowledged. | |
| acknowledge_cross_client | No | Release cross-client results withheld due to scope mismatch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the meaningful trait that an empty query flips the tool into a browse mode and that multi-table defaults differ, but says nothing about result ordering, scoring, or what withholding of cross-client results looks like.
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?
Three dense, zero-padding sentences with the core action front-loaded. It is arguably too terse in places ('Set tables param for multi-table'), trading a little clarity for compactness, but 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 an 8-parameter, multi-mode search tool with no output schema, the description covers modes and browse behavior but not result shape, ranking, or how cross-client withholding resolves. Adequate as a starting point, incomplete for an agent that needs to interpret output.
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 every parameter (including mode values, limit clamping, and category being browse-only) is already documented in the schema. The description restates mode values and the tables param without adding format or interaction detail beyond what the schema provides — baseline 3.
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 (Search) and resource (knowledge and/or handoffs), and names the mode dimension. It never distinguishes itself from siblings like list_handoffs or get_handoff, so an agent must infer that this is the ranked/query-based retrieval path rather than the enumerate-one path.
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 real conditions for the browse path ('Empty query or "*" browses recent entries') and for multi-table via the tables param, but offers no guidance on when to choose this over list_handoffs/get_handoff, nor any exclusions. Usage is implied by mode semantics rather than stated as routing advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_knowledgeB
Update an existing knowledge base entry by ID. Only provided fields are updated.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Knowledge entry ID (UUID) | |
| tags | No | ||
| title | No | ||
| content | No | ||
| category | No | ||
| verified | No | Set to true to confirm the content is still accurate: sets last_verified_at to now without requiring content changes. This is how a `_staleness_warning` on an entry is cleared. Content edits also re-verify. | |
| cross_client_safe | No | Allow this entry to surface in other clients' contexts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent, non-open-world mutation, so the safety profile is covered. The description adds the useful patch semantic that unspecified fields are left untouched, but says nothing about what tags do (replace vs append), what the call returns, or whether auth/scoping is required. Annotation-vs-description is consistent, so no contradiction.
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 sentences with the identity/target information front-loaded and zero filler. Every clause earns its place.
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 7-parameter mutation with no output schema and 43% schema coverage, the description should say more about return behavior, tag replacement semantics, and any authorization requirements. It adequately covers the update model but leaves real gaps an agent would want filled.
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 43%: id, verified, and cross_client_safe are documented in the schema, while tags, title, content, and category carry only self-evident names. The description's 'only provided fields are updated' clarifies overall patch behavior, but it adds no per-parameter meaning (e.g., whether tags overwrite the existing set), so it only partially compensates for the coverage gap.
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 ('Update an existing knowledge base entry by ID') and makes the lookup key explicit. It does not name or differentiate itself from siblings like add_knowledge or delete_knowledge, but the intent is unambiguous.
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 statement of when to reach for this tool versus add_knowledge, delete_knowledge, or search_bus, and no prerequisites or permission notes. 'Only provided fields are updated' is behavioral semantics, not usage routing, so the agent gets no decision 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.
1 tool update
v6.2.0- Changed
create_handoff1 field changed- removed
Input schema / properties / idempotency_keyRemoved value: -{ - "description": "Retry key (1–200 bytes), scoped to this sender. Reusing it with the\nsame request returns the original row even after completion; changed\npayloads fail. Keys remain reserved until the handoff is deleted.", - "type": [ - "string", - "null" - ] -}
13 tool updates
v0.1.0- First observed
accept_handoff - First observed
add_knowledge - First observed
check_in - First observed
complete_handoff - First observed
create_handoff - First observed
delete_handoff - First observed
delete_knowledge - First observed
get_handoff - First observed
list_handoffs - First observed
list_replies_to_me - First observed
mark_merged - First observed
search_bus - First observed
update_knowledge
TDQS
Scored across 13 tools
The handoff lifecycle actions (create, get, accept, complete, mark_merged, delete) are clearly distinct, and the knowledge tools (add/update/delete) are unambiguous. However, three listing tools overlap heavily: list_handoffs, list_replies_to_me, and check_in all enumerate handoffs with related filters, and search_bus also spans handoffs, so an agent may hesitate over which to pick despite descriptive help.
Nearly all tools follow a clean snake_case verb_noun pattern (list_handoffs, create_handoff, get_handoff, add_knowledge, update_knowledge). Only mark_merged (verb_adjective) and check_in (verb_preposition) deviate slightly, but the convention is otherwise predictable.
13 tools is well-scoped for a coordination server spanning handoff lifecycle plus knowledge management and cross-table search. Each tool earns its place with a discrete operation.
Handoffs have full lifecycle coverage (create, get, list, accept, complete, mark_merged, delete). The knowledge side lacks a dedicated get-by-ID, relying on search_bus brow/search instead, a minor gap an agent can work around.
Maintenance
Related MCP Connectors
Hosted kanban for AI agents: claim cards, check in while working, hand off with structured notes.
Durable agent-to-agent handoffs and shared scratchpad for multi-agent workflows.
Shared control plane for AI coding agents — tasks, memory, decisions, file locks. 12 tools.
Memory, reflection and safety for AI agents. Hosted or local, no vector database.
Related MCP Servers
- AlicenseAqualityAmaintenanceThe infrastructure for AI teams: a self-hosted server that gives a fleet of agents shared semantic memory, tasks, direct messages, and session handoff. Any agent that speaks HTTP participates: Claude Code, AutoGen, raw API scripts, anything.479MIT
- AlicenseAqualityDmaintenanceSlack for AI agents — rooms, messaging and context sharing for multi-agent collaboration.628 PyPIMIT
- AlicenseAqualityCmaintenanceShared memory and handoff hub for AI agents, enabling seamless context transfer between sessions with token-budgeted resumes and automatic handoffs.104 npmMIT
- AlicenseBqualityBmaintenanceEnables AI agents from different frameworks to communicate asynchronously via a persistent SQLite-backed bus, with doorbell wakeups for sub-second notifications and full message history.6MIT