Skip to main content
Glama

registree

test PyPI Python License: MIT

An anti-hallucination class registry for coding agents, served over MCP.

Coding agents guess constructor signatures from memory — a keyword that doesn't exist, a required argument left out — and you pay for the guess in a TypeError and a debugging round-trip. registree removes the guess: it walks your codebase with ast (never imports), builds a registry of every class definition, and serves it as MCP tools so the agent can verify the signature before writing the call.

Two principles run through every tool:

  • Names map to lists. A duplicated class name returns every definition; the server never silently picks the first match.

  • Honesty over confidence. An open-ended constructor (**kwargs, Pydantic extra=/alias=) reports its contract as unknowable, never as an empty list pretending to be an answer.

How it works

  1. Scan — an AST walk over your source tree extracts every class: constructor parameters (including **kwargs and positional-only), typed fields with defaults, inheritance, docstrings. Classification is transitive: a model routed through your project's own base class is still recognized as a Pydantic model.

  2. Serve — the registry is cached as JSON and exposed over MCP stdio. It maintains itself: generated on first use, regenerated whenever a scanned file is newer than the cache.

  3. Answer — the agent queries it at the moment of use, instead of guessing.

Related MCP server: codegraph-mcp

MCP tools

tool

use it

get_signature

before writing a constructor or method call — required args, accepted keywords, the class's methods (inherited included), every definition of a duplicated name

verify_snippet

after drafting code — checks constructor calls against the registry

search_classes

when unsure of the exact class name

list_duplicates

which names need an explicit import to disambiguate

get_usages

before a rename — every usage, including through import aliases (X as XDB)

server_info

server status and registry size

Install

No install needed with uv — MCP clients launch it with uvx. For direct CLI use:

uv tool install registree   # or: pip install registree

Requires Python 3.12+.

Wire it into your agent

Any MCP client, JSON config form:

{
  "mcpServers": {
    "registree": {
      "command": "uvx",
      "args": ["registree", "serve", "--root", "/path/to/your/project"]
    }
  }
}

Omitting --root serves the directory the client launches the server in, which for most MCP clients is the project root.

Agent compatibility

The MCP tools work with any MCP client — Claude Code, Claude Desktop, Cursor, Windsurf, Cline, Zed, VS Code Copilot agent mode, Gemini CLI, and anything else that speaks MCP over stdio. Structured tool output degrades gracefully for clients that only read text content.

The hook adapters (hook-check, hook-regen) target Claude Code's hook protocol, which can intercept a pending file edit — or, opt-in, Python about to be run through a quoted shell heredoc — and hand the model advisory feedback before it lands, a deterministic checkpoint the MCP layer alone can't provide. See docs/claude-code.md.

That protocol is spreading: VS Code Copilot agent mode (Preview) reads the same format — same events, same stdin JSON, even .claude/settings.json — and the adapters tolerate its camelCase field names. Codex CLI and Gemini CLI use close-enough hook contracts that ports are straightforward. Agents whose hook systems can't intercept file edits pre-application (Cursor, Windsurf without model feedback, Zed with no hooks yet) still get the full MCP toolset — the hooks just add a deterministic layer where the platform supports one.

CLI

The same engine is available directly:

registree gen                 # build the registry
registree conflicts           # duplicate names: accepted layering vs smells
registree usages SomeClass    # every usage, alias-aware — run before renames
registree hook-check          # Claude Code PreToolUse adapter (advisory)
registree hook-regen          # Claude Code PostToolUse adapter (debounced)

registree conflicts exits non-zero only for duplicate names that are genuine smells — the accepted ORM/domain layered pair passes — so it is safe to wire into CI from day one.

The registry cache

Lives at .registree/registry.json by default — add .registree/ to your .gitignore. Every command that touches it accepts --registry-path to put it anywhere else; relative paths are anchored to the project root.

Development

uv sync            # creates .venv, installs deps + dev tools
uv run pytest      # includes a real stdio JSON-RPC handshake test
uv run mypy src tests
uv run ruff check .
uv run black --check .

Run the server directly (speaks MCP over stdio; exits on EOF):

uv run registree

License

MIT

Available Tools

6 tools
get_signatureA

Constructor contract AND callable surface for a class — EVERY definition if the name is duplicated. Call this before writing an instantiation or a method call: it reports the required arguments, the accepted keywords, honest null when a constructor is open-ended or unknowable, and the class's methods (inherited included, each with its kind and defining class) so a method name can be verified rather than guessed. When methods_complete is false an ancestor was unresolvable, so a listed method exists but an unlisted one still might.

Inputs: class_name (required). Returns: note, found, ambiguous, class_name, +1 more

get_usagesA

Every place a class name is used — imports, inheritance, instantiations, annotations, references — including usages through import aliases (from pkg.db.models import X as XDB). Run this BEFORE a rename to enumerate what must change.

Inputs: class_name (required), limit, include_tests. Returns: note, total, usages, aliases, +3 more

list_duplicatesA

Duplicate class names, split into accepted layered pairs (ORM model + domain model sharing a name across layers) and genuine smells. Names listed here always need an explicit import to disambiguate.

Inputs: smells_only. Returns: smells, layered, alias_convention, total_duplicate_names

search_classesA

Find classes by name fragment (case-insensitive), falling back to fuzzy matching when nothing contains the fragment. Use this when unsure of the exact class name.

Inputs: query (required), limit. Returns: hits, query, truncated, total_matches

server_infoA

Report server status, the project it serves, and registry size.

Inputs: no named parameters. Returns: name, root, status, version, +2 more

verify_snippetA

Check a draft snippet's constructor calls against the registry before writing it to a file. Pass the intended file_path when known — imports in the snippet and the target location both help disambiguate duplicated names.

Inputs: code (required), file_path. Returns: ok, note, error, findings

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 6 tools

    Disambiguation5/5

    Each tool targets a clearly distinct concern: server status, class signature lookup, snippet validation, usage enumeration, name search, and duplicate reporting. Even the two validation-adjacent tools differ in scope (single class vs. full snippet), so an agent can reliably pick the right one.

    Naming Consistency4/5

    Most tool names follow a clear verb_noun pattern: get_signature, get_usages, search_classes, list_duplicates, verify_snippet. The single outlier is server_info, which lacks a verb and would fit better as get_server_info, but the overall convention is still consistent enough to be predictable.

    Tool Count5/5

    Six tools is a well-scoped set for a read-only code intelligence registry. Each tool covers a necessary mode of interaction without redundancy or bloat.

    Completeness5/5

    The tool surface covers the full workflow: discover classes, resolve duplicates, inspect signatures, validate snippets, and enumerate usages before refactoring. There are no obvious dead ends or missing operations for the stated purpose.

    Maintenance

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables LLM agents to efficiently understand and navigate a codebase by providing semantic search over symbols and a reference graph, replacing expensive grep/glob calls with structured tools like definition lookup, caller/callee queries, and change-impact analysis.
      4
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Provides coding agents with a compact map of a TypeScript/TSX codebase, enabling direct answers about symbol locations, imports, dependencies, and references while reducing token usage.
      5
      8 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI coding agents to retrieve precise, real-time architectural context—such as domains, models, routes, and events—from a codebase, avoiding the need to dump entire files into prompts.
      828 npm
      1
      MIT