Skip to main content
Glama
BaranziniLab

SPOKEAgent

Official
by BaranziniLab

SPOKEAgent

Current version: 0.5.0. Small queries stay on MCP; long queries and full exports run as monitored local jobs without tying up an MCP request.

Install in BioRouter

  1. Download spokeagent.brxt from Releases. The same current bundle is committed under extensions/.

  2. In BioRouter, open Extensions → Add extension, select the BRXT and install. BioRouter creates the Python environment; uv and Python 3.11+ are required.

  3. Enter credentials in BioRouter's own configuration dialog, never in chat.

  4. Enable the extension in your chat. Verify a small query before a larger export.

Terminal installation uses the same installer:

biorouter extension install ./extensions/spokeagent.brxt
biorouter extension configure spokeagent

Configure SPOKEAGENT_PASSCODE. Alternatively provide KNOWLEDGE_GRAPH_URI, KNOWLEDGE_GRAPH_USERNAME, KNOWLEDGE_GRAPH_PASSWORD, and optionally KNOWLEDGE_GRAPH_DATABASE (default neo4j). Direct settings take precedence; use one route consistently. Because either route is valid, manifest fields are optional individually; startup validates that one complete route exists.

The Desktop installer discovers bundled skills/*/SKILL.md. If using a BioRouter CLI version that does not copy bundled skills, the MCP server still provides the job-routing instructions; the skill folders can also be installed separately.

Related MCP server: BioBTree

Long queries, CLI and progress

Use spoke-submit_query_job for an export or a query that could exceed the interactive timeout. It returns a job ID immediately. Poll spoke-query_job_status at its recommended interval; use spoke-cancel_query_job to stop. Only completed means the file is complete. Status includes rows, bytes, elapsed time, phase and an advisory ETA when known. Set mode="explain" to obtain a plan without running the query.

From a source checkout, or BioRouter's installed extension directory:

uv sync --locked
# Standalone CLI only: configure its OS-keyring profile interactively once.
# BioRouter MCP jobs already receive credentials and do not need this command.
uv run spokeagent auth
uv run spokeagent submit --query-file query.cypher --format jsonl --timeout-seconds 3600
uv run spokeagent watch JOB_ID

No-argument uv run spokeagent continues to start the MCP server. status, watch, list, cancel and purge need no database credentials. Results remain in the local private job directory and are not sent to chat. Database/server limits can still fail a query; jobs report those failures instead of silently truncating.

See architecture, storage, security and release details. To rebuild the tracked bundle: uv run python scripts/build_brxt.py.

A structure-aware MCP (Model Context Protocol) server for querying the SPOKE biomedical knowledge graph for rapid biomedical knowledge inference. Points to the official release of SPOKE.

SPOKEAgent doesn't just expose raw Cypher — it understands SPOKE's structure. It introspects the live schema (so it tolerates schema changes), resolves entity names / synonyms / identifiers to canonical nodes via the graph's indexes, profiles a node's real relationships, finds shortest paths between entities, and guards every query against the pitfalls of a 43-million-node graph (case-sensitivity, expensive edges, unbounded scans). See docs/CHANGELOG.md and docs/TEST_FINDINGS.md for the design rationale, validated over 100 natural-language questions through BioRouter.

Features

  • Compact, cached schema — a curated node table + Source-[:REL]->Target edge directory with counts and cost flags, derived live from the database.

  • Entity resolution — name / synonym / brand / identifier → canonical SPOKE node(s), case- and apostrophe-safe, across DOID / Entrez / Ensembl / DrugBank / UMLS / UBERON / GO, ranked by connectivity.

  • Node profiling — a node's real relationship types, directions, and counts.

  • Path finding — shortest connecting path(s) between two entities.

  • Guarded querying — read-only Cypher with auto safety-LIMIT, transaction timeout, and trimmed output.

Alternative install (custom extension via uvx)

If you prefer not to use the .brxt bundle, you can register SPOKEAgent as a custom extension command:

  1. In BioRouter, go to Add custom extension

  2. Fill in the extension name and description

  3. For the command, use the following:

uvx --from git+https://github.com/BaranziniLab/SPOKEAgent spokeagent
  1. Add an environment variable:

    a. Variable name = SPOKEAGENT_PASSCODE

    b. Value = <your-passcode> (from the credentials page)

    c. Click + Add to add the variable.

  2. Click Add extension — you're ready to go

Available Tools

The recommended workflow is schema once → resolve_entity → query / describe / find_path, passing string literals through parameters.

1. get_spoke_schema(refresh=false)

Returns a compact, cached map of the current graph: node_labels (by count), an edge_directory of {source, rel, target, count, expensive}, and usage_notes (identifier namespaces, edge properties, vestige filtering, performance rules). Call once near the start of a task.

2. resolve_entity(query, label?, limit?)

Maps a free-text name, synonym, brand, or identifier to canonical node(s). Handles case-sensitivity, apostrophes, and cross-vocabulary identifiers (DOID, Entrez, Ensembl, DrugBank, UMLS CUI, UBERON, GO). Returns ranked candidates {label, name, identifier, matched_on, score} (degree may also be present). Use it before querying.

3. describe_node(query, label?)

Returns a node's real relationship profile {dir, rel, neighbor_label, count} — to pick the right edge. If truncated=true, the profile contains only the top 60 groups; do not conclude that an unlisted edge is absent.

4. find_path(source, target, source_label?, target_label?, max_hops?, max_paths?)

Resolves both endpoints and returns the shortest connecting path(s) as node + relationship-type sequences — the right tool for "how are X and Y connected".

5. query_spoke(cypher_query, parameters?)

Execute a read-only Cypher query. Behaviour built in: writes rejected; a safety LIMIT auto-applied to unbounded non-aggregate queries; a transaction timeout; trimmed, size-capped output; coaching metadata on empty/limited results.

Example (resolve first, then query by the resolved value via parameters):

MATCH (d:Disease {name: $name})-[:ASSOCIATES_DaG]->(g:Gene)
RETURN g.name AS gene, g.identifier AS entrez
LIMIT 10

parameters = {"name": "Alzheimer's disease"}. Note ASSOCIATES_DaG carries diseases_scores/gwas_pvalue (not a score property), and drug→gene targets go (:Compound)-[:BINDS_CbP]->(:Protein)<-[:ENCODES_GeP]-(:Gene) — there is no TARGETS_CtG edge.

Security

A conservative query guard rejects writes and procedure calls in user-supplied Cypher. Use a database principal with read-only permissions: the guard supplements server authorization. Entity labels are validated before interpolation, and resolver steps share a total timeout budget rather than accumulating long waits.

License

Apache-2.0

Authors

Editors

About SPOKE

SPOKE (Scalable Precision medicine Oriented Knowledge Engine) is a large-scale biomedical knowledge graph that integrates data from multiple sources to support precision medicine research.

Available Tools

5 tools
describe_nodeDescribe a SPOKE node's actual relationships (degree profile)A
Read-onlyIdempotent

Show what a node is ACTUALLY connected to: its relationship types, the neighbour label on the other end, the direction, and the count for each.

Use this to (a) decide which relationship to traverse for a question, and (b) avoid thrashing - if a node has no edge of the type you expected (e.g. a disease with no PRESENTS_DpS symptoms, or no LOCALIZES_DlA anatomy), this tells you immediately so you can report the absence instead of guessing more queries. Also ideal for open-ended "how is X connected / what is near X" questions. The node is resolved first (handles case / apostrophes / ids).

Returns {node:{label,name,identifier}, relationships:[{dir, rel, neighbor_label, count}]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoOptional node label to disambiguate (e.g. 'Disease', 'Gene', 'Compound').
queryYesName or identifier of the node to profile (e.g. "Parkinson's disease", 'TP53', 'DOID:8778').

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely new behavioral context: the node is resolved first and tolerates case, apostrophes, and ids, and it advises reporting absence rather than guessing. No rate limits or performance notes, but the extra detail is meaningful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core capability in sentence one, then usage, then return shape. Every sentence carries information, though the parenthetical examples and the 'Also ideal' sentence make it denser than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by spelling out the return shape ({node:{...}, relationships:[{dir, rel, neighbor_label, count}]}) plus node-resolution behavior and the semantics of an empty result. Complete for an agent to call and interpret it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description goes beyond the schema by explaining that the query value is resolved before use and accepts case variants, apostrophes, and ids, which clarifies what a valid `query` actually is.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Show what a node is ACTUALLY connected to') and enumerates exactly what is returned: relationship types, neighbour label, direction, count. The emphasis on ACTUAL connections implicitly distinguishes it from the schema-level sibling (get_spoke_schema), which returns possible rather than observed edges.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives two concrete usage contexts: (a) choosing which relationship to traverse, and (b) avoiding thrashing when an expected edge type is absent, including worked examples (PRESENTS_DpS, LOCALIZES_DlA). It names no alternative sibling as the 'use X instead' path and states no explicit when-not, so it stops 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.

find_pathFind shortest path(s) between two SPOKE nodesA
Read-onlyIdempotent

Find the shortest connecting path(s) between two entities in SPOKE - the right tool for "how are X and Y connected / what links X to Y / shortest path" and subgraph-bridge questions. Both endpoints are resolved first (case / apostrophe / id safe), then a bounded bidirectional allShortestPaths search runs (anchored, so it is fast and cannot scan the graph). Returns each path as an ordered list of nodes and the relationship types between them - so you can read off the intermediate nodes and mechanism in ONE call instead of probing many queries.

If no path is found within max_hops, that is reported (try a larger max_hops, or the entities are only distantly connected). Returns {source, target, max_hops, paths:[{hops, nodes:[...], rels:[...]}]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesSource entity name or identifier (e.g. 'APOE', 'aspirin', 'DOID:9256').
targetYesTarget entity name or identifier.
max_hopsNoMaximum path length to search (1-5; clamped).
max_pathsNoMaximum number of shortest paths to return.
source_labelNoOptional label for the source (e.g. 'Gene', 'Compound', 'Disease').
target_labelNoOptional label for the target.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description still adds substantial behavioral context: endpoint resolution is case/apostrophe/id safe, the search is a bounded bidirectional allShortestPaths that is anchored and 'cannot scan the graph', and it discloses the no-path-within-max_hops outcome plus remediation. This is rich disclosure well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the query patterns it serves before mechanics. Slightly long with the explanatory clause 'so you can read off the intermediate nodes and mechanism in ONE call', but every sentence contributes useful signal, so it is close to optimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter graph-traversal tool with no output schema, the description supplies the return shape ({source, target, max_hops, paths:[{hops, nodes, rels}]}), failure behavior, and performance characteristics. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining that both endpoints are resolved first (input-normalization semantics for source/target) and that exceeding max_hops yields a reported no-path result rather than silence. It adds less for max_paths and the optional label params.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'Find the shortest connecting path(s) between two entities in SPOKE'. It goes further and names the query patterns it answers ('how are X and Y connected / what links X to Y') plus 'subgraph-bridge questions', which cleanly separates it from siblings like query_spoke or describe_node.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the situations that select this tool (connectivity/path questions, subgraph bridging) and contrasts it with the alternative approach of 'probing many queries'. It does not name a specific sibling as the fallback nor state when NOT to use it, 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.

get_spoke_schemaGet SPOKE Knowledge Graph Schema (compact)A
Read-onlyIdempotent

Return a COMPACT, curated map of the current SPOKE graph: node labels with counts and a Source->REL->Target edge directory with counts and cost flags.

This is derived live from the database, so it reflects the real, current schema (robust to new/renamed labels or edges). It is small and cached - call it ONCE near the start of a task, then rely on resolve_entity + query_spoke. Use the edge_directory to pick the exact relationship type that connects two entity types before writing Cypher.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNoForce a re-read of the live schema (otherwise a cached copy is returned).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: it is derived live from the database, robust to new/renamed labels, small, and cached. It stops short of describing exact response size or cache TTL, but the caching and liveness disclosure is a meaningful addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the return payload, followed by liveness/caching caveat and usage routing. Every sentence earns its place with no repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description fully characterizes the return value (node labels with counts, edge directory with counts and cost flags) and the caching/liveness behavior. Combined with complete parameter coverage, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'refresh' parameter is fully documented in the schema itself. The description reinforces this by stating the result is 'small and cached,' but adds no syntax or format detail beyond what the schema already provides, so the 3 baseline applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return a COMPACT, curated map of the current SPOKE graph') and enumerates exactly what the map contains: node labels with counts and a Source->REL->Target edge directory with counts and cost flags. It is clearly distinguishable from siblings like query_spoke or resolve_entity, which it names as downstream tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not-to-reread guidance: 'call it ONCE near the start of a task, then rely on resolve_entity + query_spoke.' It also names a concrete use case ('Use the edge_directory to pick the exact relationship type... before writing Cypher') and implies the exclusion (don't re-call repeatedly; use refresh only if needed).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_spokeQuery SPOKE Biomedical Knowledge GraphA
Read-onlyIdempotent

Execute a read-only Cypher query on SPOKE for biomedical knowledge inference.

Behaviour built in for you:

  • Only read queries are allowed (writes are rejected).

  • An unbounded, non-aggregate query gets a safety LIMIT appended so it cannot accidentally scan the 43M-node graph; aggregations and queries with your own LIMIT are left as-is.

  • A transaction timeout aborts pathological queries instead of hanging.

  • Output is trimmed (noisy HTML/link fields removed, long strings cut) and capped in size to stay efficient.

Tips: resolve names first with resolve_entity; use the edge_directory from get_spoke_schema to choose relationship types; pass literals via parameters.

ParametersJSON Schema
NameRequiredDescriptionDefault
parametersNoQuery parameters, e.g. {"name": "Parkinson's disease"} used as $name in the query. Strongly preferred over inlining literals.
cypher_queryYesA read-only Cypher query. Anchor it on a node resolved via resolve_entity (match by exact name or identifier) and pass string literals through `parameters` rather than inlining them (this avoids case and apostrophe errors, e.g. "Parkinson's disease").

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral detail beyond them: writes are rejected, unbounded non-aggregate queries receive an automatic safety LIMIT, a transaction timeout aborts pathological queries, and output is trimmed and capped. This is rich, relevant disclosure for a graph-query tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then organized into behavioral notes and tips. Every part is useful, though the bulleted behavior section is somewhat long relative to the minimal information an agent needs to start using the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, open-ended Cypher query tool with no output schema, the description is complete enough: it covers safety constraints, automatic limits, timeout behavior, and output trimming and capping. It also provides the necessary prerequisites involving resolve_entity and get_spoke_schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 well documented in the input schema. The description repeats the guidance to pass literals via parameters rather than inline them, which adds little beyond the schema's own examples and warnings, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: execute a read-only Cypher query on SPOKE for biomedical knowledge inference. It also distinguishes the tool from siblings by telling the agent to resolve names first with resolve_entity and use get_spoke_schema for relationship guidance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear workflow: resolve names first, consult get_spoke_schema for edge types, and pass literals via parameters. It does not explicitly state when not to use this tool or directly compare it against all siblings, 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.

resolve_entityResolve a name/identifier to canonical SPOKE node(s)A
Read-onlyIdempotent

Map a free-text name, synonym, or identifier to the canonical SPOKE node(s).

Use this BEFORE query_spoke. It handles the things that make naive queries fail: case-sensitivity (exact {name:...} is case-sensitive), apostrophes, synonyms/brand names, and cross-vocabulary identifiers (DOID, Entrez, Ensembl, DrugBank, UMLS CUI, UBERON, GO). It uses SPOKE's range and full-text indexes, so it is fast and never scans the whole graph.

Returns ranked candidates: {label, name, identifier, matched_on, score}. Then query by the returned exact name or identifier via the parameters argument of query_spoke. If several candidates look plausible, state which one you picked and why.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoOptional node label to restrict to (e.g. 'Disease', 'Gene', 'Compound', 'Anatomy', 'SideEffect'). Strongly recommended when you know the entity type - it is faster and more accurate.
limitNoMax candidates to return.
queryYesFree-text name, synonym, or identifier to resolve (e.g. 'multiple sclerosis', "Parkinson's disease", 'Tylenol', 'EGFR', 'DOID:9352', 'ENSG00000130203', 'DB00619').

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely non-obvious behavior: it relies on range and full-text indexes, never scans the whole graph, and handles case-sensitivity, apostrophes, synonyms/brand names, and cross-vocabulary identifiers — all traits an agent cannot infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then progressively adds the why, the failure modes it handles, the return shape, and the next step. Dense but every sentence carries weight; only the multi-vocabulary enumeration runs slightly long.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description specifies the return shape ({label, name, identifier, matched_on, score}) and the downstream usage pattern. For a 3-parameter, single-required-param tool, an agent has everything needed to call it and act on results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so a 3 is the baseline, but the description adds real value beyond the schema by enumerating supported identifier vocabularies (DOID, Entrez, Ensembl, DrugBank, UMLS CUI, UBERON, GO) and by specifying how the returned `name`/`identifier` feed into query_spoke.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: map free-text name/synonym/identifier to canonical SPOKE node(s). It clearly distinguishes itself from the sibling query_spoke by being the resolution step that precedes querying, rather than the query itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit sequencing instruction ('Use this BEFORE query_spoke') plus a follow-up instruction on what to do with results (query by returned exact name or identifier via query_spoke's `parameters` argument). It even covers the ambiguous case: when several candidates look plausible, state which was picked and why.

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. 5 tool updatesv0.5.0
    • First observeddescribe_node
    • First observedfind_path
    • First observedget_spoke_schema
    • First observedquery_spoke
    • First observedresolve_entity

TDQS

A4.6/5.0

Scored across 5 tools

Disambiguation5/5

Each tool serves a clearly distinct purpose: schema discovery (get_spoke_schema), entity resolution (resolve_entity), neighborhood inspection (describe_node), pathfinding (find_path), and arbitrary querying (query_spoke). The only mild overlap is describe_node vs query_spoke for inspecting connections, but descriptions clearly guide when to use which.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (get_spoke_schema, resolve_entity, describe_node, find_path, query_spoke). The domain-specific inclusion of 'spoke' in two names does not break the pattern's predictability.

Tool Count5/5

Five tools is well-scoped for a read-only graph query server, covering essential operations (schema, resolution, neighborhood, path, query) without redundancy or bloat. Each tool earns its place in the workflow.

Completeness4/5

The surface covers schema discovery, entity resolution, neighborhood inspection, pathfinding, and raw Cypher—near-complete for read-only exploration. A minor gap is the lack of a dedicated tool to retrieve node properties directly, though query_spoke can serve as a workaround; write operations are intentionally absent.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    A unified biomedical graph database that integrates 50+ primary data sources — genes, proteins, compounds, diseases, pathways, and clinical data — into a single queryable graph with billions of cross-reference edges. Its native MCP server gives LLMs direct access to structured, authoritative biomedical data, complementing their reasoning with reliable identifiers and up-to-date database content.
    20
    AGPL 3.0
  • A
    license
    A
    quality
    A
    maintenance
    A high-performance MCP server that gives LLMs access to 25 biomedical tools federated across 50+ upstream APIs for genes, variants, drugs, diseases, literature, clinical trials, and structural biology.
    41
    86 npm
    12
    Apache 2.0