uctx
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., "@uctxRemember I prefer Python and tabs over spaces."
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.
uctx — your context, not the vendor's
A local, user-owned memory that you fill once and every AI agent can read.
Today each assistant keeps its own siloed memory. Tell Claude you prefer Python;
ChatGPT still has no idea. uctx is a tiny MCP
server backed by a local SQLite file you own — so the same context is
readable and writable by any MCP-enabled agent (Claude Desktop, Cursor, …).
No cloud. No account. The data is a file on your machine (~/.uctx/context.db).
Claude Desktop ┐
├──► uctx (MCP server) ──► ~/.uctx/context.db ← you own this
Cursor ┘The 30-second demo
In Claude Desktop: "Remember that I prefer Python, tabs over spaces, and I'm learning agentic frameworks." → it calls
save_context.In Cursor (or a fresh Claude chat): "What do you know about my coding preferences?" → it calls
search_contextand answers correctly.
Two different agents, one shared memory you control. That's the whole idea.
Related MCP server: tartarus-mcp
Or run the demo right now (no agent setup)
uv sync
uv run python examples/two_agents_demo.pyAgent A = 'claude-desktop' — saves what the user tells it:
[claude-desktop] save_context('Prefers Python, tabs over spaces') -> Saved context #1
[claude-desktop] save_context('Based in Boston') -> Saved context #2
[claude-desktop] save_context('Learning agentic frameworks') -> Saved context #3
---- Switch apps. Brand-new agent, same local store, no shared chat. ----
Agent B = 'cursor' — recalls it without ever seeing the above:
[cursor] search_context('coding')
-> #1 [preference] Prefers Python, tabs over spaces ·tags: coding style ·from claude-desktop
=> Two different agents. One context you own.Two separate MCP clients, one local store — the cross-app share, proven in one command.
Install (two commands)
Requires uv (Python 3.10+).
uv tool install git+https://github.com/tmeng7777/uctx.git # installs the `uctx` command
uctx setup # auto-wire Claude Desktop + Cursoructx setup detects your MCP clients, backs up their configs, and adds the uctx
server — no hand-editing JSON. Then restart the app(s) to load the tools.
Just want to try it without installing? uvx --from git+https://github.com/tmeng7777/uctx.git uctx web.
The uctx command:
uctx run the MCP server (what your agents call)
uctx setup [claude|cursor] wire uctx into your AI clients
uctx web open the local dashboard
uctx sync [set|pull|push] sync your context across devicesManual config (fallback)
If you'd rather edit JSON, add this to Claude Desktop's claude_desktop_config.json
(Settings → Developer → Edit Config) or Cursor's ~/.cursor/mcp.json:
{ "mcpServers": { "uctx": { "command": "uctx", "args": [] } } }Web UI — see & manage your context
A local dashboard for the same store your agents use — view, search, add, edit, and delete anything, so you can see what's been remembered about you (and change what shouldn't be).
uv run uctx-web # then open http://127.0.0.1:8787Reads/writes the same ~/.uctx/context.db. Localhost-only, single-user.
Sync — your context on every device (you own the file)
Point uctx at a folder your own cloud already syncs (Dropbox, iCloud Drive, Google Drive) or a git repo. Your context travels with you — and you hold the file, not a uctx server.
uctx-sync set ~/Dropbox/uctx # once, per machine
uctx-sync # pull others' changes in, push yours outEach machine keeps its own fast local SQLite store and shares a portable
context.jsonl snapshot through the folder. (We sync JSONL, not the raw
.db, because cloud tools corrupt live SQLite files — this stays safe,
human-readable, and git-diffable.)
v0 limitation: sync is additive/union and dedupes by content — edits and deletes don't propagate yet. That needs stable per-item UUIDs + tombstones (roadmap). Encryption of the synced file (so the provider can't read it) is the planned next step.
Tools
Tool | What it does |
| Remember a preference / fact / note |
| Keyword-search saved context |
| List everything, most recent first |
| Delete one item |
The v0 schema (small on purpose)
{
"id": 1,
"type": "preference | fact | note",
"content": "Prefers Python, tabs over spaces",
"tags": "coding style",
"source_app": "claude-desktop",
"created_at": "2026-07-19T..."
}source_app + created_at are the seed of provenance — so trust and
versioning can be added later without a migration.
Deliberately NOT in v0 (the roadmap)
These are the genuinely hard parts, and they come only if people actually use v0:
Semantic search (embeddings) instead of keyword
LIKEProvenance / signing — verify who wrote a memory
Temporal validity — facts that expire or get superseded
Access control — per-app read/write scopes, revocation
Multi-user / identity
Why local-first
Portable, user-owned context is something the big labs are structurally
disinclined to build — your memory is their lock-in. uctx keeps the data in a
file you own, and moves it between vendors instead of trapping it inside one.
Status
Early prototype. Built to find out one thing: does anyone actually reach for this once the novelty wears off? If that's you — open an issue and tell me what you'd want next.
MIT licensed.
Available Tools
4 toolsforget_contextA
Delete one saved context item by its id (from list_context/search_context).
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It explicitly says 'Delete', indicating a destructive action, and specifies the scope ('one saved context item'). It also clarifies that the id is a context id, adding helpful context. It could mention irreversibility or permission requirements, but the core destructive behavior is clearly conveyed.
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, well-structured sentence. It front-loads the key action ('Delete') and is concise without any wasted words. Every phrase contributes 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?
Given the tool's simplicity (one parameter, output schema present), the description covers the essential aspects: what it does, what it operates on, and where the id comes from. It doesn't detail return values (covered by output schema) or error handling, but for a basic delete tool, it is sufficiently 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?
The schema only defines item_id as an integer with no description. The tool description adds meaning by explaining that the id is a saved context item id, and specifically from list_context/search_context. This gives the agent crucial semantic understanding of the parameter that the schema itself lacks.
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 clearly states the action: 'Delete one saved context item by its id', specifying both the verb (delete) and the resource (saved context item). It also distinguishes itself from siblings by indicating the id origin (from list_context/search_context), making it 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 provides clear context on how to obtain the id ('from list_context/search_context'), implying the workflow of first listing/searching then deleting. It doesn't explicitly state when not to use it or alternatives, but the sibling tool names make the delete-vs-create/retrieve distinction obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contextA
List the user's saved context items, most recent first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool lists items and the sort order ('most recent first'), but it omits the significant behavioral detail that the limit parameter defaults to 50 and may therefore return only a subset rather than all saved items.
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, front-loaded sentence with no unnecessary words. It efficiently conveys the action, scope, and ordering.
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 is simple and has an output schema, so return-value details are not needed. However, the description omits the default limit behavior and gives no guidance on when to use search_context instead, leaving some contextual gaps.
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, but it does not mention the limit parameter at all. The parameter name and default value in the schema give minimal clues, but the description adds no semantics about how limit interacts with the listing behavior.
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 'List' with a clear resource ('user's saved context items') and states ordering ('most recent first'), which unambiguously distinguishes it from the sibling tools save_context, forget_context, and search_context.
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 use when a user wants to view saved context items, but it does not explicitly state when to prefer this tool over search_context or mention exclusions. It provides clear context for the operation but no explicit alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_contextA
Save a durable fact, preference, or note about the user so any agent can recall it later.
Use this whenever the user states something worth remembering across sessions and tools (e.g. "I prefer Python", "I'm based in Boston", "my project is a job-hunting agent").
Args: content: The thing to remember, in a self-contained sentence. type: One of "preference", "fact", or "note". tags: Optional short keywords to aid later search (e.g. ["coding", "style"]). source_app: The app/agent saving this (e.g. "claude-desktop", "cursor").
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| type | No | note | |
| content | Yes | ||
| source_app | No | unknown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly indicates a write operation ('Save') and 'durable' suggests persistence, but it does not disclose whether saving the same content again duplicates, overwrites, or merges existing entries, nor any permission requirements.
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 well-structured: purpose first, then usage guidance, then parameter details with examples. Every sentence contributes useful information; no filler or redundancy.
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 save operation with an output schema, this is nearly complete. It covers purpose, usage, and all parameters. It lacks only minor behavioral details (e.g., duplicate handling), but those are not critical for basic invocation.
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 0%, so the description must fully explain each parameter. It does: 'content' is self-contained, 'type' is one of three values, 'tags' are optional keywords, and 'source_app' identifies the saving agent. This adds meaning well beyond the bare 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 clear purpose: 'Save a durable fact, preference, or note about the user so any agent can recall it later.' This distinguishes it from siblings (forget_context, search_context, list_context) by focusing on durable storage for later retrieval.
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 explicitly says 'Use this whenever the user states something worth remembering across sessions and tools' and provides concrete examples. It does not explicitly exclude alternatives, but the context is clear enough for an agent to choose this tool over search or list operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contextA
Search the user's saved context by keyword.
Call this BEFORE answering questions about the user's preferences, background, or history, so your answer reflects what they've told other agents — not just this conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds valuable context by explaining that the search retrieves information from other agents, not just the current conversation. It does not explicitly state read-only behavior, but 'search' implies a non-mutating 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?
The description is concise, front-loaded with the function, and the second sentence adds critical usage guidance. There is no redundancy or wasted words.
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 the tool's simplicity and the presence of an output schema, the description is largely complete. It covers purpose and usage, but the unexplained 'limit' parameter is a minor 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 schema has 0% description coverage, so the description must compensate. It hints that 'query' is a keyword, but it does not explain the 'limit' parameter or its default behavior. This is insufficient for full parameter understanding.
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 clearly states the tool searches the user's saved context by keyword, using a specific verb and resource. It is distinct from siblings like list_context, forget_context, and save_context.
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 instructs when to call it: before answering questions about preferences, background, or history, so the answer reflects other-agent context. It does not explicitly name alternatives or exclusions, but the guidance is clear.
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. Dates show when Glama detected each change.
4 tool updates
v0.1.0- First observed
forget_context - First observed
list_context - First observed
save_context - First observed
search_context
TDQS
Each tool performs a clearly distinct operation: save adds new context, search and list retrieve it (with different scopes), and forget deletes by id. There is no overlap that would confuse an agent.
All tool names follow the same verb_noun pattern (save_context, search_context, list_context, forget_context) using snake_case. The naming is completely predictable and consistent.
With only four tools, the server is well-scoped for its purpose of managing user context. Each tool is essential and there is no unnecessary bloat or missing core operation for the stated domain.
The server covers create, read (both search and list), and delete operations. The only minor gap is lack of an explicit update operation, but this can be worked around via delete+save, so it is not a significant dead end.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Cloud-hosted MCP server for durable AI memory
An MCP memory server. One memory your agents share — across models, devices and apps.
Persistent memory for AI agents — log and recall conversation context over MCP.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceSelf-hosted MCP server giving AI agents persistent memory for personalization and context across conversations.277Apache 2.0
- AlicenseNot gradedqualityCmaintenanceA local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.61Apache 2.0
- AlicenseNot gradedqualityBmaintenanceA local memory server for AI agents that stores and retrieves information via MCP, keeping all data in SQLite on your machine.1Apache 2.0
- AlicenseAqualityCmaintenancePersistent memory MCP server for AI agents, using SQLite with hybrid keyword and semantic search for long-term memory storage.5Do What The F*ck You Want To Public
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/tmeng7777/uctx'
If you have feedback or need assistance with the MCP directory API, please join our Discord server