LocalKeep MCP Server
Click on "Install 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., "@LocalKeep MCP ServerWhat memories do I have from May 2024?"
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.
LocalKeep
LocalKeep is for anyone who wants a chronological memory layer for chatbots where they directly control what the model remembers about them. Instead of forcing you to rely on a black-box cloud memory that the model invents around you that you can't even edit, LocalKeep lets you curate titled, dated, editable memory banks directly on your own machine where you write the entries and manage them locally via a localhost Hub UI. When a conversation requires your prior context, Claude queries your local data through a secure, native Model Context Protocol (MCP) connector.
Why use LocalKeep
AI Chat apps are great at sounding like they remember you, but struggle at recalling the exact thing you care about — what happened, on which date, about whom? Consumer memory features tend to lack the capacity for true temporal reasoning, flattening your history into a soft, generic vibe summary instead of understanding that Event A triggered Event B three months ago, causing its reasoning to fail when you need something specific: a life event, a research arc, a decision you logged months ago. Worse yet, consumer AI memory is a black box: you don't get to decide what the model chooses to remember about you, how it interprets your life, or when it invents context around you.
LocalKeep fixes both structural flaws at once by replacing fragile, model-invented timelines with a rigid, chronological source of your truth, all while giving you absolute editorial control. You decide exactly what the AI is allowed to know about you. You write the entries, you anchor the dates, and you keep them local on your own machine. Claude simply acts as the lookup engine via MCP when a conversation requires your prior context. LocalKeep bridges the gap between structured personal logging and intelligent AI retrieval, ensuring your context is curated by you—not hallucinated by an LLM.
Who it’s for
Anyone frustrated that chat memory can’t reliably fetch dated facts or understand timelines
People who already maintain meticulous personal diaries, work logs, or research archives. Instead of settling for a generic chat-app paraphrase, you get to inject your exact words and historical data into the prompt as an unyielding source of truth.
Users who trust Claude for its reasoning capability, but demand that their foundational context database remains stored locally under their own roof. (Note: Querying memories via MCP still sends the retrieved text fragments to Anthropic during the session).
What it is (and isn’t)
Is: A lightweight customizable local Hub UI to manage your dated memory banks, paired with an MCP server that Claude Desktop can call.
Isn’t: A standalone chat application, a cloud-hosted memory API, or a background utility that silently scrapes your personal conversations.
Related MCP server: Nowledge Mem
The Aesthetic Philosophy
The Hub UI intentionally adopts a retro, Windows 95/MS Paint-inspired homage with customizable features to ensure LocalKeep feels like a deeply personal tool rather than an impersonal, rigid dashboard. By putting adjustable interface elements right at your fingertips, the UI signals that you are entering an intimate, offline workshop for your mind—a space you can shape and reconfigure to feel entirely like your own.
Install
pip install localkeep
# or: uv tool install localkeepThen:
localkeep-hub # http://127.0.0.1:8000In Claude Desktop, register the MCP server (claude_desktop_config.json):
{
"mcpServers": {
"localkeep": {
"command": "localkeep-mcp",
"args": []
}
}
}If the GUI can’t find localkeep-mcp on your PATH, use the absolute path from which localkeep-mcp (the Hub’s Connect panel copies this for you).
Memories default to ~/.localkeep/localkeep.db when installed via pip. Override with LOCALKEEP_DATA_DIR or LOCALKEEP_DB_PATH.
Auto-use LocalKeep (important)
Claude will not reliably call MCP tools unless you also set Personal preferences:
Claude Desktop → Settings → Profile → Personal preferences
Paste the LocalKeep instructions (Hub → Connect → Copy instructions, or see
src/localkeep/assets/claude-personal-preferences.txt)Quit Claude completely and reopen
When LocalKeep asks to run a tool, click Always approve
Develop from source
git clone https://github.com/zuneracodes/localkeep
cd localkeep
uv sync --group dev
uv run localkeep-hub # http://127.0.0.1:8000
# optional live reload:
LOCALKEEP_HUB_RELOAD=1 uv run localkeep-hubFrom a source checkout, the DB lives in data/localkeep.db (gitignored).
Tests
These smoke-check the Hub, retrieval, and MCP tools so a fresh install still stores and recalls dated memories the way a real user would.
uv sync --group dev
uv run pytestTests start from an empty DB and create memories through Hub form POSTs (same path as a new user).
Privacy
Storage is local. Banks and memories live in your chosen DB path (~/.localkeep/ for pip installs, or data/localkeep.db in a checkout). There is no LocalKeep cloud and nothing is auto-scraped from chat. Theme colors stay in browser localStorage. Refreshing the Hub page or restarting localkeep-hub does not delete your banks — only removing the database file does.
Recall goes through Claude. The Hub and database stay on your machine, but when Claude calls a LocalKeep MCP tool, the matching memories are returned into that chat and Anthropic processes them like any other tool result. LocalKeep isn’t shipping your whole DB upstream — only what that lookup returns for the question at hand.
Contributing
Bug reports and pull requests are welcome via GitHub Issues. Please run uv run pytest before opening a PR.
License
MIT — see LICENSE.
Available Tools
4 toolsget_bankGet memory bankARead-only
Load all memories from one bank by title (exact or partial match).
USE when a bank title matches the topic or person the user is asking about.
| Name | Required | Description | Default |
|---|---|---|---|
| bank_title | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint and openWorldHint annotations already establish the read-only, closed-world nature. The description adds useful behavioral detail beyond that: it loads ALL memories and supports exact or partial title matching, which affects how the agent should interpret 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?
The description is two short sentences with no filler. The core operation is stated first, followed by a focused usage condition, making it easy for an agent to parse quickly.
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 tool with one parameter, read-only annotations, and an output schema, the description covers the main operational details: what to load and when to use it. The only notable gap is the ambiguity around partial matches resolving to multiple banks, given the claim that it loads from 'one bank.'
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?
With 0% schema description coverage, the description must compensate for bank_title. It states that the parameter is a title match with exact or partial matching, but it does not clarify behavior when a partial match returns multiple banks, case sensitivity, or formatting expectations.
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 uses a specific verb and resource: 'Load all memories from one bank by title'. It clearly distinguishes itself from list_banks and get_memories_by_date_range through the title-based, bank-scoped behavior, though it does not explicitly contrast with search_memories.
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 gives an explicit trigger condition: 'USE when a bank title matches the topic or person the user is asking about.' This clarifies when to call the tool, but it does not state when not to use it or suggest alternatives such as search_memories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_memories_by_date_rangeMemories by date rangeARead-only
Fetch memories whose event_date falls in a date range.
USE when the user mentions a month, year, or period, or asks what they were working on during a timeframe. Combine with query/entity for topic or person.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| entity | No | ||
| date_to | Yes | ||
| date_from | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the event_date filtering behavior and optional entity refinement, but does not disclose pagination, ordering, or missing-date behavior; the openWorldHint is not explained.
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 short sentences, with the core operation front-loaded and the use case in the second sentence. The only blemish is the ambiguous 'query/entity' phrase, which could mislead.
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 four-parameter tool with an output schema, the description gives the main invocation context but omits date format, inclusive/exclusive semantics, and when to prefer search_memories instead. The 'query' mention adds a small inconsistency. Overall adequate but not fully 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 the burden. It clarifies date_from/date_to as the date-range bound and entity as a topic/person filter, but does not specify date format or limit behavior, and the phrase 'query/entity' references a 'query' that is not present in 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?
The description states a specific action and resource: 'Fetch memories whose event_date falls in a date range.' This clearly distinguishes the tool from the bank-related siblings and suggests a different mode from search_memories by anchoring on date rather than free-text search.
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 gives explicit trigger conditions: 'USE when the user mentions a month, year, or period, or asks what they were working on during a timeframe.' It lacks explicit when-not-to-use guidance or named alternatives, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_banksList memory banksARead-only
List memory bank titles so you can pick the right timeline.
USE to discover which banks exist before get_bank or a targeted search.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description is consistent with that. It adds that the tool returns only memory bank titles, not full bank content, but it does not disclose other behavioral details such as ordering, limits, or output shape; the output schema handles the return structure.
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 short, purposeful sentences with no filler. The action and purpose are front-loaded, and the usage guidance is direct.
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, read-only listing tool with an output schema, the description is complete. It states what is listed, why, and when in the workflow to call it relative to get_bank and targeted search.
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 there is no parameter burden for the description to carry. The baseline for zero-parameter tools applies, and the schema coverage is trivially complete.
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 and resource: 'List memory bank titles' and explains the purpose, 'so you can pick the right timeline.' It clearly distinguishes this discovery tool from get_bank and targeted search by framing it as the precursor action.
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 explicitly says to use it 'before get_bank or a targeted search,' which gives clear workflow context. It does not name all sibling alternatives or provide when-not-to-use guidance, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_memoriesSearch personal memoriesARead-only
Search the user's curated memory banks (local Hub).
USE FIRST when context about the user's own past — personal OR work/research — would help answer the question.
Examples of triggers: a person from their past, picking up a research topic, continuing a report or project, any dated "what did I do then" question.
Pass query (keywords), entity (person or topic tag from memories), and/or date range. Returns titled, dated facts the user wrote — authoritative for their timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| entity | No | ||
| date_to | No | ||
| date_from | No | ||
| bank_title | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and openWorldHint=false, so the tool's safety profile is known. The description adds meaningful context by stating that results are 'titled, dated facts the user wrote' and 'authoritative for their timeline,' which tells the agent about the nature and trustworthiness of the returned data.
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 core purpose is front-loaded in a single sentence, and the rest of the description is easily scannable. The trigger examples are useful and not redundant, though the middle section could be slightly more condensed without losing value.
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?
An output schema exists, so return values are presumably covered. The description offers clear usage triggers and partial parameter guidance. The main gap is the lack of any mention of bank_title and limit, which are relevant for filtering and result control, but overall the description is adequate for a read-only search tool.
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 does explain query ('keywords'), entity ('person or topic tag from memories'), and date range (date_from/date_to). However, it omits any explanation of bank_title and limit, leaving two of six parameters undocumented in both schema and description.
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 first sentence states a specific verb ('Search') and a specific resource ('the user's curated memory banks (local Hub)'). This clearly distinguishes it from sibling tools like list_banks and get_memories_by_date_range, which focus on listing banks or date-specific retrieval. The trigger examples further reinforce the tool's intended scope.
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 explicitly says 'USE FIRST when context about the user's own past — personal OR work/research — would help answer the question,' and gives concrete trigger examples. This is strong when-to-use guidance, but it does not explicitly mention when not to use it or directly contrast with the sibling tools, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
search_memories and get_memories_by_date_range overlap significantly because search_memories already accepts a date range, making the dedicated date-range tool largely redundant. list_banks and get_bank are clearly distinct, but the two retrieval tools create ambiguity in tool selection.
All tools use clear lowercase snake_case verb_noun names. The pattern is consistent across search_memories, get_memories_by_date_range, list_banks, and get_bank, each following an imperative verb + object structure.
With only 4 tools, the server is tightly scoped for its purpose of querying memory banks. Each tool has a distinct role in discovery and retrieval, and there is no bloat.
The server covers the main retrieval needs: searching across banks, filtering by date, listing banks, and loading a full bank. However, there is no way to search within a specific bank without loading all its memories, and no single-memory fetch by ID, so some workflows require client-side filtering.
Related MCP Connectors
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Persistent memory for AI agents — verbatim conversations, searchable by meaning.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides long-term memory capabilities for Claude through persistent storage and full-text search of context across conversations. Enables storing, searching, and managing memories organized by categories like facts, preferences, projects, and goals.181MIT

Nowledge Memofficial
AlicenseNot gradedqualityCmaintenanceEnables Claude to add and search personal memories through the Nowledge Mem service. Allows users to store and retrieve contextual information across conversations.4MIT- FlicenseAqualityDmaintenanceEnables Claude to maintain persistent memory across conversations using a local knowledge graph with fuzzy search capabilities, allowing it to remember and recall information about users, relationships, and context.9
- AlicenseAqualityDmaintenanceEnables Claude to remember conversations and learn over time by storing and recalling messages, memory abstracts, and recent history using a local SQLite database.42172MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/zuneracodes/localkeep'
If you have feedback or need assistance with the MCP directory API, please join our Discord server