CarryMem
CarryMem is a portable AI memory server that stores preferences, decisions, corrections, and rules, making them available across AI tools and sessions.
Memory Classification & Storage
Classify messages to detect memorable content (type, tier, confidence)
Batch classify multiple messages at once
Classify and store in one step, or declare preferences with full confidence
Retrieve the full classification schema (7 memory types, 4 tiers)
Memory Retrieval & Management
Search stored memories by query, type, tier, and confidence
Delete specific memories by ID
View a structured memory profile summary
Generate context-injected system prompts for AI agents (supports en/zh/ja)
Knowledge Base Integration
Index and search Obsidian vaults or other knowledge bases (filter by tags/title)
Unified recall across both personal memories and knowledge base simultaneously
Memory Lifecycle & Maintenance
Consolidate memories: deduplicate, decay, and detect patterns (dry-run supported)
Schedule or stop automatic consolidation
Summarize a session and store the result as a memory
Rule Engine
Add, list, match, update, and delete behavioral rules with scopes (personal, company, negotiated) and types (always, avoid, forbid, prefer, recommend)
Inject rules into AI prompts; view a readable summary of your rules
Suggest rule candidates from stored memories and promote patterns into active rules
Profile, Onboarding & Health
View a full identity profile (memory stats, rule summary, recent activity)
First-time onboarding to initialize preferences (supports en/zh/ja)
Health check for system status, adapter health, memory count, and uptime
Encryption & Portability
Pack/unpack encrypted
.carryfiles for backup, restore, and portabilityAuto-redact sensitive patterns
CarryMem — Your AI Finally Remembers Who You Are
Stop teaching AI who you are every single conversation.
Your portable AI memory — preferences, decisions, and corrections that follow you across models, tools, and devices.
Every time you open a new chat, you introduce yourself again. Your preferences, your decisions, your corrections — all forgotten. Switch from Cursor to Claude Code, from GPT to Claude, start from scratch every time.
You're not using AI. You're training it. Over and over.
CarryMem fixes this. It's a lightweight, zero-dependency memory system that stores who you are and makes that identity available to any AI tool. Your AI remembers your preferences, your past decisions, and the corrections you've made — so you can focus on building, not repeating yourself.
English | 中文 | 日本語 | 한국어 | 繁體中文
Table of Contents
Related MCP server: Sovereign Universal Memory MCP
🌟 The 30-Second Version
你每天见客户、开会、聊天,AI 问你一句你答一句,下次对话它又忘了你是谁。
CarryMem 让 AI 自动记住你的偏好和决策——不用每次重复说。装一次,所有 AI 工具通用。
Technical users: see PrefEval benchmarks (83.0% ICLR 2025 Oral) and architecture docs below.
Topics: ai-memory mcp claude-code agent-memory cursor obsidian preference-injection sqlite llm-tools portable-memory
What CarryMem Does
5 scenarios you'll recognize:
"I don't want to tell AI my preferences every time" "I prefer PostgreSQL" "Use React not Vue" "No comments in code" — say it once, remembered forever.
"I switched AI tools and started from scratch" Taught AI in Cursor, now teaching it again in Claude Code. CarryMem makes your AI memory follow you.
"I want to take my data with me" Your AI memory is yours. One file to pack, restore on any machine, any tool.
"USB Carry — my memories in my pocket" 🔑 Pack your memories to an encrypted .carry file, copy to USB, unpack on a new machine. Your AI identity travels with you — preferences, decisions, corrections, and rules all intact. Every agent on the new machine instantly knows who you are.
"My team shares conventions across agents" Team lead packs company rules as a Skill bundle, every team member installs it. All agents enforce the same conventions — no more "I didn't know we use SSL."
🎯 Real User Scenarios
Scenario 1: The Multi-Tool Developer
Monday: Tell Cursor "I prefer dark mode, PostgreSQL, React"
Tuesday: Open Claude Code — it already knows your stack
Friday: Switch to TRAE — same preferences, zero repetitionHow: carrymem setup-mcp --all --global — one command, all tools share one memory.
Scenario 2: The USB Carry — New Machine, Same Identity
1. On your laptop: carrymem pack -o my_identity.carry --encrypt
2. Copy my_identity.carry to USB drive
3. At new workplace: Install CarryMem on new machine
4. carrymem unpack my_identity.carry
5. Every agent on the new machine knows your preferences, decisions, and rulesEncrypted + SHA-256 checksum — your identity is safe even if the USB is lost.
Scenario 3: The Team Lead
1. Create team conventions as rules: "Always use SSL", "Never deploy on Friday"
2. Pack as Skill: carrymem rules pack rules.json --name team-conventions
3. Share the .json file with team
4. Each member: carrymem rules install team-conventions.json --scope company
5. All agents now enforce company conventions automaticallyScenario 4: The Long-Term User
Month 1: "I prefer dark mode" → stored as user_preference
Month 3: "Switch to light mode" → auto-supersedes old preference
Month 6: carrymem whoami → shows "I prefer light mode" (dark mode archived)Preferences evolve. CarryMem tracks the history.
Get Started (pick your path)
Using Cursor / Claude Code / TRAE?
pip install carrymem && carrymem setup-mcp --all --globalRestart your AI tool. Done.
Verify it works (30 seconds)
Tell your AI:
Remember, I prefer PostgreSQLStart a new conversation and ask:
What database do I prefer?AI answers "PostgreSQL" — it works!
Need to move your memory?
carrymem pack # Creates carrymem_identity_20260526.carry
# Copy to USB / cloud / new machine
carrymem unpack my_identity.carry # All memories restored
# With encryption for sensitive data
carrymem pack -o my_memories.carry --encrypt # Password-encrypted .carry file
carrymem unpack my_memories.carry # Auto-detects encryption, prompts for passwordAuto-backup & Recovery
carrymem backup # Manual backup (also auto-backup every 20 writes)
carrymem backup --list # List all backups
carrymem backup --restore memories_backup_20260527_120000.db # Restore from backup📊 Academically Verified: CarryMem's preference injection accuracy (83.0%) was measured using the PrefEval protocol (ICLR 2025 Oral, Amazon Science), outperforming simple reminder (80.0%) and zero-shot (71.5%) baselines across 200 test items. See Citation below.
4 Reasons to Choose CarryMem
These are what make CarryMem different from every other memory solution:
1. Preference Injection Precision — 83.0% (Academically Verified)
Measured by PrefEval (ICLR 2025 Oral, Amazon Science), 200-sample 3-condition comparison
CarryMem 83.0% > simple reminder 80.0% > zero-shot 71.5%
Proactive injection > full reminder — first system to prove this
24% fewer unhelpful responses than reminder (28 vs 38) — more precise, less noisy
2. Zero-LLM Classification — 88% Without Calling Any LLM
Rule engine classifies 88% of memories with zero token cost
Only system with built-in rule engine (competitors: 0%)
P99 latency: 1.3ms — 93x faster than Mem0
3. Lightweight & Portable — SQLite Only
Zero external dependencies for core functionality
Single .db file — carry your identity anywhere
Works with Cursor, Claude Code, ChatGPT, any MCP client
4. Industrial-Grade Engineering — 4666+ Tests / mypy 0 / flake8 0
4666+ non-e2e tests passing with 80%+ coverage (tested: 7 memory types × 4 tiers × lifecycle)
mypy 0 errors across 150+ source files — fully type-safe (CI blocking gate)
flake8 0 errors — clean codebase, no lint violations (black + isort formatted)
24 sensitive-pattern redaction — auto-detects API keys, passwords, tokens before storage
PatternAnalyzer God Class split (1547→171 LOC facade + 3 modules) — maintainable architecture
394 docstrings added — 50%→100% public API documentation coverage
Maturity assessment: 80/100 (B) per 7-dimension DevSquad evaluation
How It Works
User Input → Auto-Classification (7 types, 88% rule-based) → Smart Storage (SQLite + FTS5)
→ Semantic Recall (cross-language) → Context Injection (token budget) → AI ToolQuick Start
Install
pip install carrymemRequires Python 3.12+. Check your version:
python --version
From PyPI: https://pypi.org/project/carrymem/
For development:
git clone https://github.com/lulin70/carrymem.git && cd carrymem && pip install -e ".[dev]"
System Requirements
Python: ≥3.12 (64-bit)
OS: macOS 10.15+, Ubuntu 20.04+, Windows 10+
Disk: ~5MB for core, ~200MB with semantic search
Memory: ~50MB base
Dependencies
Feature | Package | Install |
Core (incl. encryption) | PyYAML≥5.0, cryptography≥46.0.6 |
|
Multi-language | pycld2, langdetect |
|
Semantic Search | sqlite-vec, sentence-transformers |
|
Full (all features) | all above |
|
Development | pytest, black, flake8... |
|
Zero LLM dependency for core features — classification uses rule engine only.
Verify Installation
carrymem versionIf command not found, add Python bin to PATH:
# macOS (add to ~/.zshrc)
export PATH="$HOME/Library/Python/3.12/bin:$PATH"
# Linux (add to ~/.bashrc)
export PATH="$HOME/.local/bin:$PATH"
# Or use Python module directly
python3 -m carrymem.cli versionThen run carrymem doctor to check your setup.
5 Lines of Code
⚠️ Package vs Import Name: Install with
pip install carrymem(lowercase), but import asfrom carrymem import CarryMem(CamelCase class). The package name (carrymem) and class name (CarryMem) differ in casing.
from carrymem import CarryMem
cm = CarryMem()
cm.classify_and_remember("I prefer dark mode") # Auto-classified as preference
cm.classify_and_remember("Use PostgreSQL not MySQL") # Auto-classified as correction
cm.classify_and_remember("I prefer light mode now", session_id="sess_002") # Session-aware
memories = cm.recall_memories("database") # Semantic recall
memories = cm.recall_memories("mode", filters={"session_id": "sess_002"}) # Filter by session
agg = cm.recall_aggregated() # Aggregate by type
timeline = cm.recall_timeline("database") # Knowledge evolution
print(cm.build_system_prompt()) # Inject into any AI
cm.close()CLI (50+ commands)
carrymem init # Initialize
carrymem add "I prefer dark mode" # Store a memory
carrymem add "test note" --force # Force store (bypass classification)
carrymem list # List memories
carrymem search "theme" # Search memories
carrymem show <key> # View memory details
carrymem edit <key> "new content" # Edit a memory
carrymem forget <key> # Delete a memory
carrymem whoami # Who your AI thinks you are
carrymem profile export --output identity.json # Export your AI identity
carrymem stats # Memory statistics
carrymem check # Quality & conflict check
carrymem clean --expired --dry-run # Preview cleanup
carrymem doctor # Diagnose installation
carrymem setup-mcp --tool cursor # One-line MCP config
carrymem tui # Terminal UI
carrymem export backup.json # Export all memories
carrymem import backup.json # Import memories
carrymem pack -o my_memories.carry # Pack into portable .carry file
carrymem pack -o my_memories.carry --encrypt # Encrypted .carry file
carrymem unpack my_memories.carry # Unpack .carry file
carrymem backup # Manual backup
carrymem backup --list # List backups
carrymem backup --restore <file> # Restore from backup
carrymem version # Show version
# Rule Engine commands
carrymem rules add "use SSL" --trigger "database" --type avoid # Add a rule
carrymem rules list --status active # List active rules
carrymem rules suggest # Suggest rules
# Also available: carrymem add-rule, carrymem list-rules (legacy aliases)
carrymem rules pack rules.json --name team-conventions # Pack rules as Skill
carrymem rules install team-conventions.json --scope company # Install Skill
carrymem rules verify team-conventions.json # Verify Skill integrityCore Features (powering the 3 advantages)
Memory That Understands You
Auto-Classification (7 Memory Types)
CarryMem automatically identifies what kind of information you're sharing:
Type | Icon | Example |
| ⭐ | "I prefer dark mode" |
| 🔧 | "No, I meant Python 3.11 not 3.10" |
| 🎯 | "Let's use React for the frontend" |
| 📌 | "Python 3.12 is the runtime version" |
| ❓ | "Sarah is my manager" |
| 🔄 | "I always write tests first" |
| 💭 | "This build is too slow" |
Semantic Recall (Cross-Language)
cm.classify_and_remember("我偏好使用PostgreSQL")
# All of these find it:
cm.recall_memories("PostgreSQL") # Exact match
cm.recall_memories("数据库") # Synonym expansion
cm.recall_memories("Postgres") # Spell correction
cm.recall_memories("データベース") # Cross-language (Japanese)Identity Layer (whoami)
identity = cm.whoami()
print(identity["preferences"]) # ["I prefer dark mode", ...]
print(identity["decisions"]) # ["Let's use React", ...]
print(identity["corrections"]) # ["The port should be 5432", ...]$ carrymem whoami
Who You Are (according to your AI)
==================================================
Your Preferences:
⭐ I prefer dark mode for all editors
⭐ I use PostgreSQL for databases
⭐ I always use Python for data analysis
Your Decisions:
🎯 Let's use React for the frontend
Your Corrections:
🔧 The port should be 5432, not 3306
Memory Profile:
Total: 19 | Dominant: user_preference | Avg Confidence: 73%Preference Injection (advantage #1)
Version Chain — Preferences Evolve, Old Versions Auto-Archived
cm.update_memory(key, "Updated content") # Creates version 2
history = cm.get_memory_history(key) # [v1, v2]
cm.rollback_memory(key, version=1) # Restore v1Scope-Aware Injection — Only Inject Relevant Preferences Per Context
Preferences are injected based on context scope, so your database preferences don't clutter frontend discussions.
Token Budget — 60% Budget for Preferences, Never Truncated
CarryMem allocates 60% of the token budget to preferences, ensuring they're never cut off. This is the key to achieving 83.0% on PrefEval — structured preference injection beats simple reminders.
Memory Lifecycle (advantage #2)
Importance Scoring — Confidence × Type × Recency × Access
Every memory has an importance score that evolves over time:
importance = confidence × type_weight × recency_factor × access_factor30-day half-life decay — old memories fade unless accessed
Access reinforcement — frequently recalled memories stay fresh
Type weighting — corrections (1.3x) > decisions (1.2x) > preferences (1.1x)
Consolidation (P0/P1/P2) — Dedup + Decay + Pattern → Rules + Semantic Merge
Automatic memory lifecycle management with three phases:
# Preview what consolidation would do
report = cm.consolidate(dry_run=True)
print(f"Duplicates: {report['stats']['duplicates_found']}")
print(f"Decayed: {len(report['to_decay'])}")
# Run consolidation (P0: dedup + decay, P1: pattern promotion, P2: semantic merge)
report = cm.consolidate(dry_run=False, run_p1=True, run_p2=True)Phase | Function | Mechanism |
P0 | Dedup + Decay | Jaccard similarity dedup, exponential half-life decay (preferences: 270d, facts: 90d, sentiments: 45d) |
P1 | Pattern → Rules | Detect repeated patterns → generate rule candidates for review |
P2 | Semantic Merge | Cluster related memories → request host LLM to consolidate |
Preferences are always preserved — never decayed or deduplicated.
Scheduled Consolidation — Automatic Background Maintenance
Run consolidation automatically on a recurring interval:
# Schedule consolidation every hour (runs in background thread)
cm.schedule_consolidation(interval_hours=1.0)
# Stop the scheduled consolidation
cm.stop_consolidation()CLI:
carrymem consolidate --schedule 1h # Run consolidation every hour
carrymem consolidate --stop # Stop scheduled consolidationSecurity & Portability (advantage #3)
Auto-Redaction — 24 Sensitive Patterns
Automatically detects and redacts API keys, passwords, tokens, and 21 other sensitive patterns before storage.
Encryption — AES-128 at Rest
Feature | Description |
Encryption | AES-128 (Fernet) or HMAC-CTR fallback, zero-dep |
Encrypted .carry files |
|
Auto-Backup | Every 20 writes, VACUUM INTO backup, max 5 retained |
Backup/Restore | Manual backup, list, and restore via |
Audit Log | SQLite-persisted operation history (~/.carrymem/audit.db) |
Version History | Every edit tracked, rollback supported |
Input Validation | SQL injection, XSS, path traversal protection |
cm = CarryMem(encryption_key="my-secret-key")
# All content encrypted at rest, decrypted on readBackup/Restore — Auto-Backup + Manual Control
Auto-backup triggers every 20 write operations (VACUUM INTO), retaining up to 5 backup files. Manual control via CLI:
carrymem backup # Create manual backup
carrymem backup --list # List all backups
carrymem backup --restore <file> # Restore from a specific backupPack/Unpack — USB Carry with Encryption
# Pack memories into a portable .carry file
carrymem pack -o my_memories.carry
# With password encryption for sensitive data
carrymem pack -o my_memories.carry --encrypt
# Unpack on any machine (auto-detects encryption)
carrymem unpack my_memories.carrySHA-256 checksum ensures file integrity. v1.0 .carry format is backward compatible with a warning.
Export/Import — Identity Follows You Across Devices
# Export your AI identity
cm.export_profile(output_path="my_identity.json")
# On another device or AI tool
cm.import_memories(input_path="backup.json")Supporting Features
Error Code System (v0.4.0 New)
Structured error handling with bilingual messages:
from carrymem.errors import CarryMemError
# Error code ranges:
# CM-001~099: Configuration & Initialization
# CM-100~199: Storage Adapter
# CM-200~299: Memory Operations
# CM-300~399: Classification & Rule Engine
# CM-400~499: Security & Encryption
# CM-500~599: Import / Export
# CM-600~699: CLI / TUI / MCP Entry Points
try:
cm.classify_and_remember("test")
except CarryMemError as e:
print(e.code) # "CM-001"
print(e.message) # "存储适配器未配置。" (Chinese)
print(e.hint) # "💡 Use CarryMem(storage='sqlite')..."Features:
37 error codes with Chinese + English messages
from_cause()factory maps low-level exceptions → friendly codesActionable hints for every error
7 concrete error subclasses for programmatic handling
Monitoring Framework (v0.4.0 New)
Production-ready monitoring with Prometheus export:
from carrymem.monitoring import HealthChecker, MetricsCollector, AlertManager, MonitoringHTTPServer
# Health checks
health = HealthChecker()
health.register_check("storage", lambda: cm._adapter is not None)
status = health.check() # {"status": "ok", "checks": {...}, "slo": [...]}
# Metrics collection
metrics = MetricsCollector()
metrics.increment("classify_and_remember")
metrics.record_latency("recall", 12.5)
print(metrics.to_prometheus()) # Prometheus text format
# SLO alerts
alerts = AlertManager()
alert_list = alerts.check_alerts(metrics.get_snapshot())
# HTTP server (optional)
server = MonitoringHTTPServer(port=8766, health_checker=health, metrics_collector=metrics)SLO Targets:
classify_and_rememberP99 < 200msrecallP99 < 500msStartup time < 2s
Plugin System (v0.4.0 New)
Extensible plugin architecture with hook points:
from carrymem.plugins import PluginProtocol, PluginManager, HookPoint
class MyPlugin:
name = "my-plugin"
version = "1.0.0"
def on_load(self, carrymem):
print(f"Loaded into CarryMem")
def on_memory_stored(self, memory):
print(f"Memory stored: {memory.content}")
def on_unload(self):
print("Plugin unloaded")
manager = PluginManager(plugin_dir="./plugins")
manager.set_carrymem(cm)
manager.load("my-plugin")Hook Points: on_memory_stored | on_memory_recalled | on_classified | on_error
Permission System (v0.4.0 New)
Lightweight access control MVP:
from carrymem.security.permissions import Permission, AccessPolicy
policy = AccessPolicy(owner_id="user-123")
# Check permissions
policy.check("user-123", Permission.READ) # True
policy.check("other-user", Permission.WRITE) # False
# Require permission (raises SecurityError on denial)
policy.require("user-123", Permission.DELETE, resource="memory")i18n Internationalization (v0.4.0 New)
Multi-language support without gettext dependency:
from carrymem.i18n import I18nManager, set_locale, _
# Switch language
set_locale("zh-CN")
# Translate with variable interpolation
print(_("memory.stored", count=3))
# → "已记住 3 条记忆"
# Available locales: en, zh-CNMCP Integration (One-Line Setup)
# Configure for Cursor
carrymem setup-mcp --tool cursor
# Configure for Claude Code
carrymem setup-mcp --tool claude-code
# Configure for all
carrymem setup-mcp --tool all31 MCP tools available: Core (3) · Storage (3) · Knowledge (3) · Graph (3) · Profile (2) · Prompt (2) · Consolidation (3) · Rules (11) · Health (1)
Client Compatibility:
Status | Clients | Setup |
✅ Direct | Cursor, Claude Code, TRAE, Windsurf, Cline |
|
✅ Auto-detect | OpenClaw, Kimi Code CLI, CodeX |
|
📋 Marketplace | WorkBuddy, CodeBuddy | Submit to MCP Marketplace (pending) |
❌ Not supported | Kimi Desktop, DeepSeek Desktop, Qianwen, Doubao, TiGong, ChatGLM | Closed platforms, no MCP interface |
🔒 Your memories stay on your machine. CarryMem stores all data locally in
~/.carrymem/(SQLite). Each user gets an independent database — just like Git, everyone uses the same tool but keeps their own repos. No cloud sync, no shared state, no cross-user conflicts.
Rule Engine with Scopes
Behavioral rules with three scope levels for team/organization alignment:
from carrymem.rules import RuleEngine
engine = RuleEngine()
# Company-mandated rules (highest priority, cannot be overridden)
engine.add_rule("database", "Always use SSL", scope="company", override=True)
# Personal preferences (lowest priority)
engine.add_rule("database", "Prefer PostgreSQL", scope="personal")
# Scope-aware matching
results = engine.match("database design", scopes=["company"])Scope | Priority | Description |
| 3 (highest) | Organization-mandated, cannot be overridden |
| 2 | Adapted from company rules |
| 1 (lowest) | User-created preferences |
Skill Format — Portable Rule Bundles
Share rule sets across teams with cryptographic integrity:
# Pack rules into a portable Skill bundle
bundle = engine.skill_pack(
name="team-conventions",
version="1.0.0",
scope="company",
author="team-lead",
)
# Verify integrity before installing
result = engine.skill_verify(bundle)
assert result["valid"] is True
# Install on another machine
engine.skill_install(bundle, scope_override="company", mode="skip")Merge Protocol — Conflict Resolution
Three strategies for merging rules from different sources:
Strategy | Description |
| Higher scope always wins |
| Conflicting rules adapted to "negotiated" scope |
| Both rules kept for manual review |
Quality Management
carrymem check # Check all
carrymem check --conflicts # Detect contradictions
carrymem check --quality # Find low-quality memories
carrymem check --expired # Find expired memories
carrymem clean --expired --dry-run # Preview cleanupTerminal UI
pip install textual
carrymem tuiInteractive terminal interface with sidebar filters, search, add, delete (d), and edit (e).
VS Code Extension
Rule management directly in your editor:
Rule sidebar with scope badges
Add/edit/delete rules via webview
Effectiveness report panel
Skill pack/install from file dialogs
Comparison
By Scenario
Scenario | Mem0 | Memobase | User as Code | CarryMem |
AI remembers what I said | ✅ | ✅ Profile | ✅ | ✅ Automatic |
Switch AI tools, still remembers | ❌ | ❌ | ❌ Code-only | ✅ One file follows you |
Don't want AI to remember something | ❌ | ⚠️ Limited | ⚠️ Delete code | ✅ Delete anytime, separate zones |
Remember without spending tokens | ❌ | ⚠️ LLM extract | ❌ LLM exec | ✅ 88% zero-cost |
Own your own data | ⚠️ Self-host only | ⚠️ Self-host | ✅ Local | ✅ Local file |
Execute user-defined rules | ❌ | ❌ | ✅ Python | ✅ Rule Engine |
Feature Matrix
CarryMem | Mem0 | Memobase | User as Code | OpenChronicle | ima | |
Key Differentiator | Zero-LLM + Rule Engine | Vector DB + Cloud | User Profile + Events | Executable Python | Local-first | Cloud notes |
Zero Dependencies | ✅ SQLite only | ⚠️ Vector DB optional | ⚠️ External | ⚠️ Python runtime | ✅ | ❌ Cloud |
Auto-Classification | ✅ 7 types | ❌ | ⚠️ Profile slots | ❌ | ❌ Manual | ❌ |
Identity Portrait | ✅ whoami | ❌ | ✅ Profile | ❌ | ❌ | ❌ |
Rule Engine | ✅ Scopes + Skills | ❌ | ❌ | ✅ Python functions | ❌ | ❌ |
Pack / Unpack | ✅ One file | ❌ | ❌ | ❌ | ❌ | ❌ |
Encrypted Carry | ✅ --encrypt | ❌ | ❌ | ❌ | ❌ | ❌ |
Auto-Backup | ✅ Every 20 writes | ❌ | ❌ | ❌ | ❌ | ❌ |
Cross-Language Recall | ✅ EN/CN/JP | ❌ | ❌ | ❌ | ❌ | ❌ |
Encryption | ✅ Built-in | ❌ | ❌ | ❌ | ❌ | ❌ |
Data Ownership | ✅ Local files | ⚠️ Self-hostable | ⚠️ Self-host | ✅ Local | ✅ Local | ❌ Cloud |
Note: Comparison based on publicly available information. Products evolve rapidly — please verify latest features. See docs/design/METHODOLOGY.md for the full design space positioning diagram and orthogonal classification table.
Key Difference: Other products store what you read. CarryMem stores who you are.
Design Space Positioning
CarryMem occupies a unique position at the intersection of three axes:
Portable ←————————————————————————————————→ Team-shareable
| CarryMem ⭐ Memobase
| (team, retrieval, external)
| Mem0
| (solo, retrieval, vector)
|————————————————————————————————————————————→ Executable
| User as Code
| (solo, executable, Python)Axis | CarryMem | Mem0 | Memobase | User as Code |
Portable | ✅ .carry file | ❌ | ❌ | ❌ code-only |
Team-shareable | ✅ | ❌ | ⚠️ profiles | ❌ |
Executable rules | ✅ Rule Engine | ❌ | ❌ | ✅ Python |
Zero dependencies | ✅ SQLite only | ⚠️ Vector DB | ⚠️ External | ⚠️ Python runtime |
CarryMem is the only framework at the intersection of team sharing, executable rules, and zero dependencies.
🏆 PrefEval — Preference Adherence Benchmark
Condition | Accuracy | Acknowledged | Violated | Hallucinated | Unhelpful |
Zero-shot | 71.5% | 160 | 27 | 3 | 31 |
Reminder | 80.0% | 199 | 2 | 1 | 38 |
CarryMem | 83.0% | 173 | 7 | 4 | 28 |
Protocol: PrefEval (ICLR 2025 Oral, Amazon Science) Sample: 200 items, 10 inter-turns, Claude Sonnet 4
Why this matters: Reminder injects "remember user preference" in every turn. CarryMem injects structured preferences in system prompt — more precise, more persistent, 24% fewer unhelpful responses.
Advantage | Result | |
💰 | Zero-LLM Ingestion | 88% memories need no LLM tokens |
⚡ | P99 Latency | 1.3ms — 93x faster than Mem0 |
🪶 | Dependencies | SQLite only — no vector DB |
🛡️ | Rule Engine | Only system with rule engine (competitors: 0%) |
Architecture
Three-Layer: Mixin + Facade + Protocol (v0.4.0)
┌─────────────────────────────────────────────────────────┐
│ Facade Layer │
│ CarryMem (unified entry point, health_check, version) │
├─────────────────────────────────────────────────────────┤
│ Mixin Layer (8 modules) │
│ Lifecycle │ MemoryCRUD │ Classification │ Recall │
│ Backup │ ProfileExport │ Maintenance │ PromptDelegate│
├─────────────────────────────────────────────────────────┤
│ Protocol Layer (10 Protocols) │
│ LifecycleOps │ BackupOps │ RecallOps │ ... │ CarryMemOps│
└─────────────────────────────────────────────────────────┘Data Flow:
User Input
↓
Auto-Classification (7 types, 4 tiers)
↓
Importance Scoring (confidence × type × recency × access)
↓
Smart Storage (SQLite + FTS5, WAL mode, thread-local pool, dedup, TTL, encryption)
↓
Memory Consolidation (P0: dedup+decay → P1: pattern→rules → P2: semantic merge)
↓
Semantic Recall (FTS5 + synonyms + spell fix + cross-language)
↓
Context Injection (token budget, relevance ranking)
↓
AI Tool (Cursor / Claude Code / any MCP client)Three-Tier Classification:
Rule Engine (60%+) → Pattern Analysis (30%) → Semantic (10%)
↓ ↓ ↓
Zero cost Near-zero cost Token costPatternAnalyzer Composition (v0.4.0 refactor — 1547→171 LOC):
PatternAnalyzer (facade, 171 LOC)
├── NoiseDetector — noise filtering (B1-B5, C5 rules)
├── FeedbackDetector — execution feedback detection
└── MemoryPatternDetectors — 8 memory type detectors
(preference/correction/fact/relationship/task/decision/sentiment/location)Backward compatible: from carrymem.layers.pattern_analyzer import PatternAnalyzer unchanged.
Module Overview
Module | Path | Description |
Core Engine | ||
|
| Lifecycle: |
|
| Core CRUD: |
|
| Classification pipeline internals + rule-delegate methods |
|
| Recall operations: memories, aggregated, timeline, knowledge |
|
| Backup & audit operations |
|
| Maintenance: conflict detection, quality scoring, expiry, consolidation |
|
| Profile, stats, export, import operations |
|
| Prompt delegation and LLM-powered features |
|
| Protocol interfaces for Mixin composition (structural typing) |
Error Handling (v0.4.0 New) | ||
|
| CarryMemError base class, 7 error ranges (CM-001~999), from_cause() factory |
|
| 37 bilingual error messages (Chinese + English) with actionable hints |
Adapters | ||
|
| StorageAdapter ABC + MemoryEntry/StoredMemory dataclasses |
|
| SQLite adapter (re-exports from |
|
| JSON file-based storage adapter (zero-dependency) |
|
| Obsidian vault knowledge-base adapter |
Monitoring (v0.4.0 New) | ||
|
| HealthChecker, MetricsCollector, AlertManager, MonitoringHTTPServer, LatencyTimer |
Plugins (v0.4.0 New) | ||
|
| PluginProtocol, PluginManager, HookPoint definitions, event dispatch |
Security | ||
|
| Permission constants & AccessPolicy (owner-based MVP) |
i18n (v0.4.0 New) | ||
|
| I18nManager dictionary-based translation, locale switching, variable interpolation |
Coordinators | ||
|
| Multi-phase classification orchestration |
Pattern Analysis (v0.4.0 split — was 1547 LOC God Class) | ||
|
| Thin facade (171 LOC) — backward-compatible API |
|
| Noise filtering (B1-B5, C5 rules, substantive content detection) |
|
| Execution feedback detection (positive/negative keywords) |
|
| 8 memory type detectors + result builders (1133 LOC) |
Advanced Usage
Obsidian Knowledge Base
from carrymem import CarryMem, ObsidianAdapter
cm = CarryMem(knowledge_adapter=ObsidianAdapter("/path/to/vault"))
cm.index_knowledge()
results = cm.recall_from_knowledge("Python design patterns")Async API
from carrymem import AsyncCarryMem
async with AsyncCarryMem() as cm:
await cm.classify_and_remember("I prefer dark mode")
memories = await cm.recall_memories("theme")JSON Adapter (No SQLite)
from carrymem import CarryMem, JSONAdapter
cm = CarryMem(adapter=JSONAdapter(path="/path/to/memories.json"))Memory Versioning
cm.update_memory(key, "Updated content") # Creates version 2
history = cm.get_memory_history(key) # [v1, v2]
cm.rollback_memory(key, version=1) # Restore v1Export Identity for Other AIs
# Export your AI identity
cm.export_profile(output_path="my_identity.json")
# On another device or AI tool
cm.import_memories(input_path="backup.json")Who Is This For?
Tired of repeating yourself? You use Cursor, Claude Code, ChatGPT daily. You've told AI your stack, your style, your decisions a hundred times. And it still asks "what framework do you prefer?" CarryMem makes your AI remember — so you don't have to keep reminding it.
Maintaining CLAUDE.md by hand? You already know AI needs memory. You have prompt files everywhere. They conflict, they go stale, and they don't follow you between tools. CarryMem auto-classifies your preferences, decisions, and corrections — and keeps them fresh automatically.
Building AI agents? Your agents forget users between sessions. You need a memory layer that's lightweight, local, and works with any LLM. CarryMem gives you 5-line integration, 7 memory types, and a rule engine — with zero dependencies beyond SQLite.
Documentation
Project Status
Current Version: v0.9.9 Tests: 4666+ non-e2e tests passing, 0 failed, 4 skipped (vector/semantic optional deps); 97 TUI tests passing Coverage: 80%+ mypy: 0 errors (150+ source files, CI blocking gate) flake8: 0 errors (black + isort formatted) radon: 0 D/E/F functions (CI blocking gate) Maturity: 80/100 (B) per 7-dimension DevSquad evaluation
Changelog:
v0.9.9: Methodology: orthogonal classification table (docs/design/METHODOLOGY.md) + design space positioning (README Comparison + COMPETITIVE_ANALYSIS). See docs/design/METHODOLOGY.md.
v0.9.8: Knowledge graph deletion completeness —
forget()now cascades tomemory_entities+memory_relations(TD-066, Oracle Agent Memory report启发). 4 new tests.v0.9.7: Tech debt cleanup — TD-003b/009/011b/002 follow-ups (deleted cli.py facade, added TUI fallback tests, downgraded SQLITE_SCHEMA to P3 observation).
v0.9.6: Nightly slow test threshold fix (store_messages batch API) + release.yml cp consistency.
v0.9.4: TD-063/TD-064/TD-065: test skip cleanup + flake8 bugbear fix + ruff config lock.
v0.9.3rc1: TD-015 Password-based publish restored (OIDC abandoned).
v0.9.2: P3 Tech Debt Cleanup — TD-031/049/050/051/053/054.
v0.9.1: TD-055 — mypy src/ baseline errors cleared 9 → 0.
v0.9.0: UI/UX Overhaul — Morandi Aesthetic + Accessibility + Onboarding.
v0.8.0: Graphify — 3 new MCP graph tools (query_graph, shortest_path, get_memory_impact), edge confidence labels (EXTRACTED/INFERRED/AMBIGUOUS) on memory_relations, schema migration v100.
v0.7.3: Security hardening — removed HMAC-CTR stream cipher fallback (cryptography is now a hard dependency), Fernet-only encryption, migration script for pre-v0.7.3 databases. Input validator defense-in-depth, batched LIKE queries, WAL throttle for recall access updates.
v0.7.2: Native Async I/O — async_sqlite adapter (aiosqlite), async recall/store APIs, Memify enhancement. P0 security fixes (fail-closed access control, MCP dispatcher injection), CI/CD hardening (bandit blocking, pip-audit, Docker non-root, pre-release test gate).
v0.7.1: Multi-Mode Retrieval — vector + FTS + semantic fusion with RRF, Memify content enrichment API.
v0.7.0: Knowledge Graph + Session Dual-Layer Memory — entity graph storage, session-scoped memory isolation, dual-layer recall.
v0.6.2: Security fix — access frequency weighting refinement, PBKDF2 260K→600K (OWASP 2023).
v0.6.1: Architecture cleanup — capabilities decoupling, adapter optimization (PATCH).
v0.6.0: Phase 3 Deprecated API Removal (Breaking Change) — legacy API cleanup, store_entry unified entry point.
v0.5.4: Batch API — store_batch/delete_batch for bulk operations (Phase 2 optimization).
v0.5.3: store_entry() core API — unified entry point (Phase 1 optimization).
v0.5.2: Summary Layer + Progressive Disclosure — token-efficient prompt injection, auto-summarization.
v0.5.1: Entity Normalization (Ontology-lite) — rule-based fuzzy entity matching.
v0.5.0: Configurable access frequency weighting + selection access_boost.
v0.4.0 (tech debt cleanup): PatternAnalyzer God Class split (1547→171 LOC facade + NoiseDetector + FeedbackDetector + MemoryPatternDetectors), mypy 536→0 errors with CI blocking gate, 394 public API docstrings added (50%→100%), 67 loose assertions strengthened (assertTrue→assertGreater), mypy.ini cleaned (python_version 3.10, removed unused sections). Maturity 74→80 (B-→B).
v0.4.0: Quality Sprint — 134 unit tests for core Mixins, health_check MCP tool (28 total), TUI delete/edit, CLI rules subcommand grouping, audit SQLite persistence, removed @runtime_checkable, merged StorageAdapterProtocol, all Any types replaced (24→0), mypy+bandit CI
v0.4.0: Protocol & Maturity Sprint — Mixin+Facade+Protocol 三层架构, 10个 Protocol 接口, 错误码体系 (CM-001~999), SQLite 连接池 (WAL+线程缓存), 加密升级 (PBKDF2 260K), E2E 测试补全 (+78), 监控框架 MVP, 插件系统 MVP, 权限系统 MVP, i18n 框架, 类型注解 ~82%, 72 new tests
v0.3.0: Maturity & Architecture Sprint — God Class→8 Mixin, exception narrowing (173→15), TUI enhancement (+453 lines, Morandi palette), constants.py (28 named), lazy import cache, ghost feature audit, 71 new tests
v0.2.5: Integration/E2E audit, ghost feature deprecation warnings, version chain validation, 83 new tests
v0.2.4: Beta release — CI root fix, 24 security fixes, Glama TDQS boost, 6-gate CI pipeline
v0.2.0: USB carry encryption, auto-backup, concurrent safety, PrefEval 83.0% (200 items), 8-client MCP setup
Contributing
git clone https://github.com/lulin70/carrymem.git
cd carrymem
pip install -e ".[dev]"
pytestSee Contributing Guide for details.
Citation
If you use CarryMem in your research, please cite:
@software{carrymem2026,
title = {CarryMem: Persistent Memory for AI Agents with Preference Injection},
author = {CarryMem Team},
year = {2026},
url = {https://github.com/carrymem/carrymem},
note = {Preference injection accuracy 83.0\% measured by PrefEval protocol}
}
@inproceedings{chuang2025prefeval,
title = {PrefEval: A Preference Evaluation Benchmark for LLMs},
author = {Chuang, Yun-Nung and others},
booktitle = {International Conference on Learning Representations (ICLR)},
year = {2025},
note = {Oral presentation, Amazon Science}
}Experimental Results (200 items, 10 inter-turns, Claude Sonnet 4)
Condition | Accuracy | Acknowledged | Violated | Hallucinated | Unhelpful |
Zero-shot | 71.5% | 160 | 27 | 3 | 31 |
Reminder | 80.0% | 199 | 2 | 1 | 38 |
CarryMem | 83.0% | 173 | 7 | 4 | 28 |
Key insight: CarryMem achieves the highest accuracy while producing 24% fewer unhelpful responses than reminder-based approaches, demonstrating that proactive memory injection is more precise than full-context reminding.
License
MIT License — see LICENSE
CarryMem — Your AI finally remembers who you are. Only you own the data.
Available Tools
31 toolsadd_ruleA
Add a behavioral rule to CarryMem's rule engine. Rules guide AI behavior for specific topics. Use 'company' scope for organization-mandated rules (highest priority), 'negotiated' for team-adapted rules, or 'personal' for individual preferences (lowest priority).
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Rule scope: company (org-mandated, cannot be overridden), negotiated (team-adapted), personal (individual preference) | personal |
| action | Yes | What to do when triggered (e.g., 'Always use SSL', 'Never commit secrets') | |
| trigger | Yes | Topic/scene that activates this rule (e.g., 'database', 'code review', 'security') | |
| override | No | Whether this rule overrides conflicting lower-scope rules | |
| rule_type | No | Rule type: always (mandatory), avoid (discouraged), forbid (prohibited), prefer (recommended), recommend (suggested) | always |
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 the scope priority but omits important behavioral traits such as what happens on rule conflicts, the effect of the 'override' parameter, or any authentication/authorization requirements. The agent is left to infer that override exists from the schema, but the description does not explain it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, each sentence adds distinct information: what the tool does, what rules are for, and how scopes work with priority. No 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 complexity (5 parameters, including override behavior, rule types, and scope priority), the description does not cover the behavioral interaction between rules (e.g., conflict resolution, effect of override). There is no output schema, so the agent does not know what the response contains. The description is incomplete for confident use in a rule engine context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters are documented. The description adds value by explaining the scope priority order and linking scope to use cases, but does not meaningfully augment the semantics of trigger, action, rule_type, or override. Baseline of 3 is appropriate as the description provides some but limited additional context.
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 adds a behavioral rule to the rule engine, distinguishing it from siblings like update_rule (modify) and delete_rule (remove). It also explains the scope priority, which helps differentiate from other tools.
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 explicit guidance on when to use the tool (to add a rule) and explains the use cases for each scope (company, negotiated, personal) with priority. It indirectly implies that updating or deleting rules should be done with siblings, but does not explicitly state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_classifyA
Batch classify multiple messages, each returning an independent MemoryEntry.
| Name | Required | Description | Default |
|---|---|---|---|
| messages | Yes | List of messages to batch classify |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses that each result is an independent MemoryEntry, but lacks details on side effects, permissions, rate limits, or what 'classify' entails behaviorally.
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 at two sentences, with no wasted words. It immediately conveys the core function and result structure.
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 complexity of a batch operation (multiple messages, independent results), the description is adequate but incomplete. It does not mention limits on batch size, error handling, or any prerequisites. The absence of an output schema reduces completeness requirements somewhat, but more detail would be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with descriptions for message and context in the schema. The tool description adds no new parameter information beyond what is already in the schema, so it meets the baseline without providing extra value.
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?
Description clearly states the tool batches classify multiple messages, distinguishing it from single-message siblings like classify_message. The verb 'classify' and resource 'messages' are specific, and the output 'each returning an independent MemoryEntry' clarifies the return type.
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 name implies batch use, but no explicit guidance is given on when to use this tool versus alternatives such as classify_message for single messages or classify_and_remember for combined actions. No exclusions or context are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
classify_and_rememberA
Classify a message AND store it if worth remembering. One-step operation: classify → store → return. Requires storage adapter to be configured.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Conversation context (optional) | |
| message | Yes | The message content to classify and store |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses the three-step workflow and the dependency on storage adapter configuration. However, it does not explain the criteria for 'worth remembering' or behavior on failure, leaving gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main purpose, followed by workflow and prerequisite. No redundant information, every sentence adds 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 no output schema and no annotations, the description covers the basic workflow and prerequisite but lacks details on classification criteria, return values, and differentiation from many sibling tools. Adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description adds no meaning beyond the schema. Both parameters have clear descriptions in the schema, meeting the baseline for high coverage.
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 combines classification and storage in one step, using specific verbs and resource. It distinguishes itself from siblings like classify_message (only classification) and forget_memory (storage removal).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for combined classification and storage but does not explicitly state when to use it versus alternatives. The requirement of a storage adapter provides some context, but no exclusions or when-not-to guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
classify_messageC
Analyze a message and determine if it contains memorable information. Returns a standardized MemoryEntry JSON with type, tier, confidence, and suggested_action. CarryMem is a CarryMem memory system with optional storage — it tells you WHAT to remember, and can optionally store it too.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Conversation context (optional). When user confirms/accepts AI suggestion, pass the previous AI reply to improve decision/correction classification quality. | |
| message | Yes | The message content to analyze for memorable information |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions returning a MemoryEntry JSON and optional storage, but it is unclear whether calling this tool has side effects (e.g., storing the memory). The phrase 'CarryMem is a CarryMem memory system with optional storage — it tells you WHAT to remember, and can optionally store it too' is ambiguous about the tool's behavior.
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 moderately concise (around 60 words) but the last sentence about the CarryMem system is somewhat confusing and could be streamlined. The core purpose is front-loaded, but the structure could be improved for clarity.
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 lack of annotations and output schema, the description should clarify side effects, output structure, and use cases. It vaguely mentions optional storage and return format but does not cover what happens if no memorable info is found or how to interpret the result. The presence of many sibling tools demands clearer context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds context about the output structure (MemoryEntry with fields) but does not enhance understanding of the parameters beyond the schema. Baseline score of 3 is appropriate.
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 analyzes a message to determine if it contains memorable information, which is specific. However, it does not explicitly differentiate from the sibling tool 'classify_and_remember', and the mention of optional storage blurs the boundary.
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?
No explicit guidance on when to use this tool versus alternatives like 'classify_and_remember' or 'batch_classify'. The description mentions optional storage but does not clarify if this tool itself stores data or not, leaving the use case ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consolidate_memoriesA
Run memory consolidation: deduplicate similar memories, apply time-based decay, clean up low-value entries, and detect patterns for rule promotion. Preferences are always preserved. P0 handles dedup+decay, P1 detects repeated patterns and generates rule candidates. Run periodically (e.g., daily) to keep memory store healthy. Use dry_run=true first to preview changes.
| Name | Required | Description | Default |
|---|---|---|---|
| run_p1 | No | If true, also run P1 pattern recognition and rule candidate generation (default true) | |
| run_p2 | No | If true, also run P2 semantic consolidation via host LLM (default true) | |
| dry_run | No | If true, only report what would be done without making changes (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes behavior per priority level (P0 dedup+decay, P1 patterns+rule candidates, P2 semantic via LLM) and notes preferences are preserved. No annotations exist, so description carries burden; it is fairly transparent but could mention side effects or return value more explicitly.
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?
Four sentences, front-loaded with core action and sub-actions. No fluff; every sentence adds essential information.
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?
Adequately explains the consolidation process and levels given no output schema. Could improve by describing the format of the preview report or typical output, but overall complete for maintenance 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 coverage is 100%, baseline 3. Description adds value by explaining the purpose of dry_run ('preview changes') and clarifying run_p1/run_p2 behaviors beyond the schema's boolean defaults.
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?
Clearly states the verb 'run' and resource 'memory consolidation', enumerating specific sub-actions (deduplicate, decay, clean up, pattern detection). Distinguishes from sibling tools like schedule_consolidation and stop_consolidation.
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?
Explicitly recommends periodic (daily) use and suggests using dry_run first. Lacks explicit when-not-to-use or alternatives but provides clear context for regular maintenance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declare_preferenceA
Let the user proactively tell the AI about themselves. User declarations are classified by the engine but always stored with confidence=1.0 and source_layer='declaration'. Active declaration + passive classification = complete memory coverage.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | What the user wants to declare (e.g., 'I prefer dark mode', 'We use PostgreSQL', 'My timezone is UTC+8') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses key behaviors: declarations are stored with confidence=1.0 and source_layer='declaration', and they are classified by the engine. This provides transparency about how declarations are processed. It does not detail side effects like overwriting, but the core behavior is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: the first captures the core purpose, the second details technical storage specifics, and the third ties to the broader memory system. No superfluous words or redundancy. It is front-loaded and efficient.
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 (1 required parameter, no output schema, no annotations). The description explains what it does and how it works internally. However, it does not mention what the tool returns (e.g., confirmation or status) or any prerequisites. For a simple tool, it is mostly complete but could include return behavior.
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 already provides 100% coverage with a clear description and example for the 'message' parameter. The description adds context about classification and storage but does not add new semantic meaning beyond what the schema offers. Baseline 3 is appropriate as the schema does the heavy lifting.
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's purpose: letting users proactively tell the AI about themselves. It specifies the action and resource, and the mention of classification and storage distinguishes it from siblings like add_rule or forget_memory. However, it could explicitly differentiate from classify_message to enhance clarity.
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 implicit usage context by contrasting active declaration with passive classification. It suggests using this tool when the user wants to explicitly state something. However, it lacks explicit guidance on when not to use it or mention alternatives, such as classify_and_remember for mixed cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_ruleA
Delete a rule by its ID. Use my_rules first to find the rule ID you want to remove. Returns confirmation with the deleted rule's details.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | The ID of the rule to delete (find it using my_rules) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses that the tool returns confirmation with deleted rule details, which is sufficient for a simple destructive action. Lacks mention of irreversibility, but that is implied by 'delete'.
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 concise sentences, zero waste. Each sentence earns its place: first states the action, second gives prerequisite and return info.
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 single-parameter delete tool with no output schema, the description completely covers the purpose, prerequisite, and return behavior. No 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 coverage is 100%, so the description adds little beyond what the schema already provides. It repeats 'find it using my_rules' from the schema description, offering no new semantic detail.
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 explicitly states 'Delete a rule by its ID', using a specific verb and resource. It clearly distinguishes the tool's action from siblings like add_rule or update_rule.
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?
Provides explicit guidance to use my_rules first to find the rule ID, which is a helpful prerequisite. No need for when-not-to-use given the simplicity of a delete operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forget_memoryB
Delete a stored memory by ID. Requires storage adapter.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes | Memory ID (storage_key) to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It only states 'Delete' and 'Requires storage adapter', omitting details like permanence of deletion, error cases, or side effects. Minimal behavioral context.
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 sentences with no wasted words. The action is front-loaded, and the prerequisite is clearly stated. Highly concise.
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 27 siblings and no output schema, the description is too brief. It lacks information on return values, error behavior, and does not help the agent distinguish when to use this tool vs other memory tools like consolidate_memories.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for memory_id. The description adds no extra parameter meaning beyond what the schema provides, so baseline score of 3 is appropriate.
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 'delete' and resource 'stored memory' with method 'by ID'. It clearly states the action and distinguishes from siblings like recall_memories or consolidate_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?
The description mentions a prerequisite ('Requires storage adapter'), providing some guidance on when it can be used. However, it does not specify when to use this tool versus alternatives or provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_classification_schemaA
Return CarryMem's complete classification schema definition including 7 memory types, 4 storage tiers, confidence thresholds, and downstream mapping tables.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states it 'returns' data, implying a read operation, but with no annotations provided, it does not explicitly declare read-only or non-destructive behavior. It adds some context about the returned content but lacks details on auth requirements, performance characteristics, or potential side effects. The name itself already suggests a getter, so the description provides limited behavioral transparency beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 21 words, efficiently listing the schema components without redundancy. It is front-loaded with the main action and resource, making it quick to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description adequately conveys the scope (complete schema definition) and key contents (memory types, storage tiers, thresholds, mapping tables). For a simple retrieval tool with one parameter, this is sufficient to inform the agent about what to expect. It could be slightly more complete by noting that the response is a static definition, but overall well-rounded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, as the single parameter 'format' has a description in the schema. The tool description does not add any further meaning or context about the parameter, so it meets the baseline expectation but does not exceed it.
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 the specific verb 'Return' and clearly identifies the resource as 'CarryMem's complete classification schema definition'. It enumerates the included components (7 memory types, 4 storage tiers, etc.), making the tool's purpose unambiguous and distinct from sibling tools focused on classification actions or rule management.
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?
No explicit guidance is provided on when to use this tool versus alternatives like classify_message or get_memory_profile. The description does not mention prerequisites, context, or situations where this tool is preferred, leaving the agent without direction for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_memory_impactA
Compute the graph impact of a memory. Returns the number of entities linked to the memory, the number of relations it evidences, whether it spans multiple namespaces, and an impact_score (entity_count0.4 + relation_count0.4 + cross_namespace*0.2). Requires storage adapter with graph capability.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes | The memory's storage_key (memory_id) to evaluate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries full burden and excellently discloses behavior: it lists all return fields and even provides the exact formula for impact_score. It also mentions the requirement for graph capability. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the purpose and output details, then adding the prerequisite. Every sentence provides essential information with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the output comprehensively given there is no output schema, and the single parameter is well-documented. However, it lacks information about error handling (e.g., memory not found, missing graph capability). For a simple tool, this is mostly 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 has 100% description coverage for the single parameter 'memory_id'. The description adds only the prerequisite context ('Requires storage adapter...') but does not elaborate on the parameter beyond what the schema already provides. Thus baseline 3.
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 computes the 'graph impact of a memory', specifying the exact metrics returned (entities, relations, cross-namespace flag, impact_score). This differentiates it from sibling tools like 'get_memory_profile' or 'query_graph'.
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 mentions the prerequisite 'Requires storage adapter with graph capability', but does not provide guidance on when to use this tool versus alternatives like 'get_memory_profile' or 'recall_memories'. No explicit when-not-to-use or alternative naming.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_memory_profileA
Get a structured summary of what the AI remembers about the user. Returns highlights (top preferences, decisions, corrections), statistics (by type, by tier, avg confidence), and a human-readable summary. Lets users see and audit what AI remembers.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool returns a structured summary, highlights, statistics, and a human-readable summary. It implies a read-only operation (no mention of modification). Could add explicit side-effect info, but overall adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: states purpose, details output components, and adds a benefit statement. No wasted words, well-structured, and front-loaded.
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 (0 params, no output schema), the description fully explains what it does and what the output contains. It covers the full scope of the tool's function.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are 0 parameters, and schema coverage is 100% (empty schema). The description does not need to add parameter info. Baseline for 0 params is 4, which is appropriate.
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's function: 'Get a structured summary of what the AI remembers about the user.' It specifies the resource (memory profile) and verb (get), and distinguishes it from siblings by detailing the output type (highlights, statistics, summary) which is different from raw memory queries.
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 mentions it 'Lets users see and audit what AI remembers,' implying an overview/audit use case. However, it does not explicitly state when not to use it or provide alternatives among the many sibling tools (e.g., recall_memories for specific memories).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_system_promptA
Generate a system prompt with user memories and knowledge base context injected. The prompt follows the 'memory-first' retrieval priority: User Memories > Knowledge Base > General Knowledge. Use this to inject CarryMem context into any AI agent's system prompt.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional context/topic to filter relevant memories (e.g., 'database setup', 'coding style'). If empty, returns all memories. | |
| language | No | Language for the prompt template: en, zh, or ja (default en) | en |
| max_memories | No | Maximum number of memories to include (default 10) | |
| max_knowledge | No | Maximum number of knowledge base entries to include (default 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It reveals the retrieval priority (memory-first) and that it injects context, which is useful. However, it does not disclose other behavioral traits such as whether the operation is read-only, authentication requirements, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with only two sentences. The first sentence defines the core function and retrieval order, and the second provides usage guidance. No unnecessary information is included.
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 4 parameters and no output schema, the description covers the purpose and retrieval priority well. However, it could be more explicit about the return format (e.g., the type of output), but the tool name and context make the output fairly obvious.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does not add additional meaning beyond what the schema already provides for each parameter; it only summarizes 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 clearly states that the tool generates a system prompt with injected user memories and knowledge base context, specifying the retrieval priority. It distinguishes itself from sibling tools by focusing on system prompt generation rather than memory recall or management.
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 this to inject CarryMem context into any AI agent's system prompt,' providing clear guidance on when to use the tool. However, it does not mention when not to use it or present alternatives, leaving some room for improvement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkA
Check CarryMem system health. Returns adapter health, audit logger stats, memory count, and uptime. Lightweight check that does not start any HTTP service — use this from MCP clients to verify CarryMem is operational.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description fully discloses behavior: it is a lightweight check that does not start HTTP services and returns specific health indicators. No contradictions with missing annotations.
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 sentences effectively convey purpose, return values, and usage context with no wasted words. Front-loaded with the key action.
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 parameterless health check, the description covers purpose, return items, and usage context. Missing details like error handling or status codes, but overall adequate for the tool's simplicity.
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?
Tool has no parameters, and schema coverage is 100% (empty). The description adds value by listing return fields and stating it is lightweight, exceeding the baseline.
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 checks system health and lists specific return values (adapter health, audit logger stats, memory count, uptime), distinguishing it from sibling tools that deal with classification, rules, or 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?
The description explicitly advises use from MCP clients to verify operational status and notes it does not start any HTTP service, providing clear context. No exclusions or alternatives mentioned, but the simplicity of the tool compensates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_knowledgeA
Index an Obsidian vault or knowledge base for full-text search. Scans Markdown files, extracts YAML frontmatter tags and wiki-links, builds FTS5 index. Requires knowledge adapter (ObsidianAdapter).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, but description discloses scanning of Markdown files, extraction of YAML frontmatter and wiki-links, and building of FTS5 index. Provides behavioral detail beyond a simple 'index' statement.
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 sentences, front-loaded with purpose, no redundant words. Every sentence adds 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?
Covers core functionality and prerequisite. No output schema, but description implies index is built for later search. Could mention duration or scope, but sufficient.
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?
No parameters; schema coverage 100%. Baseline 4 applies. Description adds value by explaining the type of content indexed.
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?
Clearly states the verb 'Index' and the resource 'Obsidian vault or knowledge base' with specific purpose 'for full-text search'. Distinct from sibling retrieval tools.
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?
Mentions requirement of knowledge adapter (ObsidianAdapter) as prerequisite. Does not explicitly specify when to use or alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inject_rulesB
Generate a formatted rules section for injection into AI prompts. Returns structured text with applicable rules for a given context, including scope labels and priority markers.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format: structured (markdown), compact (single line), json, anchored (by type) | structured |
| context | Yes | Context/topic to filter relevant rules | |
| max_rules | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It indicates generating text with no side effects, but does not disclose permissions, rate limits, or whether the operation is read-only.
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 sentences that efficiently state purpose and output characteristics with no superfluous content.
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?
Adequate for a simple generation tool, but missing details on max_rules behavior and exact output structure (no output schema). Could specify that output is a string suitable for embedding.
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?
Two of three parameters have schema descriptions (context and format). The description adds context about output content but does not explain max_rules. Schema coverage is 67%, so baseline 3 is justified.
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 it generates a formatted rules section for injection into AI prompts, which distinguishes it from siblings that add, list, or match rules. However, it does not explicitly differentiate from list_rules or match_rules.
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?
No guidance on when to use this tool versus alternatives. The description only mentions 'for injection into AI prompts' but does not exclude cases where raw rule lists or other formats are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rulesC
List all rules in CarryMem's rule engine, optionally filtered by scope or trigger topic.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| scope | No | Filter by scope (optional) | |
| status | No | Filter by status | active |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must disclose behavior. It omits important details such as pagination, ordering, rate limits, permissions, and the result of an empty query, leaving significant gaps for a list 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?
While very short, the description includes an inaccurate filter (trigger topic) that wastes the agent's attention. Correctness trumps brevity here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and 3 parameters with moderate schema coverage. The description lacks essential details about response format, sorting, or behavior when filters yield no results, leaving the agent underinformed.
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 input schema has 67% description coverage; the description adds 'trigger topic' which is not a parameter, misleading the agent. It provides no extra meaning for the 'limit' parameter, which lacks schema-level 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 description clearly identifies the action (list) and resource (rules in CarryMem's rule engine), but incorrectly mentions filtering by 'trigger topic' which does not exist in the input schema, causing potential confusion.
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?
No guidance on when to use this tool versus sibling tools like my_rules or match_rules. The mention of optional filters is incomplete and inaccurate, failing to set proper usage expectations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_rulesA
Match rules against a scene/topic and return applicable rules with scores. Use this to find which rules apply to a given context before generating a response.
| Name | Required | Description | Default |
|---|---|---|---|
| scene | Yes | The scene/topic to match rules against (e.g., 'database design', 'code review process') | |
| scopes | No | Filter by scopes (optional, defaults to all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states it returns applicable rules with scores but does not disclose any behavioral traits such as whether it is a read-only operation, performance implications, or authorization 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?
Two concise sentences, front-loaded with the main action, no extraneous information.
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 low complexity (2 parameters, no output schema), the description is adequate but lacks details about the scoring mechanism or how results are ordered, which could be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description does not add additional meaning beyond what the input schema already provides for 'scene' and 'scopes'. Baseline of 3 is appropriate.
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?
Description clearly states the verb 'match', the resource 'rules', and the outcome 'return applicable rules with scores'. It distinguishes from sibling tools like list_rules by specifying matching against a scene/topic.
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?
Provides a clear use case: 'before generating a response'. However, it does not mention when not to use this tool or suggest alternative tools like classify_message or recall_memories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_profileA
Get a complete view of your CarryMem identity: memory statistics, rule summary, recent activity, and preference distribution. Use this to understand what CarryMem knows about you.
| Name | Required | Description | Default |
|---|---|---|---|
| include_rules | No | Include rule summary and distribution | |
| include_memories | No | Include memory statistics and recent memories |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full responsibility for behavioral disclosure. It implies a read-only operation ('Get') but does not explicitly state that it is non-destructive or whether it has side effects. The lack of explicit safety claims is a minor gap.
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 consists of two concise sentences with no redundant words. It front-loads the core purpose and is easy to scan, achieving high efficiency.
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 simple tool with two optional boolean parameters and no output schema, the description adequately conveys what the tool returns. It could be considered complete for this level of complexity, though mentioning the output structure (e.g., 'returns a profile object') would be slightly better.
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?
Both parameters have clear descriptions in the input schema, covering 100% of schema documentation. The tool description adds no additional meaning beyond restating that the profile includes memory statistics and rule summary. With high schema coverage, a baseline score of 3 is appropriate.
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's purpose: getting a complete view of the user's identity, listing specific components like memory statistics and rule summary. It uses a specific verb ('Get') and resource ('CarryMem identity'). However, it does not explicitly differentiate from the sibling tool 'get_memory_profile', which might have overlapping functionality.
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 includes a usage hint ('Use this to understand what CarryMem knows about you'), which provides context. However, it lacks explicit guidance on when not to use this tool or alternatives, such as 'recall_memories' for specific memory retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_rulesA
View all your saved rules in a readable summary format. Shows rule triggers, actions, scope, type, and override status. Use this to review what CarryMem remembers about your preferences and behavioral rules.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Filter by scope (optional) | |
| status | No | Filter by status | active |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavior. It implies read-only ('View'), but no mention of side effects, authentication, or freshness guarantees. Adequate but could be more explicit.
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 sentences, no wasted words. First sentence states purpose and output fields, second gives usage context. Efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description compensates by listing output fields ('triggers, actions, scope, type, override status'). For a simple read tool with two optional params, this is nearly 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 coverage is 100% with clear parameter descriptions. The description adds output field context but does not enhance parameter understanding beyond the schema, so baseline 3.
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 views saved rules in a summary format, listing fields shown. It differentiates from siblings like add_rule, update_rule, and delete_rule, but the sibling 'list_rules' exists and the distinction is not fully clarified.
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 says 'Use this to review what CarryMem remembers about your preferences and behavioral rules,' providing a use case but not explicitly stating when not to use or alternatives like list_rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onboardA
First-time user onboarding. Returns a welcome message and asks key preference questions to initialize your CarryMem profile. Call this when a new user starts their first conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language for the onboarding message | en |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It mentions returning a welcome message and asking questions but does not disclose side effects like whether it modifies user state or if it's idempotent. For a tool that initializes a profile, this is a significant gap.
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 clear, front-loaded sentences with no extraneous information. Every word contributes to understanding the tool's purpose and usage.
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 simplicity of the tool (one optional parameter, no output schema), the description is fairly complete. It could mention that it's a one-time operation, but overall it provides adequate context for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter 'language'. The description adds no extra meaning beyond what the schema already provides, so it meets the baseline expectation.
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 indicates it's for first-time user onboarding, specifying it returns a welcome message and asks preference questions to initialize the profile. This distinguishes it from sibling tools that handle existing user operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states 'Call this when a new user starts their first conversation,' providing clear guidance on when to use. It does not mention when not to use or alternatives, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_rulesA
Run the full promotion pipeline: analyze memories, detect patterns, generate rule candidates, and optionally auto-accept them. Use this to convert accumulated preferences into active rules.
| Name | Required | Description | Default |
|---|---|---|---|
| auto_accept | No | If true, automatically accept all suggested rules. If false, rules are queued for your review. | |
| memory_type | No | Filter to a specific memory type (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral transparency. It outlines the pipeline steps but does not disclose whether the operation is destructive, requires authentication, or has side effects like modifying memories. The description implies a multi-step process but lacks details on duration or state changes.
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 exceptionally concise with two short sentences. The first sentence front-loads the primary action and steps, and the second provides the use case. Every word adds value with no redundancy or fluff.
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 2-parameter pipeline tool with no output schema, the description gives a high-level overview but omits return values, error states, or preconditions. It mentions 'accumulated preferences' without defining the threshold. While the description is adequate for basic use, a more complete one would clarify outputs and edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no new meaning beyond the schema: 'optionally auto-accept them' mirrors the auto_accept parameter description. The memory_type parameter is not elaborated further.
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 runs the full promotion pipeline, analyzing memories, detecting patterns, generating rule candidates, and optionally auto-accepting them. It specifies the verb 'run' and the resource 'promotion pipeline', and explains the outcome of converting preferences into active rules. However, it does not explicitly differentiate from sibling tools like suggest_rules, which may offer a similar but lighter functionality.
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 includes a usage directive: 'Use this to convert accumulated preferences into active rules.' This provides context but no explicit guidance on when not to use the tool or what alternatives exist. For instance, it does not contrast with suggest_rules, which might be used for only generating suggestions without auto-acceptance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_graphA
Multi-hop graph traversal from an entity. Performs BFS traversal of the knowledge graph starting from the given entity, collecting all connected entities and memories within max_hops hops. Requires storage adapter with graph capability.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum memories to return (default 20, max 100) | |
| max_hops | No | Maximum traversal depth (default 2, max 5) | |
| entity_text | Yes | The starting entity text to traverse from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavioral traits. It describes the algorithm and requirements but does not state that the tool is read-only (no side effects), nor does it mention auth needs or rate limits. This is a significant gap for a graph traversal tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: first states the purpose, second adds algorithmic detail and a prerequisite. No wasted words, front-loaded with key action. Perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should clarify return structure. It mentions 'collecting all connected entities and memories' which hints at output but lacks specifics on format or pagination. With no annotations, completeness is adequate but not thorough.
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?
Input schema has 100% coverage with descriptions for all three parameters. The description adds context about BFS traversal but does not add meaning beyond what the schema already provides for each parameter. Baseline score of 3 is appropriate.
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 performs 'multi-hop graph traversal' from an entity using BFS, specifying the starting entity and collecting connected entities and memories within max_hops. This distinguishes it from sibling tools like 'shortest_path'.
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 mentions the prerequisite 'Requires storage adapter with graph capability' but does not explicitly state when to use this tool versus alternatives (e.g., shortest_path for path finding). Provides necessary context but lacks comparative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recall_allA
Unified retrieval across both memories (SQLite) and knowledge base (Obsidian). Returns results from both sources with priority: memories first, then knowledge. Requires at least one adapter configured.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results per source (default 20) | |
| query | Yes | Search query | |
| filters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description discloses source prioritization and configuration requirement, adding behavioral context beyond the input schema.
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 sentences, no waste, front-loaded with key behavior and prerequisite.
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 absent output schema and nested filters, description does not elaborate on response format or filter interaction, leaving some gaps despite adequate core purpose.
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 high (67%), and description adds no additional parameter meaning beyond what the schema already provides for query, filters, and limit.
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?
Description clearly states unified retrieval across two sources (memories and knowledge base) with priority order, distinguishing it from sibling tools recall_memories and recall_from_knowledge.
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?
Mentions prerequisite 'Requires at least one adapter configured' and priority behavior, but does not explicitly state when to use this vs individual recall tools or provide when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recall_from_knowledgeA
Search knowledge base (e.g., Obsidian vault) using full-text search. Returns matching notes with title, content preview, tags, and wiki-links. Requires knowledge adapter.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 20) | |
| query | Yes | Search query for full-text search | |
| filters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It explains the return structure (title, preview, tags, links) but does not disclose side effects, authorization needs, rate limits, or error behavior. It adds some behavioral context but not comprehensively.
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 sentences, efficient and front-loaded. First sentence states the core action, second states output. No redundant 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?
The description covers the tool's purpose and return structure despite lacking an output schema. Missing details on filter logic and adapter requirements, but for a search tool with few parameters the description is mostly 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 67%, so the baseline is 3. The description adds context that the search is full-text and returns specific fields, but it does not elaborate on parameter behavior (e.g., how filters combine, default vs. explicit limit). It provides moderate added value.
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 a knowledge base using full-text search and lists what it returns (title, content preview, tags, wiki-links). It distinguishes from sibling tools like 'recall_memories' or 'recall_all' by specifying the 'knowledge base' and 'full-text search' verbs.
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 mentions a prerequisite ('Requires knowledge adapter') but provides no guidance on when to use this tool versus alternatives like 'recall_memories' or 'recall_all'. There is no explicit 'when to use' or 'when not to use' context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recall_memoriesB
Retrieve stored memories. Supports filtering by type, tier, and confidence. Supports full-text search. Requires storage adapter.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 20) | |
| query | No | Search query for full-text search (optional) | |
| filters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description implies read-only but does not disclose behavior like result ordering, pagination limits, or error handling. Minimal behavioral context beyond basic retrieval.
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 sentences, 18 words, no redundancy. Efficient but lacks depth; could include key details without adding bulk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema; description omits return format, sorting, or pagination details. For a retrieval tool, this is insufficient for agents to interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%; description summarizes existing parameter roles (filtering, full-text search) but adds no new meaning beyond what the schema descriptions state. Baseline score of 3 is appropriate.
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?
Verb 'Retrieve' + object 'stored memories' clearly states action and resource. Differentiates from siblings like recall_all by specifying filtering and full-text search support.
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?
No guidance on when to use this vs alternatives (e.g., recall_all, recall_from_knowledge). Only mentions prerequisite 'Requires storage adapter', but no context on when filtering is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_consolidationB
Schedule periodic memory consolidation (dedup, decay, cleanup) at a fixed interval
| Name | Required | Description | Default |
|---|---|---|---|
| run_p1 | No | If true, also run P1 pattern recognition | |
| run_p2 | No | If true, also run P2 semantic consolidation | |
| dry_run | No | If true, only report what would be done without making changes | |
| interval_hours | No | Hours between consolidation runs (minimum 0.1 = 6 minutes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are available, so the description must fully disclose behavioral traits. It mentions 'schedule' and 'periodic' but fails to explain whether calling the tool again replaces an existing schedule, what permissions are needed, or what side effects occur (e.g., resource usage). The 'dry_run' parameter suggests a preview mode, but this is not highlighted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the verb and resource. It is efficient but could benefit from additional structure (e.g., bullet points for behavioral notes) to improve scannability. No 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?
The description covers the core function, but given the complexity of scheduling (persistence, idempotency, cancellation) and the lack of an output schema, it leaves gaps. The schema explains parameters well, but the agent lacks information on how to cancel the schedule or what happens on repeated invocations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, setting a baseline of 3. The description adds context about consolidation tasks (dedup, decay, cleanup) which loosely aligns with parameters like run_p1 and run_p2, but it does not add specific parameter-level semantics beyond the schema. The default values and descriptions in the schema are sufficient.
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 verb 'Schedule', the resource 'memory consolidation', and specifies the scope 'periodic'. It includes specific tasks (dedup, decay, cleanup) which distinguishes it from one-time consolidation tools like 'consolidate_memories' and cancellation tools like 'stop_consolidation'.
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 the tool is for scheduling periodic maintenance but does not explicitly state when to use this tool versus alternatives like 'consolidate_memories' for immediate runs. No when-not or exclusion guidance is provided, though the sibling list offers context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shortest_pathA
Find the shortest path between two entities in the knowledge graph using bidirectional BFS. Returns the path as a list of entity texts from source to destination. Useful for understanding how concepts are connected. Requires storage adapter with graph capability.
| Name | Required | Description | Default |
|---|---|---|---|
| max_hops | No | Maximum path length to search (default 4, max 10) | |
| dst_entity | Yes | The destination entity text | |
| src_entity | Yes | The source entity text |
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 states the algorithm (bidirectional BFS) and return format, but does not disclose whether the tool is read-only or has side effects. Given the nature of path finding, it is likely read-only, but this is not explicit.
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, consisting of three sentences that efficiently convey the tool's purpose, algorithm, output, prerequisites, and use case. No redundant information.
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 absence of an output schema, the description adequately indicates the return format (list of entity texts). It could be improved by noting behavior when no path is found or when max_hops is exceeded, but overall it covers the essential aspects for a path-finding 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 coverage is 100% with descriptions for each parameter. The description adds no additional semantic value beyond what the schema already provides, such as explaining the meaning of 'max_hops' or the format of entity texts.
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 finds the shortest path between two entities using bidirectional BFS. It specifies the resource (knowledge graph) and the operation (path finding). However, it does not explicitly differentiate from similar sibling tools like 'query_graph', which may also return paths.
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 mentions it is useful for understanding how concepts are connected and requires a storage adapter with graph capability. It provides some context but does not specify when to use this over alternatives or 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.
stop_consolidationA
Stop the scheduled periodic memory consolidation
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; the description does not disclose whether the action is reversible, idempotent, or what happens to ongoing consolidations.
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?
Single sentence with no superfluous information, achieving maximum conciseness.
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 no-parameter tool, the description covers the core function. Minor gap: no mention of side effects or reversibility.
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?
No parameters exist, so baseline 4 applies. The description does not need to add parameter detail.
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 'Stop' and identifies the resource as 'scheduled periodic memory consolidation', clearly distinguishing it from sibling tools like 'schedule_consolidation'.
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?
Implies usage to cancel a scheduled task but offers no explicit guidance on when to use versus alternatives like 'consolidate_memories' or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_rulesA
Analyze your stored memories and suggest rule candidates based on detected patterns. Useful for discovering preferences you've expressed multiple times that could become formal rules.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_type | No | Filter analysis to a specific memory type (optional) | |
| max_candidates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. It states the tool analyzes and suggests but does not mention side effects, required permissions, whether it modifies memory, or any read-only nature. This lack of detail is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the action and outcome, with no wasted words. It efficiently conveys the core purpose and usage context.
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 no output schema and no annotations, the description is sparse. It does not explain the output format, how candidates are presented, or limitations such as the number of memories analyzed. For a suggestion tool, more detail is needed for complete understanding.
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 describes memory_type with enum and description, and max_candidates with default/min/max but no description. The tool description adds no additional meaning beyond 'multiple times' which is not tied to parameters. With 50% schema coverage, the description fails to compensate for gaps.
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 analyzes stored memories and suggests rule candidates based on detected patterns, distinguishing it from sibling tools like add_rule, list_rules, etc. The verb 'analyze and suggest' and resource 'memories/rule candidates' are specific and 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 indicates usefulness for discovering repeated preferences that could become formal rules, giving context for when to use it. However, it does not explicitly state when not to use it or compare to alternatives like match_rules, leaving room for improvement in guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
summarize_and_storeA
Request the host AI to summarize conversation content, then store the summary as a session_summary memory. This implements the 'borrow host LLM' pattern: CarryMem returns the content that needs summarizing, the host AI generates a concise summary focusing on user preferences, decisions, and key facts, then calls classify_and_remember or declare_preference to store it. No external LLM API key needed.
| Name | Required | Description | Default |
|---|---|---|---|
| namespace | No | Namespace for the stored summary (default 'default') | default |
| max_tokens | No | Maximum tokens of content to return for summarization (default 2000) | |
| session_id | Yes | The session ID to summarize |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description explains the host LLM usage and storage delegation, but omits side effects, error behavior, or reversibility. The pattern is described but not fully transparent.
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 four sentences, front-loaded with purpose, and efficiently conveys the pattern. Some redundancy exists but it remains clear.
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 no output schema and many siblings, the description lacks details on return values, error handling, and the exact role of the tool in the storage step. It is incomplete for an agent to use confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description adds minimal value beyond parameter descriptions. It does not elaborate on max_tokens semantics or namespace usage beyond defaults.
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 it requests summarization and stores a session_summary memory. It explains the 'borrow host LLM' pattern and distinguishes from siblings by specifying no external LLM API key needed.
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 outlines the workflow but does not explicitly state when to use this tool vs. alternatives like classify_and_remember or declare_preference. It implies use for summarization but lacks exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ruleA
Update an existing rule's trigger, action, scope, or type. Use my_rules first to find the rule ID. Returns the updated rule details.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | New scope, optional | |
| action | No | New action (what to do), optional | |
| rule_id | Yes | The ID of the rule to update | |
| trigger | No | New trigger (topic/scene), optional | |
| override | No | New override flag, optional | |
| rule_type | No | New rule type, optional |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. It mentions updating and returning details but does not clarify whether unspecified fields are preserved or reset (partial update behavior), nor does it address permissions, side effects, or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and contains no extraneous words. It is highly efficient.
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 no output schema, the description adequately states that it returns updated rule details. However, it lacks context on error handling, partial update semantics (field preservation vs. reset), and constraints like required permissions, which are not covered by annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description echoes the schema by naming some parameters (trigger, action, scope, type) but adds no additional meaning or usage context beyond what the schema already provides.
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 verb 'Update' and the resource 'existing rule', listing specific attributes (trigger, action, scope, or type) that can be modified. This distinguishes update_rule from sibling tools like add_rule (create) and delete_rule (delete).
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 advises using my_rules first to find the rule ID, providing a clear prerequisite. While it doesn't explicitly state when not to use this tool, the context of sibling tools implies alternatives for creation, deletion, and listing.
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.
3 tool updates
v0.8.0- Added
get_memory_impact - Added
query_graph - Added
shortest_path
28 tool updates
v0.4.0- First observed
add_rule - First observed
batch_classify - First observed
classify_and_remember - First observed
classify_message - First observed
consolidate_memories - First observed
declare_preference - First observed
delete_rule - First observed
forget_memory - First observed
get_classification_schema - First observed
get_memory_profile - First observed
get_system_prompt - First observed
health_check - First observed
index_knowledge - First observed
inject_rules - First observed
list_rules - First observed
match_rules - First observed
my_profile - First observed
my_rules - First observed
onboard - First observed
promote_rules - First observed
recall_all - First observed
recall_from_knowledge - First observed
recall_memories - First observed
schedule_consolidation - First observed
stop_consolidation - First observed
suggest_rules - First observed
summarize_and_store - First observed
update_rule
TDQS
Most tools have distinct purposes, but classify_and_remember and classify_message overlap in functionality (the former combines classification and storage). Similarly, suggest_rules and promote_rules both analyze patterns for rule generation, though at different stages. Overall, descriptions help distinguish, but some pairs could cause misselection.
Tools predominantly use snake_case and follow a verb_noun pattern (e.g., add_rule, list_rules, recall_memories). However, a few deviate: health_check is noun_noun, batch_classify is adjective_verb, and get_classification_schema mixes verb+noun phrase. These minor inconsistencies prevent a perfect score.
With 28 tools, the server covers a broad domain (memory, rules, knowledge, consolidation). While each tool has a clear purpose, the count feels slightly high. Some consolidation is possible (e.g., merging suggest_rules into promote_rules with a flag) without losing functionality.
The tool set covers core CRUD for rules and memories, classification, retrieval, and consolidation. However, there is no tool to update a stored memory (only forget_memory), and knowledge management lacks update/delete operations. Additionally, bulk memory listing is absent, relying on recall_memories with filters.
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
AI memory layer — one shared, persistent memory across every AI tool you connect.
A self-improving memory layer. Your memory, notes, tasks and goals, remembered everywhere.
Universal memory for AI agents and tools. Save, organize and search context anywhere.
Universal persistent memory and knowledge retrieval layer for AI agents and LLMs.
11
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceUniversal AI memory layer that provides cross-client, cross-repo context management with semantic search, automatic code indexing, and session management. Enables persistent developer memory across projects with typed memories, graph-based relationships, and RAG-powered retrieval.4MIT
- AlicenseNot gradedqualityDmaintenanceProvides a persistent, vendor-neutral memory layer that allows AI tools and agents to share context and knowledge across different platforms while maintaining local data ownership. It enables users to store, recall, and manage structured memories through hybrid semantic search and automated context assembly.16Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA persistent memory layer for AI tools that decouples personal data from AI's unstable memory, enabling you to mention information once and have it remembered forever across all conversations.3MIT
- AlicenseNot gradedqualityCmaintenanceA vendor-neutral, user-sovereign memory layer for AI agents and tools, providing persistent, cross-tool memory that users fully own and control.18Apache 2.0
Appeared in Searches
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/lulin70/carrymem'
If you have feedback or need assistance with the MCP directory API, please join our Discord server