people-memory-mcp
This MCP server acts as a private, durable people-memory database for AI agents, enabling you to manage and analyze personal, professional, and social connections. Key capabilities include:
Search & Retrieve: Find people by name, organization, role, city, or custom facts, with ambiguity handling and full record access.
Manage Records: Create or update person profiles with safeguards against duplicates and conflicting overwrites; attach structured facts with source and confidence.
Track Interactions: Log dated calls, meetings, messages, and other interactions.
Relationship Mapping: Connect people, define relationship kinds and strengths, and find warm introduction paths to organizations.
Data Analysis: Execute guarded SQL queries (read and write) for advanced insights and bulk updates.
Contact Maintenance: Identify stale strong relationships lacking recent interactions.
Import & Enrich: Import contacts from LinkedIn, Google, WhatsApp, and optionally enrich with Gmail/Calendar/Drive data (with consent).
Privacy & Access: All data stays in your private PostgreSQL database; optional UI and REST API available for visualization and programmatic access.
Used as part of the local development stack with the Supabase CLI for running the PostgreSQL database locally.
Repository is distributed via GitHub, and Codex plugin packaging supports marketplace or team distribution.
Optional connector to enrich people records using Gmail data such as participants, signatures, organizations, and last interaction dates.
Imports Google Contacts exports to build the people graph with email/phone resolution and deduplication.
Stores the people graph in PostgreSQL, providing durable storage of people, organizations, relationships, facts, and interactions.
Uses Supabase for local/cloud PostgreSQL hosting, Auth, REST API, and browser UI, with row-level security protecting data access.
Imports WhatsApp chat exports to build the people graph, with optional self-hosted MCP bridge for ongoing enrichment.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@people-memory-mcpsearch for Sarah Chen in my people graph and show her full profile"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
People Memory
How do you give an AI agent persistent memory about people? Point it at a real database instead of a context window. People Memory is that database: an MCP server, a PostgreSQL schema, an optional REST API, a browser UI, importers, and agent skills, all built around one graph of people, orgs, and facts that survives every session. Add it once and Claude Code, Codex, or any other MCP client stops forgetting who your mother-in-law is between conversations.
The server retrieves someone the moment you mention them, records durable facts as they come up, and asks before it merges two people who might not be the same person. The graph, not the chat log, is what remembers.
Your data stays in your own PostgreSQL database. The repository contains no hosted service, no telemetry, no contact data, and no credentials.
What it does
Maps people, organizations, relationships, affiliations, identifiers, facts, and interactions.
Gives Codex, Claude Code, and other MCP clients semantic tools plus guarded SQL.
Teaches the agent to look up names before answering and save durable facts during every chat.
Imports LinkedIn Connections, Google Contacts, WhatsApp chat exports, and GEDCOM family trees.
Can enrich records through connectors the user approves, including Gmail, Calendar, and Drive.
Runs fully local with Supabase CLI or in the cloud with any PostgreSQL database.
Recommends a free Supabase project because it includes Postgres, Auth, REST, and a local stack.
Includes a full-screen relationship graph and searchable directory.
Flags what an import got wrong — duplicate people and organizations, contradictory links.
Refuses uncertain merges and conflicting overwrites until the user decides.
Related MCP server: hippocampus-mcp
How it fits together
flowchart LR
Agent["Your existing agent"] --> MCP["People Memory MCP"]
MCP --> PG[("PostgreSQL")]
Agent --> Connectors["Optional Gmail / Calendar / Drive / WhatsApp connectors"]
Connectors --> MCP
UI["Private graph UI"] --> Supabase["Supabase Auth + REST"]
Supabase --> PG
API["Optional REST API"] --> PGThe MCP server provides live reads and controlled writes. The bundled skills provide the behavior: when to retrieve, what to remember, how to import, when to ask, and how to upgrade safely.
Quick start
Requirements: Python 3.11+, uv, Docker, and the
Supabase CLI.
git clone https://github.com/michelgrolet/people-memory-mcp.git
cd people-memory-mcp
uv sync --extra api --extra dev
supabase start
supabase db resetsupabase status prints the local database URL, API URL, and browser publishable key. Save the
database URL in ~/.config/people-memory/.env:
PEOPLE_MEMORY_DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:54322/postgres
PEOPLE_MEMORY_ENABLE_RAW_SQL=false
PEOPLE_MEMORY_DEFAULT_SOURCE=agentThe file is read automatically and should have mode 0600.
Set your owner email before using the UI:
update app_settings set value = 'you@example.com' where key = 'owner_email';Then configure the browser app:
cp web/config.example.js web/config.js
# add the API URL and publishable key printed by `supabase status`
python3 -m http.server 4173 --directory webOpen http://127.0.0.1:4173. Local signup emails appear in Supabase
Mailpit, whose URL is also printed by supabase status.
Connect an agent
The interactive wizard detects Codex and Claude Code:
uv run people-memory setupOr add the server directly.
Codex:
codex mcp add people-memory \
--env PEOPLE_MEMORY_ENV_FILE="$HOME/.config/people-memory/.env" \
-- uvx --from git+https://github.com/michelgrolet/people-memory-mcp people-memory-mcpClaude Code:
claude mcp add -s user people-memory \
-e PEOPLE_MEMORY_ENV_FILE="$HOME/.config/people-memory/.env" \
-- uvx --from git+https://github.com/michelgrolet/people-memory-mcp people-memory-mcpStart a new agent session after adding an MCP server. Install or invoke setup-people-memory from
the plugin to add the durable memory rule, choose imports, connect optional data sources, and verify
the complete flow.
With TARS, optionally
People Memory is standalone and stays standalone: nothing above requires a particular harness, and the agent you already use is the one it wires into. TARS is a harness for a personal agent that lists People Memory in its extension registry, so if you happen to run it, one command does the clone and the wiring:
claude plugin marketplace add michelgrolet/tars
claude plugin install people-memory@tarsWhat that adds over the plain MCP server is when the tools fire: TARS puts the trigger in the one
file it loads on every session, so the agent looks a person up before answering instead of waiting
to be told to. Without it, the remember-people skill does the same job once you install it.
Install the agent skills from a clone
Codex discovers skills in ~/.agents/skills; Claude Code uses ~/.claude/skills. Symlink every
People Memory skill so updates to the clone are picked up automatically:
mkdir -p "$HOME/.agents/skills"
for skill in "$PWD"/skills/*; do
ln -s "$skill" "$HOME/.agents/skills/$(basename "$skill")"
doneUse ~/.claude/skills instead for Claude Code. Restart the agent, then ask it to run
setup-people-memory. The repository is also packaged as a Codex plugin for marketplace or team
distribution.
MCP tools
Tool | Purpose |
| Search names, organizations, roles, cities, identifiers, summaries, and facts |
| Return a complete person record, or candidates when a name is ambiguous |
| Create or update a person without silent duplicate merges or overwrites |
| Save typed or free-form facts with source and confidence |
| Record a call, message, meeting, meal, or other dated interaction |
| Record how two people know each other |
| Find warm introduction paths into an organization |
| Find strong relationships that have gone quiet |
| Run one guarded |
| Run one guarded |
Raw SQL is disabled by default. If enabled, the parser rejects multiple statements, DDL, a short
list of dangerous functions, SELECT ... INTO, more than one data-changing operation, and
UPDATE/DELETE with no WHERE clause.
That parser is a denylist, so treat it as the first of two layers rather than the guarantee. The
guarantee is underneath it: read_query runs in a transaction with default_transaction_read_only
on, a 30-second statement timeout and a bounded result set, so a SELECT that finds a way past the
parser still cannot write. Both tools stay behind PEOPLE_MEMORY_ENABLE_RAW_SQL, and RLS applies to
them exactly as it does to everything else.
Imports
Official exports are the safest default. They are inspectable and do not require sharing account passwords.
uv run people-memory import linkedin ~/Downloads/Connections.csv
uv run people-memory import google ~/Downloads/contacts.csv
uv run people-memory import whatsapp ~/Downloads/chat.txt --self-name "Your Name" --date-order dmyImports resolve email or phone first, then name. They fill missing values and never overwrite a
conflict silently. The import-contacts skill can inspect unfamiliar CSV columns and guide the user
through ambiguous matches.
Family trees (GEDCOM)
A genealogy export carries something no contact export has: who is whose parent, who married whom,
and who the siblings are. Open the web app, click the upload button in the header, and drop a .ged
file from Geneanet, Ancestry, MyHeritage or Gramps.
A GEDCOM has no email and no phone, so the dedup key the other importers rely on does not exist: identity is resolved on name and birth date, and a woman recorded under her maiden name is also matched against her spouses' surnames. Anything those cannot settle — the same name on two records, a birth date that contradicts a name match, two entries in the file that may be one person — is listed on a review screen and nothing is written until every one of them is answered. Rerunning the same file writes nothing the second time.
What lands: a person per individual (full birth dates in the column, partial or hedged ones as a
born fact), parent / partner / sibling links, and birth_place, died, death_place,
occupation facts. A link that already exists is left untouched, notes included.
LinkedIn, live
LinkedIn also exposes 1st-degree connections live through its Member Data Portability API (DMA).
Once you hold an OAuth token with the r_dma_portability_self_serve scope (see
LinkedIn's docs),
you can sync without the manual export. Set the token as an environment variable — never pass it
as a CLI flag, which would leak it through ps and shell history:
export LINKEDIN_OAUTH_TOKEN="..."
uv run people-memory sync-linkedinRight after consenting, LinkedIn may not have collated the CONNECTIONS domain yet — it raises a
readable error in that case; retry later or fall back to the CSV export above.
Optional connectors
People Memory does not collect Gmail, Calendar, Drive, or WhatsApp credentials. The enrich-people
skill uses connectors already authorized in the user's agent. It asks which sources may be read,
limits the time range, shows what it plans to save, and marks every fact with its source.
Supported patterns include:
Gmail: participants, signatures, organizations, and last interaction dates.
Calendar: meetings, attendees, locations, and interaction dates.
Drive: user-selected documents that mention known people.
WhatsApp: official exports by default; a self-hosted MCP bridge is optional.
Browser agents: Codex in Chrome or Claude in Chrome can help configure Supabase and inspect the UI.
See docs/connectors.md for the permission and identity rules.
Cleanup
Every import writes records nobody reads again, and they collide. The shield button in the top bar opens a screen that reads them for you: two records sharing an email or a phone, the same name spelled two ways, an organization entered twice under a legal suffix, an organization nobody belongs to, links that cannot all be true (someone their own ancestor, a parent younger than their child, a pair filed as both parent and sibling), and family links still too vague for the tree. The count on the button is what is waiting.
It never decides anything, but every finding is repairable from the panel. Duplicate-looking records
are routinely two real people — a son named after his father, three sisters given the same name — so
each finding shows the records side by side with what separates them, and a pair already linked to
each other is left out entirely: the link is somebody having decided they differ, and a merge across
a parent, sibling or partner link is refused by the database itself.
Merge opens a window with both records on the outside and the one they are about to become in the middle. The middle follows the same rules the server does — the survivor keeps its own values, inherits whatever it lacks, takes the closer of the two ratings, keeps both notes — and every field in it is editable, because the right answer is often one record's name and the other's job, which picking a winner cannot express. Clicking a value on either side takes it. Which record survives is a toggle, and switching it leaves whatever you typed alone. Nothing is written until you confirm.
An empty organization is deleted in a click; a family link nobody classified is filed as parent, child, sibling or partner in a click, keeping the note that was on it; a parent link pointing at someone born before their own child is flipped in a click. Not a problem hides a finding for good, stored with the owner's own settings so the list drains instead of nagging.
A merge moves rows across five tables, so it runs as one Postgres function rather than a series of
calls from the browser: it cannot stop halfway and leave a record whose facts moved but whose links
did not. The losing record is archived into deleted_records in full — with the id it was merged
into — before anything moves, so every merge is recoverable.
Shared days, if you also keep a location archive
Off by default. Set locationCompanions: true in web/config.js when the same database also
carries the schema from tars-location-mcp.
The record card then gets a With me block: give a person a date range, times optional, and
the location archive answers where the two of you were — cities, countries, and the trip it
falls in. Nothing is typed twice, and nothing about a place is stored on the person.
People Memory owns none of those tables. With the flag off, or with the tables absent, the block does not render and the app loads exactly as before.
Hosted Supabase
Create a free Supabase project, then apply the checked-in migrations:
supabase login
supabase link --project-ref YOUR_PROJECT_REF
supabase db pushSet owner_email, enable the desired Auth providers, and deploy web/ to a static host. The browser
uses only the publishable key. Row-level security rejects every account except the configured owner.
The MCP server uses a direct PostgreSQL URL stored outside Git.
For an existing non-Supabase PostgreSQL database, apply every file in supabase/migrations/ in
filename order and use the optional API for browser access:
for f in supabase/migrations/*.sql; do psql "$PEOPLE_MEMORY_DATABASE_URL" -v ON_ERROR_STOP=1 -f "$f"; done20260803000100_security.sql expects the Supabase anon/authenticated roles and an auth.jwt()
function; outside Supabase, create them first or skip that file and keep the database private.
Upgrading an existing install means applying the migrations it has not seen yet, in the same order.
Optional REST API
uv run --extra api people-memory api --host 127.0.0.1 --port 8765Set PEOPLE_MEMORY_API_TOKEN to require Authorization: Bearer .... Keep the API on loopback unless
you put it behind TLS, authentication, rate limits, and backups.
Skills
setup-people-memory: choose local/cloud deployment, configure an existing agent, select imports, offer approved connectors, start the UI, and verify the install.remember-people: retrieve on name mention and save durable human facts during conversation.import-contacts: import and deduplicate official exports.enrich-people: use approved Gmail, Calendar, Drive, browser, or WhatsApp connectors.maintain-people-memory: audit duplicates, conflicts, stale ties, and data quality.upgrade-people-memory: back up, migrate, upgrade the MCP/UI/skills, and verify data.
If the user does not already have an agent, the setup skill can create a minimal Codex or Claude Code
workspace from templates/ and connect People Memory to it.
Privacy and safety
This database contains third-party personal data. Treat it accordingly.
One database per person is the default design.
Hosted UI access is restricted with Supabase Auth and forced row-level security.
The browser publishable key is safe to expose only because RLS is enabled.
The service-role key and PostgreSQL password must never enter browser code or Git.
Connector access is opt-in per source. Imported and inferred facts keep provenance.
Delete archives a JSON snapshot in
deleted_recordsbefore cascading dependent rows.Back up before schema upgrades or bulk merges.
Read docs/privacy.md and SECURITY.md before exposing any component to the internet.
Development
uv sync --extra api --extra dev
uv run ruff check .
uv run pytest --cov=people_memory
supabase db resetThe project uses the current stable v2 line of the official MCP Python SDK and the latest Supabase migration workflow.
License
Available Tools
11 toolsadd_factC
Attach a durable fact to a person. Ask the user if the name is ambiguous.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | No | ||
| number | No | ||
| fact_date | No | ||
| confidence | No | stated | |
| person_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. 'Attach a durable fact' implies persistence and mutation but doesn't state whether it appends, overwrites, or requires existing person records. It doesn't disclose idempotency, conflict behavior, or what 'durable' means relative to other storing tools. The ambiguity-checking instruction is a behavioral note but too shallow to constitute real transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence plus an instruction fragment. It is efficient and front-loaded with the core purpose. However, the 'Ask the user if the name is ambiguous' fragment is oddly placed and could be integrated more clearly as a usage guideline.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 6 parameters, no annotations, and a low-coverage schema, so the description must compensate for that complexity, but it does not. An output schema exists, which lowers the burden for explaining return values, but the description still leaves major gaps: what 'durable fact' entails, how person_name disambiguation works, and parameter semantics are all unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters. It provides essentially zero parameter information — no explanation of how key/value/number/fact_date/confidence relate, which are optional, or what fields are needed for a complete fact. With 6 parameters at 0% coverage, the description's failure to describe any of them is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it attaches a durable fact to a person, giving a specific verb and resource. However, the phrase 'Ask the user if the name is ambiguous' confuses the purpose — it reads as an instruction to the agent about conversation behavior rather than clarifying what the tool does. It lacks the behavioral specificity needed to distinguish it from siblings like remember_person or record_interaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. There's no mention of when a fact should be stored via this tool rather than via remember_person or record_interaction. The 'ask the user if the name is ambiguous' hint gives a minor usage signal but is vague and doesn't establish exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_peopleB
Create a relationship between two existing people. Never guesses ambiguous names.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| note | No | ||
| person_a | Yes | ||
| person_b | Yes | ||
| strength | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states 'Never guesses ambiguous names,' which is a constraint rather than describing behavior like whether connections are bidirectional, whether duplicate relationships are possible, whether existing relationships get overwritten, or the effects of the optional note/strength fields. For a mutation tool creating relationships in what appears to be a knowledge graph, this is a significant transparency gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately short at two sentences. The first sentence is front-loaded and clear. However, it's borderline under-specified rather than genuinely concise—the second sentence adds only a constraint. Given the tool's complexity (5 parameters, relationship semantics), slightly more length could be justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is an output schema, so return-value documentation isn't required. However, with 0% schema coverage, 5 parameters (3 required), and no annotations, the description is incomplete. It doesn't document valid 'kind' values, the strength semantics, or what a successful connection does to the graph. It's minimally functional but leaves important behavioral and parameter gaps for a tool with this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented parameters. It doesn't explain what 'kind' values are valid (relationship types), what strength means numerically, or what note is for. Neither the schema (bare titles like 'Kind', 'Person A', 'Strength') nor the description provide meaningful semantics for 3 of the 5 parameters. The description adds no parameter-level meaning beyond the 'ambiguous names' constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear purpose: 'Create a relationship between two existing people.' This uses a specific verb (create) with a clear resource (relationship between people). It distinguishes from siblings—search_people, get_person, remember_person all deal with individual people rather than relationships, while connect_people specifically targets the connection. However, it doesn't name the sibling relationships explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a partial usage guideline: 'Never guesses ambiguous names' implies the tool requires existing/unambiguous person references. However, it doesn't explain when to use this vs. record_interaction or add_fact (which could also capture relationships), nor does it specify prerequisites like whether people must already exist in the graph. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_intro_pathC
Find short relationship paths from a person to anyone at a target organization.
| Name | Required | Description | Default |
|---|---|---|---|
| max_depth | No | ||
| from_person | Yes | ||
| target_organization | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description doesn't state whether this is a read-only path-finding operation, how paths are computed, whether it requires existing data/graph state, what happens when no path exists, or the depth limit behavior. For a tool that traverses a graph, the underlying mechanics and limitations are undocumented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with zero wasted words. It conveys the core purpose clearly. However, given its brevity, it prioritizes compactness over the behavioral and parameter details that would add value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is an output schema, which helps with return values, but this is a graph-traversal tool with three parameters at 0% schema coverage and no annotations. The description doesn't address the meaning of 'short', the depth semantics, what constitutes a path, graph prerequisites (e.g., does the graph need to be built first?), or failure behavior. For a non-trivial pathfinding tool, this is under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains target_organization and from_person at a high level implicitly (the 'to/from' of the path). However, max_depth is entirely unexplained—its meaning, valid range, default behavior, and performance implications are absent from both schema and description. The description adds minimal semantic value beyond what the parameter names already convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Find'), the resource ('relationship paths'), the subject ('a person'), and the target ('anyone at a target organization'). It's specific enough to convey the core function. However, it doesn't explicitly distinguish from siblings like connect_people or search_people, though the name 'intro_path' front-loads the intent reasonably well.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There's no explicit guidance on when to use this vs alternatives like search_people or connect_people. The description implies usage context ('relationship paths','intro') but doesn't name alternatives or exclusion criteria. With siblings that overlap thematically (connect_people, search_people), this is a meaningful gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_personA
Get one person's full record. Returns candidates instead of guessing when ambiguous.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. The description discloses a key behavioral trait: it returns candidates instead of guessing when ambiguous, which is genuinely valuable and non-obvious behavior. It doesn't cover what the output looks like, but with an output schema present, the bar is somewhat lower. Reads clearly as non-destructive given 'Get'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both information-dense. The first states the purpose, the second adds the critical ambiguity-handling behavior. Zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter lookup tool with an output schema present, this is reasonably complete. The ambiguity-return behavior is disclosed, and the output schema presumably documents the return format. Could benefit from mentioning what 'full record' includes, but that's likely captured in the output schema, so not a major gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% with a single 'name' parameter. The description doesn't add any specifics about the name format (partial vs exact, case sensitivity, etc.), though the ambiguity note hints that partial-matching may occur. The parameter is simple enough that the baseline isn't severely harmed, but no additional semantic value is added beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Get one person's full record.' The differentiation from siblings is implied ('one person' vs search_people which presumably returns multiple). However, it doesn't explicitly distinguish from search_people, and the alternative to look up people is clearly search_people. The ambiguity-return behavior ('Returns candidates...') adds useful scoping.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states 'Get one person's full record' implying this is for a single known person, and the ambiguity note suggests when the exact person is unclear it returns candidates. However, it doesn't explicitly say when to use this vs search_people, nor does it state when-not-to-use it. The context is somewhat clear (single record lookup) but lacks explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_statusB
Check the graph connection and return record counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full disclosure burden. It indicates a read-only check operation but doesn't state error behavior (e.g., what happens if the graph is disconnected, whether it throws, returns partial results), rate limits, or what specific counts are returned. This is a read operation, but minimal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no wasted words. However, the phrase 'graph connection' is slightly ambiguous in context (connection status vs. connectivity diagnostics), and 'record counts' could be more specific about what records count against.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, complete enough for a diagnostic check. The output schema exists and presumably documents the return structure. However, the description could clarify what error/status signaling occurs if the graph is unreachable, and whether record counts represent the full graph or some subset.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema provides nothing to document. With no params, the baseline is 4 per the rubric. The description clearly conveys what the tool returns (record counts) without needing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear purpose: check graph connection and return record counts. It uses a specific verb ('check') and resource ('graph'), distinguishes its diagnostic function from the sibling tools which perform search, retrieval, and mutation operations on graph data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'check' verb implies a diagnostic/health-check use case. Context around when to run this (e.g., before queries, after connection issues, to validate the graph is responsive) is absent but somewhat implicit given the phrasing and zero parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_queryB
Run one guarded SELECT for advanced graph analysis. No DDL or data changes.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| max_rows | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. 'No DDL or data changes' usefully discloses non-mutating behavior, and 'guarded' suggests protective limits. However, it doesn't elaborate on what 'guarded' entails (e.g., execution timeout, forbidden clauses, automatic row limits), what happens on violations, or how results are returned. It adds some value beyond what the schema provides but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The description is efficiently front-loaded with the core purpose followed by the safety disclaimer. Every word earns its place, though the brevity leaves behavioral detail unaddressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a free-form query executor (high complexity in terms of what the agent might write), with no annotations and 0% schema description coverage. While output_schema exists (helps with return understanding), the description leaves significant unknowns: query language, 'guarded' semantics, max_rows behavior, and error handling. Given the complexity, the description is under-specified, though the presence of an output schema earns it a mid score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the two parameters (query, max_rows). The description mentions 'query' implicitly by 'advanced graph analysis' but provides no guidance on query syntax, language (SQL? Cypher?), or how max_rows is enforced. With zero schema coverage, the description fails to explain parameter meaning or usage, which is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it runs a 'guarded SELECT' for 'advanced graph analysis', which is a specific verb+resource with a clear scope. It distinguishes from siblings like write_query (clearly the write counterpart). However, it doesn't name the specific alternative or elaborate enough to fully disambiguate from other query-related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies read-only usage ('No DDL or data changes') and mentions 'guarded', giving some context. However, it does not explicitly state when to use this vs alternatives, nor does it specify the exact safety constraints of 'guarded' (e.g., is there a timeout? a row cap enforced automatically? a read replica?). The guidance is implied but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_interactionB
Record a dated call, meeting, message, meal, or other interaction.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | ||
| summary | No | ||
| happened_on | Yes | ||
| person_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It doesn't state whether this is a write/mutation operation, whether interactions are append-only, whether person_name must already exist (vs being created), data retention behavior, or any error conditions for invalid dates or unknown persons. Given the tool records data, this silent mutational behavior is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It front-loads the verb and resource and adds value by enumerating example interaction types. It's appropriately sized for the tool's simple scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 4 params with 0% schema coverage, no annotations, and a mutation behavior. The output schema is present but the description still leaves significant ambiguity: what values are valid for 'channel', does 'person_name' need to pre-exist in the system (possibly relevant to sibling 'search_people'/'get_person'), and what date format does 'happened_on' expect? For a recording tool, these are important operational details missing from the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the 4 undocumented parameters. However, the description does enumerate interaction types (call, meeting, message, meal) which hints at what might go into 'channel' or 'summary'. It doesn't explain what format 'happened_on' takes, what values 'channel' accepts, or what 'person_name' semantics are (must it be an existing record?). With 0% coverage and no enrichment, score 3 is the fair mid-point.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Record') with a resource ('interaction') and enumerates the kinds of interactions it covers (call, meeting, message, meal, or other). It clearly distinguishes itself from sibling tools like 'add_fact' and 'remember_person' by focusing on dated interactions rather than general facts or people profiles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context ('record a dated interaction') but gives no explicit when-to-use or when-not-to-use guidance. Among siblings like 'add_fact', it's clear this is for temporal touchpoints vs. standalone facts, but the boundary isn't explicitly stated, and no alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remember_personA
Create or update a person from conversation.
By default this refuses similar-name duplicates and conflicting overwrites. Ask the user, then retry with confirmed_new or overwrite only after they decide.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| No | |||
| phone | No | ||
| country | No | ||
| summary | No | ||
| fact_key | No | ||
| full_name | Yes | ||
| overwrite | No | ||
| fact_value | No | ||
| current_org | No | ||
| current_role | No | ||
| linkedin_url | No | ||
| confirmed_new | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the important guardrail behavior: refusing duplicates and conflicting overwrites, and requiring user confirmation before proceeding. This is significant behavioral insight. However, it doesn't disclose what gets destroyed on overwrite, whether the operation is idempotent, or any persistence details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. The core purpose is stated in one line, then the guardrail behavior follows. It's front-loaded with the verb+resource. Could arguably merge or elaborate slightly, but overall it's economical and earns each sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema and only 1 required param, the 13-parameter tool with 0% schema coverage needs more. The description explains the confirmation workflow well but says nothing about what the tool returns, how fact_key/fact_value interact with the person-record fields, or whether there are constraints on the data (format, length). For a 13-param mutation tool, this is marginally adequate but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description has the burden to explain parameters. It covers confirmed_new and overwrite semantics via the guardrail text, but the remaining 11 parameters (city, email, phone, country, summary, fact_key, full_name, fact_value, current_org, current_role, linkedin_url) are entirely undocumented. The description explains the two boolean toggles but nothing about the data fields themselves. With 0% coverage, the baseline 3 is appropriate but the description falls short of fully compensating.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource: "Create or update a person from conversation." This distinguishes it from siblings like get_person (read), search_people (search), and add_fact (adds facts to existing person). It's clear and specific, though it could more explicitly differentiate from add_fact which also relates to person data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on the guarded workflow: "By default this refuses similar-name duplicates and conflicting overwrites. Ask the user, then retry with confirmed_new or overwrite only after they decide." This tells the agent when to use confirmed_new vs overwrite parameters, which is valuable behavioral guidance. However, it doesn't cover when to prefer add_fact or update via other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_peopleC
Search people by name, organization, role, city, identifier, summary, or fact.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral disclosure burden. It discloses that the tool is a search across multiple fields (a read/search operation implying non-destructive behavior), but provides no detail on result format, pagination, limit semantics, relevance ranking, or whether the query matches substring vs exact. For a search tool, ordering and match semantics are materially useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the verb and scope, with zero wasted words. It is adequately concise for a search tool, though it could not be considered exceptionally well-structured since all information is packed into one clause with no additional organizational structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (which explains return values, reducing description burden) and only 2 simple parameters. The description covers query semantics reasonably. However, it lacks guidance on match behavior, limit semantics, and result ordering, which for a search tool are relevant completeness gaps. Given its relative simplicity, it is minimally complete but not rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It partially does by spelling out what the query can match against (name, organization, role, city, etc.), adding real meaning to the query parameter. However, it says nothing about the 'limit' parameter's behavior beyond what the schema's default of 20 implies, and provides no syntax/format hints for composing queries (e.g., free-text vs structured).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the verb (search) and resource (people) and enumerates the search dimensions (name, organization, role, city, identifier, summary, fact). It signals this is a discovery/search operation distinct from targeted lookups like get_person. Lacks strong sibling differentiation (notably search_people vs get_person could be confused), but the enumerated search fields provide useful scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this vs alternatives. The sibling set includes get_person (likely a targeted lookup by ID), read_query, and write_query, but the description never clarifies the distinction. An agent might not know whether to use search_people or read_query for people queries, or when search_people is preferred over a direct get_person fetch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stale_contactsC
List strong relationships with no recent interaction.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| min_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. However, it doesn't clarify what 'strong relationships' means (thresholds heuristics), what 'recent' is defined as, whether the output is a count or list, or whether the query could be expensive for large graphs. The min_days parameter hints at recency definition, but the description doesn't surface key behavioral semantics beyond the parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, zero waste, front-loaded with the core function. Efficient and clear in its brevity. No extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no annotations, no schema descriptions (0% coverage), and 10 sibling tools, the description is under-specified. It does have an output schema which explains return structure, but the key open questions — definition of 'strong', definition of 'recent', and relation to sibling tools — remain unaddressed. The min_days parameter (default 180) suggests recency logic, but the description fails to connect the dots clearly enough for an agent to correctly judge when to invoke this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the schema provides no descriptions for limit and min_days. The description doesn't add meaning for these parameters either — 'limit' and 'min_days' are self-descriptive names, but the description doesn't clarify how min_days interacts with 'recent' or what a sensible limit is. With 0% schema coverage, the description should compensate but does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List strong relationships with no recent interaction' uses a specific verb (List) plus a resource (relationships/contacts), and distinguishes the scope ('strong relationships', 'no recent interaction'). It's clear what the tool does, though it doesn't explicitly distinguish it from sibling tools like graph_status or record_interaction. The purpose is specific enough to be useful.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. With 10 sibling tools including search_people, get_person, and graph_status, there's no clarity on edge cases (e.g., what defines 'strong relationship' or 'recent'), nor when a user should prefer this over other search/list tools. The description implies it's for relationship health queries but offers no exclusions or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_queryA
Run one guarded INSERT, UPDATE, or DELETE. UPDATE/DELETE require WHERE; DDL is blocked.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It discloses safety guards (WHERE requirement, DDL blocked) which indicate operational protections. However, it doesn't disclose what happens on failure, whether this is a mutation with no rollback, any permissions/auth requirements, or what the output shape is. The safety restrictions give some transparency but leave gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one sentence with zero wasted words. Every clause carries information about allowed operations and constraints. It's ideal front-loaded specification that an agent can parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 1 free-form string parameter, an output schema, and no annotations, the description covers the essential constraint (which statement types are allowed) but doesn't explain return behavior. Given it has an output schema, the return format is presumably structured elsewhere. The missing piece is parameter format guidance—what SQL dialect, escaping expectations, multi-statement handling—which would help complete the picture for a query execution tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage and only one parameter (query), which is a free-form string. The description does not elaborate on the query parameter's format, escaping requirements, or valid syntax beyond the INSERT/UPDATE/DELETE restriction. With zero schema coverage, the description should compensate by explaining how to format the query string, but it provides no such guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs INSERT/UPDATE/DELETE queries with specific verbs indicating the write operation. It distinguishes from sibling 'read_query' by explicitly stating it handles writes (INSERT/UPDATE/DELETE) while implying read_query is for reads, though it doesn't name the sibling explicitly. The resource is a database query, and the specific operation types are named clearly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage constraints: UPDATE/DELETE require WHERE, and DDL is blocked. This tells the agent what queries are permissible. However, it doesn't explicitly state when to prefer this over read_query or other write-alternatives in the sibling list, though the INSERT/UPDATE/DELETE scope plus the 'DDL blocked' guard gives clear boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
11 tool updates
v0.1.0- First observed
add_fact - First observed
connect_people - First observed
find_intro_path - First observed
get_person - First observed
graph_status - First observed
read_query - First observed
record_interaction - First observed
remember_person - First observed
search_people - First observed
stale_contacts - First observed
write_query
TDQS
Most tools are clearly distinct (graph_status, search_people, get_person, add_fact, record_interaction, find_intro_path, stale_contacts). There is minor overlap between read_query/write_query and the higher-level person/interaction tools, since an agent could use write_query to bypass the intended workflows, but descriptions clarify their guarded, analysis-focused roles.
Tool names follow a consistent verb_noun pattern throughout: graph_status, search_people, get_person, remember_person, add_fact, record_interaction, connect_people, find_intro_path, stale_contacts, read_query, write_query. The naming is clean and predictable.
11 tools is reasonable for a people-memory graph server. Each tool covers a distinct purpose (querying, creating, interactions, relations, analysis). It's slightly on the higher end but not excessive, and no tool feels redundant.
The surface covers search, get, create/update (remember_person), add facts, record interactions, connect people, path finding, and staleness analysis. Minor gaps include no delete/forget person operation and no direct relationship update/removal tool, but core lifecycle and analysis workflows are well covered.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
Persistent memory for AI agents with OAuth-backed hosted MCP access.
Person-owned AI memory that learns, not just stores — portable context for any MCP client.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceOpen-source MCP memory server providing persistent, cross-platform context for AI tools via a knowledge graph with encrypted storage.413AGPL 3.0
- AlicenseAqualityBmaintenanceA personal memory MCP server that ingests AI agent conversation logs from multiple platforms into a searchable PostgreSQL+pgvector database, enabling cross-session recall of past reasoning and decisions.6MIT
- AlicenseNot gradedqualityBmaintenanceMCP server providing persistent AI memory with four-tier retrieval (SQLite FTS5, graph, vector, LLM agent) to give AI assistants structured, long-term memory without RAG.1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA privacy-first MCP server that acts as the universal memory and profile layer for AI agents, enabling profile management, skills, resume import, and team sync.4MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/michelgrolet/people-memory-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server