ChatAtlas-local

You've had hundreds of conversations with AI assistants. The good answers, the decisions, the half-finished plans are scattered across ChatGPT and Claude, and their own search barely helps.
ChatAtlas Local takes the data exports both of them already give you and keeps every chat in one file on your computer. Then you can:
Search everything at once, from the terminal or in your browser.
Ask Claude about it: "what did ChatGPT tell me about my sourdough starter?" or "find the chat where I planned the garden beds." Claude Desktop, Claude Code, Cursor, VS Code and others can read your archive through MCP.
Keep it forever, as plain Markdown files or a backup, whatever happens to the apps.
No account, no server, no telemetry. It never connects to the internet.
Get started
You need Node.js 22.16 or newer (or 24). Then:
npm install -g chatatlas-localBefore the first npm release, install it straight from GitHub: npm install -g github:hnt504/chatatlas-local
1. Ask for your exports
ChatGPT: Settings → Data controls → Export data. You get an email with a link to a .zip.
Claude: Settings → Privacy → Export data. Same idea: an email, then a .zip.
2. Bring them in
chatatlas-local import ~/Downloads/<your ChatGPT export>.zip ~/Downloads/<your Claude export>.zip✓ 6720ab…-2026-10-21.zip: ChatGPT, 1,284 chats (1,284 new)
✓ data-2026-10-21.zip: Claude, 412 chats (412 new)Do it again whenever you like with a newer export: new chats come in, changed ones update, nothing doubles up. Or let it happen by itself (see Exports folder).
3. Look around
chatatlas-local search sourdough starter
chatatlas-local open # the browser view in the screenshot aboveRelated MCP server: chron
Connect Claude (and friends)
Claude Desktop
Either download chatatlas-local-<version>.mcpb from the
latest release and open it with
Claude Desktop (it asks where your exports go; no terminal needed), or, with the command
installed:
chatatlas-local setup claude-desktop --writeQuit Claude Desktop completely and open it again. Then ask it something like "Search my old chats for the kitchen remodel estimate."
About the red warning. When you open the extension, Claude Desktop says installing it "will grant this extension access to everything on your computer." It says that for every extension installed from a file rather than from Anthropic's directory, because an extension is a program that runs as you. Here's what this one actually does: it reads your exports and its own archive file, never connects to the internet, and gives Claude read-only tools. The code is all here to check.
Claude Code
Install it as a plugin (the MCP tools and a skill that teaches Claude when to look here):
/plugin install chatatlas-local --marketplace hnt504/chatatlas-localOr, with the command installed:
chatatlas-local setup claude-code --write # the MCP tools, for every project
chatatlas-local skill # teaches Claude Code when to look hereCursor, VS Code, Windsurf, Gemini CLI, Codex
chatatlas-local setup # shows each app's settings, and whether it's connected
chatatlas-local setup cursor --write # or vscode, windsurf, gemini-cli, codex--write keeps a copy of the app's old settings file next to it before changing anything.
What about ChatGPT?
ChatGPT can't reach a file on your computer, so it can't read your archive here. You can still import your ChatGPT exports and search them from Claude, the terminal or the browser view.
What the assistant can do
Everything is read-only. An assistant can find and read your chats; it can't change, tag or delete anything.
Tool | What it does |
| Chats holding every word you asked about, with the best-matching message quoted |
| Browse by platform, date, words in the title, or tag |
| Read a conversation message by message (long ones a page at a time) |
| What you talked about over a stretch of days, week by week |
| What the archive holds and how far back it goes |
An exports folder
Point ChatAtlas Local at a folder (your Downloads, say) and any ChatGPT or Claude export you save there comes in by itself. Other files are left alone, and each file is only read once.
chatatlas-local watch ~/Downloads # until you press Ctrl+C
chatatlas-local setup claude-desktop --inbox ~/Downloads --write # whenever Claude Desktop is openThe Claude Desktop extension asks for this folder when you install it.
Commands
Command | |
| A ChatGPT or Claude export (the .zip, its |
| Chats holding every word. Each word also finds longer words it starts ("plan" finds "planning"); accents don't matter |
| Newest first |
| Read one chat. |
| What you talked about lately ( |
| Chats per platform, chats per month, your tags |
| The browser view. |
| Tag a chat ( |
| Take chats out of the archive |
| Every chat as a Markdown file, or |
| Bring in exports saved there, and keep watching |
| Connect an assistant |
| Install the Claude Code skill |
| Check Node, the archive, the search index and every connected app |
| Where the archive file is |
Filters for search, list, export and topics: --platform chatgpt, --tag work,
--since 2025-03, --until 2026, --title garden, --limit 50, --offset 50, --json.
Privacy policy
ChatAtlas Local is a program that runs on your computer. It has no servers and no accounts.
What it collects: nothing. It has no analytics, telemetry or crash reporting, and never makes a network connection.
What it stores, and where: the chats from the exports you import, plus any tags you add, in one SQLite file on your computer:
~/.chatatlas-local/chatatlas.db(chatatlas-local wheresays exactly where). Use another with--db <file>or theCHATATLAS_LOCAL_DBsetting. It reads your export files and doesn't change or delete them.Sharing: ChatAtlas Local shares nothing with anyone, including its author. If you connect an AI assistant (Claude Desktop, Claude Code, Cursor and so on), that assistant can search and read your archive through read-only tools when you ask it to, and what it reads becomes part of your conversation with it, under that assistant's own privacy policy.
The browser view listens on
127.0.0.1only, answers only requests addressed to it, and every request needs a random key that only the tab it opened knows.How long it's kept: until you delete it.
chatatlas-local forget <id>removes a chat; removing the~/.chatatlas-localfolder removes everything. Your ChatGPT and Claude accounts are never touched.Installing: npm (or GitHub, for the Claude Desktop extension) serves the download under its own terms; after that, nothing goes over the network.
Contact: questions go to GitHub issues; anything that could expose someone's chats goes privately through security advisories.
ChatAtlas Local and ChatAtlas Pro
ChatAtlas Local is free and open source, and stays that way. ChatAtlas Pro is the hosted version, for people who want more:
Local | Pro | |
ChatGPT and Claude exports | ✓ | ✓ |
Search by words | ✓ | ✓ |
Claude Desktop, Claude Code, Cursor and more | ✓ | ✓ |
Your data stays on your computer | ✓ | Kept in your account |
Gemini, Grok, Perplexity, DeepSeek and more | Through a ChatAtlas backup | ✓ |
Search by meaning | ✓ | |
ChatGPT and claude.ai on the web | ✓ | |
Folders, projects, any device | ✓ |
They speak the same backup format: chatatlas-local export <folder> --format chatatlas makes a
file ChatAtlas Pro imports, and a ChatAtlas backup comes into ChatAtlas Local the same way.
Questions
Which Node do I need? 22.16 or newer, or 24 and up (23 won't do), because ChatAtlas Local uses the SQLite database built
into Node. chatatlas-local doctor checks.
A chat I had yesterday isn't there. The archive holds what was in the exports you imported. Ask for a fresh export and import it (or drop it in your exports folder).
Can it read exports from Gemini or other apps? Not directly yet. ChatAtlas backups can carry chats from any platform, and support for more exports is welcome as a pull request.
How big does it get? About the size of the exports' text. A 60 MB export of 3,000 chats imports in about two seconds and searches in well under a tenth of a second.
Contributing
Bug reports and pull requests are welcome. See CONTRIBUTING.md.
License
Available Tools
5 toolsarchive_overviewArchive overviewARead-onlyIdempotent
What the archive holds: how many chats from each platform, the dates they cover, the tags in use and when it was last imported.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds useful scope context (it reports counts, date coverage, tags, and import recency), but does not say whether these are cached snapshot values or freshly computed, or roughly how large the response is. That is reasonable but not rich added disclosure.
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?
A single compact sentence that front-loads the core answer ('what the archive holds') and then lists the specific fields. No filler, no repetition of the tool name or title; only minor gain from splitting the enumeration into a readable list.
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?
There is no output schema, so the description must carry the return-value burden, and it does by naming the four things returned. For a zero-parameter, read-only summary tool that is essentially complete; only the lack of guidance on when to call it leaves a small gap.
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?
The tool takes zero parameters, so the baseline is 4. The description correctly makes clear there is nothing to filter or configure - it is a whole-archive summary - which matches the empty schema.
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 gives a specific verb-plus-resource ('what the archive holds') and enumerates the exact contents: per-platform chat counts, covered date ranges, tags in use, and last import date. That enumeration separates it from chat-level siblings like list_chats and read_chat, though it never names them explicitly.
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?
Usage is only implied: the contents described suggest it is an orientation/first-call tool, but the description never says 'call this before searching' or when to prefer it over search_chats or list_chats. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chatsList chatsARead-onlyIdempotent
Browse the user's saved conversations, newest first, by platform, date, words in the title or tag. Each line has the chat's id for read_chat.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only chats with this tag | |
| limit | No | How many (default 25) | |
| since | No | Only chats from this date on: 2026-08-01, 2026-08 or 2026 | |
| title | No | Words the title holds | |
| until | No | Only chats up to and including this date: 2026-08-31, 2026-08 or 2026 | |
| offset | No | Skip this many (for the next page) | |
| platform | No | Only chats from this platform: chatgpt, claude, gemini, grok, perplexity, deepseek… |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description contributes the result ordering ('newest first') and the line-level shape with ids, but says nothing about pagination behavior beyond the schema, total counts, or result limits.
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?
Two tight sentences, zero filler, with scope and ordering front-loaded ahead of the read_chat pointer. Nothing is redundant or padded.
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?
With no output schema, the description's note that each line carries a chat id partially covers the return shape, and filters are fully covered by the schema. What remains thin is the distinction from search_chats and pagination expectations.
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 100%, with each filter (tag, title, since, until, platform, limit, offset) documented in-schema, so the baseline is 3. The description restates the filterable dimensions without adding syntax or defaults beyond the schema.
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 and resource ('Browse the user's saved conversations') plus ordering and filter dimensions, so the agent knows exactly what it returns. It does not differentiate itself from the sibling search_chats, leaving the list-vs-search boundary implicit.
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?
Usage is implied by 'newest first' and the closing hint that each line carries the id for read_chat, which sketches a browse-then-read workflow. However, there is no explicit when-to-use-this-instead-of-search_chats guidance or stated preconditions, so the agent must infer the choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_chatRead a chatARead-onlyIdempotent
Read one saved conversation, message by message, numbered from 1. Long chats come a page at a time: carry on with from_message. A very long single message comes in parts: carry on with part.
| Name | Required | Description | Default |
|---|---|---|---|
| chat | Yes | The chat's id from search_chats or list_chats (its start is enough) | |
| part | No | For a message too long for one page: which part of it (default 1) | |
| from_message | No | Start at this message (default 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe, read-only, idempotent profile. The description adds valuable behavior beyond annotations: messages are numbered from 1, long chats are paged via from_message, and oversized messages are split into parts via part.
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 three compact sentences, front-loaded with the main action and then the pagination behavior. Every sentence 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 tool with full schema coverage and annotations covering safety, the description is largely complete. It explains paging and message-part handling, though it leaves return-shape details implicit since there is no output schema.
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 coverage is 100%, so the baseline is 3, but the description adds conceptual meaning by explaining how from_message and part are used to continue reading across pages and message parts.
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 gives a specific verb and resource: reading one saved conversation message by message. The phrase 'one saved conversation' clearly distinguishes it from the sibling search/list tools that handle collections.
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?
It explains continuation behavior for long chats and long messages, which is useful usage guidance. However, it does not explicitly say when to choose this tool over search_chats, list_chats, or archive_overview.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recent_topicsRecent topicsBRead-onlyIdempotent
What the user talked about with their AIs over a stretch of days: how many chats on each platform, the tags that come up most, and the chats' titles week by week.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How far back (default 30) | |
| platform | No | Only chats from this platform: chatgpt, claude, gemini, grok, perplexity, deepseek… |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile needs no restatement. The description adds value by disclosing the shape of the returned data (counts, tags, titles per week), which matters because no output schema exists, but it says nothing about how aggregation is scoped or whether results are paginated.
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?
A single front-loaded sentence with a colon list of returned elements; no filler. The trailing clause 'the chats' titles week by week' is slightly awkward but still informative.
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?
With no output schema, the description carries the burden of describing returns and does so concretely for a two-optional-parameter read tool. Minor gaps remain around aggregation scope (all platforms combined vs. per-platform totals) and result size.
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 coverage is 100% – both 'days' (default 30, max 3650) and 'platform' (enumerated examples) are documented in the schema. The description only echoes them loosely ('over a stretch of days', 'each platform') without adding format or default details, so the baseline applies.
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 names the resource (topics the user discussed with their AIs over a date range) and enumerates the specific aggregates returned: per-platform chat counts, top tags, and titles by week. That is specific enough for an agent to tell it apart from list_chats or read_chat, though it never names a sibling or a verb.
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?
There is no guidance on when to choose this over search_chats or list_chats, no mention of prerequisites, and no exclusions. The agent must infer that this is a summarization/analytics view rather than a retrieval tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_chatsSearch chatsARead-onlyIdempotent
Find the user's saved conversations that mention something: chats holding every word of the query in the title or messages (each word also matches longer words it starts, accents ignored), title matches first, then newest, with the best-matching message quoted. Each result has the chat's id for read_chat.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only chats with this tag | |
| limit | No | How many chats (default 10) | |
| query | Yes | The words to look for | |
| since | No | Only chats from this date on: 2026-08-01, 2026-08 or 2026 | |
| until | No | Only chats up to and including this date: 2026-08-31, 2026-08 or 2026 | |
| platform | No | Only chats from this platform: chatgpt, claude, gemini, grok, perplexity, deepseek… |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds real behavioral detail beyond that: AND-semantics across query words, prefix and accent normalization, result ordering (title matches first, then newest), and that the best-matching message is quoted in results.
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?
Dense but front-loaded: the search action, then the matching rules, then ordering, then the result shape. Every clause carries information, though the single run-on sentence packs the ordering and return details together in a way that is slightly hard to parse.
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?
No output schema exists, and the description compensates by describing the return contents (chat id, quoted best-matching message) and ordering. For a 6-parameter search tool that is nearly complete; only ordering stability across large result sets and the effect of the filter parameters on ranking go unaddressed.
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 coverage is 100%, so the baseline is 3; the description earns above baseline by explaining the matching semantics of the required 'query' parameter (word-splitting, prefix expansion, accent handling) that the schema's one-line 'The words to look for' does not convey. The optional tag/since/until/platform/limit filters are left entirely to the schema.
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 and resource ('Find the user's saved conversations') and goes further to define what a match means: every query word present in title or messages, prefix matching, accent-insensitive. This clearly separates it from list_chats (enumeration) and read_chat (fetch by id).
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 trigger condition is clear — use this when looking for chats that 'mention something' by keyword — and the description routes the follow-up step to read_chat via the returned id. It never explicitly contrasts itself with list_chats (browse) or recent_topics, so the sibling differentiation is implied rather than stated.
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.
5 tool updates
v0.1.0- First observed
archive_overview - First observed
list_chats - First observed
read_chat - First observed
recent_topics - First observed
search_chats
TDQS
Scored across 5 tools
Each tool has a distinct primary purpose: aggregate overview, content search, filtered browsing, single-chat reading, and recent topic summarization. The main overlap is between search_chats and list_chats, since both can find chats by title words, but their descriptions clarify that search also scans message content while list is for browsing with metadata filters.
The names use consistent snake_case and readable vocabulary, but the convention is mixed: search_chats, list_chats, and read_chat are verb_noun, while archive_overview and recent_topics are noun phrases. This is still understandable but not a predictable single pattern.
Five tools is well-scoped for a local chat archive: overview, search, browse, read, and recent-topic summarization. Each tool covers a distinct workflow and none feels redundant or extraneous.
The surface covers the core read-only lifecycle for saved conversations: orienting with overview/topics, finding chats, browsing, and reading messages with pagination. Minor gaps exist around archive management, such as import, export, or tag editing, but these may be intentionally out of scope.
Maintenance
Related MCP Connectors
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Query 40 databases from Claude, ChatGPT, or Cursor — on any device. Read-only, encrypted, audited.
Swiss encrypted cloud drive for Claude, ChatGPT and AI agents: search, read and save files.
Build study flashcards and exam-prep decks from your AI chat, all stored locally.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides read-only access to local Beeper message history on macOS, enabling users to search conversations, read messages, and list recent chats through natural language queries. Supports both SQLite and IndexedDB storage formats with privacy-focused local-only operation.1-
- FlicenseNot gradedqualityCmaintenancePermanent, timestamped audit log for every AI conversation, stored locally in SQLite, owned by you.-
- FlicenseAqualityDmaintenanceEnables full-text search and browsing of Claude.ai conversation history by ingesting exported conversations into a local SQLite database with FTS5 indexes.51-
- FlicenseNot gradedqualityCmaintenanceEnables read-only access to Kilo Code and Opencode conversation history stored in a local SQLite database, allowing users to list projects and sessions, read messages, and perform full-text keyword searches across all messages.-