# remem-mcp — Local-first MCP Memory + CodeGraph + Wiki (npm · remem-mcp)

Local-first memory for AI coding agents. Memory + CodeGraph + Wiki in one SQLite file.

- Trust score: 66/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-20

## Components

- npm · `remem-mcp`: 66/100 (this document), [markdown](https://verifymcp.io/servers/tinhien11-remem-mcp/remem-mcp.md), [page](https://verifymcp.io/servers/tinhien11-remem-mcp/remem-mcp)

## Channel facts

- Registry: `npm`
- Package: `remem-mcp`
- Version: `0.5.17`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-20.

- **Supply Chain Security**: 84/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects adm-zip 0.5.18, reached via @huggingface/transformers > onnxruntime-node > adm-zip. A fixed version is available.
  - Runs a script at install time (postinstall) that we could not recognise. It may be perfectly ordinary, but we do not read the published tarball, so we cannot say what it does.
  - Dependency health was assessed across the 185 of 187 dependencies we could resolve, so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 3 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 84/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3707 tokens (~123/item across 30 items; 28 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 98/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 94% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add tinhien11-remem-mcp -- npx -y remem-mcp
```

### Codex

```bash
codex mcp add tinhien11-remem-mcp -- npx -y remem-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "tinhien11-remem-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "remem-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add tinhien11-remem-mcp --command npx --arg -y --arg remem-mcp
```

### Hermes

```yaml
mcp_servers:
  tinhien11-remem-mcp:
    command: "npx"
    args: ["-y", "remem-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "tinhien11-remem-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "remem-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-15 (score 66)

First indexed and scored.

## MCP tools (28)

### `recall` (~284 tokens)

Retrieve relevant past memory. Call this tool before you answer the user. Use it when the user references past work or when the task needs project context.

Input parameters:

- `agent_id` (string): The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent.
- `limit` (integer): The maximum number of results.
- `max_tokens` (integer): The maximum number of tokens in the response. If the result exceeds this value, the tool truncates the text.
- `mode` (string): The search mode.
- `offset` (integer): The pagination offset. Use this to get the next page of results.
- `query` (string, required): A natural language query. The tool uses this text for the BM25 search and the vector search.
- `session_key` (string): The session key. The default is hash(cwd). Use this to recall memory from a different project.
- `task_id` (string): The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation.
- `team_id` (string): The team ID. Use this to isolate memory by team. When set, all queries filter by this value.
- `user_id` (string): The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both.

### `capture` (~442 tokens)

Save a decision, a learning, or a task outcome to memory. Call this tool after you complete a non-trivial task, make a decision, or fix a bug with a known root cause. You can capture a single text string, or a list of role-based conversation messages.

Input parameters:

- `agent_id` (string): The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent.
- `content` (string): The text to remember. The tool redacts secrets before it stores the text. Use this for a single message. Use 'messages' instead for a multi-turn conversation.
- `format` (string): The response format. Use 'json' for structured data (e.g. benchmarks). Defaults to 'text'.
- `messages` (array): A list of role-based conversation messages to capture. When set, 'content' is ignored. The tool flattens the messages into a single text for search, and stores the original messages for retrieval.
- `metadata` (object): Optional metadata.
- `override_rejection` (boolean): Set this to true to force capture even if the content was previously rejected. Use this only when the rejection reason no longer applies.
- `session_key` (string): The session key. The default is hash(cwd).
- `supersedes` (string): The ID of a capture that this one replaces. The old capture is marked as stale and ranks lower.
- `tags` (array): Optional tags.
- `task_id` (string): The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation.
- `team_id` (string): The team ID. Use this to isolate memory by team. When set, all queries filter by this value.
- `type` (string): The type of the memory. Defaults to 'conversation' if omitted.
- `user_id` (string): The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both.
- `verified` (boolean): Set this to true to mark the capture as verified. Verified captures rank higher in recall.

### `search` (~92 tokens)

Search memory by keyword or by semantic similarity. Use this tool when recall is too broad and you need specific facts.

Input parameters:

- `filters` (object)
- `format` (string): The response format. Use 'json' for structured data (e.g. benchmarks). Defaults to 'text'.
- `limit` (integer)
- `mode` (string): The search mode.
- `query` (string, required): The search text.

### `explain_recall` (~293 tokens)

Explain WHY a memory was recalled for a given query. Shows the BM25 score, vector score, RRF fused score, rank, and matching keywords for each result. Use this to debug unexpected recall results or to understand the retrieval pipeline. If you provide a capture_id, the tool explains why that specific capture was or was not retrieved.

Input parameters:

- `agent_id` (string): The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent.
- `capture_id` (string): Optional. The ID of a specific capture to explain. If set, the tool shows why this capture was or was not in the results.
- `limit` (integer): The maximum number of results to explain.
- `mode` (string): The search mode to explain.
- `query` (string, required): The same query you used with recall or search.
- `session_key` (string): The session key. The default is hash(cwd).
- `task_id` (string): The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation.
- `team_id` (string): The team ID. Use this to isolate memory by team. When set, all queries filter by this value.
- `user_id` (string): The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both.

### `related` (~87 tokens)

Find memories connected to a given memory by shared tags, project, or co-occurrence. Use this after recall or search to discover related context you might have missed. Inspired by graph spreading-activation (Mnema pattern).

Input parameters:

- `id` (string, required): The ID of the capture to find related memories for.
- `limit` (number): Maximum number of related memories to return (default: 10).

### `forget` (~169 tokens)

Delete specific memory entries. Use this tool only when the user requests a deletion. Do not auto-forget.

Input parameters:

- `confirm` (boolean): Set this to true to execute the deletion.
- `filter` (object)
- `format` (string): The response format. Use 'json' for structured data (e.g. benchmarks). Defaults to 'text'.
- `id` (string): The ID of the capture to delete.
- `reason` (string): The reason for rejection. Required when reject is true. The agent stores this with the tombstone.
- `reject` (boolean): Set this to true to reject the capture instead of deleting it. The capture is marked as rejected with a reason, and the same content cannot be captured again. Use this when the memory is wrong, not j…

### `resolve` (~102 tokens)

Resolve a conflict between two captures. Mark one as the winner and the other as stale. Call this tool when capture reports a conflict between two memories.

Input parameters:

- `loser` (string, required): The ID of the capture that is wrong or outdated. This capture is marked as stale.
- `reason` (string): The reason for the resolution. The agent stores this in the audit log.
- `winner` (string, required): The ID of the capture that is correct. This capture stays active.

### `handoff` (~334 tokens)

Write a structured handoff packet for the next agent session. Call this tool at the end of a session, or before you switch to a different agent. The next agent calls recall to load this packet and continue without re-reading files. This saves 60-85% of tokens compared to re-discovering context.

Input parameters:

- `agent_id` (string): The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent.
- `decisions` (array): A list of decisions made during this session. Include what was chosen and why.
- `files` (array): A list of files that matter for this task. Use the format: path:lines - reason.
- `next_steps` (array): A list of next steps for the next agent. Order by priority.
- `progress` (string, required): A summary of what has been done so far. Include the root cause if this is a bug fix.
- `session_key` (string): The session key. The default is hash(cwd).
- `status` (string, required): The current status of the task.
- `task` (string, required): A one-line description of the task.
- `task_id` (string): The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation.
- `team_id` (string): The team ID. Use this to isolate memory by team. When set, all queries filter by this value.
- `user_id` (string): The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both.

### `adr` (~313 tokens)

Record an Architecture Decision Record (ADR). Use this tool when you make a technical decision that future agents should know about. The ADR is stored as a structured capture and can be recalled by any agent working on the same project.

Input parameters:

- `agent_id` (string): The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent.
- `alternatives` (array): Other options that were considered but rejected. Include why each was rejected.
- `consequences` (string): The consequences of this decision. What are the trade-offs, risks, and benefits?
- `context` (string, required): The problem or situation that requires a decision. Why is this decision needed?
- `decision` (string, required): The decision that was made. What was chosen?
- `session_key` (string): The session key. The default is hash(cwd).
- `tags` (array): Optional tags for filtering. Example: ['arch', 'storage'].
- `task_id` (string): The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation.
- `team_id` (string): The team ID. Use this to isolate memory by team. When set, all queries filter by this value.
- `title` (string, required): A short title for the decision. Example: 'Use SQLite for local storage'.
- `user_id` (string): The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both.

### `knowledge_create` (~139 tokens)

Register a knowledge asset (wiki or code-graph) for the team. The asset metadata is stored locally. The actual content is processed by an external knowledge service.

Input parameters:

- `branch` (string): The repository branch (for code-graph).
- `name` (string, required): The asset name.
- `repo_url` (string): The repository URL (for code-graph).
- `service_url` (string): The URL of the knowledge service (for example: http://localhost:8424/v3).
- `summary` (string): A short description.
- `team_id` (string, required): The team ID.
- `type` (string, required): The asset type.

### `knowledge_get` (~28 tokens)

Get a single knowledge asset by ID.

Input parameters:

- `knowledge_id` (string, required): The knowledge asset ID.

### `knowledge_list` (~42 tokens)

List knowledge assets for a team. Optionally filter by type.

Input parameters:

- `team_id` (string, required): The team ID.
- `type` (string): Filter by type.

### `knowledge_delete` (~31 tokens)

Delete one or more knowledge assets by ID.

Input parameters:

- `knowledge_ids` (array, required): The knowledge asset IDs to delete.

### `skill_get` (~33 tokens)

Get a single skill by ID, including its full content and version.

Input parameters:

- `skill_id` (string, required): The skill ID.

### `skill_list` (~55 tokens)

List skills bound to a team. Optionally filter by agent.

Input parameters:

- `agent_id` (string): Filter by agent ID. When set, returns agent-specific and team-global skills.
- `team_id` (string, required): The team ID.

### `skill_search` (~64 tokens)

Search skills by keyword. Returns matching skills with descriptions.

Input parameters:

- `agent_id` (string, required): The agent ID.
- `query` (string, required): The search query.
- `team_id` (string, required): The team ID.
- `topK` (integer): The maximum number of results.

### `codegraph_index` (~163 tokens)

Index a file or directory into the code graph. Extracts symbols (functions, classes, methods), call relationships, and imports. Supports TypeScript, JavaScript, Python, Go, Rust, Java, C, C++, C#. Run this before using codegraph_search, codegraph_callers, codegraph_callees, or codegraph_impact.

Input parameters:

- `max_files` (integer): Maximum number of files to index (for directory mode).
- `path` (string, required): The file or directory path to index. For directories, all supported files are indexed recursively.
- `repo_path` (string): The root path of the repository. Used to compute relative file paths. Defaults to the path argument.
- `team_id` (string): The team ID for isolation.

### `codegraph_search` (~130 tokens)

Search for code symbols by name. Returns matching functions, classes, methods, etc. with file paths and line numbers. Use this to find where a function or class is defined.

Input parameters:

- `kind` (string): Filter by symbol kind (Function, Class, Method, Struct, etc.).
- `language` (string): Filter by language (typescript, javascript, python, go, rust, java, c, cpp, csharp).
- `limit` (integer)
- `query` (string, required): The symbol name or pattern to search for.
- `team_id` (string): The team ID for isolation.

### `codegraph_callers` (~65 tokens)

Find all callers of a symbol — who calls this function? Returns the calling functions with file paths and line numbers. Requires the symbol ID from codegraph_search.

Input parameters:

- `limit` (integer)
- `symbol_id` (string, required): The symbol ID (from codegraph_search).

### `codegraph_callees` (~68 tokens)

Find all callees of a symbol — what does this function call? Returns the called functions with file paths and line numbers. Requires the symbol ID from codegraph_search.

Input parameters:

- `limit` (integer)
- `symbol_id` (string, required): The symbol ID (from codegraph_search).

### `codegraph_impact` (~85 tokens)

Perform impact analysis: if I change this symbol, what else might be affected? Traverses the call graph upward (callers of callers) to find all potentially impacted code. Requires the symbol ID from codegraph_search.

Input parameters:

- `max_depth` (integer): Maximum traversal depth in the call graph.
- `symbol_id` (string, required): The symbol ID (from codegraph_search).

### `codegraph_list` (~97 tokens)

List all symbols in a file or directory. Returns symbols sorted by line number. Use this to get an overview of what a file contains.

Input parameters:

- `file_path` (string, required): The file path (relative to repo root) to list symbols for.
- `kind` (string): Filter by symbol kind (Function, Class, Method, etc.).
- `limit` (integer)
- `team_id` (string): The team ID for isolation.

### `wiki_ingest` (~129 tokens)

Ingest markdown documentation files into the wiki. Parses frontmatter, headings, [[wikilinks]], and [text](url) links to build a structured page graph. Supports .md and .markdown files.

Input parameters:

- `max_files` (integer): Maximum number of files to ingest (for directory mode).
- `path` (string, required): The file or directory path to ingest. For directories, all .md files are indexed recursively.
- `repo_path` (string): The root path for computing relative file paths. Defaults to the path argument.
- `team_id` (string): The team ID for isolation.

### `wiki_search` (~73 tokens)

Search wiki pages by content. Returns matching pages with title, file path, and a snippet. Use this to find documentation relevant to a topic.

Input parameters:

- `limit` (integer)
- `query` (string, required): The search query (FTS5 syntax supported).
- `team_id` (string): The team ID for isolation.

### `wiki_get` (~55 tokens)

Get a wiki page by ID, including its links and backlinks. Use this to read a specific page and see what it links to and what links to it.

Input parameters:

- `page_id` (string, required): The page ID (from wiki_search).

### `wiki_outdated` (~67 tokens)

Find wiki pages whose source file has changed since the last ingest. Returns pages that need re-ingesting because the source markdown was modified or deleted.

Input parameters:

- `repo_path` (string, required): The root path to check for source files.
- `team_id` (string): The team ID for isolation.

### `update` (~123 tokens)

Update an existing memory entry. Use this when a capture needs corrections (wrong info, missing tags, needs rewording). Preserves the original ID and created_at.

Input parameters:

- `content` (string): The new content. If omitted, the original content is kept.
- `id` (string, required): The ID of the capture to update.
- `tags` (array): The new tags. Replaces existing tags entirely.
- `type` (string): The new type. If omitted, the original type is kept.
- `verified` (boolean): Set to true to mark as verified.

### `consolidate` (~119 tokens)

Find and merge duplicate or near-duplicate memories. Use this when you suspect redundant captures (e.g. same decision captured twice). Returns groups of similar captures. Set confirm=true to merge them.

Input parameters:

- `confirm` (boolean): Set to true to merge duplicates. Without confirm, returns candidates only.
- `session_key` (string): The session key to consolidate. Default is hash(cwd). Use 'all' for all projects.
- `threshold` (number): Similarity threshold (0-1). Higher = stricter matching. Default 0.75.

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/tinhien11-remem-mcp/remem-mcp#diagnostics

## Score history

- 2026-08-20: 66
- 2026-08-19: 66
- 2026-08-18: 66
- 2026-08-17: 66
- 2026-08-16: 66
- 2026-08-15: 66

## Links

- npm package: https://www.npmjs.com/package/remem-mcp
- Socket report: https://socket.dev/npm/package/remem-mcp
- Repository: https://github.com/tinhien11/remem-mcp
- Changelog RSS feed: https://verifymcp.io/servers/tinhien11-remem-mcp/remem-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/tinhien11-remem-mcp/remem-mcp.json
- HTML version of this page: https://verifymcp.io/servers/tinhien11-remem-mcp/remem-mcp
