People Context
Local-first MCP server giving AI agents contextual knowledge about the people in your life
Connector by JinyangWang27 · GitHub account verified by the MCP Registry
Chalk Labs
Need help deploying People Context?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/jinyangwang27-people-context
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: agent-memory, crm
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 25, 2026.
Runs code on install
Its package runs an install script (such as npm postinstall or setup.py code) as soon as you install it, before any tool is called. Read the script first.
- Tools
- 19 read · 23 write · 1 delete · 4 not yet classified
- Secrets
- None asked for
- Install scripts
- Runs code on install
- Runs as
- Python package
Tools by what they do 47
Read from the source code; the running server may list different tools.
Read 19 · Look things up without changing anything.
explain_shared_connectionsfind_connectionfind_groupsget_communication_guidanceget_consolidation_contextget_groupget_person_contextget_person_timelineget_relationship_graphget_sensitive_person_contextget_stale_relationshipslist_group_memberships
Show 7 more tools
list_reminderspeople_communication_guidancepeople_contextreview_importsearch_peoplesemantic_searchupcoming_dates
Write 23 · Create, change, send or run things.
add_aliasadd_group_membershipclose_group_membershipcommit_importcomplete_remindercorrect_recordcreate_groupimport_contentmerge_peoplepeople_rememberpeople_resolverecord_fact
Show 11 more tools
record_interactionrecord_observationrecord_traitrememberremember_personresolve_personset_affiliationset_communication_philosophyset_relationshipset_remindersupersede_fact
Delete 1 · Delete, drop, revoke or wipe things.
withdraw_candidates
Not yet classified 4 · We could not tell from the name and description.
amend_candidateexport_dataforgetstage_candidates
Network hosts it talks to 4
github.com· found in codeglama.ai· found in codehuggingface.co· found in codejson.schemastore.org· found in code
Files it touches
/dev/stdin/dev/tty/tmp/people.db- Your home directory (~)
~/.pctx/people.dbC:\\Windows\\notepad.exe- Any path the agent passes to its tools
Tools (47)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
add_aliasAdd a normalized-deduplicated alias to an existing person. `kind` is one of `nickname`, `native_script`, `transliteration`, `handle`, `former_name`, or `other`, and defaults to `other`. The published schema carries the enum, so an unlisted value is refused before the alias is built rather than dropped.
add_group_membershipRecord that an existing person held a role in an existing group. Record only what was stated or confirmed. Leave dates out when they are unknown — never guess a school year or fill a January 1 date. `temporal_basis` is `unknown` (no dates), `period` (at least one known bound; a missing bound means unknown, not open-ended), or `ongoing` (asserted current, no end date); it is inferred from the dates when omitted, except that `ongoing` must be stated. `role` defaults to `member`. `sensitivity` defaults to `personal`. Concurrent and historical memberships are all kept.
amend_candidateCorrect one staged candidate before it is committed, returning the revised batch. The patch replaces the named fields and leaves the rest alone. Nothing is committed: confirming an amendment is not acceptance of the batch.
close_group_membershipRecord the last day a historically true membership held. Use this when someone left a group; the membership's earlier facts are preserved. It refuses a membership that already records an end (`already_ended`) or an end before its start (`ends_before_start`). Use `correct_record` with entity type `group_membership` when a stored membership was simply wrong.
commit_importCommit accepted people and resolvable interactions idempotently. Accepting a withdrawn candidate refuses the whole commit. Supplying the `expected_batch_digest` from the review the user approved refuses it if the batch moved after they saw it.
complete_reminderTransition one active reminder to completed.
correct_recordCorrect whitelisted assertion fields in place with before/after audit.
create_groupCreate one identified group: a class, cohort, team, department, club, household, or community. Every call creates a new group; an equal name is never treated as the same group. Use `find_groups` first and reuse the returned `id` when the user confirms it is the same one. `organization_id` must name an existing organization and only places the group under it — it creates no affiliation. `sensitivity` defaults to `personal`; a `sensitive` or `restricted` group is withheld from ordinary reads together with every membership in it.
explain_shared_connectionsExplain how two people are connected through groups they were both recorded in, and when. Use for shared-background, introduction, and "how do they know each other" questions. Pass each person as an id (`person_a_id`, `person_b_id`) or a name (`person_a`, `person_b`). Each connection is one membership of each person in the same group, cited in full. `label` is `classmates` (both `student` in a `class`) or `teammates` (both `participant` in a `team`) only when the recorded dates prove a common day (`temporal: overlap`, with the `overlap` period); otherwise the connection is `shared_context` o…
export_dataExport the complete portable domain dataset. This tool is absent from the normal MCP surface. Prefer the human-operated `pctx export` CLI; enable this tool only for a deliberately elevated MCP server process.
find_connectionReturn one shortest relationship path, or a structured not-connected result.
find_groupsList groups whose normalized name contains `name`, optionally of one `kind`. Results are candidates, not identity: two groups with the same name stay distinct, so ask the user which one is meant when several match. Sensitive and restricted groups are never returned by this ordinary tool. Ordered by normalized name then id; `truncated` reports more.
forgetHard-delete a person or record and redact identifying audit history.
get_communication_guidanceReturn sensitivity-gated signal for client-composed communication advice. Pass `person_id` from `resolve_person`, or `person` (a name or alias) to resolve inline; an ambiguous name returns candidates instead of guidance.
get_consolidation_contextReturn one person's stored facts, traits, observations, and affiliations and how they relate. Pass `person_id` from `resolve_person`, or `person` (a name or alias) to resolve inline. Use this before proposing maintenance. `signals` names pairs of records that share a predicate or category and says how they stand — `duplicate_fact`, `restated_fact`, `contradictory_fact`, `succeeding_fact`, `duplicate_trait`, `divergent_trait` — comparing normalized values and inclusive validity periods only. It decides nothing: reading the evidence and proposing a `correct_record`, a `supersede_fact`, or a `m…
Show 32 more tools
get_groupReturn one group and a bounded page of its recorded memberships. These are recorded memberships only: sharing a group is context, not proof that members know each other. Sensitive and restricted groups read as `found: false`, and sensitive or restricted memberships are omitted without affecting `truncated`.
get_person_contextAssemble a minimal-disclosure context bundle for one person. Pass `person_id` from `resolve_person`, or `person` (a name or alias) to resolve inline: an ambiguous name returns the candidates instead of context. Returns narrow identity fields, active relationships and affiliations, and one ranked facts/interactions slice capped by `max_items`. Set `include_communication=true` (or a `purpose` mentioning communication) to include communication traits. Sensitive and restricted records are never returned by this ordinary tool, and leave no trace that they exist. `truncated` says the item budget cu…
get_person_timelineReturn one person's recent history, newest first, as a bounded chronology. Pass `person_id` from `resolve_person`, or `person` (a name or alias) to resolve inline. Entries project durable records — interactions, observations, facts, affiliations, relationships, and traits — with the stored timestamp each was placed by and which field that was. Sensitive and restricted records are never returned by this ordinary tool, and a trait names only evidence that is itself ordinary. An unknown or removed person returns `found: false` rather than an error.
get_relationship_graphReturn active relationship structure around one person, capped for bounded disclosure. Pass `person_id` from `resolve_person`, or `person` (a name or alias) to resolve inline.
get_sensitive_person_contextReturn context that may include sensitive and restricted records. This tool is absent from the normal MCP surface. The operator must restart the server with PEOPLE_CONTEXT_MCP_ENABLE_SENSITIVE=1 before a client can discover or invoke it.
get_stale_relationshipsReturn people you have not interacted with recently, using ordinary interactions only.
import_contentExtract and atomically stage header-only candidates from a supported source without bodies. Accepted `source_type` values are `email`, `mbox`, `vcard`, `ics`, `linkedin`, `outlook`, and `whatsapp`. `self_sender` is an optional chat-export label for the user, such as a display name or a bare phone number, used to omit the user's own messages. A `path` import records a receipt for the file it read, so importing that exact file again reports the existing batch instead of staging a second copy. `forced` says the repeat is intentional: it stages the same content as a distinct processing session a…
list_group_membershipsReturn a bounded page of one person's recorded group memberships with each group. Pass `person_id` from `resolve_person`, or `person` (a name or alias) to resolve inline. Only ordinary memberships in ordinary groups are returned. An unknown or removed person returns `found: false`.
list_remindersList pull-based reminders, due-dated first and communication notes last. Filter by `person_id`, or by `person` (a name or alias) resolved inline; omit both for every person's reminders.
merge_peopleMerge a duplicate person into a primary person atomically.
people_communication_guidanceReturn traits, friction history, reminders, and the user's communication philosophy for a person.
people_contextReturn a minimal-disclosure context bundle for a known person.
people_rememberCreate or update a person record, including aliases and summary.
people_resolveResolve a name, nickname, or partial reference to one or more known people.
record_factRecord a time-aware fact about an existing person. `sensitivity` defaults to `personal`; `sensitive` and `restricted` records are withheld from ordinary reads. Prefer `remember` for a single statement named by a person's name.
record_interactionRecord a concise interaction summary after validating all participants.
record_observationRecord a subjective observation, separate from disclosed context.
record_traitRecord a derived trait with validated category and provenance. `category` is one of `communication_style`, `temperament`, `values`, `preference`, `topics_to_avoid`, or `other`. Cite the observation or interaction it rests on in `evidence_note` or `evidence_ids` where you can.
rememberRecord one thing the user stated about one person, in a single call. Use this when the user directly tells you something durable — "Alice from Acme prefers short emails", "Bob is my manager", "I had coffee with Dana today". `person` is the name as the user said it: it is resolved first, and a new person is created only when nobody matches. `org`/`role` record an affiliation, `relationship` records how the user relates to them (e.g. `manager_of`, `friend_of`, from the user's point of view), and `note` records the statement as a `fact`, `trait`, or `interaction`. Leave `kind` as `auto` to class…
remember_personCreate a new person or update the existing one matching `name`. Use this to durably record someone the user talks about. `aliases` is a list of `{value, kind?, lang?, script?}` objects (kinds: nickname, native_script, transliteration, handle, former_name, other); new aliases are merged into an existing record. Set `summary` to describe who they are, and `is_self=True` only for the user themselves. Returns the person and whether it was created.
resolve_personResolve a name, nickname, or partial reference to candidate people. Call this first whenever the user mentions someone, before asking who they mean. Returns ranked candidates with a score and match reason. If two or more candidates are close, the result is flagged `ambiguous` and all are returned so you can disambiguate with extra context or a clarifying question. An empty candidate list means no confident match — use `remember` or `remember_person` to create a new record. Put distinguishing context in `hints` (`org`, `role`, `relationship`) rather than in `query`.
review_importReturn staged candidates and statuses for one batch. The response carries a `batch_digest`. Pass it back to `amend_candidate`, `withdraw_candidates`, or `commit_import` to have the action refused if somebody else changed the batch after this read.
search_peopleFree-text search over stored people for browsing or lookup. Broader than `resolve_person`: use this to list who is known that matches a query, rather than to pin down a single identity. Returns ranked candidates.
semantic_searchSearch active people and safe interaction summaries by multilingual semantic similarity. This optional local search requires an explicit `pctx reindex --semantic` first. It never downloads a model while serving a query and refuses to mix vectors from different model revisions.
set_affiliationCreate an affiliation, resolving an org id or get/creating by name.
set_communication_philosophyStore communication philosophy verbatim while auditing lengths only.
set_relationshipCreate a directed relationship between two existing people.
set_reminderCreate a reminder for an existing person. `kind` is `follow_up` (dated, something to do), `occasion` (a date that recurs), or `communication_note` (undated guidance surfaced with the person's context).
stage_candidatesStage agent-extracted people, interactions, records, relationships, groups, and memberships. Candidate types are `person`, `interaction`, `affiliation`, `fact`, `observation`, `trait`, `relationship`, `group`, and `group_membership`. Use this after extracting concise candidates from user-provided notes, meeting transcripts, or other agent-visible text. Distinguish what was stated (`fact`), what happened in this source (`observation`), and what you inferred (`trait`, which requires an explicit `confidence` and a concise `evidence_note`). Relationship candidates carry batch-local `from_ref`/`t…
supersede_factClose a fact that was true and open its replacement from an effective date. Use this when a stored value was historically correct and the real-world state changed; `correct_record` remains the tool for a value that was simply wrong. The old fact keeps its person, predicate, value, and provenance and is closed the day before `effective_from`; the replacement inherits the old assertion's original end date, so a bounded claim is never widened into an open-ended one. Person, predicate, and the replacement's end date cannot be changed here. Omitting `confidence` or `sensitivity` inherits the old f…
upcoming_datesReturn ordinary birthdays and dated active reminders inside an inclusive upcoming window. Optionally narrow to one person by `person_id` or by `person` (a name or alias).
withdraw_candidatesDrop staged candidates from consideration, returning the revised batch. A withdrawn candidate stays listed as `rejected` so the user can see what was dropped, and is never committed. Nothing else about the batch changes.
Signals
- Stars
- 59
- Forks
- 4
- Open issues
- 0
- Contributors
- 7
- Weekly downloads
- 64
- Last commit
- Oct 24, 2026 (7 days ago)
- Last release
- Sep 22, 2026 (1 month ago)
- Last package publish
- Sep 22, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.JinyangWang27/people-context- Version
- 1.3.0
- Auth
- No auth
- Packages
- pypi people-context
- License
- MIT
- Repository
- github.com/JinyangWang27/people-context
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get People Context running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
People Context MCP server. Agent Mart. https://agentmart.dev/connectors/jinyangwang27-people-context (last updated 2026-10-24)