Local-first MCP server giving AI agents contextual knowledge about the people in your life
io.github.JinyangWang27/people-context — Local-first MCP People Context Server
The io.github.JinyangWang27/people-context MCP server and CLI provide local-first contextual knowledge to AI agents about people in your life. It stores durable memory—who someone is, how you know them, what you last agreed on, and how they like to be addressed—in a single SQLite file on your machine.
🛠️ Key Features
Local-first MCP server and CLI
Durable memory about people (identity, relationship, agreements, communication preferences)
SQLite-based storage
No account, no cloud, no network calls
🚀 Use Cases
Give AI agents context about personal contacts
Enable consistent, preference-aware communication
Maintain notes on relationships and last agreements
⚡ Developer Benefits
Uses Model Context Protocol (MCP)
Runs with a single local SQLite file for state management
Avoids external services (no account/cloud/network)
⚠️ Limitations
Source material does not list available tools, schemas, or supported MCP interfaces beyond providing “people-context” memory
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.
pctx demo: seed a fictional dataset, list people, and print a brief
Why
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:
Who is this? Explainable name resolution over names, nicknames, aliases, and handles. Two Priyas come back
as two candidates with a match reason, never a silent guess.
What do I know? Relationships, organisations and roles, durable facts, concise interaction summaries,
traits, reminders, and a per-person timeline, each disclosed only as far as the request needs.
How do I talk to them? Communication guidance grounded in recorded traits, past friction, open follow-ups,
and your own written philosophy.
Who has gone quiet? Stale-relationship and upcoming-date reports over what is already stored.
Get data in safely. Email, mbox, vCard, calendar, LinkedIn, Outlook, and WhatsApp exports are staged as
reviewable candidates. You approve what gets recorded; raw source content is never kept.
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.
Demo
A packaged fictional dataset is the fastest way to see identity resolution, graph traversal, and bounded
context without touching real data:
bash
uvx --from people-context pctx demo --reset
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.
Quick start
Upgrading from a release before the shared ~/.pctx/people.db default? Before any client starts the new
version, inventory and pin each client's existing database as described in
Upgrading to the shared default.
Requires Python 3.11+ and uv. Pick your client; each is one step.
Claude Code
bash
claude plugin marketplace add JinyangWang27/people-context
claude plugin install people-context@people-context-plugins
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.
Claude Desktop
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.
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.
CLI only
bash
uv tool install people-context
pctx init # seed your own record, optionally import a vCard, then connect a client
pctx --help
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.
What it remembers, and what it never does
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
How it compares
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
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.
Going further
Loopback HTTP for clients that cannot spawn stdio: people-context-mcp --http --host 127.0.0.1 --port 8765.
Unauthenticated and local-only by design; prefer stdio. See docs/cli.md.
Semantic search: uv sync --extra semantic && pctx reindex --semantic downloads a pinned multilingual
Model2Vec model once; server startup and search stay cache-only.
Obsidian: pctx export-vault --output ~/PeopleVault writes a deterministic, browsable vault, and a
read-only Obsidian plugin renders live briefs. See docs/obsidian-plugin.md.
Import: 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.
Backup and second device: pctx sync push --output DIR and pctx sync pull --input PATH.
Docker: 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.
Database location: --db, then PEOPLE_CONTEXT_DB, then the XDG config file, then the shared
~/.pctx/people.db. Inspect with pctx db-path -v.
adapters (SQLite, MCP, filesystem, imports, CLI)
↓ implement
ports (narrow Protocols)
↑ used by
app (use cases and policy)
↓ operates on
domain (entities and values)
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.
Planned review of split and mixed speaker attribution
Contributing
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.