Skip to main content
Glama
Fengrru

RepoGraph-Honest MCP Server

by Fengrru

HonestCode

The deterministic verification layer for AI coding agents.

Catch invented APIs, undefined symbols, wrong calls, and other code hallucinations before your agent moves on.

HonestCode invented API demo

CI PyPI version Python versions License: MIT


The problem

AI coding agents hallucinate. They invent function names, fabricate library APIs, and call methods that do not exist.

HonestCode is the layer that checks what the agent just wrote against the repository it is supposed to be grounded in.

Agent
  ↓
writes code
  ↓
HonestCode
  ↓
evidence
  ↓
Agent fixes
  ↓
verified code

No LLM calls. No network. Pure AST + symbol resolution.


Related MCP server: javalens-mcp

Demo

The agent was asked to "add authentication using the existing UserClient." It generated:

client.refresh_token()

The real project only has:

class UserClient:
    def refresh(self): ...
    def refresh_access_token(self): ...

HonestCode catches it deterministically:

✗ verification failed — 1 issue in app/login_broken.py

  [invented_api] app/login_broken.py:9
  `UserClient.refresh_token()` does not exist.
  did you mean: refresh_access_token()?
  available methods:
    - refresh()
    - refresh_access_token()
  confidence: deterministic · action: revise

Run it yourself:

cd demos/invented-api
python run.py

Why not just use Ruff / Pyright?

HonestCode is not a replacement — it is a verification layer that answers a specific question: did the agent's code actually come from this repository?

Error

Ruff

Pyright

HonestCode

Syntax error

Type mismatch

Undefined symbol

Invented API

partial

partial

core

Wrong method call

partial

core

Agent-generated API mismatch

core

The key difference is repository grounding. Ruff checks the file. Pyright types the call. HonestCode checks whether the call resolves to a real symbol that exists in the codebase the agent is editing.


Install

pip install honestcode

Requires Python >= 3.10. 100% local.


30-second setup with Claude Code

# Add HonestCode as an MCP server
claude mcp add honestcode -- honestcode-mcp

Or add it manually to your Claude Code config (~/.claude/config.json on macOS/Linux, %LOCALAPPDATA%\Claude\config.json on Windows):

{
  "mcpServers": {
    "honestcode": {
      "command": "honestcode-mcp",
      "args": []
    }
  }
}

Restart Claude Code. You now have two verification tools available:

  • scan_file(path) — legacy tool, returns issues plus the new evidence shape.

  • verify_file(path) — agent-facing tool, returns status, findings with evidence, and a human-readable text summary.

Try prompting Claude:

Add a login endpoint using the existing UserClient, then run verify_file on the
file you just wrote and fix anything it reports.

HonestCode auto-discovers the project root from the file path, indexes the codebase, and returns grounded evidence.


Real example

# auth/client.py
class UserClient:
    def refresh_access_token(self): ...

# auth/login.py
from auth.client import UserClient

def login(client: UserClient):
    client.refresh_token()  # invented API
>>> from honestcode.mcp.tools import verify_file
>>> verify_file("auth/login.py")
{
  "status": "fail",
  "file": "auth/login.py",
  "findings": [
    {
      "line": 7,
      "kind": "invented_api",
      "symbol": "refresh_token",
      "owner": "UserClient",
      "message": "`UserClient.refresh_token()` does not exist.",
      "evidence": {
        "available_methods": ["refresh", "refresh_access_token"],
        "did_you_mean": "refresh_access_token"
      },
      "confidence": "deterministic",
      "action": "revise"
    }
  ],
  "text": "✗ verification failed — 1 issue in auth/login.py\n  ..."
}

Agent output protocol

verify_file returns evidence an agent can act on directly, not just an error message:

{
  "status": "fail",
  "file": "auth/client.py",
  "line": 42,
  "kind": "invented_api",
  "symbol": "refresh_token",
  "owner": "UserClient",
  "message": "UserClient.refresh_token() does not exist.",
  "evidence": {
    "available_methods": ["refresh", "refresh_access_token"]
  },
  "confidence": "deterministic",
  "action": "revise"
}

How it works

  1. Auto-index the project (or reuse the cached symbol index).

  2. Parse the target file with the standard-library ast module.

  3. Resolve every call site to a concrete symbol:

    • infer the receiver type from annotations, constructors, and imports;

    • reconstruct the class's member surface from the repository AST;

    • mark the surface as unknown when a base class cannot be resolved or the class defines __getattr__.

  4. Emit findings with kind, owner, evidence, confidence, and action.

The loop is deterministic and auditable.


MCP tools

By default only scan_file is exposed. Set HONESTCODE_TOOLS=all to enable the full set, including:

Tool

Purpose

scan_file

Scan a file for invented APIs, undefined calls, and wrong arities.

verify_file

Return the agent-facing structured evidence protocol.

index_project

Build or reuse the project symbol index.

load_project_deps

Load dependency APIs from requirements.txt / pyproject.toml.

check_symbol

Verify a symbol is defined.

check_api

Verify a library API call exists.

validate_types

Structural type checks.

See the old tool reference below for the complete list.


Benchmark

HonestCode includes two benchmark suites that run automatically in CI on every push and pull request to main:

Agent-accuracy benchmark

benchmarks/agent_accuracy/ is a deterministic, LLM-free benchmark that measures how well HonestCode catches common agent hallucinations.

Each task is a tiny agent episode: the agent writes a broken file, HonestCode verifies it, then the file is replaced with the fix and verified again.

cd benchmarks/agent_accuracy
python run.py

Current results (4 tasks, deterministic verification):

task

expected issue

broken detected

fixed clean

broken ms

fixed ms

invented_method

invented_api (UserClient.refresh_token)

yes

yes

2.38

1.51

invented_module_attr

invented_api (Connection.query)

yes

yes

1.72

1.41

undefined_import

undefined_symbol (delete_user)

yes

yes

0.69

0.94

wrong_signature

wrong_call (add())

yes

yes

1.0

0.89

Summary: precision 1.0, recall 1.0, F1 1.0, false-positive rate 0.0, median verify time 2.51 ms.

Performance benchmark

scripts/benchmark.py measures the latency of core operations (index, scan, graph, dead code detection, similarity search) on the repository itself.

python scripts/benchmark.py                          # text output
python scripts/benchmark.py --format markdown        # table for README
python scripts/benchmark.py --repo psf/requests      # benchmark a real-world repo

Both benchmarks run in CI (.github/workflows/ci.yml) as separate jobs: benchmark-accuracy and benchmark-performance. A benchmark failure blocks the build if precision or recall drops below 1.0.

See benchmarks/agent_accuracy/README.md for the dataset format and how to add new accuracy tasks.


Architecture

honestcode/
├── verify/        # Evidence protocol + repository-grounded verification
├── mcp/           # MCP server layer
├── honest/        # Symbol index + project binding
├── graph/         # Persistent call graph (SQLite)
├── structure/     # AST extraction
├── sandbox/       # Sandboxed execution
└── cli.py         # Command-line interface

verify_file is the agent interface. scan_file is the default MCP tool and returns both the new evidence shape and the legacy issues list.


Roadmap

v0.1 — Repository grounding (now)

  • symbol / API / function / class / method / import / call verification

  • invented API detection with structured evidence

  • auto-index on scan_file

v0.2 — Semantic contract verification

  • function expects UserID, agent passes User → suspicious

v0.3 — Execution verification

  • static verification → tests → runtime evidence

v1.0 — Verification Runtime for Coding Agents

                 Coding Agent
                      │
              ┌───────▼───────┐
              │   HonestCode  │
              │ Verification  │
              │    Runtime    │
              └───────┬───────┘
                      │
       ┌──────────────┼──────────────┐
       ↓              ↓              ↓
   Static          Semantic       Runtime
 Verification     Verification   Verification
       │              │              │
       └──────────────┼──────────────┘
                      ↓
                   Evidence
                      ↓
                     Agent

Development

git clone https://github.com/Fengrru/honestcode.git
cd honestcode
python -m venv .venv
.venv\Scripts\activate  # Windows
# source .venv/bin/activate  # macOS/Linux
pip install -e ".[dev]"
pytest
ruff check honestcode tests scripts

Run benchmarks locally:

# Accuracy benchmark
python benchmarks/agent_accuracy/run.py

# Performance benchmark
python scripts/benchmark.py

See CONTRIBUTING.md for pull request guidelines.


Security

See SECURITY.md for vulnerability reporting.


Telemetry

HonestCode collects no telemetry. There are no analytics libraries, no background services, and no phone-home endpoints.


License

MIT - Copyright (c) 2026 HonestCode Team

Available Tools

1 tool
scan_fileB

Scan a file for potential hallucinations: undefined symbols, missing imports, and incorrect API calls.

Args: file_path: Absolute path to the Python file.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYes

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. The description doesn't state whether the scan is read-only, whether any side effects occur, what the return format looks like, or any ownership/permission requirements. For a tool with zero annotations, this lacks adequate transparency about what happens during execution.

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 compact—a one-sentence summary plus a single documented parameter with its arg meaning. It is appropriately brief with no filler. Minor deduction for the Args section being a lightweight docstring format rather than a structured rich description, but overall it earns its sentences well.

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?

With 1 parameter, no output schema, and no annotations, the tool is relatively simple. The description covers the purpose and the single parameter adequately, but lacks detail on what the scan result looks like (e.g., return format, whether it returns findings or just a pass/fail) and no behavioral context. It's adequate for a minimal tool but leaves the agent guessing about output structure.

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?

While schema description coverage is 0%, the description does add value by explaining file_path is 'Absolute path to the Python file,' adding format (absolute) and type (Python) constraints beyond the schema's bare 'string' type. With only one parameter, this adds sufficient semantic meaning, though the name/schema combination was already fairly clear.

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 uses a specific verb+resource ('Scan a file') and clarifies the domain (potential hallucinations) with concrete examples: undefined symbols, missing imports, incorrect API calls. It clearly states what the tool does, though it doesn't need sibling differentiation as no siblings exist.

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 guidance on when to use this tool versus alternatives. There's no mention of language scope beyond 'Python file' in the arg description, no prerequisites (e.g., file must exist), no context on when scanning is appropriate. The only implicit context is scanning for hallucination-type issues, which is weak guidance.

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

TDQS

B3.1/5.0
Disambiguation5/5

With only a single tool, there is no possibility of confusion or overlap between tools. The purpose of scan_file is clearly isolated and distinct.

Naming Consistency4/5

Only one tool exists, so consistency is trivially satisfied. The name follows a sensible verb_noun pattern (scan + file) that would fit well if more tools were added.

Tool Count1/5

A single trivial tool for a server named 'RepoGraph-Honest' is extremely thin. Scanning individual files for hallucinations is a narrow capability that does not justify an MCP server's scope.

Completeness2/5

The tool only scans a single file at a time with no support for scanning directories, repos, or batch operations. There are no complementary tools for viewing results history, scanning modules, or handling related analysis tasks, leaving significant gaps in the stated purpose.

Maintenance

ActivityMaintained
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

  • F
    license
    Not graded
    quality
    D
    maintenance
    A modular MCP server that provides tools for file operations, regex-based code searching, and structural analysis of functions and classes across multiple programming languages. It also includes AI-powered features for intelligently updating files according to architectural changes.

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/Fengrru/honestcode'

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