Keystone
Provides tools for analyzing GitHub repositories' merged pull request history to compute knowledge concentration, bus factor, and succession plans. It can also draft CODEOWNERS patches and create issue recommendations, with optional write actions to a repository.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Keystonewhat if @Anchel123 leaves? who steps in for the API module?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Keystone
An MCP-native agent that answers "if this person leaves, what breaks, and who steps in?" from an organisation's real merged-PR history, held as a graph in FalkorDB.
Built for Graph Hacks: Context for AI Agents (WeMakeDevs x FalkorDB). Track entered: Track 01, Agents That Act on Connected Data.
Live demo | https://keystone-2d8k.onrender.com (a free instance sleeps when idle: the first visit after a quiet spell takes about a minute) |
Demo video | to be added |
Blog post | to be added |
MCP endpoint | https://keystone-2d8k.onrender.com/mcp (streamable HTTP) |


The workbench: choose a person (left) and the nine modules show how much knowledge stays if they leave, with the totals on the right. Make the plan runs the three-role review and heals the wall; the command line at the bottom talks to the same agent that serves /mcp; PROOF draws the path behind the last answer.


New to the project? Read docs/HOW_IT_WORKS.md.
What it does
Finds where knowledge is concentrated. Every merged pull request is a fact: who authored it, who reviewed it, which module it touched. Keystone turns those facts into a
KNOWSgraph with time decay and computes bus factor, how load-bearing each module is (PageRank), and who bridges teams (betweenness).Runs the counterfactual. "What if @Anchel123 leaves?" forks the live graph with
GRAPH.COPY, deletes the person on the fork, recomputes the same statistics and diffs them. The live graph is never touched, and the fork is deleted afterwards.Finds who can really step in, with the path. Successors are ranked by multi-hop evidence: who already reviewed the leaver's PRs, and who knows modules that change together with the target module (
CO_CHANGES). Every answer carries the nodes, edges and public PR links that produced it.Acts. Three roles hand off through graph state: the Analyst runs the what-if, the Planner simulates a pairing plan on a fork and writes a Decision with Tasks, the Reviewer reads those Tasks back from the graph and re-verifies on a fresh fork. An approved plan becomes reviewable artifacts: a CODEOWNERS patch diffed against the repository's real file, and an issue per pairing. All of it is a dry run unless the operator opts in.
Remembers and checks itself. Decisions and tasks are ordinary nodes. A later session asks
changes_since: did the plan happen, judged from real PR activity rather than from a checkbox.
Ask it in plain English, or drive the same tools from Claude Desktop, Claude Code or any MCP client.
Related MCP server: hangang-code-graph
Why this needs a graph
"Who steps in for her?" is a path question: Person -AUTHORED-> PR -TOUCHES-> Module <-TOUCHES- PR <-REVIEWED- Person, plus Module -CO_CHANGES- Module. A table of commit counts cannot show the chain. A vector index cannot compute a counterfactual. FalkorDB is the primary and central store, and the product stops working without it:
algo.pageRank,algo.labelPropagationandalgo.betweennessrun in the database at load and write their results back as properties.algo.SPpathsfinds the weighted shortest chain of shared knowledge between two people or a person and a module.GRAPH.COPYis the counterfactual engine forwhat_if_leaves, the Planner and the Reviewer.One graph per organisation, plus a private
GRAPH.COPYsandbox per visitor, so writes never leak between users.Read tools run through
GRAPH.RO_QUERY, so a read tool cannot mutate the graph.
Track 01 map
Track 01 focus | Where it lives |
Multi-hop reasoning |
|
Graph queries and algorithms as agent tools | 15 human-written tools in |
Tool selection through MCP |
|
Actions based on what the graph shows |
|
Explainable results | every result carries |
Architecture
browser UI ──► FastAPI ──► agent loop ──► MCP client ══(MCP protocol)══► MCP server ──► tools ──► FalkorDB
│ │ ▲ │ GRAPH.RO_QUERY
│ └── LLM (optional) picks tools; never writes Cypher │ GRAPH.COPY forks
└──── /mcp (streamable HTTP) ───────────────────────────────┘ └─ algo.* procedures
Claude Desktop / Claude Code / any MCP client ──► stdio or /mcpThe model only chooses tools and phrases the answer. Names are validated: a person mentioned in the prose must appear in the tool rows, otherwise the prose is discarded and the rows are rendered instead. Without an LLM key a deterministic router makes the same MCP calls and the UI labels the mode. With keys you can set a primary and a backup model (LLM_* and LLM2_*): if the primary is slow, rate-limited or down the backup answers, and if both fail the router does, so a provider outage never breaks the demo.
Graph data model
Nodes (one graph per tenant, ks_<tenant>):
Node | Key properties |
|
|
|
|
|
|
|
|
| snapshot date, half-life, counts |
Edges from the data: (Person)-[:AUTHORED]->(PR), (Person)-[:REVIEWED {state}]->(PR), (PR)-[:TOUCHES {share, files}]->(Module), (PR)-[:CLOSES]->(Issue), (Module)-[:IN]->(Repo).
Edges derived inside FalkorDB: (Person)-[:KNOWS {score, share, authored, reviewed, last, cost}]->(Module), (Person)-[:CO_KNOWS {w, shared}]->(Person) (both directions), (Module)-[:CO_CHANGES {n}]->(Module) (both directions).
Agent memory, as ordinary nodes in the same graph: Session, Finding, Decision, Task, Snapshot, Run, Step, Action, linked by ABOUT, PRODUCED, IMPLEMENTS, OBSERVED, HAS_STEP, NEXT {handoff}, FOR.
Every statement is listed in docs/QUERIES.md, generated from the code that runs.
How "knowledge" is defined
knowledge(p, m)= the sum over PRs thatpauthored (weight 1.0) or reviewed (weight 0.4), times the share of that PR's files landing in modulem, times a time decay with a 365-day half-life.share(p, m)=knowledge(p, m)divided by everyone's knowledge ofm.Bus factor = the fewest people whose combined share reaches 50%.
Active = authored or reviewed a PR within 180 days of the snapshot. Orphaned = active people hold under 25% of a module's accumulated knowledge.
Bots are excluded. Mass changes (over 300 files) and lockfiles, vendored and generated paths are ignored.
These are structural facts about contribution patterns. They describe a team; they do not evaluate anyone.
The tools (MCP)
overview, find_modules, module_risk, risk_scan, keystones, what_if_leaves, successors, who_knows, knowledge_map, path_between, recall, changes_since, succession_review, draft_actions, note_finding. Each docstring is the description the model sees, so it says when to use the tool.
Run it
Needs Docker, Python 3.11+ and uv. The repository carries the data snapshots (about 700 KB), so no GitHub access is needed.
docker compose up --build # app on http://localhost:8000, FalkorDB Browser on http://localhost:3000or without compose:
docker run -d --name keystone-db -p 6379:6379 -p 3000:3000 falkordb/falkordb:latest
uv sync
uv run python -m keystone.bootstrap # builds both graphs and the demo memory in about 6 seconds
uv run uvicorn keystone.api:app --port 8000
uv run pytest # tests need the database runningOptional but recommended: copy .env.example to .env and add a key (ANTHROPIC_API_KEY, or LLM_API_KEY plus LLM_BASE_URL for any OpenAI-compatible endpoint, or a local model through Ollama, see the file). With a model, the model chooses the tools; without one the app still answers through its deterministic router and the button at the bottom right says ROUTER.
Use it from Claude Desktop or Claude Code
stdio (local):
{ "mcpServers": { "keystone": { "command": "uv", "args": ["--directory", "/path/to/keystone", "run", "python", "-m", "keystone.mcp_server"],
"env": { "KEYSTONE_TENANT": "falkordb" } } } }HTTP (the running app, or the live demo): claude mcp add --transport http keystone http://localhost:8000/mcp
Refresh the data
uv run python -m keystone.fetch OWNER/REPO ... # needs `gh auth login` or GITHUB_TOKEN; reads public merged PRs only
uv run python -m keystone.snapshot # compress into data/snapshot
uv run python -m keystone.bootstrap --forceEvaluation (honest)
bench/backtest.py runs the successor ranking as of 2026-04-15 and compares it with who actually took over each module's knowledge by 2026-10-15. Cases are modules where one active person held at least 40% (bus factor 1).
Organisation | Cases | Keystone hit@3 | Next-largest holders | Busiest contributors | Random |
FalkorDB (21 active people at T0) | 19 | 0.95 | 0.95 | 0.95 | 0.39 |
Pallets (T0 2026-01-15, 49 active) | 2 | 1.00 | 1.00 | 1.00 | 0.18 |
Pallets has only two qualifying cases, so its row is listed for completeness and proves nothing on its own (bench/backtest_pallets.json).
What this shows and what it does not: Keystone's recommendations come true far more often than chance. In teams this small, though, simple heuristics tie the graph ranking, because the plausible successors are the same handful of people. The graph earns its place through the explanation (the path), the counterfactual (what_if_leaves on a fork) and the verified plan, not by out-guessing a "second-largest holder" rule.
Latency on the real FalkorDB snapshot (3,664 PRs, 62 people, 114 tracked modules), local Docker, 30 runs each (python -m bench.latency): single-query tools take 1 to 17 ms at p50 (successors, three queries, 50 ms); what_if_leaves, which forks the whole graph with GRAPH.COPY, deletes the person and recomputes, takes 113 ms at p50 and 221 ms at p95; the full three-role review takes about 0.9 s. Traversals are fast enough to run on every step of an agent loop.
Evaluating the agent itself
bench/agent_eval.py asks the agent real questions about the FalkorDB graph and scores three things per question: tools (every tool we expect was called; with no expected tool, none may be called), outcome (answered, from_memory, not_in_graph or unknown_entity is the right one) and grounded (every person named in the answer is in the tool rows). Each question runs in its own GRAPH.COPY sandbox, and a model is scored on its own answer, not on the router's rescue. The question sets:
dev(27): the questions the router was built against, so a regression test and not a result.heldout(26): the router first scored 62% on tools; fixing the gaps it exposed lifted it, so it is no longer unseen.fresh(20): written after those fixes and never used to change the router or the prompt at the time it was run. This is the one to read.
Agent | Set | Scored | Tools | Outcome | Grounded | Median per question |
Keyword router (no key) | dev | 27 | 100% | 100% | 100% | 30 ms |
Keyword router (no key) | heldout | 26 | 100% | 100% | 100% | 33 ms |
Keyword router (no key) | fresh | 20 | 65% | 85% | 100% | 34 ms |
Gemini 3.5 Flash-Lite | dev | 27 | 96% | 100% | 100% | 4.0 s |
Gemini 3.5 Flash-Lite | fresh | 20 | 85% | 95% | 100% | 3.4 s |
Groq gpt-oss-120b | dev | 26 of 27 (one provider error left out) | 100% | 100% | 100% | 2.5 s |
Groq gpt-oss-120b | fresh | 20 | 85% | 95% | 100% | 2.6 s |
Qwen3-VL 8B on a laptop GPU (Ollama) | dev | 27 | 93% | 100% | 100% | 94 s |
What this says. A model picks the right tool for about 85 of 100 unseen questions where the keyword router manages 65, and nobody's answer ever named a person the tools did not return. The misses are the interesting kind: both models read "what did the last review say" as recall rather than changes_since, one asked overview for "who is the CEO" where it should have declined, and Gemini answered "keep in mind that barakb is moving" by running the planning and drafting tools instead of noting it. That last one made us add a rule to the system prompt (write tools only when the user asks for a plan, drafts or a note), so the fresh set is no longer unseen for the prompt; the numbers above are from before that change. Results per run are in bench/agent_eval_*.json; rerun with python -m bench.agent_eval --llm --set fresh (add --which backup for the second model).
The real model path is also covered by tests that need no key (FakeModel in tests/test_keystone.py): tool calls go through MCP, the model can never choose a tenant, ungrounded prose is discarded, and an empty, slow, failing or tool-less model falls back to the backup model and then the router without leaking a key.
Safety, privacy and limits
Public data only: merged pull requests of public repositories. GitHub logins appear (they are public); email addresses are never requested or stored.
The public deployment serves read-only base graphs; every visitor works in a private
GRAPH.COPYsandbox that is deleted after a few hours. A sandbox name is 96 random bits and is never listed (not by the API, not by the MCP resource, not in error messages), so the name is the visitor's capability. One address can hold at most six sandboxes and is told to retry rather than having an active one cut off (an address can be several visitors); the same refusal applies when the whole server is full. An idle sandbox is replaced first. A sandbox is deleted after three idle hours.Every endpoint, including
/mcp, is rate-limited per client and across everyone, and the client address comes from the proxy's ownX-Forwarded-Forentry, believed only when the connection arrives from a private address (KEYSTONE_TRUSTED_PROXIES), so a forged header cannot lift the global cap or grow the limiter's table.A visitor's own LLM key is used for that single request, is never stored or logged, and may only target an allowlist of provider hosts.
Actions are dry runs. Posting is off unless the operator sets
KEYSTONE_GH_REPO(one repository they own),GITHUB_TOKENandKEYSTONE_ADMIN_TOKEN, and the request carriesconfirm=trueand the admin token in anx-admin-tokenheader. A visitor can never open an issue.Limits: PR history is a proxy for knowledge (it misses design discussions, on-call work and direct pushes); module boundaries are directory heuristics; the successor ranking was only backtested on two organisations.
AI assistance disclosure
Required by the hackathon rules, so stated plainly:
The code in this repository was written with an AI coding assistant, Claude Code (Anthropic), working under the direction of the team during the event window (Oct 17 to 18, 2026).
Interface comps were generated with Figma AI (image model
gpt-image-2.5-sunburst, through the Figma MCP) and used as visual targets; the interface itself is hand-built HTML, CSS and JavaScript.The team is responsible for the architecture, security, correctness and every claim above and can explain the graph model, the queries and the decisions.
Team: who did what (to be completed by the team before submission):
name: role and contribution
Repository layout
keystone/ load.py (ingest + derived graph), tools.py (the tool catalog), memory.py, workflow.py (3 roles), actions.py,
mcp_server.py, agent.py (LLM or router, via MCP), llm.py, api.py (FastAPI + /mcp), bootstrap.py, fetch.py
web/ hand-built UI (landing + workbench, no framework) data/snapshot/ real public PR history, gzip
bench/ backtest and latency tests/ pytest against FalkorDB deploy/ + Dockerfile one-container deploy
docs/ QUERIES.md (generated), HOW_IT_WORKS.md, DEMO_SCRIPT.md, DEPLOY.md, BLOG.md, design/ (the Figma AI comps the UI was built to)
scripts/ capture.ps1 (screenshots), deploy-hf.ps1 (push to a Hugging Face Space) PRODUCT.md, DESIGN.md design contextLicense
MIT. Data comes from the public GitHub API; repository names and logins belong to their owners.
Available Tools
15 toolschanges_sinceB
Compare the graph now with the last saved review: which modules got safer or riskier, who became top holder, and whether open pairing tasks actually progressed according to real PR activity. Use for 'what changed since last time', 'did the plan work'.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden. It usefully notes it reads 'real PR activity' and compares against a 'last saved review' (implying a prior review must exist), but it never states whether the operation is read-only, what permissions or tenant scoping is needed, or how results are produced.
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 comparison and its output list are front-loaded, followed by a compact use-case clause. It is appropriately sized with no wasted sentences, though the first sentence is dense.
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?
No output schema exists, and the description does cover the main return content, which helps. However, it omits the 'tenant' parameter entirely and doesn't clarify the dependency on an existing saved review, leaving gaps for correct invocation.
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 0% for the single 'tenant' parameter and the description never mentions it, offering no meaning, format, or default explanation. For a tool whose only parameter is undocumented in both schema and prose, the description fails to compensate.
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 (compare) and resources (the graph now vs. the last saved review) and enumerates the concrete outputs: safer/riskier modules, top holder change, pairing-task progress. It is clear what the tool does, though it does not explicitly distinguish itself from the adjacent succession_review sibling.
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 trigger phrases ('what changed since last time', 'did the plan work') that map an intent to this tool. There are no when-not conditions or named alternatives, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_actionsA
Turn an approved succession Decision into concrete, reviewable artifacts: a CODEOWNERS patch per repo and an issue draft per pairing, each with the graph evidence. Dry-run: nothing is posted anywhere. Omit decision_id to use the latest approved one.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant | No | ||
| decision_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does the important part: 'Dry-run: nothing is posted anywhere' explicitly declares the operation is side-effect-free, which is the key safety fact for a tool that emits patches and issues. It also says each artifact carries graph evidence. Permissions and any limits on reruns are not covered.
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 tightly packed sentences: artifacts first, then the safety guarantee, then the parameter shortcut. No filler and every clause adds 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?
With no annotations and no output schema, the description usefully enumerates what is produced (CODEOWNERS patch per repo, issue draft per pairing, graph evidence) and confirms nothing is emitted externally. The unexplained tenant parameter is the only real gap for an agent to call this correctly.
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 0%, so the description must compensate. It explains decision_id well - omitting it selects the latest approved Decision - but tenant is never mentioned and its empty-string default is unexplained, leaving one of two parameters ambiguous.
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 transformation - an approved succession Decision becomes a CODEOWNERS patch per repo and an issue draft per pairing. The concrete output artifacts distinguish it from read-only siblings like succession_review and overview without needing 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?
Usage is implied by 'approved succession Decision' and the explicit 'omit decision_id to use the latest approved one' rule, but there is no statement of when to call this versus succession_review or what prerequisites (approval state, credentials) must hold. Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_modulesA
Turn a fuzzy phrase ('execution plan', 'browser api') into exact module ids. Use before any module-specific tool when the user did not give an exact id.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the core behavior (fuzzy/semantic matching rather than exact lookup) and the intended call ordering, but says nothing about whether zero, one, or many candidates are returned, how ambiguity is resolved, or what the tenant scoping implies.
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, zero filler, with the core transformation stated first and the call-ordering rule second. Nothing can be cut without losing guidance.
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 and no annotations, so the description is the only source of behavioral detail. For a discovery tool whose results feed other tools, the missing information about return shape (single id vs candidate list) and the undocumented tenant parameter leave the agent guessing about downstream usage.
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 0%, so the description must compensate. It meaningfully explains the `query` parameter's expected content (fuzzy natural-language phrases, with examples), which is more than the bare string type conveys, but the `tenant` parameter is left entirely unexplained in both schema and description.
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?
Specific verb (turn) plus resource (fuzzy phrase -> exact module ids), with two concrete examples ('execution plan', 'browser api') that remove ambiguity. It also positions itself against the module-specific siblings by declaring it runs before them, so an agent can separate it from module_risk, risk_scan, etc.
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 an explicit trigger ('before any module-specific tool') and an explicit exclusion ('when the user did not give an exact id'), which is real routing guidance. It stops short of naming a particular sibling as the follow-on target or stating what to do if the query is already exact, so it is clear context rather than full alternative selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keystonesA
People ranked by what leaves with them: modules that would be orphaned and modules where they are the sole holder. Use for 'who can we not afford to lose', 'single points of failure'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does disclose the ranking logic (orphaned modules and sole-holder modules), which is useful beyond structured data. It stops short of describing permissions, output format, or how tenant scoping affects results.
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, front-loaded with the core ranking definition followed immediately by usage triggers. No filler or redundant restatement of the name.
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?
The conceptual framing is complete enough to know what the tool computes, but with no output schema, no annotations, and two undocumented parameters, the agent lacks detail on result shape and parameter effects. Adequate but with clear gaps.
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 0% and the description is silent on both 'limit' and 'tenant'. The names plus defaults make them partly guessable, but the description does not define what tenant does or what unit limit controls, so it fails to compensate 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?
The description names the resource (people) and the ranking criterion (orphaned modules, sole-holder modules), which is a specific analytical output rather than a restatement of the name 'keystones'. It distinguishes itself conceptually from siblings like what_if_leaves or successors, though it never explicitly names them.
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 supplies concrete use-case triggers ('who can we not afford to lose', 'single points of failure'), which tells the agent when this tool fits. However it gives no exclusions or contrast with the very similar what_if_leaves sibling, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_mapB
Territories (module clusters that change together, found by label propagation), who holds each, and the brokers that connect people (betweenness). Use for 'how is knowledge organised', 'silos', 'who bridges teams'.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the underlying algorithms (label propagation for clusters, betweenness for brokers), which adds genuine context about how results are derived. It does not, however, state cost, permissions, or that it is a read-only analysis, leaving key traits unstated.
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 dense sentences with the primary resource definition front-loaded followed by usage examples. The parentheticals are compact and the structure is easy to parse, though the phrasing is noun-heavy rather than an explicit verb.
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 tool with no output schema, the description adequately describes the returned artifacts (territories, holders, brokers), which the agent would otherwise lack. It is incomplete on the tenant parameter and on behavioral/permission aspects, but the core analysis is sufficiently explained.
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?
The single 'tenant' parameter has 0% schema description coverage and is never mentioned in the description, so nothing is added beyond the bare name. Although 'tenant' is a somewhat self-explanatory scoping concept, its default (empty) and required-status are not explained anywhere.
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 names the concrete resource it produces: territories (module clusters found by label propagation), who holds each, and brokers (via betweenness). An agent can form a clear mental model of the output. It stops short of naming which sibling it replaces (e.g., find_modules or who_knows), relying on the example phrases for differentiation.
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?
Explicit example intents are given: 'how is knowledge organised', 'silos', 'who bridges teams', which map directly to user questions. However, there is no when-not guidance and no mention of alternatives such as who_knows or path_between, so the agent must infer the boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
module_riskA
Bus factor and risk tier of ONE module: who holds its knowledge (authored vs reviewed share), whether they are still active, how load-bearing the module is (PageRank). Use for 'how risky is X', 'bus factor of X'.
| Name | Required | Description | Default |
|---|---|---|---|
| module | Yes | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the analytical methodology (authored vs reviewed share, contributor activity, PageRank) which is genuinely useful, but says nothing about permissions, cost, rate limits, or that it is a read-only operation. The behavioral profile is partially but not fully covered.
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?
A single, front-loaded sentence that packs purpose, component signals, and usage cues without filler. Slightly dense with parentheticals, but 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?
No output schema or annotations exist, so the description must do more legwork. It conveys what signals are analyzed but not how results are shaped or what the tenant scoping does. Adequate for the core intent, incomplete on scoping and return behavior.
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 0%, so the description must compensate. It implies 'module' identifies a single target, but the 'tenant' parameter is never mentioned and its meaning/default is left entirely to inference. Half the parameters remain unexplained.
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 analysis verb (bus factor and risk tier) on a specific resource (ONE module), and enumerates the constituent signals: authorship/review share, contributor activity, and PageRank load-bearing. The emphatic 'ONE' implicitly contrasts with multi-module siblings like risk_scan and keystones.
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 concrete usage triggers via quoted user phrasings ('how risky is X', 'bus factor of X'), which maps intent to tool cleanly. It stops short of naming alternatives or exclusions (e.g., when to prefer risk_scan or who_knows), so it is clear context without explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
note_findingB
Save a short finding to memory, linked to the people/modules (exact ids) it is about. Only write what the graph showed.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| about | Yes | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that this is a persistent memory write, that links require exact ids, and that content must be graph-grounded, but it says nothing about permissions, whether writes are append-only or deduplicated, or how tenant scoping affects visibility.
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, zero waste, with the core action and its linking requirement front-loaded and the content-fidelity constraint placed last as a qualifier. 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 mutation tool with no annotations, no output schema, and 0% parameter coverage, the description is too thin. It omits the role of tenant, the shape of any returned identifier, and safety/visibility context an agent needs before writing to shared memory.
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 0%, so the description is the only source of meaning. It partially compensates by clarifying 'text' (a short finding) and 'about' (people/module ids, exact), but the 'tenant' parameter is entirely unmentioned in both schema and description, leaving a required-capable parameter undocumented.
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: save a finding to memory, with the linking target named (people/modules by exact id). It is clear what the tool does and how it differs in kind from the read-only analysis siblings, but it never names or contrasts with its natural counterpart, recall, so an agent must infer the write/read pairing.
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?
Implies the usage context (record findings produced by graph analysis) and constrains content with 'Only write what the graph showed,' but gives no explicit when-to-use, no prerequisites, and no routing to or from recall. Guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overviewA
Size and freshness of the graph: people, active people, tracked modules, merged PRs, and the as-of date of the data. Call first when unsure what is in the graph.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the return payload (counts plus an as-of freshness date), but never states that this is a read-only, side-effect-free operation, nor anything about tenant scoping or cost. For a read-only summary tool the risk is low, but the disclosure is incomplete.
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 content list first, then the routing rule. Zero filler and the most decision-relevant information (what you get) is front-loaded.
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 does a decent job enumerating returned fields, and with no annotations the read-only nature is at least implied by 'size and freshness.' However, the sole parameter goes unexplained and there is no statement of side-effect profile, leaving a meaningful gap for a tool the agent is told to call first.
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?
There is one parameter, 'tenant', with a default of empty string and 0% schema description coverage. The description never mentions tenant, so an agent cannot tell whether omitting it means 'all tenants', 'the caller's default tenant', or something else. With a param present and undocumented, the baseline-4 zero-param case does not apply.
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 names the resource (the graph) and enumerates exactly what the tool reports: people, active people, tracked modules, merged PRs, and the data as-of date. It reads as a metadata/summary tool and is clearly distinct from the analytical siblings (risk_scan, path_between, who_knows), though it never states a crisp verb like 'summarize'.
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 gives an explicit routing rule: 'Call first when unsure what is in the graph.' That is real when-to-use guidance and positions it as the entry-point tool. It does not name any alternative or a when-not-to-use condition, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
path_betweenC
Weighted shortest chain of shared knowledge between two people, or a person and a module (algo.SPpaths). Use for 'how is X connected to Y'.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | ||
| b | Yes | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It names an internal algorithm ('algo.SPpaths') but doesn't disclose return shape, what 'weighted' means, whether the search needs a tenant context, or performance/limit behavior. Only the implicit read-only nature of 'path between' is conveyed.
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 with the core purpose front-loaded and zero filler. The parenthetical algorithm reference is the only slightly expendable token.
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 pathfinding query with no annotations, no output schema, and 0% parameter coverage, the description should explain at least the return concept and the tenant parameter. It leaves the agent without enough to call the tool confidently on anything but the simplest two-arg case.
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 0%, so the description should compensate. It clarifies that the two endpoints (a, b) are people or modules, which adds real meaning, but the third parameter 'tenant' is never mentioned and no input format or typing guidance is given for any parameter.
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 computed resource ('weighted shortest chain of shared knowledge') and its domain (two people, or a person and a module), which is more than a tautology. It doesn't explicitly contrast with path/knowledge siblings such as who_knows, knowledge_map, or successors, so an agent must infer the distinction.
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?
The phrase "Use for 'how is X connected to Y'" gives an implied usage context, which is better than nothing. However there are no when-not conditions, no prerequisite guidance, and no routing versus the many connectivity-oriented siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallB
What earlier sessions concluded or decided about a person or module (findings, decisions, open tasks), including notes about the people who hold a module. Call BEFORE planning so you do not repeat or contradict earlier work.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| tenant | No | ||
| subject | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the content returned (findings, decisions, open tasks, notes about module holders) but omits whether this is read-only, any permission requirements, or result-size/limit behavior. Adequate but leaves real behavioral gaps for an annotation-free tool.
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, front-loaded with the core purpose and content types, then the timing advice. Dense but no wasted filler; the parenthetical content list earns its space.
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 3-param tool with no annotations and no output schema, the description explains what comes back but not the parameters or result format. It covers the 'why/when' well but leaves the 'what arguments/returns' side under-specified.
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 0% for all three parameters (limit, tenant, subject). The description implicitly maps 'subject' to a person or module but never defines limit or tenant, nor explains syntax. With zero schema help the description should compensate far more than it does.
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 concrete retrieval purpose — surfacing findings, decisions, and open tasks from earlier sessions about a person or module — which is a specific verb+resource. It is reasonably distinguishable from write siblings like note_finding, though it never names a sibling tool to sharpen the boundary. The abstract name 'recall' is rescued by the parenthetical content list.
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 gives explicit timing guidance ('Call BEFORE planning') and states the rationale (avoid repeating or contradicting earlier work), which is strong context. However, it provides no when-not guidance and does not name alternatives (e.g., knowledge_map, who_knows) that an agent might confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
risk_scanA
Rank every tracked module by succession risk (critical/high/medium/low) and count the tiers. Use for 'what is most at risk', 'where are we fragile', 'orphaned code'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses the output shape (a ranking plus tier counts), which is useful, but says nothing about cost, scan scope, pagination, or permissions.
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 ranking/counting behavior is front-loaded, followed by trigger examples. No 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?
Covers purpose and output semantics adequately for a small two-param tool, but with no output schema, no annotations, and 0% param coverage, the meaning of limit and tenant is left entirely to 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 0% and both parameters (limit, tenant) are undocumented in the schema. The description does not explain whether 'limit' caps the ranked list or the scan scope, nor what 'tenant' filters.
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 (rank), resource (every tracked module), and the risk scale (critical/high/medium/low) plus tier counting. The scope word 'every' distinguishes it from the per-module sibling module_risk, but no sibling is named explicitly.
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 three concrete natural-language trigger phrasings ('what is most at risk', 'where are we fragile', 'orphaned code') that map intent to the tool. No explicit exclusions or contrast with siblings like module_risk or keystones.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
succession_reviewA
Full succession review for one person, run by three roles that coordinate only through graph state: Analyst (what-if + successors), Planner (simulates a pairing plan on a fork, writes a Decision and Tasks), Reviewer (re-verifies from the graph on a fresh fork). Writes memory. Use for 'make a plan for X', 'succession plan'.
| Name | Required | Description | Default |
|---|---|---|---|
| person | Yes | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses the three-role architecture, that roles coordinate through graph state and forks, and crucially that the tool Writes memory and produces a Decision and Tasks. It omits cost/latency/reversibility and whether the memory write is idempotent, but the mutation behavior is clearly surfaced.
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?
Front-loads the purpose, then the architecture, then the usage trigger. The parenthetical breakdown of the three roles is dense but each clause adds distinguishing information. Only mild bloat from the architecturally detailed middle section.
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 complex, multi-role, memory-writing orchestrator with no annotations and no output schema, the description covers purpose, process, and side effects well, but leaves the tenant parameter undocumented and says nothing about expected outputs, duration, or failure modes. Adequate but with clear gaps.
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 0%, so the description must compensate for both parameters. It clarifies that 'person' is a single person, but the 'tenant' parameter is never mentioned at all, and no format, default behavior, or scoping semantics are given for either. Half the parameters remain semantically undefined.
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 ('Full succession review for one person') and immediately differentiates itself from siblings by describing itself as an orchestrated multi-role workflow rather than a single primitive like successors or what_if_leaves. An agent can distinguish it from the individual analysis tools without opening a 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?
Provides explicit trigger phrases ('make a plan for X', 'succession plan') that map intent to this tool. It does not, however, name when NOT to use it or explicitly route the agent to siblings (successors, what_if_leaves, draft_actions) for smaller-scope requests, so the alternative-selection guidance is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
successorsB
Who could realistically take over a person's modules (or one module)? Multi-hop: who already reviewed their PRs, who knows adjacent modules that change together with the target. Use for 'who can step in for X', 'who should we pair with X'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| module | No | ||
| person | Yes | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses how results are derived – multi-hop over PR reviews and modules that change together – which helps the agent interpret output confidence. But it says nothing about read-only semantics, tenant scoping effects on results, or performance characteristics.
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?
Front-loads the core question before the mechanism, then usage examples. Three compact sentences with no filler, though the parenthetical '(or one module)' is slightly awkward.
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?
No output schema and no annotations, so the description is the only source of guidance. It covers the use case well but is thin on parameter meaning and result semantics, leaving an agent to guess at tenant scoping and result cardinality.
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 4 parameters at 0% schema description coverage, the description must compensate. It hints at 'person' and 'module' via 'a person's modules (or one module)', but leaves 'limit' and 'tenant' completely unexplained, which is significant given multi-tenancy appears to be a real concern.
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 analytical question – identifying successors who could take over a person's modules – and clarifies the mechanism (PR reviewers, co-changing adjacent modules). It implicitly distinguishes itself from siblings like who_knows and keystones via the 'multi-hop' framing, though it never names them outright.
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 concrete trigger phrases: 'who can step in for X' and 'who should we pair with X', which map cleanly to agent intents. It stops short of naming when NOT to use it or which sibling to prefer when the question is simpler (e.g. who_knows for pure knowledge lookup).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
what_if_leavesA
Counterfactual: if this person left, which modules become orphaned or fragile? Runs on a GRAPH.COPY fork and diffs before/after; the live graph is untouched. Use for 'what if X leaves/quits/goes on leave'.
| Name | Required | Description | Default |
|---|---|---|---|
| person | Yes | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it discharges it well: it discloses the execution mechanism (GRAPH.COPY fork, before/after diff) and the safety guarantee that the live graph is untouched. That is exactly the kind of side-effect and isolation information an agent needs before invoking an analysis tool, beyond what any structured field provides.
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 question the tool answers front-loaded ahead of the implementation detail and the usage trigger. Nothing 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 a two-parameter analysis tool with no output schema, the description covers purpose, mechanism, safety, and usage trigger well. It stops short of indicating the shape of the result (ranked list of modules? fragility scores?) and leaves the tenant parameter unexplained, but nothing essential to correct invocation is missing.
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 0% and there are two parameters. The description only alludes to the required 'person' parameter ('if this person left') without stating accepted format (name, ID, email), and the 'tenant' parameter is never mentioned at all. With no schema-level documentation or enums to lean on, this is a real 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?
The description names a specific operation (counterfactual removal simulation) and a concrete output (which modules become orphaned or fragile), which is distinct from siblings like module_risk or keystones that measure current-state risk rather than a hypothetical departure. An agent can differentiate this from the rest of the toolset without opening any 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?
It gives an explicit trigger: 'Use for "what if X leaves/quits/goes on leave"', which is a clear usage cue. However, it never names an alternative tool (e.g. module_risk or keystones) or states when a static risk tool would be preferable to this simulation, so the routing is helpful but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
who_knowsA
Who holds the knowledge for a module or area, with authored/reviewed counts and recency. Use for 'who knows about X', 'who owns X'. Returns not_in_graph if nothing matches.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| topic | Yes | ||
| tenant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it does disclose useful behavior: the return contents (authored/reviewed counts, recency) and the empty-case sentinel "not_in_graph". It does not address permissions, cost, or whether the underlying graph may be stale.
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 with no filler: purpose first, then usage triggers, then the empty-result caveat. Every sentence 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?
No output schema and no annotations, but the description covers purpose, usage, return fields, and the no-match case, which is enough for an agent to call it. The notable gap is the undocumented limit/tenant parameters.
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 0%, so the description must compensate. It indirectly clarifies "topic" (module or area) but says nothing about "limit" (default 6) or "tenant", leaving two of three parameters undocumented anywhere.
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: it identifies who holds knowledge for a module/area and enumerates the returned fields (authored/reviewed counts, recency). This is concrete, though it does not explicitly differentiate itself from near-siblings like knowledge_map or keystones.
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?
"Use for 'who knows about X', 'who owns X'" gives clear trigger phrasings, so an agent can recognize the intent quickly. It offers no when-not guidance or named alternatives among the many sibling graph tools.
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.
15 tool updates
v0.1.0- First observed
changes_since - First observed
draft_actions - First observed
find_modules - First observed
keystones - First observed
knowledge_map - First observed
module_risk - First observed
note_finding - First observed
overview - First observed
path_between - First observed
recall - First observed
risk_scan - First observed
succession_review - First observed
successors - First observed
what_if_leaves - First observed
who_knows
TDQS
Scored across 15 tools
Each tool targets a distinct resource or analysis angle: single-module risk vs portfolio risk, current knowledge holders vs multi-hop successors, keystone ranking vs per-person counterfactual. Descriptions explicitly state when to use which, so an agent can reliably select among closely related tools.
All names use lowercase snake_case with no camelCase mixing, and they are broadly descriptive. However, the set mixes verb-led commands (draft_actions, find_modules, note_finding) with noun-led queries (overview, keystones, knowledge_map, successors), so the pattern is not a uniform verb_noun convention.
15 tools fit a rich domain spanning graph overview, module discovery, risk analysis, person impact, counterfactuals, memory recall, review workflow, and artifact drafting. Each tool appears to serve a distinct part of the succession-planning workflow without obvious redundancy.
The surface covers discovery, analysis, planning, review, memory, and artifact generation, with no major dead ends. Minor gaps exist around explicit decision management (e.g., listing or approving decisions outside recall) and direct person/module listing, but core workflows are well covered.
Maintenance
Related MCP Connectors
Repository knowledge graph MCP server for codebase understanding and debugging.
Hosted code graph over MCP: exact callers, dependencies, and cross-repo blast radius for AI agents.
Permission-aware onboarding MCP server: answers about a codebase, filtered by the caller's role.
AI-native git hosting — repos, PRs, issues, CI gates, and AI code review over MCP (60 tools).
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceDev intelligence layer that builds a knowledge graph from any codebase and exposes 7 MCP tools for graph-powered reasoning, impact analysis, and preflight safety and governance checks.723 PyPI32Apache 2.0
- FlicenseNot gradedqualityBmaintenanceMCP server for indexing source code from repositories into a Neo4j graph database and enabling Graph RAG-based search and traversal of functions via natural language queries.-
- AlicenseNot gradedqualityAmaintenanceProvides MCP tools to search, compare, and get recommendations for open-source projects from a structured knowledge graph of GitHub data.MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for persistent code exploration and diff-aware review, exposing explore and review tools to map call paths, blast radius, and generate explainable risk-scored reports.3 npm2MIT