Interact with the Lean theorem prover via the Language Server Protocol (LSP), enabling LLM agents to understand, analyze, and modify Lean projects.
MCP server that allows agentic interaction with the Lean theorem prover via the Language Server Protocol using leanclient. This server provides a range of tools for LLM agents to understand, analyze and interact with Lean projects.
Currently beta testing: Please help us by submitting bug reports and feature requests!
leansearch
, loogle
, and lean_state_search
to find relevant theorems and definitions.lake build
manually.Install uv for your system.
E.g. on Linux/MacOS:
curl -LsSf https://astral.sh/uv/install.sh | sh
lake build
lean-lsp-mcp
will run lake build
in the project root to use the language server (for most tools). Some clients (e.g. Cursor) might timeout during this process. Therefore, it is recommended to run lake build
manually before starting the MCP. This ensures a faster build time and avoids timeouts.
E.g. on Linux/MacOS:
cd /path/to/lean/project
lake build
Note: Your build does not necessarily need to be successful, some errors or warnings (e.g. declaration uses 'sorry'
) are OK.
VSCode and VSCode Insiders are supporting MCPs in agent mode. For VSCode you might have to enable Chat > Agent: Enable
in the settings.
OR manually add config to settings.json
(global):
{
"mcp": {
"servers": {
"lean-lsp": {
"command": "uvx",
"args": ["lean-lsp-mcp"],
// OPTIONAL: Setting this env variable is not required.
// It is recommended to try without it first and only set it if you run into issues.
"env": {
"LEAN_PROJECT_PATH": "/path/to/lean/project"
}
}
}
}
}
Open MCP Settings (File > Preferences > Cursor Settings > MCP)
"+ Add a new global MCP Server" > ("Create File")
Paste the server config into mcp.json
file:
{
"mcpServers": {
"lean-lsp": {
"command": "uvx",
"args": ["lean-lsp-mcp"],
// OPTIONAL: Setting this env variable is not required.
// It is recommended to try without it first and only set it if you run into issues.
"env": {
"LEAN_PROJECT_PATH": "/path/to/lean/project"
}
}
}
}
Run one of these commands in the root directory of your Lean project (where lakefile.toml
is located):
# Local-scoped MCP server
claude mcp add lean-lsp uvx lean-lsp-mcp
# OR project-scoped MCP server (creates or updates a .mcp.json file in the current directory)
claude mcp add lean-lsp -s project uvx lean-lsp-mcp
# OR If you run into issues with the project path (e.g. the language server directory cannot be found), you can also set it manually e.g.
claude mcp add lean-lsp uvx lean-lsp-mcp -e LEAN_PROJECT_PATH=$PWD
You can find more details about MCP server configuration for Claude Code here.
Other setups, such as Claude Desktop, OpenAI Agent SDK, Windsurf or Goose should work with similar configs.
Tools are currently the only way to interact with the MCP server.
Get the contents of a Lean file, optionally with line number annotations.
Get all diagnostic messages for a Lean file. This includes infos, warnings and errors.
l20c42-l20c46, severity: 1 simp made no progress
l21c11-l21c45, severity: 1 function expected at h_empty term has type T ∩ compl T = ∅
...
Get the proof goal at a specific location (line or line & column) in a Lean file.
Get the term goal at a specific position (line & column) in a Lean file.
Retrieve hover information (documentation) for symbols, terms, and expressions in a Lean file (at a specific line & column).
This is intended for stubbing-out incomplete parts of a proof while still having a syntactically correct proof skeleton.
Lean will give a warning whenever a proof uses sorry
, so you aren't likely to miss it,
but you can double check if a theorem depends on sorry
by looking for sorryAx
in the output
of the #print axioms my_thm
command, the axiom used by the implementation of sorry
.
Get the file contents where a symbol or term is declared.
Code auto-completion: Find available identifiers or import suggestions at a specific position (line & column) in a Lean file.
Run/compile an independent Lean code snippet/file and return the result or error message.
Attempt multiple lean code snippets on a line and return goal state and diagnostics for each snippet. This tool is useful to screen different proof attempts before using the most promising one.
Currently all external tools are rate limited to 3 requests per 30 seconds. This will change based on provider feedback.
Search for theorems in Mathlib using leansearch.net (natural language search).
Github Repository | Arxiv Paper
bijective map from injective
, n + 1 <= m if n < m
, Cauchy Schwarz
, List.sum
, {f : A → B} (hf : Injective f) : ∃ h, Bijective h
{
"module_name": "Mathlib.Logic.Function.Basic",
"kind": "theorem",
"name": "Function.Bijective.injective",
"signature": " {f : α → β} (hf : Bijective f) : Injective f",
"type": "∀ {α : Sort u_1} {β : Sort u_2} {f : α → β}, Function.Bijective f → Function.Injective f",
"value": ":= hf.1",
"informal_name": "Bijectivity Implies Injectivity",
"informal_description": "For any function $f \\colon \\alpha \\to \\beta$, if $f$ is bijective, then $f$ is injective."
},
...
Search for Lean definitions and theorems using loogle.lean-lang.org.
Real.sin
, "differ"
, _ * (_ ^ _)
, (?a -> ?b) -> List ?a -> List ?b
, |- tsum _ = _ * tsum _
[
{
"type": " (x : ℝ) : ℝ",
"name": "Real.sin",
"module": "Mathlib.Data.Complex.Trigonometric"
},
...
]
Search for applicable theorems for the current proof goal using premise-search.com.
Github Repository | Arxiv Paper
A self-hosted version is available and encouraged. You can set an environment variable LEAN_STATE_SEARCH_URL
(see Setup 3. for an example) to point to your self-hosted instance. It defaults to https://premise-search.com
.
Uses the first goal at a given line and column. Returns a list of relevant theorems.
[
{
"name": "Nat.mul_zero",
"formal_type": "∀ (n : Nat), n * 0 = 0",
"module": "Init.Data.Nat.Basic"
},
...
]
Search for relevant premises based on the current proof state using the Lean Hammer Premise Search.
Github Repository | Arxiv Paper
A self-hosted version is available and encouraged. You can set an environment variable LEAN_HAMMER_URL
(see Setup 3. for an example) to point to your self-hosted instance. It defaults to http://leanpremise.net
.
Uses the first goal at a given line and column. Returns a list of relevant premises (theorems) that can be used to prove the goal.
Note: We use a simplified version, LeanHammer might have better premise search results.
[
"MulOpposite.unop_injective",
"MulOpposite.op_injective",
"WellFoundedLT.induction",
...
]
Rebuild the Lean project and restart the Lean LSP server.
Many clients allow the user to disable specific tools manually (e.g. lean_build).
VSCode: Click on the Wrench/Screwdriver icon in the chat.
Cursor: In "Cursor Settings" > "MCP" click on the name of a tool to disable it (strikethrough).
Here are a few example prompts and interactions to try. All examples use VSCode (Agent Mode) and Gemini 2.5 Pro (Preview).
After installing the MCP, tools are automatically available to the agent.
E.g. Open a Lean file with a sorry and run the following prompt: "Solve this sorry"
The agent should use various tools such as lean_goal
to understand and create a proof.
You can also ask the agent to use tools explicitly, e.g. "Help me write this proof using tools." or "Use tools to analyze the goal and hover information, then write a proof."
Open Algebra/Lie/Abelian.lean
. Example prompt:
"Analyze commutative_ring_iff_abelian_lie_ring thoroughly using various tools such as goal, term goal, hover info. Explain the key proof steps in english.".
Open an incomplete proof such as putnam 1964 b2. Example prompt:
"First analyze the problem statement by checking the goal, hover info and looking up key declarations. Next use up to three queries to leansearch to design three different approaches to solve this problem. Very concisely present each approach and its key challenge."
There are many valid security concerns with the Model Context Protocol (MCP) in general!
This MCP server is meant as a research tool and is currently in beta. While it does not handle any sensitive data such as passwords or API keys, it still includes various security risks:
Please be aware of these risks. Feel free to audit the code and report security issues!
For more information, you can use Awesome MCP Security as a starting point.
npx @modelcontextprotocol/inspector uvx --with-editable path/to/lean-lsp-mcp python -m lean_lsp_mcp.server
MIT licensed. See LICENSE for more information.
Citing this repository is highly appreciated but not required by the license.
@software{lean-lsp-mcp,
author = {Oliver Dressler},
title = {{Lean LSP MCP: Tools for agentic interaction with the Lean theorem prover}},
url = {https://github.com/oOo0oOo/lean-lsp-mcp},
month = {3},
year = {2025}
}
Share code context with LLMs via Model Context Protocol or clipboard.
Up-to-date documentation for your coding agent. Covers 1000s of public repos and sites. Built by ref.tools
Tools for Xcode project management, building, testing, archiving, code signing, and iOS development utilities.
Set up MCP servers in Claude Desktop
Interacting with Phabricator API
Turns any Swagger/OpenAPI REST endpoint with a yaml/json definition into an MCP Server with Langchain/Langflow integration automatically.
Query information about dependencies in a Ruby project's Gemfile.
An example of a remote MCP server deployable on Cloudflare Workers without authentication.
MCP Server that exposes Creatify AI API capabilities for AI video generation, including avatar videos, URL-to-video conversion, text-to-speech, and AI-powered editing tools.
Analyze large codebases and document collections using high-context models via OpenRouter, OpenAI, or Google AI -- very useful, e.g., with Claude Code