MCP server bridging AI agents with the Isabelle proof assistant via its LSP/PIDE interface
Project description
Isabelle-MCP
MCP server that lets AI agents (Claude Code, Codex, …) drive the Isabelle theorem prover through its LSP/PIDE commands — fully autonomously, with no human in the loop.
Python ≥ 3.12 | v0.1.0 (MVP)
Purpose
This MCP server exists so that Claude / Codex can issue Isabelle LSP commands
without any human mediation. The entire Isabelle process is encapsulated
behind the MCP tools — it exposes no UI to the user. The agent works by
editing .thy/.ML files on disk and calling the tools to evaluate them and
query proof states; nobody watches or steers the prover interactively.
This server is not designed for human–AI collaboration (there is no jEdit/VSCode front-end in the picture). It implements a single AI ↔ Isabelle, no-human-in-the-loop model.
⚠️ One agent per server instance. This server holds a single Isabelle session with global mutable state — one set of open documents, one caret/perspective, and one evaluation in flight at a time. It is single-threaded and not concurrency-safe: pointing multiple agents at one instance, or interleaving concurrent requests, corrupts the evaluation/caret/ document state with catastrophic, hard-to-debug results. The server runs over stdio, so each agent already gets its own dedicated server process (and its own
isabelle vscode_server) — just don't share one or drive it concurrently.
[!IMPORTANT] Patch Isabelle first — this server does not work on a stock Isabelle. It drives
isabelle vscode_serverthrough PIDE LSP requests (PIDE/output_at_position,PIDE/cancel_execution, …) that only exist after applying the my-better-isabelle-prover patches:pip install my-better-isabelle-prover # via pip or uv tool; needs Python ≥ 3.12 my-better-isabelle patch # apply patches + rebuild the Scala components my-better-isabelle status # verify: every patch reports "applied"
isabelle-mcp installchecks this (whenisabelleis reachable) and refuses to register the server against an unpatched Isabelle. The server re-checks at run time too: everyisabelle_launchverifies the patches (via its bundled copy of the patch manager) and refuses to start an unpatched Isabelle — bypass withisabelle-mcp --skip-patch-checkfor hand-patched setups the patch manager cannot recognize. Compatibility notes (PEP 668, non-global Isabelle, …) are in AGENTS.md.
Quick Start
pip install isabelle-mcp # or: uv tool install isabelle-mcp
# register into Claude Code / Codex (auto-detects whichever is installed):
isabelle-mcp install
For Claude Desktop, register manually instead
(~/.config/claude/claude_desktop_config.json):
{
"mcpServers": {
"isabelle": {
"command": "isabelle-mcp"
}
}
}
Tools
| Tool | Description |
|---|---|
isabelle_launch |
Start (or restart) the prover with the session/logic that fits the work (bare Main is only a minimal fallback); call this first |
isabelle_terminate |
Terminate the running prover (the MCP server stays up; you can relaunch) |
isabelle_evaluate_to |
Evaluate the theory up to a line; returns a per-file snapshot of errors / warnings / running command lines |
isabelle_evaluation_status |
Poll progress of a running evaluation (same snapshot) |
isabelle_cancel_evaluation |
Cancel a running evaluation |
isabelle_hover |
Type info and documentation at position |
isabelle_definition |
Jump to symbol definition |
isabelle_local_occurrences |
In-file occurrences (definition + uses) of a local entity |
isabelle_goal |
Proof goals — omit after_text for before/after diff |
isabelle_command_output |
Prover output messages |
isabelle_session_info |
Current session info |
All positions are 1-indexed. File paths must be absolute.
PIDE tools (goal, command_output) are best-effort wrappers around async PIDE notifications and may time out.
Development
pip install -e ".[dev]" # editable install from a checkout
pytest # unit tests
pytest -m integration # requires running Isabelle
python -m mypy src/ # type checking
Architecture
server.py FastMCP entry point — tool registration, lifespan
lsp_client.py JSON-RPC 2.0 client for isabelle vscode_server
tools/ Tool implementations (one file per tool)
utils/ Position conversion, URI handling, HTML parsing
models.py Pydantic output models
License
See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file isabelle_mcp-0.1.1.tar.gz.
File metadata
- Download URL: isabelle_mcp-0.1.1.tar.gz
- Upload date:
- Size: 86.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
06cf821a030c256efd37b377be73abe6338a8be731eddd2fe7d6de821f2d94a8
|
|
| MD5 |
00dff8ced41bc41ae887b07e481b089b
|
|
| BLAKE2b-256 |
435eaf376229e323177e53acfe7951d52a397c16812acb3ca07d903161a90f91
|
File details
Details for the file isabelle_mcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: isabelle_mcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 66.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2787aa4a18ad487d06772318a400cfd73c9024fb6bfc8967e910ad715d44a956
|
|
| MD5 |
14df0614ed3a3c003433ddcc4f5d06a7
|
|
| BLAKE2b-256 |
301708fcf1b7a4bd6868258bcc5f661ea842138f5caa41409cd462c2848ef5ea
|