Skip to main content
Glama

Estelle CLI

The trust layer under your AI coding agents. Estelle grounds every model in your real codebase and refuses to ship what isn't true.

It is not another agent. It runs underneath the agents you already use and gives them three things they do not have on their own: memory of your repository, a deterministic gate that resolves every symbol a change names against your real code, and grounded review. Model-agnostic, bring your own key.

This repository holds the Rust CLI and the Claude Code plugin. The hosted server is separate.

Install

curl --proto '=https' --tlsv1.2 -fsSL \
  https://github.com/uqeu/estelle-cli/releases/latest/download/install.sh | sh

That is the whole install. It detects your platform, downloads from this repository's latest release, verifies the archive against the release's SHA256SUMS, rejects archives with unexpected members, and atomically installs estelle into ~/.local/bin. macOS or Linux, arm64 or x86_64. There is no Windows build.

The same binary is on npm for machines that are already npm-based:

npm install -g @fatelabs/estelle

Related MCP server: Heimdall MCP Server

Two doors, and the difference between them

Both doors reach the same hosted server at https://api.fatelabs.ca/mcp. They do not see the same code.

Door 1: the plugin. Use this one. In Claude Code:

/plugin marketplace add uqeu/estelle-cli
/plugin install estelle@fatelabs

The plugin ships the hooks and the server entry together. The hooks fire on every edit rather than when the model decides to call a tool, and they send your working tree as you edit it, so uncommitted work is indexed. The plugin carries no credential: the client negotiates OAuth in the browser. Its hooks shell out through npx, so Node 18 or newer has to be on the machine.

For editors that are not Claude Code, estelle install-hooks writes the same ten handlers across seven events (PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, Stop, PreCompact, SessionEnd) for both Claude Code and the Codex CLI.

Every hook fails silently by design (tui/src/top_level.rs:471): no credentials, no network, a slow server or an empty memory all produce nothing rather than an error on the hot path. The UserPromptSubmit handler is still the slowest one, and it is now bounded. It used to ask the server for a full search and read only the recall text, paying for a code branch it discarded unread — measured at 133.4 s against 8.4 s for the same recall, byte for byte. It now asks for the one field it reads (top_level.rs:424) and gives up at 20 seconds (top_level.rs:397), ten seconds under the host's 30-second kill, because being killed by the host discards your prompt along with the hook's answer. The floor is the server's, not ours: POST /search has an observed floor near 6 seconds, so a prompt still costs that much before the model sees it, and if the budget expires the turn proceeds with no added context. Nothing tells you that happened.

What the edit hook does, exactly. It grounds the edit and reports one of four verdicts to you and to the model: PASSED, FLAGGED, ABSTAINED, or UNREACHABLE. ABSTAINED says in its own words that it is not a pass. It does not block the edit (tui/src/top_level.rs:805). The finding is advisory while the server does not attest index freshness, and the runner says so in the text it emits. The blocking check is estelle gate, which returns a merge verdict you can fail a build on.

And the edit hook inspects Python only today (tui/src/top_level.rs:807). A write to any other file type produces no output at all, so on that path "not checked" and "clean" look the same. Use estelle gate on the diff if you need a verdict for another language.

Door 2: the remote MCP URL. For hosts that cannot run a Claude Code plugin:

claude mcp add --transport http estelle https://api.fatelabs.ca/mcp

estelle init writes that entry for every editor it finds, so you do not paste it once per tool.

This door has no hooks. It sees only what you have pushed, so its graph is never fresher than your last push to GitHub. If you are asking about code you wrote in the last ten minutes, use door 1.

What the CLI does

estelle sweep                          # index this repo into your memory
estelle ask "how does billing retry a failed charge?"
estelle verify src/http/headers.rs     # resolve every symbol against the repo's real symbol graph
estelle gate                           # run that check over a local diff
estelle mcp-server                     # Estelle's tools over MCP, for any agent
estelle acp                            # Agent Client Protocol, over stdio

Answers cite the files and lines they came from. When Estelle cannot ground an answer, it says so instead of inventing one. estelle --help lists all twenty-six commands.

To bypass credential storage, set ESTELLE_API_KEY in the process environment. It takes precedence over ~/.estelle/auth.json and is never persisted by Estelle.

What is measured

Estelle's grounding gate caught 38,153 of 38,153 invented APIs, with 0 false positives on 6,933 real symbols, over 45,086 labelled cases. It makes no model call: it parses the change and resolves each symbol against the repository's indexed symbol graph, so the verdict is a property of the artifact rather than a score that moves between runs.

Read the limit in the same breath, because it is the part that decides whether the number applies to you:

  • That measures invented repository APIs, in Python. A case is one code reference naming a repository symbol or import the codebase does not define.

  • Twelve of twenty-three supported languages block at some rung. Python is the only one with the full guarantee of existence, arity, type, and member calls on any receiver. The other eleven are navigated, not gated: their references are excluded from the rate rather than counted as passes.

  • It is not a correctness claim. Code can be perfectly grounded and still wrong.

  • The eval harness is not in this public repository, so you cannot re-run it from here. What you can check from here is the behaviour, on your own code, with estelle verify and estelle gate.

Fixes are proposed, not merged. The default writes to a sandbox and opens a pull request a human reviews. Auto-merge is opt-in, off by default, and gated on the fix being proved green in a sandbox first. There is no auto-deploy step.

The component boundaries, trust model, release path, measurements, provenance inventory, and named limits live in docs/ARCHITECTURE.md, docs/SCORECARD.md, and docs/WHAT-WE-BUILT.md.

How a release is verified

Public releases are cut by .github/workflows/release.yml and carry four checksummed binaries: macOS and Linux, arm64 and x86_64. The workflow refuses a tag that disagrees with the version in Cargo.toml, npm-shim/package.json, estelle-plugin/.claude-plugin/plugin.json, or .claude-plugin/marketplace.json, builds from the lockfile with warnings denied, and requests a GitHub-signed SLSA build provenance attestation for every published artifact.

Neither installer checks that attestation for you, so verify it yourself if you want the stronger guarantee:

gh attestation verify estelle-<target>.tar.gz --repo uqeu/estelle-cli

ESTELLE_RELEASE_REPOSITORY is an explicit operator and test override that changes the installer's trust root. Normal installs must leave it unset.

Provenance

Forked from OpenAI Codex at commit 582569998181aad08a88bacc151a94b2048a5d1f. The fork boundary and the egress census are enforced by scripts/check-fork-audit.py and fork-manifest.yaml on every release.


fatelabs.ca · docs · install guide · Apache-2.0

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityActive
ResponsivenessSlow

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
    B
    quality
    Not graded
    maintenance
    Provides repository-scoped safe memory for AI coding agents with just-in-time verification against file changes to ensure facts remain accurate. It links memories to specific code citations and automatically marks them as stale if the underlying source code is modified or deleted.
    5
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI coding assistants with persistent, context-rich memory of a codebase, including documentation and git history, enabling recall across sessions.
    104
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Gives AI coding agents persistent, evolving knowledge about a codebase, enabling them to store and retrieve observations about architecture, conventions, gotchas, and recent work context.
    10
    39
    2
    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/uqeu/estelle-cli'

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