Skip to main content
Glama

arch-mcp

Maps your repo's architecture — files, imports, SQL, APIs — and shows what a change breaks.

English | Russian

License: MIT Node Version

arch-mcp status output in a terminal: adapters, graph size, response budget

arch-mcp is an MCP server over stdio. It indexes a workspace into a graph of files, modules, symbols, database tables, API contracts, container and CI files, then answers questions about that graph: what depends on this file, which tests a change touches, what two snapshots differ by.

Features

Find what a change breaks. impact returns the transitive dependents of the files you changed, affected_tests narrows that to test files (src/index.ts:90-119).

One graph across stacks. 22 adapters read JavaScript/TypeScript, Python, nine more languages through wasm grammars, SQL, API contracts, manifests, Dockerfile, Kubernetes, CI YAML, Markdown and SCIP indexes (src/core/adapters/registry.ts:67-89).

Answers state their own coverage. Every response carries index.coverage and index.kinds, so you can tell a missing edge from a missing adapter (src/core/envelope.ts:59, src/core/envelope.ts:162-173).

Your repository stays untouched. The server only reads: the cache lives in %LOCALAPPDATA%\arch-mcp\cache\<sha1(repo)> and nothing is written back (src/cache.ts:8-11).

Responses respect a byte budget. max_bytes defaults to 65536 with a hard cap of 1048576; a truncated answer always carries truncated: true and a hint (src/config.ts:35-40).

Related MCP server: UCN

What it sees

Every node is addressed as kind:path#symbol in repo-relative POSIX form (src/core/adapters/types.ts:2).

Nodes (11)

Kind

What it is

file

A source file or manifest on disk

module

An importable module, one per source file in the tree-sitter pipeline

package

A dependency: a manifest entry, a container image, or a CI action

symbol

A function, class or type declaration found by tree-sitter or SCIP

table

A SQL table

view

A SQL view

api

One API operation from an OpenAPI, Swagger, proto, GraphQL or AsyncAPI contract

config

A configuration object: a CI file, a Kubernetes config referenced by envFrom

doc

A Markdown document

service

A deployable unit: an API service, a Kubernetes workload, a Terraform resource

container

A Dockerfile or the image it builds

Source: src/core/adapters/types.ts:5-16.

Edges (10)

Edge

In plain words

Emitted today

imports

File A uses file B

yes (src/core/adapters/registry.ts:102-114)

calls

Function A calls function B

yes (src/core/adapters/registry.ts:115)

reads

SQL: a table or view is read; with sqlglot on, the edge also carries columns

yes (src/core/adapters/registry.ts:118)

writes

SQL: a table or view is written, with columns under sqlglot

yes (src/core/adapters/registry.ts:119)

references

An API operation, an infrastructure file, a document, or a package dependency points at an object

yes (src/core/adapters/registry.ts:120)

deploys

A Kubernetes workload deploys an image

yes (src/core/adapters/registry.ts:122)

extends

Class or interface inheritance

no

implements

Interface implementation

no

configures

Configuration of another object

no

tests

A test covers a target

no

The last four edges are declared in the type system, but no adapter emits them yet. The index.kinds block reports them honestly as not_emitted with an empty emitter list (src/core/adapters/registry.ts:116-117, src/core/adapters/registry.ts:121, src/core/adapters/registry.ts:123).

Coverage you can trust

The server never claims a complete picture it cannot back up.

  • Each response carries index.coverage with files_seen, parsed and unsupported, plus index.kinds with the status of every edge kind (src/core/envelope.ts:59, src/core/envelope.ts:171-173).

  • An empty graph is reported as index.state = "partial", not as an error (src/core/envelope.ts:162-171).

  • Files a parser could not handle are listed by name in coverage.unsupported, and an adapter that failed turns the matching edge kind into unsupported instead of no_matches (src/core/envelope.ts:130-154).

  • A kind with no emitters at all shows up as not_emitted (src/core/envelope.ts:130-132).

Supported layers: JavaScript/TypeScript, Python, nine languages through wasm tree-sitter grammars (C, C++, C#, Go, Java, Kotlin, PHP, Ruby, Rust), SQL (DML plus PostgreSQL DDL), API contracts (OpenAPI, Swagger, proto, GraphQL, AsyncAPI), Dockerfile, Kubernetes, CI YAML, Terraform behind a flag, Markdown, and SCIP indexes.

The invariants are covered by tests/envelope.test.mjs and tests/kinds.test.mjs; the suite has 35 files and 241 tests in tests/.

Quick start

npm install
npm run build
npm run bootstrap
npm test

npm install pulls runtime and dev dependencies. npm run build writes dist/server.mjs, dist/cli.mjs and dist/lib.mjs with esbuild. npm run bootstrap installs the pinned toolchain (dependency-cruiser 18.7.0) into ./toolchain and is idempotent. npm test runs the node test suite (package.json:14, package.json:16, package.json:17).

Connect your MCP client

The server speaks stdio through dist/server.mjs. An opencode v2 config entry looks like this:

{
  "mcp": {
    "servers": {
      "arch-mcp": {
        "type": "local",
        "command": ["node", "E:/1_Products/arch-mcp/dist/server.mjs"]
      }
    }
  }
}

Replace the path with your own checkout. The MCP layer is thin: the tools are registered in src/index.ts:137-141 and executed through src/server_core.ts.

Tools

Tool

Arguments

Returns

arch_status

workspace?, max_bytes?

Stacks, git info, index coverage, adapters

arch_snapshot

workspace?, scope?, max_bytes?

Graph plus snapshot_id; scope is summary or full

search

workspace?, query, kind?, max_bytes?

Graph nodes matching a case-insensitive substring

focus

workspace?, node, limit?, max_bytes?, include_type_only?

Incoming and outgoing edges of one node, limit defaults to 50, max 200

reaches

workspace?, target, max_depth?, max_bytes?, include_type_only?

Reverse reachability: who depends on the target, max_depth defaults to 10

impact

workspace?, changed[], depth?, max_bytes?, include_type_only?

Transitive dependents of changed files

affected_tests

workspace?, changed[], max_bytes?, include_type_only?

Test files depending on the change; an empty result carries a reason and the checked inputs

arch_diff

workspace?, from, to, max_bytes?

Added and removed nodes and edges between two refs

Source: src/index.ts:14-135.

Response envelope

{
  "ok": true,
  "workspace": "E:/work/my-service",
  "root_used": "E:/work/my-service",
  "roots": ["E:/work/my-service"],
  "schema_version": 6,
  "index": {
    "state": "ready",
    "progress": { "percent": 100, "complete": true },
    "coverage": { "files_seen": 226, "parsed": 226, "unsupported": [] },
    "adapters": [{ "name": "git", "status": "ok", "version": null }],
    "missing": []
  },
  "data": {},
  "truncated": false,
  "_meta": { "provenance": { "command": "arch_status", "cwd": "E:/work/my-service", "ts": "…", "cached": false, "exit_code": 0 } }
}

Failures come back as {"ok": false, "error": {"code", "message", "hint", "candidates"}} with one of the codes WORKSPACE_NOT_FOUND, NODE_NOT_FOUND, AMBIGUOUS_NODE, INVALID_ARGUMENT, ADAPTER_UNAVAILABLE, INDEX_BUILDING, BUDGET_EXCEEDED, SNAPSHOT_NOT_FOUND, EXTERNAL_TOOL_FAILED (src/core/errors.ts:2-11, src/core/errors.ts:27).

An empty graph gives index.state = "partial" (src/core/envelope.ts:162-171). An answer over the byte budget carries truncated: true and a hint that says to raise max_bytes (src/tools/get_graph.ts:40-59).

index.kinds

index.kinds always holds ten entries in EdgeKind order. Each entry has kind, status, edges, confidence, confidence_min and emitters (src/core/envelope.ts:30, src/core/envelope.ts:100-127). status is one of:

  • emitted: edges exist;

  • no_matches: no edges, and every emitter for that kind ran;

  • unsupported: no edges, and at least one emitter failed;

  • not_emitted: the kind has no emitters in the registry at all (src/core/envelope.ts:130-154).

The invariant sum(kinds.edges) == graph.edges.length is checked by tests/kinds.test.mjs.

Only index.state = "building" breaks the rule of ten entries: a cold arch_status answers immediately with empty kinds, adapters and missing, zero coverage and data.graph = null, while the index builds in the background (src/core/envelope.ts:182-197, src/tools/get_graph.ts:429-443).

Workspace discovery

workspace is optional. A .git directory anywhere above the working directory wins and is returned at once. Otherwise the server walks up to the nearest manifest (package.json, pyproject.toml, requirements.txt, settings.gradle*, build.gradle*) or to a directory with at least three source files. Markdown, JSON and YAML files do not make a root. No root means WORKSPACE_NOT_FOUND (src/core/workspace.ts:7-12, src/core/workspace.ts:105-112, src/core/workspace.ts:152-163).

A container without its own root resolves into child roots: the envelope reports roots[] and root_used. ARCH_MCP_ALLOWED_ROOTS turns discovery into an allowlist, and a path outside it answers WORKSPACE_NOT_FOUND (src/core/workspace.ts:179-190, src/core/workspace.ts:228-244).

Adapters

All 22 adapters are built in and register at module load, so index.adapters reflects the registry at runtime (src/core/adapters/registry.ts:60-89). An adapter with no matching files reports absent and stays out of index.adapters and missing[] (src/core/envelope.ts:115-117). A broken grammar or ABI mismatch lands in missing[] with state: partial while the core keeps answering (src/core/envelope.ts:150-173).

Adapter

Formats

Precision

What it adds

scip

SCIP index.scip

semantic

symbol nodes and references edges from a ready index; path from ARCH_MCP_SCIP_DIR or <root>/.arch/scip/index.scip

git

git repository

manifest

HEAD and status metadata; no edges

depcruiser

JavaScript/TypeScript

syntax

import edges, type-only ones included

api

OpenAPI/Swagger, AsyncAPI, GraphQL SDL, .proto

syntax

service nodes for contracts and references edges

ci

CI YAML

syntax

config:<file> nodes, uses: to package:<action> references

dockerfile

Dockerfile

syntax

container:<file> and package:<image> nodes

docs

Markdown

syntax

doc nodes, headings in meta.headings, local links as references

k8s

Kubernetes YAML

syntax

service:<Kind>/<name>, deploys to an image, envFrom to config

manifests

TOML/JSON manifests

manifest

file and package nodes with references to dependencies

sql

SQL DML, PostgreSQL DDL

syntax

table and view nodes, reads, writes, references edges

terraform

Terraform HCL

syntax

service:<type>.<name> and references by interpolation; runs only with ARCH_MCP_TERRAFORM=1

tree-sitter-c

C

syntax

module and imports plus approximate symbol nodes

tree-sitter-cpp

C++

syntax

same

tree-sitter-csharp

C#

syntax

same

tree-sitter-go

Go

syntax

same

tree-sitter-java

Java

syntax

same

tree-sitter-kotlin

Kotlin

syntax

same

tree-sitter-php

PHP

syntax

same

tree-sitter-python

Python

syntax

module nodes, imports, approximate symbol and calls

tree-sitter-ruby

Ruby

syntax

same as the generic languages

tree-sitter-rust

Rust

syntax

same

tree-sitter-tsjs

JavaScript/TypeScript

syntax

symbol nodes and calls edges only; imports belong to depcruiser

Third-party licenses per dependency are listed in THIRD_PARTY_NOTICES.md; grammars/LICENSE holds the grammar provenance and grammars/SHA256SUMS the binary hashes.

Type-only dependencies

Edges whose dependencyTypes contain type-only get meta.type_only = true. focus, reaches, impact and affected_tests exclude them unless you pass include_type_only: true. Collecting them needs depcruiser with options.parser = tsc, otherwise import type statements never reach the graph (src/adapters/depcruiser.ts:77-83).

Snapshots and arch_diff

arch_snapshot computes snapshot_id = SHA256(graph JSON + git HEAD + adapter versions) and stores the snapshot in the cache. arch_diff compares two refs: current, git HEAD (a hex string of 7 to 39 characters, an ambiguous prefix yields AMBIGUOUS_NODE with candidates), or a snapshot_id. A missing snapshot yields SNAPSHOT_NOT_FOUND, a malformed ref yields INVALID_ARGUMENT; arbitrary git revisions such as HEAD~1 are v1.1 (src/core/snapshots.ts:11-12, src/core/snapshots.ts:136-139, src/core/snapshots.ts:171-175).

CLI

node dist/cli.mjs <status|snapshot|search|focus|reaches|impact|affected-tests|diff> [--workspace <path>] [--json]
node dist/cli.mjs bootstrap

Options include --json, --scope, --query, --kind, --node, --target, --changed, --limit, --max-depth, --depth, --max-bytes, --include-type-only, --from and --to. Exit codes: 0 on success, 1 on a contract error, 2 on a usage error (src/cli.ts:8-26, src/cli.ts:155-187). Without ARCH_MCP_MAX_RESPONSE_BYTES the budget is 65536, and status prints the line budget: 65536 (src/cli.ts:135).

Sample call arguments:

{ "name": "impact", "arguments": { "workspace": "E:\\work\\my-service", "changed": ["server/src/limits.ts"], "depth": 3 } }
{ "name": "affected_tests", "arguments": { "workspace": "E:\\work\\my-service", "changed": ["server/src/limits.ts"] } }

Configuration

Variable

Default

Meaning

ARCH_MCP_STACKS

all

Stack filter: py, jvm, js or all

ARCH_MCP_TIMEOUT_MS

120000

Timeout for every external process

ARCH_MCP_MAX_RESPONSE_BYTES

65536

Response budget, cap 1048576, above it BUDGET_EXCEEDED

ARCH_MCP_ALLOWED_ROOTS

not set

Workspace allowlist separated by path.delimiter; unset means no restriction

ARCH_MCP_CACHE_DIR

%LOCALAPPDATA%\arch-mcp\cache

Cache root override for graphs and snapshots

ARCH_MCP_ALLOW_EXEC

off

1 enables optional external tools

ARCH_MCP_AUTO_INSTALL

off

Installs the toolchain automatically when missing

ARCH_MCP_GRAMMAR_DIR

<package>/grammars

wasm grammar directory override

ARCH_MCP_SCIP_DIR

not set

Directory or index.scip file for the scip adapter

ARCH_MCP_SCIP_INDEXER

not set

Indexer command template with {root} and {out} tokens; needs ARCH_MCP_ALLOW_EXEC=1

ARCH_MCP_TERRAFORM

off

1 enables the lazy MPL-2.0 @cdktf/hcl2json import

ARCH_MCP_SQLGLOT

off

1 adds the sqlglot bridge for CTAS, materialized views, ALTER-FK and column lineage

ARCH_MCP_PYTHON

python

Interpreter for the sqlglot bridge

ARCH_MCP_SQLGLOT_BRIDGE

<package>/python/sqlglot_bridge.py

Bridge path override; the file content joins the cache key

Most variables are read in src/config.ts:42-70; the root allowlist is read in src/core/workspace.ts:179.

What v1 does not do

  • Run your code. No tests, builds or scripts from the repository; external processes go through one runner, and the trusted core uses git read-only and depcruise (src/core/exec.ts:5-12).

  • Generate a SCIP index by default. The adapter reads a ready index; an external indexer runs only with ARCH_MCP_SCIP_INDEXER and ARCH_MCP_ALLOW_EXEC=1 (src/config.ts:67-70).

  • Write into the repository. Tools only read the workspace; the cache and snapshots stay outside it (src/cache.ts:8-11).

  • Diff arbitrary git revisions. arch_diff covers current, HEAD and snapshot_id (src/core/snapshots.ts:171-175).

  • Drive the Terraform CLI. The adapter parses HCL through @cdktf/hcl2json; no plan, validate or apply call is made (src/adapters/infra/terraform.ts:2-3, src/adapters/infra/terraform.ts:78).

Notes and limits

  • Cache key. Git HEAD, mtimes of changed files, toolchain version, config hashes, the adapter signature, GRAPH_SCHEMA_VERSION and the package version (src/cache.ts:112-131). A non-git workspace is keyed by a sha256 signature over all files except node_modules and .git, so an edit that keeps mtime and size does not invalidate the cache (src/cache.ts:185-196).

  • Build artifacts reach the graph. Only node_modules and .git are excluded from that signature, so .next/ and friends are indexed (src/cache.ts:185-190).

  • Schema versions. SCHEMA_VERSION = 6 moves with the response shape, GRAPH_SCHEMA_VERSION = "graph-9" only with the graph or cache entry shape (src/core/envelope.ts:15-19, src/cache.ts:31).

  • Single flight. Identical concurrent calls share one run (src/tools/get_graph.ts:308-423); a cache hit marks the evidence command with a (cached) suffix and sets provenance.cached (src/tools/get_graph.ts:361, src/provenance.ts:31).

  • Non-blocking build. The tree-sitter pipeline yields to the event loop every eight files, so a cold arch_status answers within seconds and the graph builds in the background (src/core/adapters/tree-sitter/generic.ts:165, src/tools/get_graph.ts:442-443).

License

MIT (LICENSE:1-3). Third-party components and their licenses are listed in THIRD_PARTY_NOTICES.md.

Available Tools

8 tools
affected_testsA

Test files transitively depending on changed files (type-only excluded by default). Read-only.

NameRequiredDescriptionDefault
changedYesChanged paths inside the workspace
max_bytesNoResponse budget in bytes (default 65536, max 1048576)
workspaceNoWorkspace path; omitted = discovery from cwd
include_type_onlyNoInclude type-only edges (default false)

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose 'Read-only' and the default exclusion of type-only edges, which is genuinely useful. However, it says nothing about truncation or response-budget behavior despite max_bytes governing that, nor about the shape/ordering of results, which are the main behavioral risks here.

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

Conciseness5/5

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

Two compact sentences with zero filler, and the core behavior is stated first. Nothing in it is redundant or padded.

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

Completeness3/5

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

There is no output schema, so the description could have said what the response looks like (a list of test paths) and what happens when the byte budget is exceeded. For a moderate-complexity query with fully documented params, it is adequate but leaves real gaps.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented, including the max_bytes default/max and the workspace discovery rule. The description only restates the include_type_only default, adding no meaning beyond the schema; baseline 3 applies.

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

Purpose4/5

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

The description names a precise resource and scope: test files that transitively depend on changed files, with a default exclusion of type-only edges. An agent can tell this is a dependency-query tool rather than a mutation or status tool. It stops short of naming how it differs from siblings like impact or reaches, which also sound dependency-related.

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

Usage Guidelines3/5

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

Usage is only implied: an agent infers 'call this after a change to find which tests to run.' There is no explicit when-to-use, when-not-to-use, or pointer to the sibling tools (impact, reaches, focus) that could be confused with it.

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

arch_diffA

Diff two snapshots (current | git HEAD | snapshot_id): added/removed nodes and edges. Read-only.

NameRequiredDescriptionDefault
toYesTarget ref: "current" | git HEAD | snapshot_id
fromYesBaseline ref: "current" | git HEAD | snapshot_id
max_bytesNoResponse budget in bytes (default 65536, max 1048576)
workspaceNoWorkspace path; omitted = discovery from cwd

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral disclosure burden. It usefully states that the tool is read-only and describes the diff output as added/removed nodes and edges, but it omits details such as error behavior, permissions, or whether any limits apply beyond the schema-documented max_bytes.

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

Conciseness5/5

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

The description is a single tight sentence plus 'Read-only', with the core action and output front-loaded. There is no unnecessary wording and every clause contributes useful information.

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

Completeness4/5

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

For a read-only diff tool with a fully described schema and no output schema, the description covers the essential action, accepted refs, and returned difference categories. It is largely complete, though it could say more about error or truncation behavior when max_bytes is exceeded.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents from, to, max_bytes, and workspace. The description repeats the ref values but adds no meaning beyond what the schema provides, so the baseline score of 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource: diffing two snapshots and returning added/removed nodes and edges. Its purpose is clear, but it does not explicitly distinguish itself from siblings such as arch_status or arch_snapshot.

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

Usage Guidelines3/5

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

The description implies when to use the tool by explaining that it diffs snapshots and accepts current, git HEAD, or snapshot_id refs. However, it gives no explicit guidance on when to choose this over related tools like arch_snapshot or arch_status, and no exclusions are stated.

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

arch_snapshotB

Architectural snapshot: stacks, git, graph and snapshot_id (scope=summary|full). Read-only.

NameRequiredDescriptionDefault
scopeNosummary (default) or full graph
max_bytesNoResponse budget in bytes (default 65536, max 1048576)
workspaceNoWorkspace path; omitted = discovery from cwd

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the safety burden and does step up by declaring 'Read-only', which is the key behavioral trait for this call. It does not cover whether snapshots are cached, how large responses behave beyond the schema's max_bytes, or whether workspace discovery can fail.

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

Conciseness4/5

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

One compact sentence, front-loaded with the resource and payload, with no filler. It is telegraphic to the point of being slightly cryptic, but every fragment earns its place.

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

Completeness3/5

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

For a zero-required-parameter read tool with a fully documented schema and no output schema, the brief return-content list plus the read-only note are adequate. What is missing is orientation for a complex architectural tool: how it relates to arch_status and arch_diff, and what snapshot_id is used for downstream.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters (scope, max_bytes, workspace) are already documented in the schema; the baseline of 3 applies. The description's '(scope=summary|full)' merely restates the enum and adds no new meaning.

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

Purpose4/5

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

The description names the resource (architectural snapshot) and enumerates the payload (stacks, git, graph, snapshot_id), so an agent knows exactly what it gets back. It never distinguishes itself from arch_status or arch_diff, so the sibling boundary is left to inference.

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

Usage Guidelines2/5

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

No when-to-use guidance is given: nothing says whether this is a first-call orientation tool or when to prefer arch_status/arch_diff. The only hint is the inline scope=summary|full, which is a parameter note rather than usage guidance.

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

arch_statusB

Workspace status: detected stacks, git info, graph index coverage and adapter availability. Read-only.

NameRequiredDescriptionDefault
max_bytesNoResponse budget in bytes (default 65536, max 1048576)
workspaceNoWorkspace path; omitted = git root or nearest manifest from cwd

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full behavioral burden. It usefully discloses read-only behavior and lists the reported content, but it does not cover permissions or auth requirements, freshness or caching, error behavior, or the response shape. For a simple status tool this is moderate transparency.

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

Conciseness5/5

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

The description is a single front-loaded sentence with no wasted wording. Each clause names a concrete status component, and 'Read-only' is a useful behavioral tag.

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

Completeness4/5

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

For a low-complexity read-only status tool with no output schema, the description names the core return categories and the read-only safety property. It leaves usage routing against siblings and some behavioral details unstated, but the schema covers the parameters fully.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both optional parameters, including workspace default resolution and max_bytes budget. The description adds no parameter-specific meaning beyond what the schema provides, making the baseline 3 appropriate.

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

Purpose4/5

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

The description states a specific resource and scope—workspace status—and enumerates what it reports: detected stacks, git info, graph index coverage, and adapter availability. It does not explicitly differentiate itself from sibling tools such as arch_snapshot, so it falls short of a 5.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance, no named alternatives, and no exclusions. 'Workspace status' and 'Read-only' imply a diagnostic call, but the agent is not told when to choose this tool over arch_snapshot, arch_diff, or the other siblings.

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

focusA

Incoming and outgoing edges of one node with types; sqlglot lineage edges additionally carry columns (from/to pairs), stripped from get_graph/arch_snapshot. Type-only edges excluded unless include_type_only=true. Read-only.

NameRequiredDescriptionDefault
nodeYesNode path: absolute inside workspace or repo-relative POSIX
limitNoMax edges per list (default 50, max 200)
max_bytesNoResponse budget in bytes (default 65536, max 1048576)
workspaceNoWorkspace path; omitted = discovery from cwd
include_type_onlyNoInclude type-only edges (default false)

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description must carry behavioral disclosure; it does state 'Read-only', default exclusion of type-only edges, and extra sqlglot lineage columns. It does not describe ordering, missing-node behavior, or the overall returned edge structure, leaving gaps for a query tool with no output schema.

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

Conciseness5/5

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

The description is front-loaded and very short: scope first, then lineage-column nuance, filtering default, and safety. Dense graph terminology ('sqlglot lineage edges') adds information without wasted prose.

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

Completeness3/5

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

For a graph-query tool with five documented parameters and no output schema, it explains scope, filtering default, lineage columns, and read-only status. It still leaves the return shape largely implicit—such as how incoming and outgoing edges are separated—so an agent lacks full context for interpreting results.

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

Parameters3/5

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

Schema coverage is 100%, so the input schema already documents node, limit, max_bytes, workspace, and include_type_only. The description only restates the include_type_only default and otherwise adds no parameter-specific semantics beyond the schema.

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

Purpose4/5

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

States the resource and operation as 'incoming and outgoing edges of one node with types', and distinguishes the lineage-column behavior from get_graph/arch_snapshot. It does not use an explicit verb and does not position itself against all siblings such as reaches or impact, so clarity is strong but not fully sibling-differentiating.

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

Usage Guidelines3/5

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

It implies the tool is for inspecting one node and contrasts the lineage-column output with get_graph/arch_snapshot, which helps select it when columns are needed. It gives no explicit when-not guidance or direct routing versus reaches, impact, search, or affected_tests.

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

impactB

What a change affects: transitive dependents of changed files within depth (type-only excluded by default). Read-only.

NameRequiredDescriptionDefault
depthNoMax reverse edges (default 10, integer >= 1)
changedYesChanged paths inside the workspace
max_bytesNoResponse budget in bytes (default 65536, max 1048576)
workspaceNoWorkspace path; omitted = discovery from cwd
include_type_onlyNoInclude type-only edges (default false)

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description must carry the safety and behavior burden. It does disclose 'Read-only', the depth bound, and the default exclusion of type-only edges, which is genuinely useful. However, it says nothing about output shape, truncation semantics implied by max_bytes, or error behavior for paths outside the workspace.

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

Conciseness4/5

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

Two short sentences, front-loaded with the core semantics and the read-only guarantee, with zero filler. It is slightly telegraphic ('What a change affects:'), but nothing is wasted.

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

Completeness3/5

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

For a five-parameter analysis tool with no annotations and no output schema, the description omits what the response looks like (file lists, edge counts, truncation indicators) and how max_bytes interacts with depth limits. Adequate to start but leaves real gaps for correct invocation and interpretation.

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

Parameters3/5

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

Schema coverage is 100%, so all five parameters are already documented, including depth defaults and include_type_only. The description only echoes the type-only default and depth concept, adding no syntax, format, or interaction detail beyond the schema. Baseline 3 is appropriate.

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

Purpose4/5

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

States a specific computation: transitive dependents of changed files, bounded by depth, with type-only edges excluded by default. That is clearly distinct from forward-reachability or test-selection tools, though it never names a sibling such as 'reaches' or 'affected_tests' to make the distinction explicit.

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

Usage Guidelines3/5

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

The phrase 'What a change affects' implies the situation (you have changed files and want upstream blast radius), but there is no explicit when/when-not guidance and no routing to alternatives like 'affected_tests' for test coverage. Usage must be inferred.

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

reachesB

Reverse reachability: which nodes depend on target within max_depth. Read-only.

NameRequiredDescriptionDefault
targetYesTarget node path: absolute inside workspace or repo-relative POSIX
max_bytesNoResponse budget in bytes (default 65536, max 1048576)
max_depthNoMax reverse edges (default 10, integer >= 1)
workspaceNoWorkspace path; omitted = discovery from cwd
include_type_onlyNoInclude type-only edges (default false)

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden, and it only contributes the phrase "Read-only" to signal safety. It says nothing about truncation when max_bytes is exhausted, how cycles are handled, whether results are ordered, 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.

Conciseness5/5

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

Two compact sentences with the core semantics front-loaded and zero filler. The clipped "Read-only." fragment is arguably the most useful per-word signal in the whole definition.

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

Completeness3/5

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

For a five-parameter graph-traversal tool with no annotations and no output schema, the definition is minimally viable but thin. It should clarify directionality relative to 'impact', describe truncation behavior tied to max_bytes, and note how workspace discovery affects resolution.

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

Parameters3/5

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

Schema description coverage is 100%, so a baseline of 3 applies – the schema already documents target, max_bytes, max_depth, workspace, and include_type_only with defaults and constraints. The description mentions target and max_depth, but adds no syntax, format, or interpretation guidance beyond those fields.

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

Purpose4/5

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

"Reverse reachability: which nodes depend on target within max_depth" names a specific operation and resource, and the parenthetical defines what the result set actually is. It is clear on its own but never contrasts itself with the sibling 'impact' tool, which a reader would plausibly confuse with reverse dependency traversal.

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

Usage Guidelines2/5

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

The description contains no when-to-use or when-not-to-use guidance and names no alternatives, despite four siblings (impact, search, focus, arch_snapshot) that could plausibly cover adjacent questions. An agent must infer from the name alone that this is the reverse-direction counterpart to a forward traversal.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.1.0
    • First observedaffected_tests
    • First observedarch_diff
    • First observedarch_snapshot
    • First observedarch_status
    • First observedfocus
    • First observedimpact
    • First observedreaches
    • First observedsearch

TDQS

B3.4/5.0

Scored across 8 tools

Disambiguation3/5

Most tools have distinct roles, but reaches, impact, and affected_tests all express reverse-dependency/reachability queries and can be confused. Descriptions clarify the differences (generic depth vs changed-file impact vs tests only), but the boundaries are not fully crisp.

Naming Consistency3/5

All names are snake_case and readable, but the set mixes an arch_ prefix on only some tools and mixes verb-style names (search, focus, reaches) with noun-style names (impact, affected_tests, arch_diff). No predictable verb_noun convention is followed.

Tool Count5/5

Eight tools is well within the typical 3-15 range and the surface is focused on read-only architecture graph analysis. Each tool corresponds to a distinct query shape, so the count is appropriate.

Completeness4/5

The read-only architecture-analysis surface is broadly covered: status, snapshots, search, edge inspection, reverse reachability, impact, test impact, and diff. A minor gap is the lack of a general get_graph or node-detail tool (focus explicitly references get_graph, which is absent), though arch_snapshot may fill part of that role.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents and reviewers to query a deterministic code dependency graph for callers, routes, pages, tables, and config with file:line evidence instead of grepping. One server can serve many indexed graphs, supporting cross-repository impact analysis.
    192 PyPI
    4
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents and terminal users to query codebases for callers, impact, tests, dependencies, and refactor previews using static AST analysis, with every match accounted for and uncertain relationships clearly marked.
    331 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Exposes three read-only tools—impact, explain, and report—so an agent can query a prebuilt local DuckDB graph of a codebase to find the transitive reverse-dependencies of a symbol or file, inspect a symbol's structural neighbourhood, and introspect the index itself. Runs over stdio or Streamable HTTP, always read-only, with no external service.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI coding agents to query a local code graph over stdio, so they can see what a Git change may affect, find related tests, routes and nodes, and cite evidence paths — read-only and fully on-machine.
    6 npm
    MIT