Skip to main content
Glama
Riku-KANO

mem9-guard-mcp

by Riku-KANO
README.md
# mem9-guard-mcp

An MCP server that exposes [mem9](https://github.com/mem9-ai/mem9) (the TiDB team's
persistent memory backend for AI agents) behind
[OWASP agent-memory-guard](https://owasp.org/www-project-agent-memory-guard/).

Agents never touch the raw mem9 API — every read and write goes through the guard:

```
MCP client (agent)
        │  memory_read / memory_write / ...
        ▼
  mem9-guard-mcp (this server)
        │  MemoryGuard + Policy.strict()   ← inspect, then block / quarantine / redact
        ▼
  Mem9Store adapter (MemoryStore Protocol)
        │  REST (X-API-Key)
        ▼
      mem9 (api.mem9.ai or self-hosted)
```

This protects agent memory against prompt injection, secret leakage, and memory
poisoning: malicious or sensitive content is blocked, quarantined, or redacted
according to policy before it ever reaches — or returns from — the store.

## Tools

| Tool | Description |
|---|---|
| `memory_write(key, value, source_class, memory_class)` | Guarded write. Result is `allow` / `redact` / `quarantine` / `blocked` |
| `memory_read(key, default)` | Read with integrity verification and outbound screening |
| `memory_delete(key)` | Delete a key (protected keys are blocked) |
| `memory_list()` | List stored keys |
| `security_events(limit)` | Recent security events emitted by the guard (for auditing) |
| `quarantine_list()` | Writes currently held in quarantine |

`rollback` / snapshot restore is intentionally **not** exposed. Recovery is an
operator action; giving it to agents would let them discard legitimate writes
or cover up poisoned data.

## Configuration (environment variables)

| Variable | Description |
|---|---|
| `MEM9_API_KEY` | mem9 API key. **Falls back to a local JSON store when unset** |
| `MEM9_API_URL` | Defaults to `https://api.mem9.ai`. Override for self-hosted mem9 |
| `MEM9_AGENT_ID` | `X-Mnemo-Agent-Id` header (optional) |
| `MEM9_GUARD_POLICY` | Path to a policy YAML. Defaults to `Policy.strict()` |
| `MEM9_GUARD_LOCAL_PATH` | Path of the fallback JSON store (default `mem9_local_store.json`) |

## Installing into Claude Code

Straight from GitHub (no clone needed — `uvx` fetches and builds on first run):

```bash
claude mcp add mem9-guard \
  --env MEM9_API_KEY=<your-key> \
  -- uvx --from git+https://github.com/Riku-KANO/mem9-guard-mcp mem9-guard-mcp
```

Or from a local clone (recommended while developing):

```bash
claude mcp add mem9-guard \
  --env MEM9_API_KEY=<your-key> \
  -- uv run --project <path-to-this-repo> mem9-guard-mcp
```

Notes:

- `MEM9_API_KEY` is optional — omit the `--env` line to use the local JSON
  store fallback.
- The server is registered for the current project by default; add
  `--scope user` to make it available in every project.
- For self-hosted mem9, add `--env MEM9_API_URL=<url>`.
- Verify with `claude mcp list`, or run `/mcp` in a new session to see the
  `memory_write` / `memory_read` / ... tools.

### Other MCP clients

Any MCP client that supports stdio servers works, e.g.:

```json
{
  "mcpServers": {
    "mem9-guard": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/Riku-KANO/mem9-guard-mcp", "mem9-guard-mcp"],
      "env": { "MEM9_API_KEY": "<your-key>" }
    }
  }
}
```

## Development

```bash
uv sync
uv run pytest

# End-to-end smoke test over stdio (no LLM involved)
uv run python scripts/smoke_stdio.py
```

## Notes

The mem9 v1alpha2 JSON field names (`content` / `metadata` / `id`) are not yet
covered by a published official schema, so they are centralized as assumptions
in `src/mem9_guard_mcp/client.py`. If the real API differs, that is the only
file that needs to change.

## License

[MIT](LICENSE)

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clear, distinct purpose: core memory operations (delete, list, read, write) plus quarantine and security events. No overlap ambiguity.

Naming Consistency4/5

Main tools follow a consistent 'memory_' prefix pattern. 'quarantine_list' and 'security_events' deviate slightly but are still descriptive and follow a sensible scheme.

Tool Count5/5

Six tools is an appropriate number for a guarded memory system, covering essential operations without being overwhelming.

Completeness4/5

Covers CRUD (memory_write as create/update, memory_read, memory_delete, memory_list) plus quarantine and security auditing. Missing an explicit update operation, but write can serve that role.

Maintenance

ActivityInactive
ResponsivenessNo issues