continuum
This server provides read-only access to a local Continuum history index via four MCP stdio tools for inspecting sources, listing sessions, searching text, and reading full events.
history_sources: List imported sources with coverage, revision/snapshot digest, and index timestamps; it does not perform live discovery.
history_list: List sessions with exact optional filters for
source_idandproject, with pagination vialimitandcursor.history_search: Find literal Unicode text (including short Chinese queries) across the index, with optional project/source filters, pagination, and previews that may be truncated.
history_read: Read complete events in snapshot order for a given opaque
session_id, with pagination and source references.All tools are read-only: they cannot import files, delete source records, read arbitrary filesystem paths, or launch agents.
Connecting a client grants read access to the entire configured index; project filters are not access controls.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@continuumsearch my history for 'sqlite' and list matching sessions"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
CONTINUUM
Your tools change. Your context stays.
A local-first history layer for humans and coding agents.
中文 · Architecture · Contributing · Security
Coding conversations are scattered across tools. Continuum is being built to let you find them in one place, read their original context, and make selected history available to another agent through MCP—without rewriting a vendor's conversation database.
Where the project stands
This is a developer foundation, not a ready-to-use history browser.
Available in this repository | Not implemented yet |
Versioned normalized snapshot contract and synthetic example | Claude Code / Codex adapters; Cursor JSONL transcripts |
Atomic SQLite imports, literal Unicode search, source references | Automatic discovery and background incremental updates |
Version-bound pagination and explicit errors | Desktop installer / Tauri |
CLI-backed GUI session and Vite shell (pytest only) | Browser e2e, live GUI host |
CLI and four read-only stdio MCP tools sharing one core | Fine-grained client permissions and attachment reading |
Cursor IDE | Live Cursor host verification |
Unit, rollback, CLI and real stdio protocol tests; CI | Cross-agent execution, cloud sync, semantic search |
No private conversations are included. The example is hand-written synthetic data. The earlier single-user Cursor prototype is not bundled or claimed as native support.
Related MCP server: chist
Try the foundation
Requires uv and Python 3.12+. Run from a checkout; no package has been published to PyPI and no desktop release exists.
git clone https://github.com/bosprimigenious/continuum.git
cd continuum
uv sync --locked
uv run continuum --db .continuum/demo.sqlite3 import examples/synthetic.snapshot.json
uv run continuum --db .continuum/demo.sqlite3 sources
uv run continuum --db .continuum/demo.sqlite3 search "数据库锁"
uv run continuum --db .continuum/demo.sqlite3 listCopy a returned session_id from search (or id from list):
uv run continuum --db .continuum/demo.sqlite3 read SESSION_ID --limit 2Pass the returned next_cursor with --cursor to continue. null means the end.
Rerun the import: it reports "changed": false. The input file is never modified.
import accepts Continuum's normalized snapshot v1 by default. To import one explicitly
selected Cursor IDE state.vscdb (not auto-discovered, not a live-host verification):
uv run continuum --db .continuum/demo.sqlite3 import \
--adapter cursor-state-vscdb --source-id cursor-demo PATH/TO/state.vscdbDo not commit real Cursor databases. The reader copies the selected file plus WAL/SHM
sidecars and opens the copy with SQLite mode=ro; it does not write the source. A damaged
capture (incomplete_source) leaves any existing index unchanged and does not create a new
empty --db. Other Cursor stores (agent-transcripts JSONL, workspace DBs) are not this adapter.
Reusing a source_id replaces that source's entire derived snapshot atomically, including
removing previously indexed events absent from the new snapshot. It is not an archive merge.
Keep your source files; indexes are disposable derived data.
Connect an MCP client
Start the stdio server using the same index:
uv run continuum --db .continuum/demo.sqlite3 serveFor a host supporting the usual mcpServers JSON configuration, adapt this example.
Replace both paths with absolute paths on your machine; configuration location varies by host.
{
"mcpServers": {
"continuum": {
"command": "uv",
"args": [
"run", "--locked", "--directory", "/absolute/path/to/continuum",
"continuum", "--db", "/absolute/path/to/continuum/.continuum/demo.sqlite3", "serve"
]
}
}
}Tool | Purpose |
| Inspect imported sources, counts, snapshot digests and index timestamps |
| List sessions with exact source/project filters |
| Search literal text, including short Chinese queries |
| Read complete events in order, with pagination and references |
All four tools query the same local core. They cannot import files, delete source records, read arbitrary filesystem paths or launch another agent. SDK stdio interoperability is tested; real Codex / Claude Code / Cursor host integration is not yet verified.
Connecting a client gives it read access to this entire index. Project filters are not access controls. Use separate indexes for different trust boundaries. Text retrieved by an agent may be sent to that agent's model provider, even though Continuum has no upload service.
Architecture and stack
Source adapters → normalized snapshots → local history core → CLI
│ → MCP (stdio)
SQLite / FTS5 → GUI (CLI JSON; Vite shell)Core: Python 3.12+, Pydantic v2 contracts, SQLite + FTS5, official MCP Python SDK v2.
Tooling: uv and a committed lockfile; pytest, Ruff, mypy; GitHub Actions.
GUI: React + TypeScript + Vite talks to the index through the
continuumCLI JSON interface (continuum_history.gui). Runnpm install && npm run devingui/from a checkout. Browser end-to-end tests and Tauri are not implemented.Deployment: one local modular application. No account, cloud database, vector service, model download or LLM API is needed for the current demo.
The core must remain independent of MCP, the GUI and vendor formats. Packaging the Python core with a desktop shell requires a platform-specific spike before committing to a release. See architecture, trade-offs and migration boundaries.
Development
uv sync --locked
uv run python scripts/check.pyThe aggregate gate checks formatting, lint, strict source typing, tests with a coverage floor, basic publication hygiene, wheel/sdist builds, and a wheel installed in an isolated environment. It may download build/runtime dependencies. It does not read your native agent history.
CI runs the same gate on Linux, macOS and Windows. A green run validates the foundation, not native source coverage or real-host compatibility. Read the next bounded milestone before adding features. Adapter work starts with synthetic fixtures and failing behavior tests.
Scope
The first product milestone is reliable read-only history: discover supported local records, show coverage and errors, search and read through a GUI or MCP. Start with one Cursor path, prove it, then extend to Claude Code and Codex.
Execution orchestration, automatic migration/cleanup, shared cloud memory and model routing are out of scope for this milestone. Existing projects are welcome references; novelty is not the acceptance criterion. Correctness, understandable boundaries and a complete user path are.
Privacy and license
Local indexes contain plaintext. There is no automatic secret redaction or secure-erasure guarantee. Only import material you intend to expose to the connected client. See SECURITY.md.
MIT. Continuum is an independent project, not affiliated with any agent vendor. The working name does not imply exclusive naming or trademark rights.
Available Tools
4 toolshistory_listARead-onlyIdempotent
List sessions; filters are exact matches, not authorization boundaries.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| project | No | ||
| source_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds a non-obvious behavioral nuance: filters are exact matches, not authorization boundaries, which clarifies that results are not permission-scoped. This goes beyond the annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with two clauses, front-loading the action and adding a critical caveat. It contains no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return format is covered elsewhere. It has four optional parameters, and the description provides a key nuance about filters but does not explain limit/cursor pagination or the meaning of project/source_id beyond their names. Given the low complexity and the presence of an output schema, the description is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries full responsibility for explaining parameters. It only states that filters are exact matches, which applies to project and source_id but not to limit and cursor. The parameter names are somewhat self-explanatory, but pagination semantics and data types are not clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List sessions', a clear verb and resource, and adds a clarifying note about filter semantics. It doesn't explicitly differentiate from sibling tools like history_search or history_read, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use this to list sessions with exact-match filters. The warning that filters are not authorization boundaries hints at when not to rely on it for security scoping, but no alternatives are named and no explicit when-to-use/when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
history_readARead-onlyIdempotent
Read complete events by opaque session ID, in snapshot order, with pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint, so the safety profile is covered. The description adds meaningful behavior beyond annotations: events are returned complete, in snapshot order, and with pagination. It does not discuss errors or rate limits, but the added context is sufficient for this simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with no filler. It front-loads the verb and resource, then efficiently packs completeness, ordering, and pagination. Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only paginated fetch with an output schema and comprehensive annotations, nothing critical is missing: session ID, record completeness, ordering, and pagination are all explicitly present. The tool's complexity is low, and the definition covers the full call contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It covers session_id ('opaque session ID') and pagination (limit/cursor), giving high-level semantics for the parameters. However, it leaves details unstated, such as whether the cursor itself is opaque or how limit interacts with pagination. The schema's defaults and titles fill in some meaning, so the description is adequate but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read'), a clear resource ('complete events'), and the key differentiator ('by opaque session ID'), plus ordering and pagination. This distinguishes it from siblings like history_list and history_search, which imply broader listing or searching rather than a direct session-based read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when you have a session ID and need the full event sequence in snapshot order. It does not explicitly name alternatives or exclusions, but the intended use case is evident from the wording and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
history_searchBRead-onlyIdempotent
Find literal Unicode text. Previews may truncate; history_read returns full text.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| cursor | No | ||
| project | No | ||
| source_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which cover the safety profile. The description adds meaningful behavioral context beyond annotations: 'Previews may truncate' discloses output truncation, and 'history_read returns full text' points to a workaround. This is valuable non-obvious information that aids agent decision-making.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, with no fluff. The primary purpose is front-loaded in the first sentence, and the behavioral caveat and alternative are in the second. Every word serves a function, making it highly efficient and easily parseable by an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has 5 parameters with 0% schema coverage and no parameter descriptions from the tool definition, the description is severely incomplete for correct invocation. It does not explain how to structure a query, handle pagination via cursor, or use project/source_id filters. The output schema exists, so return format isn't a concern, but the input semantics are under-documented. An agent would likely need to guess or rely on external knowledge to use this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% – the input schema has no descriptions for any of the five parameters. The description fails to compensate: it does not explain the meaning or usage of query, limit, cursor, project, or source_id. While parameter names like 'query' and 'limit' are somewhat self-explanatory, the description adds zero value in clarifying parameter semantics, and the cursor/project/source_id fields remain ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Find') and a specific resource ('literal Unicode text'), which clearly indicates a text search operation. This distinguishes it from the sibling tools history_sources (list sources), history_list (list history), and history_read (read full content). However, it does not explicitly name the target as 'history entries', though the tool name and sibling context imply that.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an implicit usage context: use this tool to find literal text, and use history_read to get full text when previews truncate. It explicitly mentions a condition to switch to an alternative, but it does not contrast against history_sources or history_list, nor does it state when not to use this tool. The guidance is partially useful but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
history_sourcesARead-onlyIdempotent
List imported source coverage, revision and timestamps; not live discovery.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds that it lists coverage, revision, and timestamps, and clarifies it is not live discovery, which provides additional behavioral context beyond the annotations. This is useful and consistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that front-loads the core action and resource. Every word earns its place, and the clarifying 'not live discovery' adds meaningful distinction without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with a clear output schema (not shown but noted), the description is complete. It states what the tool does, what it covers, and explicitly rules out live discovery. The distinction from siblings is clear, and an agent can correctly invoke it without additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so schema description coverage is trivially 100%. With no parameters, the description carries no burden to explain them, and the baseline of 4 applies. No additional param info is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('imported source coverage, revision and timestamps'), and explicitly adds 'not live discovery' to distinguish it from live discovery tools. This differentiates it from siblings like history_list, history_search, and history_read, which are about different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'not live discovery' clarifies that this tool is for imported/historical data, not real-time discovery. While it doesn't explicitly name alternatives, the context of the siblings (list, search, read) implies when this tool is appropriate. It gives clear context but no explicit exclusions beyond the live discovery caveat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
history_list - First observed
history_read - First observed
history_search - First observed
history_sources
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: listing sources, listing sessions, searching text, and reading full events. The overlap between search and read is well-defined, with search for discovery and read for retrieval.
All tools follow a consistent history_ verb_noun pattern (sources, list, search, read). The naming is predictable and immediately conveys the action and resource.
With only 4 tools, the server is well-scoped for a read-only history/event domain. Each tool earns its place, covering the essential operations without unnecessary bloat.
The surface covers listing, searching, and reading, which are the core operations for a history server. Minor gaps exist, such as no rich filtering for sessions, but agents can work around these limitations.
Maintenance
Related MCP Connectors
Read-only MCP access to authorized Vocci sessions, notes, files, and memory search.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Read-only MCP tools for AI agent discovery, structured resources, and NIULAI information.
Read-only MCP for the Eco game wiki: search, Markdown pages, and wiki_* lookups. No keys, no writes.
Related MCP Servers
- AlicenseAqualityCmaintenanceLocal-first, read-only Codex session aggregator that indexes multiple CODEX_HOME directories into a SQLite database and provides MCP tools for cross-project, archival, and sub-agent history queries.53MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for unified full-text search across chat histories from Claude Code, Codex, Cursor CLI, and Antigravity CLI, using SQLite FTS5. Provides read-only tools to search sessions, list conversations, and retrieve session details.MIT
- AlicenseAqualityCmaintenanceRead-only MCP server for searching your local Retrace screen-history database, with tools for full-text search, segment listing, frame details, app usage, and tags.6MIT
- AlicenseAqualityAmaintenanceProvides MCP tools to search, browse, and retrieve unified read-only history from CLI agents like Codex, Claude Code, and OpenCode, with connector discovery and project-folder grouping.61MIT