graphify-mcp
graphify-mcp exposes a codebase knowledge graph as MCP tools, prompts, and resources, enabling AI assistants to explore, query, and maintain structural code insights with token-efficient queries.
Build & Maintain
graphify_build— Build or incrementally update a knowledge graph from source code (Python viaast; JS/TS/Go/Java/Rust/C++ via tree-sitter)graphify_add— Incorporate external URLs (arXiv papers, tweets) into the graphgraphify_freshness— Detect if the graph is stale vs. git HEAD; distinguishes cosmetic (comment/format) changes from structural ones and recommends fresh/update/rebuildgraphify_validate— Lint for dangling/duplicate edges and orphan nodes
Graph Exploration & Navigation
graphify_overview— One-shot orientation: graph size, god nodes, communities, surprise edges, suggested next stepsgraphify_query— Natural-language queries with optional DFS tracing and token budget cappinggraphify_path— Find the exact path between two named nodesgraphify_explain/graphify_node_details— Full metadata for a node (type, file, line, docstring, community)graphify_subgraph— BFS subgraph around a node capped at a token budget (core cheap exploration tool)graphify_neighbors— List 1-hop neighbors with relation typesgraphify_search— Search nodes by name/label text
Structural Analysis
graphify_god_nodes— List highest-degree (most connected) nodesgraphify_communities— Summarize Leiden communities with sizes and sample membersgraphify_surprises— Surface unexpected cross-file/cross-domain connections
Semantic Naming
graphify_label_communities— Assign human-readable names to communities via host-LLM sampling, backend API key, or placeholdersgraphify_set_labels— Persist assistant-provided community names into the graphgraphify_sampling_status— Capability test for which naming method is available
Semantic Bridge (optional [semble] extra)
graphify_locate— Joins semantic search and graph structure, returning token-budgeted subgraphs plushidden_links(semantically similar but structurally disconnected code)
LLM-Friendly Features
Tool annotations (
readOnlyHint,destructiveHint),as_jsonstructured output, token budgetingReusable prompts (
onboard,trace_bug,explain_flow) that orchestrate tools for common workflowsResources exposing graph report, raw graph JSON, and per-community wikis
Full or lean toolset mode via
GRAPHIFY_TOOLSETenv varstdio(default) or HTTP transport with authentication; deployable locally or as a shared team server
Allows adding a source from arXiv by URL, enabling the knowledge graph to include research papers as nodes.
Optionally used as a local backend for labeling communities with semantic names via the graphify_label_communities tool.
Optionally used as a backend API for labeling communities with semantic names via the graphify_label_communities tool.
Click on "Install 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., "@graphify-mcpgive me an overview of the codebase graph"
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.
graphlore
A Python MCP server that makes a Graphify codebase
knowledge graph navigable — and joins it to the real source through a span
engine. Graphify builds the graph (graphlore ships no extractor of its own);
graphlore exposes it as 28 MCP tools, prompts and resources, and resolves every
node to its true start..end symbol range — so an assistant orients structurally
and cheaply (token-budgeted maps, then exact spans) instead of grepping and
reading file after file.
Relationship to Graphify's own MCP server. Graphify ships an embedded MCP server (
graphify ./raw --mcp), and the two overlap more than they differ. Graph navigation (query, node lookup, neighbors, communities, god nodes, stats, shortest path), token-budgeted subgraph rendering, an HTTP transport with API-key auth and DNS-rebinding protection, and multi-project serving are all already there — and it has PR triage tools graphlore does not.What graphlore adds is the span engine: real
start..endsymbol ranges via stdlibastand tree-sitter, and the layer that only becomes possible once you have them — semanticlocatewithhidden_links(a semantic chunk joined to the enclosing symbol, not a nearest-line guess), source hydration (graphlore_fetch/graphlore_skeleton), framework route → handler and package-API extraction, and cosmetic-vs-structural git freshness.
Known limits. One project per server process (GRAPHLORE_PROJECT_DIR; use
Graphify's embedded server if you need several repos from one process). No
PR/review tooling. No extractor: graphifyy must be installed, and
graphlore_build/query/path/explain/add are thin wrappers over its CLI.
graphlore_locate and graphlore_duplication_scan need the optional [semble]
extra; non-Python spans, routes and package APIs need [treesitter], without
which non-Python files fall back to nearest-line matching.
Why graphlore_locate
One MCP call turns a natural-language question into a navigational map, not a wall of code:
🔎 Semantic + structural, one call — semble finds the relevant code, the graph gives its neighborhood. ~235 tokens to orient vs ~61k for grep+read (263× fewer on httpx).
🔗
hidden_links— semantically similar code that is structurally disconnected (duplication / missing-abstraction / sync-async-twin candidates) that neither search nor the graph surfaces alone.🌍 Multi-language, zero config — Python via stdlib
ast; JS/TS · Go · Java · Rust · C++ · 165+ more via tree-sitter with automatic language detection. Span-join precision 70–96% on real HTTP-client repos in six languages, at 1 tool call / 0 file reads per orientation (benchmark).🕒 Cosmetic-aware freshness —
graphlore_freshnessignores comment/format-only edits (in every language) so a reformat never triggers a needless rebuild.
One call beats running semble and graphify separately
semble finds what's relevant; graphify gives how it connects. They're complementary — but stitching them by hand means four calls, ~2.7k tokens, and manually aligning semble's line ranges to graph nodes. graphlore does that join for you, in one call:
per query | semble alone | graphify alone | both, by hand |
|
Semantic search | ✓ | — | ✓ | ✓ |
Graph structure | — | ✓ | ✓ | ✓ |
Chunk → symbol join | — | — | you wire it | ✓ automatic |
| — | — | — | ✓ only here |
Calls | 1 | 1 | 4 | 1 |
Tokens to orient | 1,613 | 1,107 | 2,721 | 235 |
→ 11.6× fewer tokens than running the two separately — in a single call, and hidden_links (semantically similar code that is structurally disconnected) is a signal neither tool produces alone. So the combined tool isn't just convenience: it's cheaper, and it surfaces something the parts can't. (full benchmark ↓)
Installation
# graphlore itself
pip install graphlore
# plus the Graphify CLI it wraps (needed for build/query/path/explain/add)
pip install graphifyy && graphify installFrom source:
git clone https://github.com/yasinyaman/graphlore
cd graphlore
pip install -e ".[dev]"Optional extras: [semble] (semantic locate + duplication scan), [treesitter]
(non-Python span/API/route engines; usually already present via graphify),
[tiktoken] (exact token counts), [watch] (filesystem watcher).
Related MCP server: repo-graphrag-mcp
Running
GRAPHLORE_PROJECT_DIR=/path/to/repo graphlore
# equivalently:
GRAPHLORE_PROJECT_DIR=/path/to/repo python -m graphloreRenamed from
graphify-mcp: the old name collided with thegraphify-mcpconsole script thatgraphifyyships for its embedded server, which forced the clunkygraphify-mcp-serverentry point. Asgraphlorethe bare command is ours. The boot banner on stderr (graphlore vX.Y.Z | transport=… | project=…) confirms which server and project dir you're actually running.
Claude Code
Copy mcp.json to a .mcp.json at your project root. GRAPHLORE_PROJECT_DIR: "." uses the project root.
Claude Desktop / Cowork
Add the contents of claude_desktop_config.json to your Claude Desktop config:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Transport (stdio default, optional HTTP)
stdio is the default and the right choice for a per-developer local server. To serve over HTTP instead (e.g. a shared graph for a team or a web MCP client):
GRAPHLORE_TRANSPORT=streamable-http GRAPHLORE_HOST=127.0.0.1 GRAPHLORE_PORT=8000 \
GRAPHLORE_PROJECT_DIR=/path/to/repo graphloreAny HTTP transport force-enables path containment (GRAPHLORE_RESTRICT_PATHS)
so a network client can't drive graphlore_build to extract arbitrary filesystem
paths. HTTP binds 127.0.0.1 by default. To expose it beyond localhost, set
GRAPHLORE_API_KEY — every request must then send Authorization: Bearer <key>
(constant-time checked, 401 otherwise); binding a non-loopback host without a key
prints a warning.
When bound to a loopback host, the MCP SDK auto-enables DNS-rebinding
protection: only Host: 127.0.0.1 / localhost / ::1 requests are accepted. A
reverse proxy in front (nginx/caddy on a public name forwarding to
127.0.0.1) must therefore rewrite the Host header — or set
GRAPHLORE_ALLOWED_HOSTS to the public name(s) (comma-separated, :* port
wildcards allowed; * disables the protection for a trusted proxy).
The CLI is always invoked as an argument list with no shell (subprocess.run
with shell=False), so a build path or query string can't inject shell commands.
Per-file analyzers (spans/APIs/routes/fetch) are confined to the project
directory through a single path-resolution boundary, so a hostile path in a
graph or chunk can't read files outside the project. For a shared/network
deployment, also consider lowering GRAPHLORE_TIMEOUT (default 600s) so a
single slow graphlore_build can't tie up a worker for ten minutes.
GRAPHLORE_TRANSPORT=streamable-http GRAPHLORE_HOST=0.0.0.0 GRAPHLORE_API_KEY=$(openssl rand -hex 16) \
GRAPHLORE_PROJECT_DIR=/path/to/repo graphloreFor a smaller tool surface (helps some models pick the right tool), set
GRAPHLORE_TOOLSET=lean to expose only the core exploration tools — or
GRAPHLORE_TOOLSET=locate for the minimal locate-first surface: orient with one
graphlore_locate call, hydrate code with graphlore_fetch, stay in sync with
graphlore_build/graphlore_freshness. locate needs a semantic backend (the
[semble] extra or GRAPHLORE_SEMANTIC_BACKEND) and falls back to lean without
one.
Tools
CLI-backed (the first two write state; the rest are read-only):
Tool | Purpose |
| Build/update the graph ( |
| Add a source by URL (arXiv, tweet) |
| Natural-language query ( |
| Exact path between two nodes |
| Everything about a node |
graph.json analysis (read-only, no CLI needed, as_json=True for structured output):
Tool | Purpose |
| Call first — size, god nodes, communities, surprises, suggested next steps |
| Most connected nodes |
| Leiden community summaries |
| Unexpected cross-file connections — listed from the graph's own flags when it has them, otherwise computed by scoring cross-file edges (confidence, file-type/directory/community crossing), with resolver noise and test↔source coupling suppressed; says plainly when nothing is computable rather than printing an empty list |
| Node search |
| 1-hop neighbors of a node |
| Token-budgeted BFS subgraph around a node — the cheap way to feed the model just the relevant slice (Graphify's embedded server does this too; pairing it with |
| Reverse-dependency / blast radius — what breaks if a node changes ( |
| Node metadata: type, source file/line, docstring, community |
| def/class signatures (decorators kept, bodies stripped) for a file/node/community — the middle layer between the map and full code |
| Token-budgeted source hydration — reads the real code for a node (its enclosing def/class span ± context), the map→code other half of |
| Is the graph stale vs. git HEAD? Returns |
| Structural changeset between two git refs (default |
| Drop phantom nodes (and their edges) for deleted/renamed source files — the surgical alternative to a full rebuild ( |
| Lint the graph for dangling/duplicate/self-loop edges and orphan nodes (read-only) |
| Repo-wide hidden-link / duplication audit — the batch form of |
| Circular dependencies — strongly-connected node groups in the directed graph (an architectural smell), self-loops listed separately |
| Symbol-level external API surface — which names each external package is actually used for ( |
| Framework route → handler table — which URL patterns hit which code, joined back to graph nodes ( |
Semantic naming (uses the host model via MCP sampling — no API key — or a backend key):
Tool | Purpose |
| Capability test: reports whether the client supports host-LLM sampling, whether a backend key is set, and which method will be used |
| Give Leiden communities human-readable names. |
| Persist assistant-provided community names (sampling-free fallback) to |
Semantic bridge (optional [semble] extra — semantic search joined to graph structure):
Tool | Purpose |
| NL query → enclosing graph node → token-budgeted subgraph, plus |
Typical workflow
graphlore_locate("where do we retry failed requests?")— one-call orientation (orgraphlore_overview()→graphlore_subgraph("SomeNode")without the semble extra)graphlore_fetch(["Client._send_single_request"])— hydrate exactly the code you zeroed in ongraphlore_impact("Response")/graphlore_cycles()/graphlore_routes()— targeted analysisgraphlore_query("how does the auth flow work?")— free-form questions via the CLIAfter code changes:
graphlore_freshness()→graphlore_build(update=True)(plusgraphlore_prune()after deletes/renames)
Keeping the graph fresh
The analysis tools surface staleness for you: graphlore_overview and
graphlore_subgraph carry a lightweight graph_age ("built 3 commits ago"), and
graphlore_freshness gives a full recommended_action (fresh / update / rebuild).
To stop thinking about it, regenerate on every commit with a git post-commit
hook — the recommended first-class auto-update flow:
# .git/hooks/post-commit (then: chmod +x .git/hooks/post-commit)
#!/bin/sh
# incremental, viz-free, backgrounded so the commit returns immediately
graphify . --update --no-viz >/dev/null 2>&1 &Incremental --update only re-extracts changed files — it can't drop nodes for
deleted/renamed code on its own. graphlore_prune closes that gap: it surgically
removes the phantom nodes (and their edges) for source files that are gone from the
working tree, so after a delete/rename you can graphlore_prune (preview with
dry_run=True) + graphlore_build(update=True) instead of a full rebuild.
graphlore_freshness knows about this — it only steers to a rebuild while phantom
nodes for the removed files still linger, and reports them in phantom_files. An
agent can also just call graphlore_build(update=True) when graph_age /
graphlore_freshness says the graph drifted.
There's also an opt-in filesystem watcher (GRAPHLORE_WATCH=1, the [watch]
extra): it re-syncs the graph on structural source changes, ignores cosmetic
edits and non-source churn (VCS internals, virtualenvs, its own output), and
debounces via GRAPHLORE_WATCH_DEBOUNCE.
Semantic bridge (optional [semble])
pip install "graphlore[semble]" adds graphlore_locate, which joins
semble's semantic code search to the graph
in one call. Graphify gives structure (how code connects); semble gives
retrieval (which code is semantically relevant) — they're complementary.
graphlore_locate("how does retry backoff work"):
semble finds the most relevant code and resolves the top hit to its enclosing graph node (better than label matching).
returns the token-budgeted subgraph around it (structure).
runs semble
find_relatedand cross-checks: a cousin that is semantically similar but not within the seed's structural neighborhood is flagged as ahidden_link(with its hop distance) — a duplication / missing-abstraction / implicit-coupling candidate that neither tool surfaces alone.
The extra is optional: without it the core tools are unchanged and graphlore_locate
returns an install hint. Any other embedding backend can be plugged in via
GRAPHLORE_SEMANTIC_BACKEND=module.path:Factory (implementing search /
find_related). It also pairs well with running semble's own MCP server
alongside graphlore.
The chunk→node join and the freshness cosmetic-vs-structural check work
across languages: Python uses the stdlib ast (no extra deps), and every
other language (JS/TS, Go, Rust, Java, Ruby, C/C++, …) is handled by an optional
tree-sitter backend — pip install "graphlore[treesitter]", also pulled in
by graphify. Without it, non-Python files fall back to nearest-line matching.
Naming communities without an API key (MCP sampling)
The Leiden clustering is keyless, but turning Community 7 into Authentication
needs a model. Three ways, in graphlore_label_communities's preference order:
Host-LLM sampling — the server asks the connected client to run the completion via MCP
sampling/createMessage. The model the user already uses (e.g. Claude in a sampling-capable client) does the naming; the server holds no API key. Subject to client support — callgraphlore_sampling_statusfirst; it degrades gracefully when unsupported. All communities are named in a single batched request, carried over whichever transport the negotiated protocol allows (the legacy back-channel, or input-required rounds on MCP 2026-07-28+), so it works with both older and modern clients.Backend API key (
method="cli") — setGEMINI_API_KEY/OPENAI_API_KEY/ANTHROPIC_API_KEY/ … (or run a local ollama) and graphify's own backend names them. This option always remains available.Placeholders — no model anywhere: names stay
Community N.
If the client can't sample and you have no backend (e.g. Claude Code, which
doesn't support sampling), use the assistant-driven fallback: the assistant
is already a capable model in the loop, so it reads graphlore_communities and
pushes names back via graphlore_set_labels({"0": "Authentication", ...}) —
no key, no sampling, works in any client. The names persist to
.graphify_labels.json and are patched into graph.html.
Benchmark
Averaged over 6 queries spanning httpx subsystems (send path, digest auth, redirects, content decoding, cookies, timeouts) on the 2,101-node graph. Each query orients an agent to a code area; tokens = what reaches the model's context (≈ chars/4).
Approach | Tokens (avg) | Calls | Structure | Semantic | Hidden links |
Naive grep + read | 61,836 | ~14 | — | — | 0 |
semble alone | 1,613 | 1 | — | ✓ | 0 |
graphify alone | 1,107 | 1 | ✓ | — | 0 |
semble + graphify (separately) | 2,721 | 4 | ✓ | ✓ | 0 |
| 235 | 1 | ✓ | ✓ | 7 |
graphlore_locate averages 263× fewer tokens than grep+read and 11.6× fewer
than running semble and graphify separately (one call instead of four) — and it's
the only approach that surfaces hidden_links (semantically similar but structurally
disconnected code), 5–10 per query.
Those ~235 tokens are a navigational map (seed file:line + structural
neighborhood + hidden links), not raw code — you fetch the specific code only where
needed. That's the trade graphlore optimizes: cheapest orientation plus the
cross-check signal, then drill in precisely. The graphify alone row is its own token-budgeted subgraph output — the gap to 235 is the semantic seed (landing on the right node instead of a degree-sorted expansion), not a budgeting difference.
Case study — the hidden links are real. Asked "does httpx duplicate
request-sending across sync and async?", graphlore_locate returned the seed
Client._send_single_request and flagged hidden links. Checking the source
confirmed every production flag is a genuine sync/async twin:
Client._send_single_request (_client.py:1001) ↔ AsyncClient._send_single_request
(:1717); BaseTransport.handle_request ↔ handle_async_request (in every
transport); __enter__ ↔ __aenter__. ~500 tokens (one locate + a targeted read)
surfaced a real architectural pattern that naively reading _client.py (~16k tokens)
would. The far-distance bucket also held test files (related, not refactor targets) —
the distance field separates production parallels (3–4) from that noise.
Across languages — real HTTP-client repos. The span join and freshness check aren't Python-only. I built AST-only graphs for an HTTP client in five more languages and ran the same kind of queries (send · redirects · timeout/retry · headers/auth · transport):
Language | Repo | Span-join precision | Qualname | Hidden / q | locate vs grep | Calls (locate vs naive) |
Python (ast) |
| 96% (52/54) | 67% | 3.2 | 272× | 1 vs 15 (0 vs 14 reads) |
JavaScript / TS |
| 89% (48/54) | 67% | 2.3 | 583× | 1 vs 9 (0 vs 8 reads) |
Go |
| 93% (50/54) | 100% | 1.8 | 911× | 1 vs 17 (0 vs 16 reads) |
Java |
| 85% (46/54) | 50% | 2.3 | 217× | 1 vs 18 (0 vs 17 reads) |
Rust |
| 70% (38/54) | 83% | 3.7 | 577× | 1 vs 22 (0 vs 21 reads) |
C++ |
| 72% (39/54) | 100% | 4.3 | 195× | 1 vs 16 (0 vs 15 reads) |
Python uses the stdlib ast; JS/TS · Go · Java · Rust · C++ go through tree-sitter with
automatic language detection — one tool, zero per-language config. Span-join precision =
share of semantic hits landing inside the resolved symbol's real span (any overload of it —
C++ collapses same-name overloads into one graph node while each keeps its own span; cpr's
Session::SetOption has 46). It's 70–96% across six 350–2,095-node graphs, hidden-links
keep surfacing 2–4/query, and locate stays 195–911× cheaper than grep+read. Orientation is
also one tool call with zero file reads by construction, where the grep-driven baseline
spends 9–22 calls opening 8–21 files per query — 89–95% fewer calls, on the same grep
baseline as the token numbers. Rust and C++
trail at 70–72% — their misses are mostly file-top/whole-file chunks and namespace-level free
functions where the resolution is still correct (they recover qualified names at 83–100%).
graphlore_freshness's cosmetic-vs-structural check is correct in every language too
(comment/reformat → cosmetic; operator/rename → structural). Re-measured 2026-08 on the MCP v2
SDK, Python 3.14, fresh repo HEADs. Reproduce with
benchmarks/multilang.py (--json persists a run;
benchmarks/results-multilang.json is the committed
record of the call/token baseline — its span-join counts predate the overload-family
re-count above).
→ Full benchmark report (interactive HTML, per-query breakdown + the cross-language tables) — or open docs/benchmark.html locally. (Türkçe)
httpx headline measured 2026-06 with semble 0.3.4 (6 queries, per-query locate 189–286
tokens); cross-language table re-measured 2026-08 with semble 0.5.5 + the tree-sitter span
backend — 6 queries × 54 hits each on httpx / got / resty / retrofit / ureq / cpr,
call counts from the same run. Sample bias: every repo benchmarked here is
an HTTP-client library — a deliberately uniform family chosen for cross-language comparability.
Token savings and span-join precision will differ on other architectures (data pipelines, GUI
apps, sprawling monorepos), so treat these as indicative, not guarantees. Numbers vary by
codebase and query.
Resources
graphlore://report— GRAPH_REPORT.mdgraphlore://graph— graph.json (raw)graphlore://community/{id}— per-community wiki (members + internal/boundary edges)
Prompts
Reusable templates that orchestrate the tools for the assistant:
onboard— orient to the codebase (overview → communities → subgraphs → surprises → summary)trace_bug(symptom)— find likely root-cause locations through the graphexplain_flow(flow)— end-to-end walkthrough of a named flow with file:line refs
LLM-friendliness
Tool annotations (
read_only_hint,destructive_hint, titles) tell the model which tools are safe to call freely vs. which mutate state.Server instructions describe the recommended flow (locate/overview → targeted subgraph/fetch → build update).
as_jsonoutput on every analysis tool — including error and no-match paths — returns structured data the model can chain on instead of re-parsing prose.Token budgeting on source, not just structure — budgeted subgraph rendering is Graphify's own (its embedded server does the same); graphlore extends the discipline to code:
graphlore_fetchandgraphlore_skeletonhydrate real spans under a cap, so escalating map → signatures → source never blows the context.Unambiguous names — when several nodes share a bare label (five
.auth_flow()s across auth classes), rendered output qualifies them with the span-recovered FQN (DigestAuth.auth_flow()) or afile:linesuffix, so an arrow always names exactly one symbol.Host-LLM sampling (
graphlore_label_communities) lets the server borrow the client's model via MCPsampling/createMessage, so semantic naming works with no server-side API key — with a capability test (graphlore_sampling_status) and a backend-key fallback.
Environment variables
Variable | Default | Description |
|
| Project root to extract the graph from |
|
| Output folder name |
|
| CLI path |
|
| CLI timeout (seconds) |
|
| Confine |
|
|
|
|
| Bind host for HTTP transports |
|
| Bind port for HTTP transports |
| (unset) | Require |
| (unset) | DNS-rebinding |
|
|
|
| (heuristic) |
|
|
| Semantic index: |
|
| Filesystem watcher: auto re-sync on structural changes ( |
|
| Watcher debounce window (seconds) |
Every variable is also honored under its legacy
GRAPHIFY_*spelling (the pre-rename names); when both are set,GRAPHLORE_*wins. Artifacts of the wrapped Graphify CLI keep their own names regardless (graphify-out/,.graphify_labels.json, thegraphifybinary).
Project layout
graphlore/
├── src/graphlore/ # package
│ ├── server.py # MCP server: 28 tools, prompts, resources, transports
│ ├── graph.py # graph.json loading, node/edge accessors, BFS, adjacency
│ ├── spans.py # span engine: ast + tree-sitter, chunk→node join, structural diff
│ ├── apis.py # symbol-level external-API extraction
│ ├── routes.py # framework route → handler extraction
│ └── config.py # project dir / out dir
├── tests/ # pytest suite (in-process MCP client + unit tests)
├── benchmarks/ # multilang benchmark + committed results JSON
├── docs/ # benchmark reports (HTML/SVG)
├── .claude/skills/ # graphlore-explore skill for Claude Code
├── .github/workflows/ # CI: ruff + mypy + pytest on py 3.10–3.12
├── mcp.json # Claude Code example config
└── claude_desktop_config.jsonDevelopment
pip install -e ".[dev]"
ruff check .
mypy
pytest -qSee CONTRIBUTING.md. Licensed under MIT.
Available Tools
16 toolsgraphify_addA
Add an external source to the graph (arXiv paper, tweet, etc.). http/https only.
Args: url: Source URL to add. author: Original author tag (optional). contributor: Tag for who added it (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| author | No | ||
| contributor | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the additive nature and the http/https constraint. Annotations indicate destructiveHint=false, which aligns with adding. However, it does not explain whether the addition is permanent, if duplicates are checked, or what the response looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences plus a bullet list of arguments. It front-loads the purpose and constraints, with no unnecessary words.
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?
Given the tool's simplicity and the presence of an output schema, the description covers the core action. However, it could benefit from mentioning validation behavior or side effects on the graph. It is adequate but not thorough.
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 0% schema description coverage, the description adds meaningful semantics for all three parameters: url is the source URL, author is the original author tag, contributor is the tag for who added it. This compensates for the lack of schema descriptions, though it could provide more format details.
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 clearly states the verb 'Add' and the resource 'external source to the graph', with concrete examples (arXiv paper, tweet) and a protocol constraint (http/https only). It distinguishes this tool from siblings by its unique function of adding external sources.
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 description provides no explicit guidance on when to use this tool versus alternatives, nor does it specify prerequisites or exclusions. The usage is implied by the name, but there is no contextual advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_buildA
Build or update a knowledge graph from a folder. (Writes to graphify-out/.)
Args: path: Folder to extract the graph from (relative to the project dir or absolute). mode: "deep" -> more aggressive INFERRED edges; empty -> default. update: True -> re-extract only changed files and merge into the existing graph. cluster_only: True -> rerun clustering only, without re-extraction. no_viz: True -> skip the HTML visualization (faster for development).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | . | |
| mode | No | ||
| update | No | ||
| cluster_only | No | ||
| no_viz | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=false, and the description adds behavioral details: writing to graphify-out/, incremental update behavior, and optional skip of visualization. This goes beyond what annotations alone provide, though it lacks information on auth or rate limits.
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 description is well-structured with an Args list, front-loaded with the main purpose. It is slightly verbose but every sentence adds value. Could be tightened slightly but remains efficient.
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?
Given 0% schema coverage and 5 parameters, the description covers all key inputs and the primary output (graphify-out/). The presence of an output schema means return values need not be explained. The description is complete enough for correct tool selection and 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 description coverage is 0%, but the description compensates fully by explaining each parameter: path, mode (deep vs empty), update (re-extract changed files), cluster_only (rerun clustering), and no_viz (skip HTML). This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Build or update' and the resource 'knowledge graph from a folder', including the output destination. It is specific enough to differentiate from some siblings like graphify_add, though it doesn't explicitly contrast with all siblings.
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 description explains parameter modes (deep, update, cluster_only, no_viz) with brief guidance on when to use each. However, it does not provide explicit context on when to use this tool versus alternatives like graphify_add or graphify_query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_communitiesBRead-only
Summarize Leiden communities with sizes and sample members.
| Name | Required | Description | Default |
|---|---|---|---|
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, so the agent knows it's safe. The description adds no extra behavioral context beyond that.
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 description is very short and to the point. It could be slightly more informative but is efficient.
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?
Given the simple structure (one boolean param, output schema exists), the description is adequate but lacks guidance on usage and parameter semantics.
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 0% schema description coverage, the description should explain the 'as_json' parameter but does not. The parameter name gives some hint, but no extra meaning is added.
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 'Summarize Leiden communities with sizes and sample members' clearly states the action and output. It distinguishes from siblings like graphify_label_communities, but does not explicitly differentiate.
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?
No guidance on when or when not to use this tool. The description lacks context for selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_explainCRead-only
Return everything Graphify knows about a node.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so the tool is safe. The description adds 'Return everything Graphify knows', which implies it may be expensive or broad, but no further behavioral traits are disclosed (e.g., what 'everything' includes). Given the annotation covers safety, a score of 3 is appropriate.
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 description is a single sentence, which is concise but lacks structure. It front-loads the purpose but omits details that would be helpful. It could be improved by adding a brief note on the parameter and perhaps a usage hint.
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?
Given that an output schema exists, the description does not need to explain return values. However, with multiple sibling tools and a vague 'everything' claim, the description is minimally complete. It tells the agent what the tool does but not enough to differentiate or set expectations fully.
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%, meaning the parameter 'node' has no description in the schema. The description does not explain what the parameter expects (e.g., node name, ID, format). It only implies it refers to a node. This is insufficient for an agent to correctly invoke the tool.
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 'Return everything Graphify knows about a node' clearly states the action (return) and the resource (everything about a node). It distinguishes from sibling tools like graphify_node_details or graphify_neighbors, which imply more focused queries, but does not explicitly differentiate. The purpose is clear but could be more specific.
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?
No usage guidelines are provided. The description does not specify when to use this tool versus other similar tools such as graphify_node_details or graphify_search. There is no guidance on prerequisites, limitations, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_freshnessARead-only
Check whether graph.json is stale relative to the current git HEAD.
Prefers the commit graphify recorded the graph was built from
(built_at_commit) over the file mtime — robust across checkouts where
mtime is reset — and flags both modified and newly-added (untracked) files.
Recommends graphify_build(update=True) if stale.
| Name | Required | Description | Default |
|---|---|---|---|
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as readOnlyHint=true, and the description adds behavioral context: it uses built_at_commit over mtime, handles modified and untracked files, and flags staleness. This complements the annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (two sentences), front-loaded with the core purpose, and every sentence adds value. No extraneous 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?
Given the tool's simplicity (1 optional param, 0 required) and the presence of an output schema, the description covers the essential behavior. It explains the staleness check logic and recommends next steps, though it could briefly mention that output includes a boolean result.
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 input schema has one parameter (as_json) with no description (0% schema_description_coverage). The tool description does not mention this parameter or its effect on output, so it provides no added value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks whether graph.json is stale relative to the current git HEAD. It uses a specific verb ('check') and resource ('graph.json staleness'), and distinguishes itself from sibling tools by recommending graphify_build(update=True) if stale.
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 description explains that it prefers built_at_commit over file mtime, and recommends graphify_build(update=True) if stale. This provides clear guidance on when to use and what to do next, though it lacks explicit exclusions or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_god_nodesBRead-only
List the highest-degree (most connected) 'god nodes'.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | ||
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, consistent with listing. Description adds the concept of 'god nodes' and highest-degree ordering, but no extra behavioral traits (e.g., pagination, data freshness). Minimal added value beyond annotations.
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?
Single sentence, concise and front-loaded. Efficient but could add slight detail without losing brevity.
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?
Output schema exists, covering return structure. Description explains the core concept. However, with 0% schema coverage and no parameter explanations, an agent may lack complete information for invocation, especially for 'as_json' and 'top_n' semantics.
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%, but description does not explain parameters. 'top_n' and 'as_json' meanings are absent. The description only mentions 'highest-degree' without linking to parameters.
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?
Description uses specific verb 'list' and resource 'god nodes', clearly defining them as 'highest-degree (most connected)' nodes. This distinguishes it from siblings like graphify_neighbors or graphify_node_details.
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?
No guidance on when to use this tool versus alternatives. Does not mention context like global scope or preconditions. Among many sibling graph tools, explicit usage notes are lacking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_label_communitiesA
Give the Leiden communities human-readable names.
Args:
method: "auto" -> host-LLM sampling if the client supports it, else a
configured backend key (graphify CLI), else "Community N" placeholders.
"sampling" -> force host-LLM sampling (no API key needed).
"cli" -> force the graphify backend (GEMINI_API_KEY/OPENAI_API_KEY/...
or a local ollama). "placeholder" -> no LLM at all.
limit: Only the largest limit communities are named, to stay cheap.
sample_size: Member labels per community handed to the model.
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | auto | |
| limit | No | ||
| sample_size | No | ||
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-destructive and non-read-only behavior. The description adds value by explaining that host-LLM sampling may be used without an API key, that names are generated with cost implications, and that only the largest communities are named. It does not disclose if the tool modifies the graph permanently or any rate limits, but overall adds useful behavioral context beyond annotations.
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 description is concise, with a single opening sentence stating purpose, then a clear bullet-style list for each parameter. No unnecessary text or repetition. Every sentence adds value.
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?
Given the tool's complexity (4 optional parameters with defaults) and the presence of an output schema, the description covers the main inputs and behavior well. However, it does not mention prerequisites (e.g., need for an existing graph or communities) or the exact side effect of naming (whether it persists or is ephemeral). Still, it is largely complete for typical use.
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 description adds significant meaning to three of the four parameters ('method', 'limit', 'sample_size'), explaining their options, defaults, and behavioral effects. However, the 'as_json' parameter is not mentioned at all, leaving its purpose unclear. Since schema coverage is 0%, the description compensates well for most but not all parameters.
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 clearly states the tool's purpose: 'Give the Leiden communities human-readable names.' It uses a specific verb ('give') and resource ('communities'), and the outcome is clear. Among siblings like graphify_communities (which likely lists or computes communities) and graphify_build, this tool uniquely handles naming, providing good 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?
The description provides detailed guidance on the 'method' parameter, explaining when to use 'auto', 'sampling', 'cli', or 'placeholder', including fallback logic and cost considerations for 'limit'. However, it does not explicitly state when to use this tool versus alternatives (e.g., other graphify tools) or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_neighborsCRead-only
List the direct (1-hop) neighbors of a node, with relations.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | ||
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so description adds minimal behavioral context beyond 'with relations'. Does not disclose behavior for missing nodes, format of output, or any side effects. Schema coverage is 0%, so description bears more burden but fails to provide sufficient detail.
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?
Single concise sentence with no wasted words. However, the brevity leaves significant gaps in clarity. It is appropriately front-loaded but would benefit from more detail.
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?
Despite having an output schema (unknown content), the description lacks context for parameters and does not specify what 'relations' means or how results are structured. The tool is simple, but with 0% schema coverage, the description should compensate more.
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 the description does not explain what 'node' should be (e.g., ID, name) or what 'as_json' does. The agent receives no guidance on parameter values beyond the schema types.
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 clearly states it lists direct (1-hop) neighbors with relations, using a specific verb and resource. It distinguishes from sibling tools like 'graphify_node_details' or 'graphify_path' by specifying 'neighbors', but lacks explicit comparison.
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?
No guidance on when to use this tool over alternatives. Does not mention any context where it is appropriate or inappropriate, nor reference sibling tools for different needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_node_detailsCRead-only
Show a node's full metadata: type, source file/line, docstring, community.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | ||
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context about the type of metadata returned (type, source file/line, docstring, community), which is beyond the readOnlyHint annotation. However, it does not disclose error conditions, performance implications, or whether the node must exist in a built graph.
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 description is a single sentence with no wasted words. It efficiently conveys the tool's purpose, though it could be slightly expanded with parameter details without becoming verbose.
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?
Given that the schema lacks descriptions and there is no output schema shown, the description should provide more context about usage and return values. It is too brief to fully inform an AI agent about the tool's behavior and prerequisites.
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 description does not explain the parameters 'node' or 'as_json' at all. With 0% schema description coverage, the description fails to add meaning beyond the parameter titles and types. For example, it does not clarify expected format of 'node' or impact of 'as_json'.
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 clearly states that the tool shows a node's full metadata including type, source file/line, docstring, and community. This is specific and actionable, but it does not differentiate from sibling tools like graphify_neighbors or graphify_overview, which could overlap in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus its siblings. The description lacks context about prerequisites, when not to use it, or which alternative tools might be more appropriate for related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_overviewARead-only
One-shot orientation: call this FIRST.
Returns graph size, top god nodes, community count, surprise-edge count and suggested starting questions — enough to plan further exploration cheaply.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | ||
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true; the description adds context that it is a lightweight, cheap call for orientation, which is consistent and provides additional behavioral insight beyond annotations.
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?
Very concise and front-loaded; first sentence is clear and imperative, and every sentence adds value without unnecessary words.
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?
Given the presence of an output schema, the description adequately lists return values, but fails to describe input parameters, making it incomplete for a tool with undocumented 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 coverage is 0% and the description does not explain the two parameters (top_n, as_json) or their meaning, leaving the AI agent without guidance on parameter values despite having defaults.
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?
Clearly states the tool's purpose as a one-shot orientation to call first, listing specific outputs (graph size, top god nodes, community count, etc.) and differentiates from sibling tools by positioning it as the initial cheap exploration call.
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?
Explicitly instructs to call this tool first and describes it as a one-shot orientation for cheap planning, but does not specify when not to use it or mention alternative tools by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_pathBRead-only
Find the exact path between two nodes (e.g. "DigestAuth" -> "Response").
| Name | Required | Description | Default |
|---|---|---|---|
| node_a | Yes | ||
| node_b | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds minimal extra behavioral context beyond 'exact path', without explaining the algorithm or constraints.
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?
Single sentence with example, front-loaded and efficient without wasted words.
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?
Has output schema covering return values, but lacks parameter descriptions. For a simple two-param tool, it is somewhat incomplete.
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 description must compensate. It does not describe parameters node_a and node_b beyond the example, adding no semantic value.
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 clearly states it finds the exact path between two nodes, with a concrete example. This distinguishes it from siblings like graphify_neighbors or graphify_search.
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 description implies usage when needing a path between two specific nodes, but lacks explicit guidance on when not to use it or alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_queryARead-only
Run a natural-language query against the graph.
Args: question: Natural-language question, e.g. "what connects attention to the optimizer?" dfs: True -> trace a specific path in depth. budget: If >0, cap the number of tokens returned (e.g. 1500).
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | ||
| dfs | No | ||
| budget | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows it's safe. The description adds valuable behavioral details: dfs enables depth tracing, budget caps tokens. This goes beyond the title 'Query graph' in annotations.
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 description is concise: one sentence for purpose, then parameter docs. No superfluous text. Front-loaded with the main action.
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?
Given the presence of an output schema (handling return values), the description adequately covers all input parameters and basic behavior. For a 3-param tool with low schema coverage, this is sufficient.
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%, placing full burden on the description. It explains all three parameters: question with an example, dfs as depth tracing, budget as token cap. This adds significant meaning beyond the schema's bare types.
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 clearly states the verb 'Run' and the resource 'natural-language query against the graph,' distinguishing it from sibling tools like graphify_search or graphify_explain which have different query modes. However, it does not explicitly contrast with siblings.
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?
No guidance on when to use this tool vs alternatives. The description only explains parameters, not usage context or exclusions. For example, it does not say 'use this for natural language queries; use graphify_search for keyword search.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_sampling_statusARead-only
Capability test: how can semantic naming be produced in this session?
Reports whether the connected client supports host-LLM sampling (so the server needs no API key), whether a backend API key is configured as a fallback, and which method graphify_label_communities will pick.
| Name | Required | Description | Default |
|---|---|---|---|
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds detailed behavioral context beyond the readOnlyHint annotation by specifying exactly what status is reported (client support, API key configuration, and impact on graphify_label_communities). No contradictions with annotations.
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 description is concise (three sentences) and front-loaded with 'Capability test'. However, it could be slightly more structured (e.g., listing what is reported). Minimal waste.
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?
Given the tool's simplicity (one boolean parameter, readOnly annotation, and output schema), the description sufficiently covers what the tool does and its output meaning, including the relation to graphify_label_communities. It is complete for its purpose.
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 schema description coverage at 0%, the description does not explain the single parameter 'as_json'. The parameter name is self-explanatory, but the description adds no value beyond the schema, failing to compensate for the low coverage.
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 clearly states the tool reports whether the client supports host-LLM sampling, whether a backend API key is configured, and which method graphify_label_communities will pick. This is a specific verb+resource combination and distinguishes itself from siblings by focusing on sampling/LLM status.
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 description says 'Capability test' implying it's used to check sampling capabilities, but it does not explicitly state when to use it vs. alternatives or when not to use it. The usage context is implied but lacks explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_searchBRead-only
Search nodes by text in their name/label (case-insensitive).
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | ||
| limit | No | ||
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so description adds little beyond case-insensitivity. It does not disclose the behavior of the 'limit' or 'as_json' parameters, nor any pagination or performance traits. Minimal value beyond annotations.
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?
Single sentence, front-loaded with key action. No wasted words. However, lacks structure detailing different aspects of usage, such as parameter effects.
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?
Output schema exists, so return values are covered. However, important parameters like limit and as_json are not explained in description. For a tool with 3 parameters and sibling tools, more contextual info (e.g., response format) would improve completeness.
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 description must compensate. It explains 'pattern' implicitly, but 'limit' and 'as_json' are left undocumented. The description adds meaning for only one of three parameters.
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?
Description clearly states 'Search nodes by text in their name/label (case-insensitive)'. The verb 'search' and resource 'nodes' are specific, and the case-insensitivity distinguishes it from potential sibling tools that might be case-sensitive. Compared to siblings like graphify_neighbors, graphify_node_details, and graphify_subgraph, this tool's purpose is distinct.
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: use when you need to find nodes by text pattern. However, no explicit guidance on when not to use or alternatives. Sibling tools like graphify_neighbors or graphify_node_details could be alternatives but are not mentioned. The description lacks exclusionary context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_subgraphARead-only
Extract a BFS subgraph around a node, capped at a token budget.
This is the token-cheap way to hand the model just the relevant slice of a large codebase instead of the whole graph.
Args: node: Center node (exact or fuzzy match). hops: BFS depth from the center. budget_tokens: Approximate cap on returned size; expansion stops when hit.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | ||
| hops | No | ||
| budget_tokens | No | ||
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds that it uses BFS, caps tokens, and supports fuzzy matching, but does not disclose behavior on budget exceedance, missing nodes, or the output format beyond what the output schema 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?
The description is concise with two sentences and a bulleted args list. It is front-loaded and well-structured, though the args section could be integrated more seamlessly.
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 description covers core functionality and parameters but misses details on the 'as_json' parameter and error handling. The presence of an output schema reduces the need to explain return values, but extra context would improve completeness.
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 explains node, hops, and budget_tokens, but omits the 'as_json' parameter entirely. This incomplete coverage lowers the score.
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 clearly states it extracts a BFS subgraph around a node with a token budget. This specific verb+resource is distinct from sibling tools, and the phrase 'token-cheap way to hand the model just the relevant slice' further differentiates it.
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 description implies usage for obtaining a relevant subgraph slice versus the whole graph, but it lacks explicit guidance on when not to use it or alternatives among the 15 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphify_surprisesCRead-only
List unexpected cross-file/cross-domain connections (surprise edges).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| as_json | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, indicating safe read. The description adds minimal behavioral context beyond the purpose, not expanding on what 'unexpected' means or any side effects.
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?
Despite being concise (one sentence), it omits essential details about parameters and usage, making it under-specified rather than effectively concise.
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 16 sibling tools and 2 parameters with no description, the description fails to provide sufficient context for an agent to correctly select and invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides no explanation of parameters like 'limit' or 'as_json'. This is a critical 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 clearly states it lists unexpected cross-file/cross-domain connections (surprise edges), specifying the verb 'list' and the unique resource type. However, it does not differentiate from siblings like graphify_neighbors or graphify_communities.
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?
No guidance on when to use this tool versus alternatives. It does not mention when not to use it or provide context about typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose: adding sources, building graphs, checking freshness, exploring nodes and paths, analyzing communities, and querying. There is no overlap between tool functionalities.
All tools use the 'graphify_' prefix followed by descriptive names. While some are verbs (e.g., graphify_build) and others nouns (e.g., graphify_communities), the pattern is consistent and names clearly indicate tool purpose.
With 16 tools, the server covers the core operations for knowledge graph management—building, adding sources, exploring, and analyzing—without being bloated. Each tool serves a clear need.
The tool set covers building, adding, exploring, querying, and community analysis. Missing are tools for deletion or modification of nodes/edges, but the surface is largely complete for the intended exploration and building workflow.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
An MCP server that gives your AI access to the source code and docs of all public github repos
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that transforms codebases into knowledge graphs using Neo4J, enabling AI assistants to understand code structure, relationships, and metrics for more context-aware assistance.27MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that builds a knowledge graph from code and text documents, enabling Q\&A and implementation planning via tools like graph_create, graph_plan, and graph_query.7MIT
- FlicenseNot gradedqualityDmaintenanceAn in-memory knowledge graph MCP server that gives coding agents structural and semantic recall over codebases by indexing Python source, ADR documents, and project configuration, exposing 7 tools for search, traversal, context retrieval, and natural-language Q&A.
- AlicenseNot gradedqualityAmaintenanceA universal MCP server providing persistent, structured memory through a knowledge graph with graph storage, semantic vector search, and multi-hop traversal for AI agents and IDEs.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/yasinyaman/graphlore'
If you have feedback or need assistance with the MCP directory API, please join our Discord server