Skip to main content
Glama

transcend

Docs: ldippo.github.io/transcend-mcp · Suite: transcend-harness

A code-intelligence MCP server for coding agents: a cheap static map of a repository (tree-sitter structural graph — clusters, hubs, budgeted subgraphs) plus precise live navigation (real language servers via LSP), bridged by stable symbol IDs. Every response is structured, token-budgeted, and anchored to file:line — never a raw file dump.

Languages: Python (pyright) and TypeScript/JavaScript (typescript-language-server). Adding a language = a tree-sitter grammar + .scm queries + an LSP command — no core changes.

Install & run

npm install
npm run build

# optional but recommended — without them the server runs map-only:
npm install -g pyright typescript-language-server typescript

node dist/src/index.js --root /path/to/repo        # stdio MCP server
node dist/src/index.js --root /path/to/repo --no-watch

On first run the server indexes the repo in the background (≈0.5s per 1k files) and persists the index under <repo>/.transcend/ (add it to .gitignore). A file watcher keeps the index fresh incrementally.

Related MCP server: AgentsBestFriend

Wire into a harness

Any MCP-over-stdio harness works. Claude Code:

claude mcp add transcend -- node /path/to/transcend/dist/src/index.js --root /path/to/repo

Generic MCP config:

{
  "mcpServers": {
    "transcend": {
      "command": "node",
      "args": ["/path/to/transcend/dist/src/index.js", "--root", "/path/to/repo"]
    }
  }
}

Give the agent docs/AGENT_GUIDE.md — it documents the orient-with-map / confirm-with-LSP policy that the tool descriptions also encode.

Tool surface

Tool

Layer

Purpose

map_overview

map

clusters + hub symbols; start here

map_search

map

fuzzy symbol lookup → node IDs

map_neighbors

map

callers/callees/imports/inheritance around a node

map_path

map

shortest structural path between two symbols

map_rebuild, map_status

map

index management + both layers' health

nav_definition / nav_references / nav_implementations

live

ground truth, always current

nav_type / nav_symbols / nav_workspaceSymbols

live

hover, file outline, workspace search

nav_callHierarchy

live

incoming/outgoing calls (capability-gated, with fallback)

resolve

bridge

node ID ⇄ verified live file:line:col, staleness flagged

metrics_report

meta

token savings so far (this session + cumulative)

All tools accept tokenBudget (default 2000, max 10000) and return a uniform envelope; see the agent guide.

Token savings

Every successful tool response is measured against the naive alternative — reading in full every file the response points into — and the delta is accumulated cumulatively in .transcend/metrics.json:

savings = baseline (full reads of referenced files) − actual (emitted tokens)

Baseline is an upper bound (an agent might not read whole files). View it three ways: the metrics_report tool (live, mid-session), a one-line stderr summary on shutdown, or the CLI report:

node dist/src/index.js report --root /path/to/repo          # per-tool table + total
node dist/src/index.js report --root /path/to/repo --json   # raw JSON

Development

npm test          # unit + integration (LSP tests auto-skip if servers absent)
npm run smoke     # build + scripted MCP client against the TS fixture
npx @modelcontextprotocol/inspector node dist/src/index.js --root test/fixtures/ts-mini

Architecture notes: docs/ARCHITECTURE.md.

No telemetry. No network calls. Secrets are never read; configuration is CLI flags only.

Available Tools

14 tools
map_neighborsA

Explore the static relationship graph around one node: callers/callees, imports, inheritance, containment. Call this BEFORE nav_references when you want the shape of the dependency fan-in/out cheaply — it is instant and token-budgeted, while nav_references invokes the language server. Edges come from static analysis: resolved:false edges are name-match guesses, and any edge can be stale or miss dynamic dispatch. Once you've picked the edges that matter, verify with nav_references or nav_callHierarchy at the location from resolve(nodeId).

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
nodeIdYesMap node ID, e.g. "py:src/auth/session.py#SessionStore.refresh" or "ts:src/index.ts" (file node)
maxNodesNo
directionNoboth
edgeKindsNoRestrict to these edge kinds; omit for all
tokenBudgetNoMax tokens for the response. Lists are truncated to fit, with a note saying what was dropped and how to get it back.

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description takes full responsibility for behavioral disclosure. It honestly states that edges come from static analysis, that 'resolved:false' edges are name-match guesses, and that any edge can be stale or miss dynamic dispatch. It also mentions the token budget and truncation behavior, providing excellent transparency.

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

Conciseness4/5

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

The description is well-structured and mostly concise, front-loading the core purpose. It includes essential details about usage and limitations without excessive verbosity, though it could be slightly more streamlined.

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?

Given the tool's complexity (6 parameters, no output schema), the description covers the essential behavioral aspects, limitations, and integration with sibling tools. It lacks explicit mention of the response shape, but the purpose and limitations are clear enough for an AI agent to use the tool correctly.

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

Parameters3/5

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

The description provides high-level context for the tool but does not elaborate on individual parameters like depth, maxNodes, or direction beyond what is in the schema. Since schema coverage is 50%, the description partially compensates by explaining the tool's overall behavior, but it doesn't fully clarify parameter semantics for all six parameters.

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

Purpose5/5

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

The description clearly states the tool's purpose: exploring the static relationship graph around one node, listing specific edge types (callers/callees, imports, inheritance, containment). It distinguishes itself from the sibling tool nav_references by positioning itself as a cheaper, instant alternative for understanding dependency shape.

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

Usage Guidelines5/5

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

The description explicitly advises to call this BEFORE nav_references for cheap dependency shape, and to verify specific edges with nav_references or nav_callHierarchy later. This provides clear when-to-use and when-to-avoid guidance, including alternatives.

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

map_overviewA

START HERE for any unfamiliar codebase or feature area. Returns a cheap, token-budgeted structural summary (clusters of related files, hub symbols with node IDs) from a pre-built static index — no language-server cost, milliseconds even on large repos. Use the returned node IDs with map_neighbors to explore relationships and with resolve to jump to exact live locations. The index may lag recent edits: before editing or relying on a specific line number, confirm with resolve or nav_definition, which query the live language server.

ParametersJSON Schema
NameRequiredDescriptionDefault
focusNoRestrict the overview to a subtree, e.g. 'src/auth'
tokenBudgetNoMax tokens for the response. Lists are truncated to fit, with a note saying what was dropped and how to get it back.
hubsPerClusterNo

TDQS

A4.5/5.0
Behavior4/5

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

Without annotations, the description carries full burden. It discloses that the tool is cheap, uses a static index, has no language-server cost, and is fast. It warns that the index may lag recent edits and advises using other tools for live confirmation. However, it does not explicitly mention what the tool does not do (e.g., provide live line numbers) but implies it via the warning.

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 paragraph of 5 sentences, front-loaded with the purpose. Every sentence adds value, and it is well-structured for quick comprehension.

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

Completeness5/5

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

Given the tool has 3 parameters, no output schema, and no annotations, the description covers purpose, usage guidelines, limitations, and links to siblings. It provides sufficient context for an overview tool, enabling the agent to decide when and how to use it.

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 67% (2 of 3 parameters have descriptions). The description adds some context about token budgeting and speed but does not elaborate on parameter usage beyond what the schema provides. It indirectly adds value by explaining the tool's nature, but parameter semantics are not significantly enhanced.

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

Purpose5/5

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

The description clearly states that the tool returns a structural summary from a static index, specifying it as a starting point for unfamiliar codebases. It distinguishes itself from siblings like map_neighbors and resolve by explaining how node IDs are used with those tools.

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

Usage Guidelines5/5

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

Explicitly says 'START HERE for any unfamiliar codebase or feature area.' Provides guidance on when to use siblings: 'Use the returned node IDs with map_neighbors to explore relationships and with resolve to jump to exact live locations.' Also warns about index lag and suggests confirming with resolve or nav_definition for live data.

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

map_pathA

Shortest structural path between two symbols in the static map (over imports/calls/inheritance/containment). Useful to understand how two areas connect before reading code. Static and possibly stale — confirm the load-bearing hops with nav_references.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
fromYesMap node ID, e.g. "py:src/auth/session.py#SessionStore.refresh" or "ts:src/index.ts" (file node)
maxLenNo
tokenBudgetNoMax tokens for the response. Lists are truncated to fit, with a note saying what was dropped and how to get it back.
includeReferencesNoAlso traverse noisy 'references' edges

TDQS

A4.3/5.0
Behavior4/5

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

Discloses that the path is 'shortest structural path' and 'static and possibly stale', which are important behavioral traits. Since there are no annotations, these add value. However, it does not describe the response format or error behavior (e.g., no path found), slightly reducing completeness.

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 efficient sentences: first defines purpose, second gives usage guidance and a caution. No fluff, every word 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?

While purpose and usage are clear, the description omits response structure (e.g., the format of the path, whether it is a list of node IDs) and handling of edge cases like no path. Without an output schema, these gaps reduce completeness.

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 60%, and the description indirectly maps 'from' and 'to' as symbols but adds no details beyond the schema's own descriptions for maxLen, tokenBudget, or includeReferences. It provides minimal additional context, earning a middle score.

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

Purpose5/5

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

The description specifies the verb 'find shortest structural path' and the resource 'static map', with explicit mention of relations (imports/calls/inheritance/containment). It clearly distinguishes from siblings like map_neighbors or map_overview.

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

Usage Guidelines5/5

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

Provides a concrete use case ('understand how two areas connect before reading code') and explicitly warns about staleness, directing to nav_references for confirmation. This tells the agent when and when not to rely on this tool.

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

map_rebuildA

Rebuild the static map index (incremental: only changed files are re-parsed). Long-running on first build of a large repo. Not needed for nav_* correctness — those are always live. Use when map responses flag staleness or after large refactors.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoSubtree to rebuild, e.g. 'src/auth'; omit for the whole repo

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the burden. It reveals that the rebuild is incremental (only re-parses changed files except on first build), and mentions it's long-running on first build. It does not disclose any destructive side effects or system impacts beyond time, but the description is clear enough for safe invocation.

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 sentences, front-loaded with the action and key behavior (incremental). Every sentence adds value: first defines the tool, second provides usage guidance and performance context. No unnecessary words.

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?

Given the tool's complexity (side-effect operation) and lack of output schema, the description adequately covers when to use, performance implications, and distinction from live queries. It could optionally mention return format or completion signal, but the context is sufficient for an agent to decide correctly.

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

Parameters3/5

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

Schema coverage is 100% with the 'scope' parameter described as 'Subtree to rebuild, e.g. 'src/auth'; omit for the whole repo.' The description repeats 'omit for the whole repo' but adds no new meaning beyond the schema. The baseline is 3 for high-coverage schemas.

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

Purpose5/5

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

The description clearly identifies the tool's action ('Rebuild the static map index') and resource (map index), and distinguishes it from sibling tools like map_neighbors, map_overview, and the nav_* tools by stating it's not needed for nav_* correctness.

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

Usage Guidelines5/5

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

Provides explicit usage conditions: 'Use when map responses flag staleness or after large refactors.' Also states when not to use: 'Not needed for nav_* correctness.' The note about long-running first build sets performance expectations.

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

map_statusA

Health and freshness of both layers: map age, file/symbol/edge counts, stale files, watcher state, and per-language LSP availability. Cheap; call when results look off or to check whether a language server is installed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses that the tool is 'cheap' (low cost) and enumerates the data it provides, which implies it is a safe, read-only operation. No hidden behaviors or side effects are indicated.

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 two sentences long, no wasted words, and front-loads the key information about what the tool provides. It is optimally concise.

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

Completeness5/5

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

Despite no output schema, the description enumerates all relevant status aspects (map age, counts, etc.). For a zero-parameter status check, this is complete and sufficient for an agent to understand the tool's output.

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

Parameters4/5

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

The input schema has zero parameters, so schema description coverage is 100%. The description adds no parameter info because none exist, aligning with the baseline score of 4 for no-parameter tools.

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

Purpose5/5

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

The description explicitly states the tool provides 'Health and freshness of both layers' and lists specific metrics like map age, file/symbol/edge counts, stale files, watcher state, and per-language LSP availability. This clearly distinguishes it from sibling tools like map_neighbors or map_overview.

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

Usage Guidelines4/5

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

The description advises using it when 'results look off' or to check language server installation, providing clear usage context. It does not explicitly mention when not to use or alternatives, but the guidance is sufficient.

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

resolveA

The bridge between the static map and the live language server — call it whenever you switch layers. Given a map nodeId, returns the verified current file:line:col plus live symbol info, with mapStale:true if the indexed location has drifted (the live location is authoritative). Given a file:line:col, returns the enclosing symbol chain and the matching map nodeId (inMap:false with the nearest container if the map hasn't caught up). Use before nav_* calls that need exact positions, and after nav_* results to re-enter the map graph.

ParametersJSON Schema
NameRequiredDescriptionDefault
colNo
fileNoRepo-relative path (use with line/col instead of nodeId)
lineNo
nodeIdNoMap node ID, e.g. "py:src/auth/session.py#SessionStore.refresh" or "ts:src/index.ts" (file node)
tokenBudgetNoMax tokens for the response. Lists are truncated to fit, with a note saying what was dropped and how to get it back.

TDQS

A4.9/5.0
Behavior5/5

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

Describes both input modes (nodeId vs file:line:col), explains the mapStale flag indicating drift, and details what happens when map hasn't caught up (inMap:false with nearest container). Also explains tokenBudget behavior (truncation with note). No annotations present, so description carries full burden and succeeds.

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?

Sentence 2 is long but packs essential information. Could be slightly more structured (e.g., bullet points), but still efficient with no wasted words.

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

Completeness5/5

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

Completely covers both directions of resolution, explains stale detection and fallback behavior, and provides usage context relative to sibling tools. No output schema exists, but description gives enough to understand return behavior.

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

Parameters5/5

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

Adds significant meaning beyond schema: explains the nodeId pattern, the dual use of file/line/col, and the tokenBudget behavior. At 60% schema coverage, description compensates fully.

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

Purpose5/5

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

Clearly states tool bridges static map and live language server, resolving nodeId to file:line:col and vice versa. Distinguishes from sibling map_* and nav_* tools by positioning it as a bridge between them.

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

Usage Guidelines5/5

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

Explicitly says 'call it whenever you switch layers', and provides specific guidance: 'Use before nav_* calls that need exact positions, and after nav_* results to re-enter the map graph.' This tells the agent exactly when and how to use it.

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

TDQS

A4.2/5.0
Disambiguation5/5

Each tool has a distinct purpose with clear boundaries between static map exploration (map_*) and live language server queries (nav_*). The descriptions explicitly guide when to use each, preventing confusion.

Naming Consistency5/5

Tools follow a consistent pattern: map_+verb for static operations and nav_+noun/verb for live queries. The 'resolve' tool is a well-justified exception serving as a bridge between layers.

Tool Count5/5

With 14 tools, the server covers both cheap static analysis and expensive but accurate live queries without unnecessary overlap. The number is well-scoped for comprehensive code navigation.

Completeness5/5

The tool set covers all common navigation tasks: structural overview, search, path finding, call hierarchy, definitions, references, implementations, symbols, type information, and handles staleness. No obvious gaps exist.

Maintenance

ActivityStale
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for semantic codebase navigation that builds an AST index of symbols, imports, and exports, providing AI agents with tools to search, explore, and understand code.
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Give your AI coding agents superpowers — a local MCP server for fast, token-efficient code navigation, search & analysis.
  • A
    license
    Not graded
    quality
    A
    maintenance
    A persistent code-intelligence MCP server that builds a queryable knowledge graph of your codebase, enabling AI assistants to perform cross-file structural reasoning, dependency analysis, and blast radius detection.
    6
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that gives AI coding agents codebase navigation intelligence, enabling symbol lookup, reference finding, type inspection, and diagnostics through tools like locate, refs, hover, diagnostics, status, and rename.
    557
    MIT

Latest Blog Posts

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/LSDIPPOLLC/transcend-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server