Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

code-graph

PYPI · CG-CODE-GRAPH

Local dependency graph: callers, entry points and file:line evidence for what a change affects.

Available components

−12 this week 72 Trust /100

Last scanned (20 hours ago)

Scores higher than 68% of PyPI servers

Category Developer Tools

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security50
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 1 of 37 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to cyberchronos00/code-graph). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 14 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability71
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 2895 tokens (~206/item across 14 items; 13 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management63
  • Stability observed for 19 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 −15
    • Malware scan: pass → unverified ▼ security
  • 3 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

  • 1 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

  • 30 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 27 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

  • 25 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

  • 23 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

  • 21 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed pypi/cg-code-graph@0.23.13

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo cyberchronos00/code-graph
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/cyberchronos00/code-graph/.github/workflows/publish.yml@refs/tags/v0.23.13
Rekor log index 3335734868
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:3cdc5ba1906add389e0af13d5cd00eb1d66b7ecf78f9d3028061d61d7bdb9d1a

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted setuptools.build_meta

Background: Why install scripts are a supply-chain risk →

Dependencies 37 packages
Packages resolved 37
No linked repository 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 13 exposed · ~2,744 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
callers ~90

Use to see who calls X right now. Direct callers of a function / method / class (one level: CALLS, INSTANTIATES, dispatch and framework edges into it), each with the call site file:line and confidence. For the full chain up to entry points use impact().

NameTypeReqDescription
limitinteger––
min_confidencestring––
symbolstringyes–
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

coverage ~225

Use when cg finds nothing or you need to know if a file is indexed. Which languages and files this index covers. Per language: parser mode (exact, heuristic only when an exact-mode indexer such as rust-analyzer or scip-clang is missing, skipped when the toolchain is missing, with the install hint) and file completeness (discovered vs indexed, with parse failures, files over the size limit, unmapped files outside the source roots, excluded files); unsupported source types by extension or shebang (.go .qml .sh ...); blind spots: route / handler registrations cg does not model, with file:line. path (optional): a file or directory; says whether cg has it in the graph. all_files: list every file per bucket (default: the first 5). json_output: the completeness object as JSON. Not covered, heuristic or a blind spot means: use your normal search and file reading for that part.

NameTypeReqDescription
all_filesboolean––
json_outputboolean––
path–––
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

downstream ~230

Use to see what X ends up calling or reading (page -> routes -> tables). Forward dependencies of a node. On a combined graph a frontend page goes page -> composables/components -> HTTP endpoints -> backend routes -> controllers/services -> tables. Lists backend routes, tables touched (directly or via columns), columns, connections, config/env keys, each with one shortest evidence path. target: page:/reports/:id | app/pages/x.vue | Class::method | ... platform: only code built for that target (windows, linux, macos, ios, android, web): code under a platform condition that is false there (#[cfg], #if, Platform.OS / Platform.isX, kIsWeb, .ios.ts / .android.ts files, Dart conditional imports) is left out; the reply's first line names the filter and how many conditions could not be evaluated (those stay in).

NameTypeReqDescription
max_per_kindinteger––
min_confidencestring––
pathsboolean––
platform–––
targetstringyes–
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

explore ~122

Start here for a broad question ("how does X work") or a spec you have not pinned down. Resolves a few symbols and returns their source, entry points, call paths and blast radius in one call, inside budget_tokens. Prefer this over impact, downstream, path and snippet until you know which symbol matters. The reply ends with the fine-grained calls to run next. max_symbols caps how many matches are expanded (default 4).

NameTypeReqDescription
budget_tokensinteger––
max_symbolsinteger––
querystringyes–
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

graphs ~99

Use when unsure which graph a question belongs to. Lists the graphs this server can query: name, repo roots, languages, indexed commit and freshness. One `cg-mcp` process serves every registered graph. Pass `graph` to other tools to choose one, or omit it and the server resolves from a path in the call, then MCP roots or the working directory, then the configured default. An ambiguous choice returns the list instead of guessing.

Input schema present but exposes no named parameters.

NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

impact ~177

Use before editing a function: what a change to it affects. Reverse callers of a method (Class::method, short or FQN) up to entry points, with the shortest call path from each entry point. platform: only code built for that target (windows, linux, macos, ios, android, web): code under a platform condition that is false there (#[cfg], #if, Platform.OS / Platform.isX, kIsWeb, .ios.ts / .android.ts files, Dart conditional imports) is left out; the reply's first line names the filter and how many conditions could not be evaluated (those stay in).

NameTypeReqDescription
max_itemsinteger––
methodstringyes–
min_confidencestring––
pathsboolean––
platform–––
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

index ~257

Use after editing so later answers see the change. Re-index (static analysis only: never boots the app or touches a database). On a combined graph (any number of repos): with no arguments every repo is re-indexed from its recorded root and the cross-repo link is rebuilt; repo (a name used at link time) re-indexes just that repo; root is matched to the recorded repo roots (a repo directory, a path inside one, or a parent of several). A root that matches no repo, or a result with 0 nodes, is refused and the graph is left unchanged. On a single-repo graph root defaults to the indexed root; gates is a gate-scenario JSON path (defaults to the server's --gates). The project config file (.cg.yaml at the root) is read on every re-index; Python source roots given with `cg index --python-root` and `--include-generated` are kept. Generated, copied and vendored files stay out of the graph (the coverage tool lists them) unless the graph was indexed with --include-generated or .cg.yaml sets generated.include.

NameTypeReqDescription
gates–––
repo–––
root–––
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

node ~109

Use to inspect a symbol without reading its file. Details of one node: kind, FQN, file:line span, module, entry kinds, docblock (PHPDoc), and edge counts by kind (in/out) with a few neighbours. Specs: Class::method | file#name | table.column | table:<t> | route:<METHOD> <uri> | env:<KEY> | page:/path (more: resource cg://guide).

NameTypeReqDescription
id_or_symbolstringyes–
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

path ~171

Use to answer "how does A reach B". Shortest forward evidence chain from source to target (e.g. page:/reports/:id -> SalesReportService::report), one hop per line with file:line and confidence. platform: only code built for that target (windows, linux, macos, ios, android, web): code under a platform condition that is false there (#[cfg], #if, Platform.OS / Platform.isX, kIsWeb, .ios.ts / .android.ts files, Dart conditional imports) is left out; the reply's first line names the filter and how many conditions could not be evaluated (those stay in).

NameTypeReqDescription
min_confidencestring––
platform–––
sourcestringyes–
targetstringyes–
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

reaches ~462

Use before changing a column, table, connection, env key or symbol: everything that depends on it. Reverse transitive dependents of one or more targets (union), e.g. ["orders.customer_id", "connection:warehouse", "connection:tenant_*"]. Groups: RUNTIME (live; reached from http routes/schedules/jobs/listeners, or main()/exported FFI symbols in Rust/C/C++), LIBRARY (only via a library's public API), DEV (only tests/benches/examples/build scripts), OPERATOR (artisan commands / admin panels only: one-off import & provisioning), GATED (dead under the indexed gate scenario, e.g. code that only runs while a feature flag is off), NO-ENTRY. Inside each group items are grouped by `group_by` = module | entry_kind | class. Each line: symbol, entry kinds, depth, shortest evidence path (hops KIND@file:line; ~r = resolved, ~h = heuristic confidence). At most `max_per_group` lines per top-level group (shallowest first). min_confidence: heuristic | resolved | exact. A hop on a database connection other than the default shows `conn=<name>` (dynamic names as a pattern, `?` when it cannot be resolved). connection: only the table / column edges that go to that connection (a dynamic name by its pattern, e.g. `legacy_{store.id}`); no match lists the connections seen. platform: only code built for that target (windows, linux, macos, ios, android, web): code under a platform condition that is false there (#[cfg], #if, Platform.OS / Platform.isX, kIsWeb, .ios.ts / .android.ts files, Dart conditional imports) is left out; the reply's first line names the filter and how many conditions could not be evaluated (those stay in).

NameTypeReqDescription
connection–––
group_bystring––
include_gatedboolean––
max_per_groupinteger––
min_confidencestring––
pathsboolean––
platform–––
targetsarrayyes–
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

routes ~464

Use for route, auth and middleware questions. Routes with their middleware / guards / auth, in one call. Optional scope: writes="*" (routes that reach any DB write) or writes="<table>", reaches=[specs] (routes that reach any of these nodes: table, column, connection, method, env key...). Optional filters: missing="<name>" keeps routes with no guard whose name contains it (e.g. "auth:api", "ApiKeyGuard"), unguarded=true keeps routes with no auth guard (the framework presets' auth guards and the auth name pattern; extend with auth_pattern, a regex, or .cg.yaml auth.extra_patterns). An unconditional inline check on a Laravel action (authorize, Gate, a permission check, FormRequest::authorize, controller middleware, a shared-secret compare) is listed under guards as `inline:` and counts for unguarded. strict=true with unguarded counts only route-level guards. Each route: guards, what it reaches with one evidence chain, and the frontend callers on a combined graph. Guards come from Laravel middleware, Nest guards/interceptors, Express/Koa/Fastify/Hono/Elysia middleware, Next.js middleware.ts / handler wrappers, django-ninja auth= and Django/DRF view access checks. min_confidence: keep the default (heuristic) for reviews: every edge still shows its own label, and a stricter level names the routes it hides. platform: only code built for that target (windows, linux, macos, ios, android, web): code under a platform condition that is false there (#[cfg], #if, Platform.OS / Platform.isX, kIsWeb, .ios.ts / .android.ts files, Dart conditional imports) is left out; the reply's first line names the filter and how many conditions could not be evaluated (those stay in).

NameTypeReqDescription
auth_pattern–––
max_itemsinteger––
min_confidencestring––
missing–––
pathsboolean––
platform–––
reaches–––
strictboolean––
unguardedboolean––
writes–––
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

search ~230

Use first to find a symbol instead of grep. Finds nodes by name / FQN substring (case-insensitive), optionally filtered by kind (class, method, route, command, table, column, connection, config, env, job, admin...). Also matches route middleware, guards, auth and access checks (e.g. "auth" finds `auth:api`, `ApiKeyGuard`, `IsAuthenticated`) and lists the routes that carry them. Platform-specific symbols carry their targets, e.g. `[ios, android]`. platform: only code built for that target (windows, linux, macos, ios, android, web): code under a platform condition that is false there (#[cfg], #if, Platform.OS / Platform.isX, kIsWeb, .ios.ts / .android.ts files, Dart conditional imports) is left out; the reply's first line names the filter and how many conditions could not be evaluated (those stay in).

NameTypeReqDescription
kind–––
limitinteger––
namestringyes–
platform–––
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

snippet ~108

Use instead of opening a whole file. Source of one symbol: a `path:start-end` header then the body with line numbers. Resolves a node id or a symbol / FQN (as node() and search() do); an ambiguous name lists the candidates instead of guessing. context adds lines around the span; max_lines caps the body (truncation noted).

NameTypeReqDescription
contextinteger––
id_or_symbolstringyes–
max_linesinteger––
NameTypeReqDescription
completenessobjectyes–
overridesobject––
platformobject––
resultstringyes–
staleboolean––

No examples provided.

Install

How do I install the code-graph MCP server?

code-graph runs locally as a PyPI package, launched with uvx cg-code-graph. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · cg-code-graph

# add to Claude Code
claude mcp add cyberchronos00-cg-code-graph -- uvx cg-code-graph
Common questions

What is the code-graph MCP server?

code-graph is an MCP server listed in the public MCP registry as io.github.cyberchronos00/cg-code-graph. Local dependency graph: callers, entry points and file:line evidence for what a change affects. This page covers its PyPI package (cg-code-graph).

Is the code-graph MCP server safe to use?

code-graph scores 72 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the code-graph MCP server expose?

code-graph exposes 13 tools: reaches, impact, callers, node, snippet, and 8 more. Their descriptions and schemas cost roughly 2,744 tokens of context every time the server is loaded.

Is the code-graph MCP server still maintained?

code-graph is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the code-graph MCP server under?

code-graph declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.