Skip to main content
Glama
adamkwhite

Claude Conversation Memory System

by adamkwhite

Quality Gate Status Bugs Vulnerabilities Code Smells Coverage Duplicated Lines (%)

Universal Memory MCP — AI Conversation Memory

A Model Context Protocol (MCP) server that provides persistent, searchable conversation memory across multiple AI platforms. Store, search, and retrieve conversation history with fast full-text search powered by SQLite FTS5.

Features

  • šŸ” Fast full-text search via SQLite FTS5 with relevance ranking — ~10x faster than a linear scan (measured)

  • šŸ·ļø Automatic topic extraction — 574+ unique topics across 2,000+ associations

  • šŸ“Š Weekly summaries with insights and patterns

  • šŸ—ƒļø Organized file storage by date and topic

  • šŸ¤– Multi-platform support — Claude, ChatGPT, Cursor AI, and custom formats

  • šŸ”Œ MCP integration for Claude Desktop and Claude Code

Related MCP server: Claude Memory MCP

Quick Start

Prerequisites

  • Python 3.10+ (CI runs 3.14)

  • An MCP client — Claude Code, Claude Desktop, Codex, or anything else speaking MCP over stdio

Installation

uv tool install universal-memory-mcp   # or: pipx install universal-memory-mcp

Not pip install: this is an application, and on Debian/Ubuntu and other PEP 668 systems installing one into the system interpreter fails with error: externally-managed-environment. Inside a virtualenv you have already activated, pip install universal-memory-mcp is fine.

Then point your client at the universal-memory-mcp console script:

claude mcp add --transport stdio universal-memory-mcp -- universal-memory-mcp

Or write it into the config yourself — Claude Code and Claude Desktop:

{ "mcpServers": { "universal-memory-mcp": { "command": "universal-memory-mcp" } } }

Codex (~/.codex/config.toml):

[mcp_servers.universal-memory-mcp]
command = "universal-memory-mcp"

The server name is yours to choose, but it sets the tool namespace your client exposes (mcp__<name>__*). Conversations live in ~/claude-memory/ regardless, so renaming is safe.

Upgrading an install that points at a checkout? scripts/switch_mcp_config.py rewrites both config formats in place — dry run by default, --apply to write.

From source

git clone https://github.com/adamkwhite/universal-memory-mcp.git
cd universal-memory-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
python3 tests/validate_system.py     # optional: verify the install

Point your client at <checkout>/.venv/bin/python3 -m universal_memory_mcp.server_fastmcp. The package uses relative imports, so running the file directly cannot work — python3 src/universal_memory_mcp/server_fastmcp.py fails with attempted relative import with no known parent package.

Basic Usage

MCP Server Mode

Your client starts the server for you; run it by hand only to debug.

universal-memory-mcp                          # installed from PyPI
python3 -m universal_memory_mcp.server_fastmcp  # from source

Bulk Import

# Import conversations from JSON export
python3 scripts/bulk_import_enhanced.py your_conversations.json

MCP Tools

search_conversations(query, limit=5)

Full-text search across all stored conversations with relevance ranking. Query text is treated as literal Unicode terms, so punctuation and FTS5 operators do not change the query semantics. Results include conversation IDs for exact retrieval.

get_conversation(conversation_id, max_chars=12000)

Retrieve a stored conversation by an ID returned from a search tool. Content is read from the authoritative JSON store and truncated to max_chars to protect the model context. max_chars must be between 1 and 50,000.

search_by_topic(topic, limit=10)

Find conversations tagged with a specific topic.

add_conversation(content, title, date)

Store a new conversation with automatic topic extraction and FTS indexing.

generate_weekly_summary(week_offset=0)

Generate insights and patterns from recent conversations.

get_search_stats()

View search engine statistics — index size, topic counts, and engine status.

update_conversation(conversation_id, content=None, title=None, add_tags=None, remove_tags=None, set_tags=None, conversation_type=None, session_id=None, user_id=None, change_note=None, record_audit=True)

Update fields on an existing conversation in place. Pass conversation_id plus any subset of fields to change; unspecified fields are left alone. By default, the first line of stored content is rewritten with a self-documenting audit line — [update <iso-timestamp> — <change_note>] — chained across repeated updates. If change_note is omitted, it is derived from the changed fields.

Set record_audit=False only for authoritative imports whose content must remain an exact replica of the source system. Normal interactive updates should retain the default audit record.

Tag operations: set_tags replaces the full tag list and is mutually exclusive with add_tags/remove_tags (pass set_tags=[] to clear all tags); add_tags/remove_tags mutate the existing list.

Returns a status string. On success: Status: success plus a summary message and, when enabled, the audit line. On failure (malformed ID, conversation not found, no changes provided, conflicting tag ops, or an I/O error): Status: error plus a message describing the problem.

search_by_tag(tag, limit=10)

Find conversations tagged with a specific tag — a universal metadata field populated by importers or set via update_conversation (e.g. starred, archived, workspace:my-project). Exact match, case-sensitive. Requires SQLite FTS to be enabled; without it, returns an error message.

search_by_session_id(session_id, limit=10)

Find all conversations sharing a session_id, useful for reconstructing a multi-turn session that spans several stored conversation records (e.g. a Cursor working session, a Claude thread continued across days). Results are sorted chronologically (oldest first). Requires SQLite FTS to be enabled; without it, returns an error message.

search_by_conversation_type(conversation_type, limit=10)

Find conversations by conversation_type (e.g. chat, code, analysis). Exact match, most recent first. Requires SQLite FTS to be enabled; without it, returns an error message.

Architecture

~/claude-memory/
ā”œā”€ā”€ conversations/
│   ā”œā”€ā”€ 2025/
│   │   └── 06-june/
│   │       └── 2025-06-01_topic-name.md
│   ā”œā”€ā”€ index.json          # Search index
│   └── topics.json         # Topic frequency
└── summaries/
    └── weekly/
        └── week-2025-06-01.md

Configuration

Claude Desktop Integration

Add to your Claude Desktop MCP config:

{
  "mcpServers": {
    "universal-memory-mcp": {
      "command": "universal-memory-mcp"
    }
  }
}

Installed from source rather than PyPI? Point command at your virtualenv's interpreter and run the module:

{
  "mcpServers": {
    "universal-memory-mcp": {
      "command": "/absolute/path/to/universal-memory-mcp/.venv/bin/python3",
      "args": ["-m", "universal_memory_mcp.server_fastmcp"]
    }
  }
}

Upgrading from before the package move (#225): configs used to name the server script directly (src/server_fastmcp.py). That no longer works in any form — the modules moved under src/universal_memory_mcp/, and the package now uses relative imports, so running the file raises attempted relative import with no known parent package. Switch to the console script or the -m form above.

Configuration Precedence

Settings are resolved by src/universal_memory_mcp/config.py's Config.load(), consulted in this order (highest wins):

  1. Environment variables (CLAUDE_MEMORY_* / CLAUDE_MCP_*)

  2. Config file (default ~/.claude-memory/config.json)

  3. Platform profile (default, claude, chatgpt, or cursor — selects a partial set of defaults, e.g. log_format)

  4. Built-in defaults

Environment Variables

Variable

Purpose

Default

CLAUDE_MEMORY_PATH

Conversation storage directory

~/claude-memory

CLAUDE_MEMORY_DISABLE_SQLITE

Set true to disable SQLite FTS and fall back to JSON linear search. Inverse alias of CLAUDE_MCP_ENABLE_SQLITE; wins if both are set.

unset (SQLite enabled)

CLAUDE_MCP_LOG_FORMAT

Log output format: text or json

text

CLAUDE_MCP_LOG_LEVEL

Log level: DEBUG, INFO, WARNING, ERROR, CRITICAL

INFO

CLAUDE_MCP_ENABLE_SQLITE

Enable/disable SQLite FTS search (boolean: true/false, 1/0, yes/no, on/off)

true

CLAUDE_MCP_CONSOLE_OUTPUT

Echo logs to stdout in addition to the log file (boolean)

false

CLAUDE_MCP_PLATFORM_PROFILE

Platform profile to apply: default, claude, chatgpt, or cursor

default

When CLAUDE_MEMORY_PATH is set explicitly, the path may live outside your home directory (e.g. a separate data drive on Windows: D:\claude-memory). Paths that are not explicitly configured are still restricted to the home or project directory for safety.

Config File

As an alternative to environment variables, settings can be placed in ~/.claude-memory/config.json. The file is optional — a missing file falls back to platform-profile/built-in defaults. Example:

{
  "storage_path": "~/claude-memory",
  "log_format": "json",
  "log_level": "INFO",
  "enable_sqlite": true,
  "console_output": false,
  "platform_profile": "default"
}

Unknown keys in the file raise a configuration error rather than being silently ignored. Environment variables still override anything set here.

Disabling SQLite

SQLite FTS5 search is enabled by default. On platforms where SQLite/FTS5 is unavailable (e.g. some Windows Python builds), disable it to fall back to JSON-based linear search:

export CLAUDE_MEMORY_DISABLE_SQLITE=true

Logging Configuration

Log Format

Switch between human-readable text logs (default) and structured JSON logs for production:

# JSON format (for production log aggregation)
export CLAUDE_MCP_LOG_FORMAT=json

# Text format (default, for development)
export CLAUDE_MCP_LOG_FORMAT=text

JSON Log Example:

{
  "timestamp": "2025-01-15T10:30:45",
  "level": "INFO",
  "logger": "claude_memory_mcp",
  "function": "add_conversation",
  "line": 145,
  "message": "Added conversation successfully",
  "context": {
    "type": "performance",
    "duration_seconds": 0.045,
    "conversation_id": "conv_abc123"
  }
}

JSON logging is ideal for:

  • Production deployments with log aggregation (Datadog, ELK, CloudWatch)

  • Automated monitoring and alerting

  • Structured log analysis and querying

  • Performance tracking and debugging

See docs/json-logging.md for detailed JSON logging documentation.

File Structure

universal-memory-mcp/
ā”œā”€ā”€ src/
│   ā”œā”€ā”€ server_fastmcp.py       # Main MCP server
│   ā”œā”€ā”€ conversation_memory.py  # Core memory engine + SQLite FTS5
│   ā”œā”€ā”€ format_detector.py      # Auto-detect AI platform format
│   ā”œā”€ā”€ validators.py           # Input validation
│   ā”œā”€ā”€ logging_config.py       # Structured logging (text/JSON)
│   ā”œā”€ā”€ importers/              # Platform-specific importers
│   │   ā”œā”€ā”€ chatgpt_importer.py
│   │   ā”œā”€ā”€ claude_importer.py
│   │   ā”œā”€ā”€ cursor_importer.py
│   │   └── generic_importer.py
│   └── schemas/                # JSON schema validation
ā”œā”€ā”€ tests/                      # 435 tests, 98.68% coverage
ā”œā”€ā”€ data/                       # Consolidated app data
ā”œā”€ā”€ scripts/                    # Import and utility scripts
└── docs/                       # Documentation

Performance

scripts/benchmark_search.py was broken (unawaited async calls, measuring coroutine construction instead of real search time) from October 2025 until this was found and fixed. The previous numbers below were never actually measured and have been replaced with real ones. Reproduce with:

python scripts/generate_test_data.py --conversations 159
python scripts/benchmark_search.py --storage-path ~/claude-memory-test --iterations 5

Measured on a 159-conversation / 7.7MB local dataset (WSL2, Python 3.12) — treat as order-of-magnitude, not a precise SLA, results vary by machine:

  • Search Speed (SQLite FTS5): mean 15–18ms, median 10–13ms per query, range 0.5–82ms across 12 query types (was claimed 0.2–0.5ms; that figure was never measured)

  • Search vs. linear JSON scan: SQLite FTS5 is ~10x faster (mean 14.7ms vs 154.2ms; median 10.5ms vs 152.0ms) — the old "4.4x" claim had the right direction but was also never actually measured

  • Topic Search: mean 3.4ms, median 2.5ms (was claimed 0.3–0.4ms; that figure was never measured)

  • Write Speed: mean 14ms, median 14ms per ~49KB conversation, SQLite indexing included (was claimed ~33ms; that figure was never measured)

  • Capacity: 371 conversations in production use over 10 months

  • Test Coverage: 98.68% (435 tests) — 0 code smells, 0 security hotspots (SonarCloud verified)

Last benchmarked: July 2026 | Detailed Report

Note for Developers: Performance benchmarks create a ~/claude-memory-test directory for isolated testing. Normal MCP usage only uses ~/claude-memory/. If you see ~/claude-memory-test, it can be safely deleted.

Search Examples

# Technical topics
search_conversations("terraform azure")
search_conversations("mcp server setup")
search_conversations("python debugging")

# Project discussions
search_conversations("interview preparation")
search_conversations("product management")
search_conversations("architecture decisions")

# Specific problems
search_conversations("dependency issues")
search_conversations("authentication error")
search_conversations("deployment configuration")

Development

Adding New Features

  1. Topic Extraction: Modify _extract_topics() in ConversationMemoryServer

  2. Search Algorithm: Enhance search_conversations() method

  3. Summary Generation: Improve generate_weekly_summary() logic

Testing

# Run validation suite
python3 tests/validate_system.py

# Run full test suite with coverage
python3 -m pytest tests/ --cov=src --cov-report=term

# Import test data
python3 scripts/bulk_import_enhanced.py test_data.json --dry-run

Test Data Storage (Developers Only): If you run performance benchmarks or test data generators, they create a ~/claude-memory-test directory to isolate test data from your production ~/claude-memory directory. This is only for development/testing - normal MCP usage does not create this directory.

To clean up test data after running benchmarks:

rm -rf ~/claude-memory-test

Or using the Makefile cleanup target:

make clean-test-data

Troubleshooting

Common Issues

MCP Import Errors: the mcp dependency comes with the package, so this normally means the server is running under an interpreter that does not have it. Check which one your MCP config invokes: the universal-memory-mcp console script from uv tool/pipx, or your virtualenv's python3 -m universal_memory_mcp.server_fastmcp — not a bare system python3.

Search Returns No Results:

  • Check conversation indexing: ls ~/claude-memory/conversations/index.json

  • Verify file permissions

  • Run validation: python3 tests/validate_system.py

Weekly Summary Timezone Errors:

  • Ensure all datetime objects use consistent timezone handling

  • Recent fix addresses timezone-aware vs naive comparison

System Requirements

  • Python: 3.10+ (CI runs 3.14)

  • Disk Space: ~10MB per 100 conversations

  • Memory: <100MB RAM usage

  • OS: Linux/WSL and Windows are both verified in CI on every PR (Ubuntu + windows-latest). macOS is expected to work but is not covered by a CI runner.

Contributing

  1. Fork the repository

  2. Create a feature branch: git checkout -b feature-name

  3. Commit changes: git commit -am 'Add feature'

  4. Push to branch: git push origin feature-name

  5. Submit a Pull Request

A note for fork PRs: GitHub does not give forks access to repository secrets, so the SonarCloud scan and the performance-results comment are skipped on your PR rather than run. That is expected and is not something you can or should fix — the test suite, linting, CodeQL and the Windows run all still execute normally, and coverage on your changes is checked when the branch lands on main. If you see those two skipped, nothing is wrong.

Releasing

Publishing is tag-gated and uses Trusted Publishing (OIDC) — there is no PyPI token stored in this repo. .github/workflows/publish.yml fires only on a vX.Y.Z tag.

One-time setup on PyPI (publisher settings for the project, or a pending publisher while the name is still unclaimed):

field

value

Owner

adamkwhite

Repository

universal-memory-mcp

Workflow

publish.yml

Environment

pypi

To cut a release:

# 1. bump `version` in pyproject.toml, commit, merge to main
# 2. tag the merged commit — the workflow refuses a tag that disagrees with pyproject
git tag v0.1.0 && git push origin v0.1.0

The workflow builds, runs twine check, installs the wheel into a clean venv and asserts that every module imports and that no generic top-level name leaked, then publishes. Add required reviewers to the pypi environment in repo settings for a manual approval gate as well.

Rehearse on TestPyPI before the first real upload — the first upload claims the name permanently, and a version number can never be reused:

rm -rf dist && uv build
uv run --with twine --no-project twine upload --repository testpypi dist/*
# TestPyPI does not mirror mcp/jsonschema/aiofiles, so pull deps from real PyPI:
uv pip install --index-url https://test.pypi.org/simple/ \
               --extra-index-url https://pypi.org/simple/ universal-memory-mcp

License

MIT License - see LICENSE file for details

Acknowledgments


Status: Production ready āœ… Last Updated: April 2026 Version: 2.0.0

Available Tools

10 tools
add_conversationB

Add a new conversation to the memory system.

session_id, user_id, tags, and conversation_type are the universal metadata fields introduced in PR #114; when provided, they are persisted alongside the conversation and indexed for metadata search (search_by_tag / search_by_session_id / search_by_conversation_type). All four are validated/sanitized before storage since this data may originate from external imports.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo
tagsNo
titleNo
contentYes
user_idNo
session_idNo
conversation_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full burden. It discloses validation/sanitization and the persistence/indexing behavior of the four metadata fields, which is useful. It does not mention the return value, whether the tool can duplicate conversations, or any side effects or failure modes beyond validation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and readable, front-loading the core action and then explaining the metadata fields. The formatting is clean, though the trailing phrase about external imports is slightly tangential and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter write operation with no annotations and no parameter descriptions in the schema, the description is under-equipped. It explains why the four universal fields exist and the indexing behavior, but it does not clarify return values, error conditions, or the meaning of date/title/content. The presence of an output schema helps, but the description still leaves significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema lists 7 parameters but none of them have descriptions, and the description adds meaning only for session_id, user_id, tags, and conversation_type by explaining they are persisted and indexed. date, title, and content receive no semantic explanation beyond their names and types, which is a notable gap given the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool adds a new conversation to the memory system, and it names the universal metadata fields. However, it does not explicitly contrast itself with the update_conversation sibling, which is an easy distinction to miss in an agent's selection process.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that the optional fields can be used for metadata search and that they may originate from external imports, which implies when these fields matter. It does not spell out when to prefer add_conversation over update_conversation or when certain metadata fields are required, leaving usage context implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_weekly_summaryC

Generate a summary of conversations from the past week

ParametersJSON Schema
NameRequiredDescriptionDefault
week_offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says a summary is generated; it does not clarify whether this is read-only, how the past week is calculated, whether it aggregates across all conversations or only certain types, or what data the summary contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tight sentence that front-loads the core purpose without wasted words. However, its brevity comes at the cost of omitting useful parameter and behavior details, so it is concise but slightly under-specified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although the tool is simple and has an output schema, the description leaves the meaning of week_offset undefined, which is essential for correct invocation. An agent cannot determine how to request the desired week without additional assumptions, so the description is not complete enough on its own.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, week_offset, is not mentioned in the description at all. The schema provides its name, title, type, and default, but not what the offset means (e.g., 0 = current week, 1 = previous week) or how it relates to 'past week'. With 0% schema description coverage, the description needed to compensate and does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Generate') and resource ('a summary of conversations') with a time constraint ('past week'). This distinguishes it from the sibling search/add/update/get tools as an aggregation operation, though it does not explicitly contrast it with any of them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'past week' implies the tool is appropriate when a weekly summary is needed, but the description provides no explicit guidance on when to use this tool versus search_conversations or search_by_topic. No exclusions or alternative conditions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_conversationA

Retrieve a stored conversation by an ID returned from a search tool.

The complete record is read from the authoritative JSON store. Content is capped to protect the model context; increase max_chars when necessary.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_charsNo
conversation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and adds useful behavioral details: the read is from the 'authoritative JSON store', and the response content is capped to protect model context. It could mention error behavior when the ID is not found, but the disclosed behaviors go beyond a bare getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two lean sentences with no filler. The primary purpose is front-loaded, and the second sentence adds a meaningful operational constraint about content truncation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple retrieval tool with an output schema, the description covers purpose, source, and the one tunable behavior (content cap). It is adequate for an agent to select and call the tool, though it leaves not-found/error behavior unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does: conversation_id is contextualized as an ID returned from a search tool, and max_chars is explained as the content cap that can be increased when needed. It does not specify units or range, but the default in the schema covers some of that gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Retrieve') and a clear resource ('a stored conversation by an ID'), which immediately identifies it as a point-lookup tool. The mention that the ID comes from a search tool further separates it from the search-family siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: call this after obtaining a conversation ID from a search tool. It does not explicitly name sibling alternatives or state when not to use it, but the intended workflow is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_search_statsA

Get search engine statistics and performance information

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral burden. The verb 'Get' implies a read-only operation and the lack of parameters suggests no destructive side effects. Still, it does not explicitly confirm safety, rate limits, or what 'performance information' includes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word contributes to identifying the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless tool with an output schema available, this description is sufficient for an agent to select and invoke it correctly. The lack of parameters removes invocation complexity, and the output schema covers return value details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, which sets the baseline at 4. There is no parameter semantics to explain, and the description does not need to compensate for undocumented inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and identifies a clear resource ('search engine statistics and performance information'). It is distinct from all sibling tools, none of which obviously cover search engine statistics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied by the name and description: use this when search engine statistics or performance are needed. However, there is no explicit guidance about when to use it versus alternatives, nor any mention of prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_by_conversation_typeB

Search conversations by conversation_type (D2 metadata field).

Typical values: chat, code, analysis. Requires SQLite FTS.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
conversation_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry behavioral context itself. It adds useful details: conversation_type is a D2 metadata field, typical values are chat/code/analysis, and SQLite FTS is required. However, it does not disclose read-only behavior, result-set behavior, or what happens when FTS is unavailable, leaving some burden unmet.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: purpose first, then typical values, then the key prerequisite. Every sentence earns its place with no filler or repetition of schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-field search tool, the description covers the essential domain context (D2 metadata field, typical enum-like values) and the important prerequisite (SQLite FTS). The presence of an output schema reduces the need to describe return values, so the remaining gaps are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 adds real meaning to the required conversation_type parameter by explaining it is a D2 metadata field and giving typical values. The optional limit parameter remains unspecified, though its name, type, and default make it fairly self-explanatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Search') and resource ('conversations') filtered by 'conversation_type', so an agent immediately knows what the tool does. It does not explicitly compare against sibling tools, but the focused field name already differentiates it from search_by_topic, search_by_tag, and generic search_conversations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to choose this tool over search_conversations or the other search_by_* siblings. It mentions a technical prerequisite ('Requires SQLite FTS') but does not explain alternative conditions, exclusions, or preferred usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_by_session_idA

Find all conversations sharing a session_id (D2 metadata field).

Useful for reconstructing a multi-turn session that spans several stored conversation records (e.g. a Cursor working session, a Claude thread continued across days). Results are sorted chronologically. Requires SQLite FTS.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full behavioral burden. It adds meaningful traits beyond the schema: 'Results are sorted chronologically' and 'Requires SQLite FTS'. It does not mention exact-match semantics or permissions, but the read-oriented wording and presence of an output schema reduce ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences: the first states the core function, the second gives the primary use case with examples, and the third provides ordering and a system prerequisite. Every sentence earns its place and there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema present, the description covers the purpose, a concrete use case, chronological ordering, and the SQLite FTS dependency. It does not explain the limit parameter's effect or mention alternative tools, but these are minor given the tool's simplicity and available output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 adds meaning for session_id by calling it a 'D2 metadata field' and explaining its role in reconstructing sessions, but the limit parameter is not described at all beyond its schema default. This partial compensation leaves one parameter without added context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb ('Find') with a concrete resource ('all conversations sharing a session_id') and clarifies that session_id is a 'D2 metadata field', clearly distinguishing this from sibling tools that search by topic, tag, or conversation type. An agent can immediately understand what the tool returns and how it differs from alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use the tool: 'reconstructing a multi-turn session that spans several stored conversation records', with concrete examples like a Cursor working session or a Claude thread continued across days. It does not explicitly name alternatives or state when not to use it, but the use case is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_by_tagA

Search conversations tagged with a specific tag (D2 metadata field).

Tags are universal metadata populated by the importers (e.g. starred, archived, workspace:my-project, variant:web). Requires SQLite FTS.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYes
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description must carry the burden of behavioral disclosure. It adds meaningful context: tags originate from importers, are universal, and can take namespaced forms like 'workspace:my-project'. The SQLite FTS dependency is also a useful behavioral hint. However, it does not mention return shape, limit handling, pagination, or potential errors, leaving several behavioral aspects undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences, each earning its place: the core purpose, the tag semantics with concrete examples, and a required dependency. It is front-loaded with the action and contains no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter search tool with an output schema, the description covers the essential tag concept, provides real-world examples, and notes a critical prerequisite. The main gaps are the lack of explanation for the 'limit' parameter and the absence of sibling differentiation, but the output schema likely covers return values, so overall completeness is strong.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 the key 'tag' parameter thoroughly, including its nature as a D2 metadata field and providing examples. The 'limit' parameter, however, is entirely left to the schema's name and default value, with no description in either place.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Search conversations tagged with a specific tag.' It further clarifies that tags are D2 metadata fields with concrete examples, which helps distinguish the tool from siblings like search_by_topic or search_by_session_id. However, it does not explicitly contrast itself against those sibling tools, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful context for when the tool is applicable: tags are universal metadata populated by importers, and examples like 'starred' and 'archived' imply common use cases. It also states a prerequisite ('Requires SQLite FTS'), which is a form of usage constraint. Yet it offers no explicit guidance on when to prefer this tool over search_by_topic, search_by_conversation_type, or search_conversations, nor any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_by_topicC

Search conversations by a specific topic

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
topicYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It implies a read-only search but does not disclose whether matching is exact, fuzzy, case-insensitive, or how results are ordered. It also omits any mention of pagination, limits beyond the schema default, or access/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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that is easy to parse. It wastes no words and communicates the core action and resource immediately, though that brevity contributes to the lack of behavioral detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two parameters, no annotations, and several closely related sibling tools, the description is incomplete. An agent would need extra information about parameter semantics and when to prefer this over search_by_tag or search_conversations to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does little to compensate. It maps to the 'topic' parameter but says nothing about how topics are matched or interpreted, and it entirely ignores the 'limit' parameter and its default behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('Search'), a resource ('conversations'), and a filtering dimension ('by a specific topic'). This distinguishes it from siblings like search_by_tag and search_by_session_id, though it does not clarify the exact matching semantics of 'topic'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as the general search_conversations or the more specific search_by_tag. No context about typical use cases or exclusions is provided, leaving the agent to infer applicability from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_conversationsC

Search through stored Claude conversations for relevant content

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does convey a read-style operation over stored conversations and mentions 'relevant content', which implies some relevance ranking, but it does not explain whether search covers full transcripts, metadata, summaries, or how results are ordered and limited.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no filler and places the action and resource early. It earns its conciseness, though it is arguably too sparse to support tool selection among siblings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The input schema is simple and an output schema exists, so return structure may be covered elsewhere, but the tool sits in a crowded sibling set with multiple specialized search variants. The description does not explain when generic search is appropriate, leaving a meaningful selection gap for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 for undocumented parameters, but it never mentions 'query' or 'limit' explicitly. The phrase 'relevant content' hints that query drives a relevance search and limit likely caps results, but that is inferred rather than stated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('search') and a clear resource ('stored Claude conversations'), so an agent can tell this is a search operation. It does not differentiate from sibling tools like search_by_topic, search_by_tag, search_by_session_id, or search_by_conversation_type, which all share the same search family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this generic search versus the specialized sibling search tools. With four search-by-* siblings plus get_search_stats, the description leaves the agent to infer which tool fits a given request.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_conversationA

Update fields on an existing conversation in place.

Pass conversation_id plus any subset of fields to change. The first line of the stored content is rewritten with a self-documenting audit line: [update <iso-timestamp> — <change_note>]. If change_note is omitted, it's auto-derived from which fields changed.

Tag ops: set_tags replaces the full list; add_tags and remove_tags mutate it. set_tags is mutually exclusive with the other two; pass set_tags=[] to clear all tags.

Metadata fields (tags, conversation_type, session_id, user_id) are validated/sanitized before storage since this data may originate from external imports.

record_audit=False preserves authoritative imported content verbatim. Normal interactive updates should retain the default audit record.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNo
contentNo
user_idNo
add_tagsNo
set_tagsNo
session_idNo
change_noteNo
remove_tagsNo
record_auditNo
conversation_idYes
conversation_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and succeeds. It discloses that the first line of content is rewritten with a self-documenting audit line, change_note can be auto-derived, tag operations have specific replace/mutate semantics with mutual exclusivity, metadata is validated/sanitized, and record_audit=False preserves imported content verbatim. These are all meaningful behavioral traits beyond the tool name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded, with the core purpose in the first sentence. Each paragraph earns its place: partial update mechanics, audit behavior, tag semantics, metadata validation, and special record_audit usage. It is detailed without being bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 parameters, no annotations, and no schema-level descriptions, this description is remarkably complete. It covers partial updates, audit-line side effects, tag exclusivity, metadata sanitization, and audit suppression. The presence of an output schema covers return-value expectations, so no critical calling information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 well for tags, change_note, record_audit, conversation_id, and metadata fields, but title and content are only covered implicitly via 'any subset of fields to change.' The tag semantics and audit behavior add substantial value beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Update fields on an existing conversation in place.' This clearly identifies the action and scope, distinguishing it from add_conversation, get_conversation, and the search family without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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: modifying an existing conversation by passing conversation_id with a subset of fields. It also provides usage guidance for record_audit, recommending default audit for interactive updates and record_audit=False for preserving authoritative imports, but it does not explicitly name sibling tools or state when not to use it.

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.

  1. 10 tool updatesv0.1.2
    • First observedadd_conversation
    • First observedgenerate_weekly_summary
    • First observedget_conversation
    • First observedget_search_stats
    • First observedsearch_by_conversation_type
    • First observedsearch_by_session_id
    • First observedsearch_by_tag
    • First observedsearch_by_topic
    • First observedsearch_conversations
    • First observedupdate_conversation

TDQS

B3.4/5.0
Disambiguation4/5

Most tools target distinct resources or actions: add/get/update are clear CRUD operations, and the metadata-specific searches (by_tag, by_session_id, by_conversation_type) are well-scoped. However, search_conversations and search_by_topic overlap conceptually, and the distinction between generic content search and topic search is not sharply defined.

Naming Consistency4/5

The naming is predominantly verb_noun snake_case, with add_conversation, get_conversation, update_conversation, and generate_weekly_summary following a clear pattern. The search tools are slightly inconsistent because some use search_conversations while others use search_by_tag/search_by_session_id/search_by_conversation_type, but the style is still recognizable and predictable.

Tool Count4/5

Ten tools is a reasonable size for a conversation memory system, and the CRUD core plus search variants cover most expected workflows. The count is slightly search-heavy, with six retrieval-related tools, but none feel redundant enough to remove outright.

Completeness3/5

The system covers add, get, update, search, summary, and stats, which handles the core lifecycle for stored conversations. Notable gaps include no delete/forget operation, no list-all conversations tool, and no dedicated search_by_user_id even though user_id is described as a universal metadata field.

Maintenance

ActivityMaintained
ResponsivenessResponsive

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

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that makes Claude Code conversation history searchable and proactively useful by indexing past sessions with hybrid BM25+TF-IDF search, extracting decisions and solutions, and auto-injecting relevant project context at session start.
    9
    12
    65
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    A lightweight MCP server that provides Claude Desktop with persistent memory across conversations by storing, summarizing, and retrieving conversation history.
    3
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that gives Claude persistent memory by storing conversation context, entities, and enabling semantic search across sessions.
    18
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables semantic and keyword search over Claude Code conversation history stored locally, using hybrid search, local embeddings, and time-decay scoring.
    26
    MIT

Latest Blog Posts

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/adamkwhite/universal-memory-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server