# Particles MCP server

> Provides an append-only ledger of sourced, dated, and confidence-scored claims for AI agents to use as shared memory.

- Repository: https://github.com/LinkedParticles/particles-engine-py
- Page: https://hostedmcp.org/servers/linkedparticles/particles-engine-py
- Transport: stdio
- Stars: 4
- License: Apache-2.0
- Latest version: 1.224.6

## Install

### Claude Code

```sh
claude mcp add --env ANTHROPIC_API_KEY=<YOUR_ANTHROPIC_API_KEY> particles-engine-py -- uvx linkedparticles
```

### Cursor (`~/.cursor/mcp.json`)

```json
{
  "mcpServers": {
    "particles-engine-py": {
      "command": "uvx",
      "args": [
        "linkedparticles"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "<YOUR_ANTHROPIC_API_KEY>"
      }
    }
  }
}
```

### VS Code (`.vscode/mcp.json`)

```json
{
  "servers": {
    "particles-engine-py": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "linkedparticles"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "<YOUR_ANTHROPIC_API_KEY>"
      }
    }
  }
}
```

### Claude Desktop (`claude_desktop_config.json`)

```json
{
  "mcpServers": {
    "particles-engine-py": {
      "command": "uvx",
      "args": [
        "linkedparticles"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "<YOUR_ANTHROPIC_API_KEY>"
      }
    }
  }
}
```

### Codex (`~/.codex/config.toml`)

```toml
[mcp_servers.particles-engine-py]
command = "uvx"
args = ["linkedparticles"]

[mcp_servers.particles-engine-py.env]
ANTHROPIC_API_KEY = "<YOUR_ANTHROPIC_API_KEY>"
```

### Gemini CLI (`~/.gemini/settings.json`)

```json
{
  "mcpServers": {
    "particles-engine-py": {
      "command": "uvx",
      "args": [
        "linkedparticles"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "<YOUR_ANTHROPIC_API_KEY>"
      }
    }
  }
}
```

## Environment variables

| Name | Required | Secret | Description |
|---|---|---|---|
| `ANTHROPIC_API_KEY` | yes | yes | Anthropic API key. Required for the tools that call a model — `query` composes a cited natural-language answer, and the semantic half of `lint` reasons over claim pairs. The accessors that only read the store (`particle_show`, `particles_list`, `subjects_*`, `events_*`, `graph_view`, `quality_report`) work without it. |
| `DATABASE_URL` | no | no | SQLAlchemy URL of the belief store to serve, used as given, so write a SQLite path absolute: a relative one opens against the directory the server starts in. Without it, and without PARTICLES_CONFIG, the server serves the store `~/.particles/config.yaml` names (a relative path there is read under `~/.particles/`), or `~/.particles/particles.db` when that file names none, never a store in the directory it starts in. |
| `PARTICLES_CONFIG` | no | no | Path to the config file holding the rest of the server's settings: additional stores, model selection per purpose, and the `mcp.write.enabled_stores` allowlist that turns the write tools on. This is the supported way to give the server settings. Without it the server reads `~/.particles/config.yaml`, never a `config.yaml` in the directory it starts in. Give it as an absolute path: a relative one is refused. When you set it, also set `DATABASE_URL` to an absolute path or name one as `storage.database_url` in the file: a server started with a config file refuses a store path relative to its working directory, and refuses to start while any store under `storage.stores` has one. |

## FAQ

### What is Particles?

Particles is shared memory for humans and AI agents that records claims with provenance, including who said it, where, when, and the confidence level.

### Can I see what the agent believed in the past?

Yes, because the store is append-only and nothing is overwritten, you can use the --as-of flag to query the state of beliefs at a specific point in time.
