Development MCP server for LangGraph checkpoint and store inspection
Project description
LangMCP
Read-only MCP server for inspecting LangGraph checkpoints, thread state, and long-term memory.
LangMCP helps you answer the debugging question that traces do not always answer:
What is actually saved in my LangGraph persistence layer right now?
It is not a generic SQL MCP. It uses LangGraph-native checkpointer and store APIs, connects through named profiles, and keeps database credentials out of tool arguments.
Why LangMCP
When a stateful agent behaves strangely, the problem is often not only the prompt. It might be the checkpoint it resumed from, the user ID in configurable state, the store namespace used for memory, or an oversized message history.
LangMCP gives MCP clients such as Cursor and Claude Desktop a safe inspection surface for those questions.
| LangMCP | Not LangMCP |
|---|---|
| Read-only inspection of LangGraph persistence | Arbitrary SQL execution |
| Profile-based connections | Raw DSNs in model-facing arguments |
| Tools, resources, and prompts for debugging state | A replacement for LangSmith or LangGraph Studio |
| Local stdio MCP server for development | LangGraph Agent Server API |
Use LangSmith for traces, LangGraph Studio for visual graph workflows, and LangMCP when you want an assistant in your editor to inspect persisted state through a narrow read-only interface.
Features
- Profile-based config with environment variable expansion.
- Read-only enforcement in v0.1.
- Secret redaction in health checks and error output.
- PostgreSQL, SQLite, and Redis checkpointer inspection.
- PostgreSQL
PostgresStorelong-term memory inspection. - MCP tools for threads, checkpoints, store data, and analysis.
- MCP resources for stable readable state URIs.
- MCP prompts for repeatable debugging workflows.
- Pagination and truncation for large responses.
Installation
uv pip install "langmcp[all]"
Or run without installing:
uvx "langmcp[all]" --version
LangMCP supports Python 3.11 and 3.12. The repository includes a
.python-version file set to Python 3.12.
Configuration
Copy the example config and environment files:
cp examples/langmcp.example.toml langmcp.toml
cp .env.example .env
Set a read-only database URI in .env:
POSTGRES_URI=postgresql://READONLY_USER:READONLY_PASSWORD@HOST:5432/DB_NAME
LANGMCP_READ_ONLY=true
LangMCP loads .env automatically when present. Existing shell environment
variables take precedence.
Example langmcp.toml:
[defaults]
profile = "dev"
read_only = true
max_response_chars = 250000
[profiles.dev]
checkpointer = "${POSTGRES_URI}"
store = "${POSTGRES_URI}"
[profiles.local_sqlite]
checkpointer = "sqlite:///./.langgraph/checkpoints.db"
[profiles.local_redis]
checkpointer = "redis://localhost:6379/0"
Environment overrides:
LANGMCP_CONFIGLANGMCP_PROFILELANGMCP_READ_ONLYPOSTGRES_URILANGMCP_CHECKPOINTER_URILANGMCP_STORE_URI
Verify Setup
Run:
langmcp doctor --config ./langmcp.toml
The doctor command checks connectivity, backend types, setup status, package versions, and redacts sensitive URI fields.
Cursor Setup
Minimal shape:
{
"mcpServers": {
"langmcp": {
"command": "uvx",
"args": ["langmcp[all]", "serve", "--config", "<ABSOLUTE_PATH_TO_LANGMCP_TOML>"],
"env": {
"LANGMCP_READ_ONLY": "true",
"POSTGRES_URI": "postgresql://READONLY_USER:READONLY_PASSWORD@HOST:5432/DB_NAME"
}
}
}
}
Start the server directly:
langmcp serve --config ./langmcp.toml
Example Assistant Prompts
Once connected through MCP, ask your assistant:
Use LangMCP to summarize thread THREAD_ID and check whether user memory exists for USER_ID.
Compare checkpoint CHECKPOINT_A and CHECKPOINT_B for thread THREAD_ID. Tell me what changed.
Analyze whether thread THREAD_ID is carrying too much context.
Investigate a possible memory gap for thread THREAD_ID and user USER_ID.
MCP Tools
All tools accept optional profile unless noted. Responses include profile,
truncated, and pagination fields where applicable.
| Tool | Description |
|---|---|
health_check |
Connectivity, backend types, redacted URIs |
list_profiles |
Profile names and backend types |
list_threads |
Discover thread IDs |
get_thread_state |
Latest or specific checkpoint state |
list_checkpoint_history |
Paginated checkpoint list |
get_checkpoint |
Full snapshot for one checkpoint |
compare_checkpoints |
Diff values and message count delta |
summarize_thread |
Transcript-style summary |
analyze_context_window |
Token estimate and size warnings |
analyze_memory_gaps |
Store versus thread user ID hints |
list_namespaces |
Store namespace tuples |
search_store |
Search under namespace prefix |
get_store_item |
Full store value by key |
summarize_user_memory |
Grouped keys under user prefix |
MCP Resources
Resources expose readable state through stable MCP URIs.
| Resource URI | Description |
|---|---|
langmcp://profiles |
Configured profiles and active profile |
langmcp://profiles/{profile}/health |
Connectivity and setup status |
langmcp://profiles/{profile}/threads |
Discovered thread IDs |
langmcp://profiles/{profile}/threads/{thread_id}/state |
Latest thread state |
langmcp://profiles/{profile}/threads/{thread_id}/summary |
Transcript-style thread summary |
langmcp://profiles/{profile}/threads/{thread_id}/checkpoints |
Recent checkpoint history |
langmcp://profiles/{profile}/threads/{thread_id}/checkpoints/{checkpoint_id} |
Full checkpoint snapshot |
langmcp://profiles/{profile}/threads/{thread_id}/context-analysis |
Context-window analysis |
langmcp://profiles/{profile}/store/namespaces |
Long-term memory namespaces |
langmcp://profiles/{profile}/store/items/{namespace}/{key} |
One store item |
langmcp://profiles/{profile}/users/{user_id}/memory-summary |
User memory summary |
For multi-part namespaces, prefer the get_store_item tool if your MCP client
treats / as a path separator inside resource parameters.
MCP Prompts
Prompts package repeatable investigations.
| Prompt | Description |
|---|---|
debug_thread |
Diagnose one thread from summary, checkpoints, context analysis, and memory hints |
investigate_memory_gap |
Check whether thread state and long-term memory are aligned |
compare_thread_checkpoints |
Explain behavioral differences between two checkpoints |
inspect_user_memory |
Summarize and sanity-check long-term memory for one user |
Backend Matrix
| Backend | Checkpointer | Store in v0.1 |
|---|---|---|
| PostgreSQL | Full | Full through PostgresStore |
| SQLite | Full | Not supported |
| Redis | Full | Not supported |
Security
- Tools accept profile names, not raw DSNs.
read_only=trueis enforced in v0.1.- Use a read-only PostgreSQL user for shared environments.
- Passwords are redacted in
health_checkand CLI output. - Redis thread discovery uses
SCANwith limits. Avoid broad scans on very large instances. - Commit
examples/langmcp.example.tomland.env.example, not reallangmcp.tomlor.envfiles.
Development
uv pip install -e ".[all,dev]"
ruff check .
pytest tests/unit -v
Integration tests use local Docker services:
docker compose -f docker-compose.test.yml up -d
POSTGRES_URI=postgresql://langgraph:langgraph@localhost:5442/langgraph \
REDIS_URI=redis://localhost:6379/0 \
pytest tests/integration -v -m integration
Use the local test values from docker-compose.test.yml. They are for Docker
integration tests only.
Roadmap
- LangGraph Agent Server adapter.
- HTTP transport with team auth.
- Vector store inspection tools.
- Carefully scoped write workflows such as
update_thread_stateandresume_thread.
Contributing
Issues and pull requests are welcome. See CONTRIBUTING.md.
Good first issue ideas:
- Add examples for a specific LangGraph persistence backend.
- Improve error messages for unsupported store backends.
- Add a resource or prompt test for an edge case.
License
MIT. 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 langmcp-0.1.0.tar.gz.
File metadata
- Download URL: langmcp-0.1.0.tar.gz
- Upload date:
- Size: 30.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7caf6b40b6f4cc1d4b85d22949c214150e846e2da1ff1cc41a5b2d21c20dbb35
|
|
| MD5 |
b8eec024ea2afc0831bb474c63fbebc2
|
|
| BLAKE2b-256 |
078879f13ed1da46b08c9caf9bce50f7d15957c1559d5311fc7a2fe768eec911
|
Provenance
The following attestation bundles were made for langmcp-0.1.0.tar.gz:
Publisher:
publish.yml on xmassmx/langmcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
langmcp-0.1.0.tar.gz -
Subject digest:
7caf6b40b6f4cc1d4b85d22949c214150e846e2da1ff1cc41a5b2d21c20dbb35 - Sigstore transparency entry: 1646437976
- Sigstore integration time:
-
Permalink:
xmassmx/langmcp@883602dc8c06b6e9fc1a41be5d239ed1bc2eec44 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/xmassmx
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@883602dc8c06b6e9fc1a41be5d239ed1bc2eec44 -
Trigger Event:
push
-
Statement type:
File details
Details for the file langmcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: langmcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 32.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c788b9f10f8664186c22a7e4b071f2928ce48327576a5e719e3452130509ca41
|
|
| MD5 |
7c64b102c7515e3a59cf448cd388de48
|
|
| BLAKE2b-256 |
a6f85ab07e978c1535198e684242706888da3d732838c12694867dcf019ac20a
|
Provenance
The following attestation bundles were made for langmcp-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on xmassmx/langmcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
langmcp-0.1.0-py3-none-any.whl -
Subject digest:
c788b9f10f8664186c22a7e4b071f2928ce48327576a5e719e3452130509ca41 - Sigstore transparency entry: 1646438122
- Sigstore integration time:
-
Permalink:
xmassmx/langmcp@883602dc8c06b6e9fc1a41be5d239ed1bc2eec44 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/xmassmx
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@883602dc8c06b6e9fc1a41be5d239ed1bc2eec44 -
Trigger Event:
push
-
Statement type: