Local working notes, decisions, evidence and resumable sessions with SQLite persistence.
Runs on your machine from its package; the steps are below.
At most: moves money, runs code or commands, deletes data, or sends messages for you.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx mcp-sequential-thinking
MCP client config
{
"mcpServers": {
"sequential-thinking-working-notes": {
"command": "uvx",
"args": [
"mcp-sequential-thinking"
]
}
}
}A local MCP server for working notes you can resume: evidence, decisions, risks and next actions for a difficult task, stored durably in SQLite and readable after any restart. It records what the caller writes; it does not generate, judge or improve reasoning, and it never asks for hidden chain-of-thought.
python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\Activate.ps1
python -m pip install -e .
python scripts/stdio_smoke.py # restart demo: write, restart, read back
Client configuration (Claude Desktop, Cursor, …):
{"mcpServers":{"working-notes":{
"command":"/absolute/path/to/.venv/bin/mcp-sequential-thinking",
"env":{"MCP_STORAGE_DIR":"/absolute/path/to/notes"}}}}
On Windows use .venv\Scripts\mcp-sequential-thinking.exe.
A typical session:
{"tool":"create_session","arguments":{"title":"Choose a local store","request_id":"create-1"}}
{"tool":"add_step","arguments":{"session_id":"<id>","content":"Two writers need unique positions.","kind":"evidence","request_id":"step-1"}}
{"tool":"add_step","arguments":{"session_id":"<id>","content":"Use SQLite.","kind":"decision","request_id":"step-2"}}
{"tool":"read_session","arguments":{"session_id":"<id>"}}
Lost the ID after a restart? list_sessions finds the session by title.
| Tool | Purpose |
|---|---|
create_session | Start a session from a title. |
add_step | Add a note; kind is note (default), observation, evidence, assumption, option, risk, decision or next_action. |
list_sessions | Find sessions by title or status. |
read_session | view="resume" (default): active notes, decisions first. view="steps": full history with filters. |
finalize_session | Store the caller's outcome and evidence IDs; no further steps afterwards. |
delete_session | Delete a session's database records (exports and backups remain). |
export_session / import_session | JSON archive of one session, confined to MCP_STORAGE_DIR/exports. |
Links between notes. parent_step_id records provenance, supersedes_step_id
replaces an earlier note (resume hides it, full history keeps it), and
branch_from_step_id starts a named branch. All references stay inside one session.
Retries. Every write takes a request_id. Repeating a call with the same ID and
input returns the original result; the same ID with different input returns
IDEMPOTENCY_CONFLICT. finalize_session and delete_session also need
expected_version.
Pagination and limits. Reads default to 20 entries and 12,000 characters
(limit ≤ 100, max_chars 1,000–50,000). Follow cursor until it is null, and
keep the same view while paging. truncated reports shortened content. A note
too large for one response comes back as its first chunk; continue with step_id
and content_offset until next_content_offset is null.
Errors set isError=true with a stable code and a short hint, e.g.
INVALID_INPUT (with Fields: …), UNKNOWN_SESSION, INVALID_REFERENCE,
CONFLICT (with current_version), SESSION_FINALIZED, IDEMPOTENCY_CONFLICT,
STORAGE_BUSY (retry with the same request_id), PATH_OUTSIDE_EXPORTS,
RESPONSE_LIMIT.
Sources attached to notes are caller-supplied and never fetched or verified.
process_thought, generate_summary and clear_history, plus export_session /
import_session without a session_id, work on a single shared legacy session.
They remain for existing clients; every result carries a deprecation_notice.
Use the session API for new work.
--strict-stages is set.main_line_progress counts mainline notes only, against your total_thoughts;
it is not task completion.read_session(session_id="legacy") reads it; a legacy branch X appears as
legacy-X there.mcp-sequential-thinking # stdio server
mcp-sequential-thinking --health # diagnostic check
mcp-sequential-thinking --ephemeral # in memory only, lost on exit
~/.mcp_sequential_thinking (or MCP_STORAGE_DIR) as plaintext
SQLite (WAL, synchronous FULL, 5 s busy timeout). Use a local disk; NFS/SMB and
multiple hosts are not supported.Backup and restore (all sessions, including retry keys):
python -m mcp_sequential_thinking.backup create /path/to/storage /path/to/snapshot.sqlite3
python -m mcp_sequential_thinking.backup restore /path/to/NEW-storage /path/to/snapshot.sqlite3
Restore requires a new directory. Never copy a live database file without its WAL.
| Client | OS | Date |
|---|---|---|
| Python MCP SDK 2.0.0 and latest, Python 3.10–3.14 | Linux, Windows | every CI run |
| Claude Desktop | Linux | 2026-10-21 |
uv run --extra dev ruff check .
uv run --extra dev ruff format --check .
uv run --extra dev mypy --strict mcp_sequential_thinking
uv run --extra dev pytest --cov=mcp_sequential_thinking --cov-fail-under=85
rm -rf dist && uv run --extra dev --with build --with twine --with jsonschema python scripts/check_artifacts.py
The artifact check builds and installs the wheel in isolation and runs a real
restart round trip. Releases publish that tested artifact via Trusted Publishing
once a GitHub release is created; the version lives in
mcp_sequential_thinking/_version.py. See CHANGELOG.md for details.