# code-graph (pypi · cg-code-graph)

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

- Trust score: 88/100 (high trust)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- pypi · `cg-code-graph`: 88/100 (this document), [markdown](https://verifymcp.io/servers/cyberchronos00-cg-code-graph/cg-code-graph.md), [page](https://verifymcp.io/servers/cyberchronos00-cg-code-graph/cg-code-graph)

## Channel facts

- Registry: `pypi`
- Package: `cg-code-graph`
- Version: `0.23.13`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it.
  - 1 of 37 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to cyberchronos00/code-graph).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 15 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 71/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 67/100
  - Stability observed for 20 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## 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.

### Claude

```bash
claude mcp add cyberchronos00-cg-code-graph -- uvx cg-code-graph
```

### Cursor

```json
{
  "mcpServers": {
    "cyberchronos00-cg-code-graph": {
      "command": "uvx",
      "args": [
        "cg-code-graph"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "cyberchronos00-cg-code-graph": {
      "command": "uvx",
      "args": [
        "cg-code-graph"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add cyberchronos00-cg-code-graph -- uvx cg-code-graph
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyberchronos00-cg-code-graph": {
      "type": "local",
      "command": [
        "uvx",
        "cg-code-graph"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add cyberchronos00-cg-code-graph --command uvx --arg cg-code-graph
```

### Hermes

```yaml
mcp_servers:
  cyberchronos00-cg-code-graph:
    command: "uvx"
    args: ["cg-code-graph"]
```

### Netclaw

```json
{
  "McpServers": {
    "cyberchronos00-cg-code-graph": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "cg-code-graph"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add cyberchronos00-cg-code-graph -t stdio -c uvx -a cg-code-graph
```

### Other

```json
{
  "mcpServers": {
    "cyberchronos00-cg-code-graph": {
      "command": "uvx",
      "args": [
        "cg-code-graph"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 88, +16)

- [security improvement] Malware scan: unverified → pass

### 2026-11-04 (score 72, −15)

- [security regression] Malware scan: pass → unverified

### 2026-11-03 (score 87, +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.

### 2026-11-01 (score 86, +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.

### 2026-10-30 (score 85, +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.

### 2026-10-27 (score 84, +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.

### 2026-10-25 (score 83, +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.

### 2026-10-23 (score 82, +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.

## MCP tools (13)

### `reaches` (~462 tokens)

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).

Input parameters:

- `connection`
- `group_by` (string)
- `include_gated` (boolean)
- `max_per_group` (integer)
- `min_confidence` (string)
- `paths` (boolean)
- `platform`
- `targets` (array, required)

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `impact` (~177 tokens)

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).

Input parameters:

- `max_items` (integer)
- `method` (string, required)
- `min_confidence` (string)
- `paths` (boolean)
- `platform`

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `callers` (~90 tokens)

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().

Input parameters:

- `limit` (integer)
- `min_confidence` (string)
- `symbol` (string, required)

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `node` (~109 tokens)

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).

Input parameters:

- `id_or_symbol` (string, required)

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `snippet` (~108 tokens)

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).

Input parameters:

- `context` (integer)
- `id_or_symbol` (string, required)
- `max_lines` (integer)

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `search` (~230 tokens)

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).

Input parameters:

- `kind`
- `limit` (integer)
- `name` (string, required)
- `platform`

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `explore` (~122 tokens)

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).

Input parameters:

- `budget_tokens` (integer)
- `max_symbols` (integer)
- `query` (string, required)

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `routes` (~464 tokens)

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).

Input parameters:

- `auth_pattern`
- `max_items` (integer)
- `min_confidence` (string)
- `missing`
- `paths` (boolean)
- `platform`
- `reaches`
- `strict` (boolean)
- `unguarded` (boolean)
- `writes`

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `coverage` (~225 tokens)

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.

Input parameters:

- `all_files` (boolean)
- `json_output` (boolean)
- `path`

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `downstream` (~230 tokens)

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).

Input parameters:

- `max_per_kind` (integer)
- `min_confidence` (string)
- `paths` (boolean)
- `platform`
- `target` (string, required)

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `path` (~171 tokens)

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).

Input parameters:

- `min_confidence` (string)
- `platform`
- `source` (string, required)
- `target` (string, required)

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `index` (~257 tokens)

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.

Input parameters:

- `gates`
- `repo`
- `root`

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

### `graphs` (~99 tokens)

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.

Output parameters:

- `completeness` (object)
- `overrides` (object)
- `platform` (object)
- `result` (string)
- `stale` (boolean)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/cyberchronos00-cg-code-graph/cg-code-graph#diagnostics

## Score history

- 2026-11-05: 88
- 2026-11-04: 72
- 2026-11-03: 87
- 2026-11-02: 86
- 2026-11-01: 86
- 2026-10-31: 85
- 2026-10-30: 85
- 2026-10-29: 84
- 2026-10-28: 84
- 2026-10-27: 84
- 2026-10-26: 83
- 2026-10-25: 83
- 2026-10-24: 82
- 2026-10-23: 82
- 2026-10-22: 81
- 2026-10-21: 81
- 2026-10-20: 80
- 2026-10-19: 50
- 2026-10-18: 79
- 2026-10-17: 50
- 2026-10-16: 50

## 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 88 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 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 5 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.

## Links

- PyPI project: https://pypi.org/project/cg-code-graph/
- Socket report: https://socket.dev/pypi/package/cg-code-graph
- Repository: https://github.com/cyberchronos00/code-graph
- Website: https://code-graph.cyberchronos00.workers.dev/
- Changelog RSS feed: https://verifymcp.io/servers/cyberchronos00-cg-code-graph/cg-code-graph.xml
- Changelog JSON feed: https://verifymcp.io/servers/cyberchronos00-cg-code-graph/cg-code-graph.json
- HTML version of this page: https://verifymcp.io/servers/cyberchronos00-cg-code-graph/cg-code-graph
