The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the People Context listing page.
Your agent already remembers your codebase. Now it can remember your people.
people-context is a local-first MCP server and CLI that gives AI agents
durable memory about the people in your life: who someone is, how you know them, what you last agreed, and how
they like to be talked to. One SQLite file on your machine. No account, no cloud, no network calls.

Ask an assistant "how should I approach Priya about the reporting delay?" and it has nothing: it does not know which Priya, that she is your counterpart at a partner org, that you agreed a new deadline last week, or that she prefers a short email over a call. That knowledge lives in your head, your inbox, and a notes file the agent cannot see.
people-context keeps it in one place the agent can query through narrow tools:
It is opinionated about trust: writes are audited, forget is a real delete, sensitive records sit behind an
operator-only gate that a prompt cannot open, and ordinary commands never touch the network.
A packaged fictional dataset is the fastest way to see identity resolution, graph traversal, and bounded context without touching real data:
The demo always writes its own dedicated database at
{XDG_DATA_HOME or ~/.local/share}/people-context/demo.db. It ignores --db, PEOPLE_CONTEXT_DB, the config
file, and workspace discovery, and --reset replaces only that file plus its -wal/-shm companions, so a
real database is never read or modified. Seeding writes audited fictional people, handles, affiliations, facts,
interactions, and a connected relationship graph, then prints the path-targeted server command and concrete
tool calls that use the ids it just created:
Person ids are generated per seed, so the printed values differ from the placeholders above. Start the printed server command in an MCP client and run the printed calls verbatim. See docs/cli.md.
Requires Python 3.11+ and uv. Pick your client; each is one step.
Restart Claude Code or run /reload-plugins. You get the server plus /people-context:who,
/people-context:remember, and /people-context:reminders. Details: docs/claude-code-plugin.md.
Download people-context.mcpb from the
latest release and open it. Claude Desktop
installs the pinned release with its own uv runtime. Details: docs/desktop-and-editors.md.
Start a new Codex session. Details: docs/codex-plugin.md.
Add the stdio server to your client's MCP config (.cursor/mcp.json, ~/.codeium/windsurf/mcp_config.json,
.vscode/mcp.json, ...):
Or let the CLI write it: uvx --from people-context pctx setup cursor (also windsurf, vscode,
claude-desktop; add --dry-run to preview). VS Code uses a servers key with "type": "stdio". Per-editor
snippets: docs/desktop-and-editors.md.
The native plugin talks to the opt-in loopback HTTP server. Details: docs/openclaw-plugin.md.
people-context and people-context-mcp are the server commands; pctx is the human-operated CLI.
Then try, in your agent:
Who is Amina?
Remember that Amina from Open City Lab prefers short emails and hates surprise calls.
What should I know before my meeting with Daniel tomorrow?
The second one is a single remember tool call: the name is resolved, the person is created only if nobody
matches, and the affiliation and preference are recorded in one audited transaction. Ambiguous names come back
as candidates, never a guess.
Or, without an agent: pctx remember "Amina Hassan" "prefers short emails" --org "Open City Lab" and
pctx brief "Amina Hassan". Five worked scenarios live in docs/use-cases.
| It remembers | It never does |
|---|---|
| Names, nicknames, aliases, and handles | Upload anything, anywhere |
| Relationships with a canonical, extensible vocabulary | Store raw imported emails, chats, or files |
| Organisations, roles, and time-bounded affiliations | Let a model enable sensitive disclosure or full export |
| Durable facts, observations, and traits with evidence | Commit imported or agent-extracted data without your review |
| Concise interaction summaries and a per-person timeline | Log private values or keep a soft-deleted copy after forget |
| Reminders, follow-ups, and your communication philosophy | Make a network request outside pctx reindex --semantic |
people-context | Assistant memory (ChatGPT, Claude) | Memory platforms (Mem0 and similar) | |
|---|---|---|---|
| Where data lives | One SQLite file you own | Vendor account | Vendor platform or your own deployment |
| Works offline | Yes | No | Self-hosted only |
| Knows people as first-class records | Identity, relationships, roles, graph, guidance | Free-text notes | Free-text or vector memories |
| Explains a match | Ranked candidates with a reason; ambiguity is surfaced | No | Similarity score |
| Import review gate | Stage, review, commit | n/a | Automatic extraction |
| Deletion | Hard delete plus audit redaction in one transaction | Request to vendor | API delete |
| Backup and move | pctx sync push / pull bundle | n/a | Deployment-specific |
The dated, sourced version with vendor documentation links is in docs/privacy-and-safety.md.
This project executes local Python with the launching user's filesystem permissions. Ordinary MCP discovery excludes elevated sensitive context and full export. Operator-gated tools require process environment flags; models cannot enable them through arguments. Vault export is intentionally CLI-only.
The database is plaintext SQLite by default. On Unix-like systems a new one is created 0600, so other local
accounts cannot read it. That is a boundary between accounts, not encryption, so pair it with full-disk
encryption or opt into SQLCipher at-rest encryption (uv sync --extra encrypted, key read only from
PEOPLE_CONTEXT_DB_KEY). See
database file permissions and
optional at-rest encryption.
people-context-mcp --http --host 127.0.0.1 --port 8765.
Unauthenticated and local-only by design; prefer stdio. See docs/cli.md.uv sync --extra semantic && pctx reindex --semantic downloads a pinned multilingual
Model2Vec model once; server startup and search stay cache-only.pctx export-vault --output ~/PeopleVault writes a deterministic, browsable vault, and a
read-only Obsidian plugin renders live briefs. See docs/obsidian-plugin.md.pctx import stage SOURCE PATH then review and commit, over email, mbox, vCard, .ics,
LinkedIn, Outlook, and WhatsApp exports. Agents can stage extracted candidates the same way. See
docs/import.md.pctx stale, pctx upcoming, pctx timeline, pctx doctor, pctx stats.pctx sync push --output DIR and pctx sync pull --input PATH.docker run --rm -i -v people-context-data:/data ghcr.io/jinyangwang27/people-context:latest.
A convenience image, not a sandbox. See docs/docker.md.--db, then PEOPLE_CONTEXT_DB, then the XDG config file, then an OpenClaw workspace,
then the XDG data directory. Inspect with pctx db-path -v.The full command reference is in docs/cli.md; the MCP tool inventory and response contracts are in docs/mcp-interface.md; what stays stable across releases is in docs/compatibility.md.
The codebase follows ports and adapters:
Dependencies point inward. Vocabulary normalization and graph caps live in app/domain; recursive SQL and file writing live in adapters. One composition root wires both stdio and HTTP. See docs/architecture.md.
| Document | Contents |
|---|---|
| docs/architecture.md | Layering, dependency rule, entrypoint wiring |
| docs/data-model.md | Schema, migrations, and perspective display_type |
| docs/relationship-graph.md | Vocabulary, normalization, perspective, traversal, curation |
| docs/vault-export.md | Layout, marker safety, determinism, sensitivity |
| docs/mcp-interface.md | MCP tools and stable response contracts |
| docs/compatibility.md | What stays stable across releases for MCP, DB, CLI, and JSON |
| docs/cli.md | CLI commands and DB resolution |
| docs/import.md | Import sources, staging, review, and commit |
| docs/design/sync.md | Sync design and delivered local foundations |
| docs/releasing.md | PyPI trusted publishing, Codecov, and release procedure |
| docs/mcp-registry.md | MCP Registry namespace, server.json, and community-directory submission matrix |
| docs/distribution-checklist.md | Account-owner walkthrough: Registry publish, directories, awesome lists, Desktop directory, Obsidian |
| docs/desktop-and-editors.md | Native-UV MCPB Desktop bundle and Cursor/Windsurf/VS Code snippets |
| docs/docker.md | Optional non-root stdio Docker image, data volume, and GHCR publishing |
| docs/claude-code-plugin.md | Claude Code install, runtime, privacy, validation, and publishing |
| docs/codex-plugin.md | Codex install, runtime, privacy, validation, and publishing |
| docs/openclaw-plugin.md | OpenClaw install, runtime, privacy, validation, and ClawHub publishing |
| docs/obsidian-plugin.md | Obsidian read-only panes, subprocess safety, encryption, and mirrored releases |
| docs/privacy-and-safety.md | Disclosure, audit, forget, threat model |
| docs/use-cases | Narrative recipes for onboarding, meeting prep, follow-up, migration, and auditing |
| docs/evals.md | Evaluation harness, fixed tasks, scoring rules, and dated recorded results |
| docs/roadmap.md | Delivered milestones and planned work |
| docs/specs | One implementation spec per planned milestone |
Issues and pull requests are welcome; see CONTRIBUTING.md for the architecture rules, validation commands, and a list of good first issues. Questions and show-and-tell go to Discussions.
If people-context is useful to you, a star helps other people find it.
MIT. See LICENSE.