MCP · Streamable HTTP

Relationship memory for personal assistants.

Threadkeep stores people, selected interactions, and commitments in a private vault so connected assistants can recover useful context and help users follow through.

Server URLhttps://mcp.threadkeep.me/mcp
TransportStreamable HTTP
AuthenticationOAuth 2.1 · DCR · PKCE

Quickstart

Connect the URL from an MCP client. Threadkeep dynamically registers compatible clients and opens an authorization screen.

{
  "url": "https://mcp.threadkeep.me/mcp",
  "transport": "streamable-http"
}

Confirm reachability with curl https://mcp.threadkeep.me/healthz.

Authentication

Every identity maps to one private vault. The OAuth authorization server supports dynamic client registration and PKCE S256.

vault:readRequired for people, history, and briefings.
vault:writeOptional for selected updates.
Threadkeep does not connect directly to email or calendar providers. An assistant may save context the user or connected sources supply.

Data model

People contain relationship details and follow-up dates. Interactions capture selected conversations and meetings. Commitments record promised follow-through. Context snapshots preserve source evidence supplied during memory refreshes.

Tools

Read responses place the primary value under data and may include a non-binding continuity-maintenance recommendation. Examples show the primary value for brevity.

get_current_identity

Returns the authenticated principal, vault, and effective scopes.

Authentication only

Payload

{}

Response

{ "principal_id": "user:alex@example.com", "vault_id": "vault:alex", "scopes": ["vault:read"] }

get_current_vault

Describes the private vault and its settings location.

vault:read

Payload

{}

Response

{ "vault_id": "vault:alex", "administration_url": "https://threadkeep.me/settings" }

search_people

Searches names, addresses, relationships, tags, and notes.

vault:read

Payload

{ "query": "hiking" }

Response

[{ "person_id": "person:maya", "display_name": "Maya Chen", "relationship": "friend" }]

list_people

Lists up to 50 saved people with optional cursor pagination.

vault:read

Payload

{ "cursor": "person:maya" }

Response

[{ "person_id": "person:alex", "display_name": "Alex Rivera" }]

get_person

Gets one complete relationship record.

vault:read

Payload

{ "person_id": "person:maya" }

Response

{ "display_name": "Maya Chen", "tags": ["hiking"], "next_follow_up_at": "2026-11-08" }

add_person

Adds a person and optional relationship details.

vault:write

Payload

{ "display_name": "Sam Lee", "primary_email": "sam@example.com", "relationship": "friend" }

Response

{ "person_id": "person:81a...", "display_name": "Sam Lee" }

update_person

Updates only the specified fields.

vault:write

Payload

{ "person_id": "person:maya", "patch": { "next_follow_up_at": "2026-11-15" } }

Response

{ "person_id": "person:maya", "next_follow_up_at": "2026-11-15" }

remove_person

Removes a person and their interactions, commitments, and snapshots.

vault:write

Payload

{ "person_id": "person:maya" }

Response

{ "removed": true }

list_interactions

Lists interactions filtered by person or type.

vault:read

Payload

{ "person_id": "person:maya", "interaction_type": "meeting" }

Response

[{ "interaction_id": "interaction:12a...", "summary": "Discussed weekend plans" }]

add_interaction

Records a selected conversation, meeting, message, or event.

vault:write

Payload

{ "person_id": "person:maya", "interaction_type": "conversation", "occurred_at": "2026-11-05T20:00:00Z", "summary": "Talked about a trail day" }

Response

{ "interaction_id": "interaction:12a..." }

update_interaction

Updates selected interaction fields.

vault:write

Payload

{ "interaction_id": "interaction:12a...", "patch": { "summary": "Planned a Saturday hike" } }

Response

{ "interaction_id": "interaction:12a...", "summary": "Planned a Saturday hike" }

remove_interaction

Removes an interaction from the vault.

vault:write

Payload

{ "interaction_id": "interaction:12a..." }

Response

{ "removed": true }

list_commitments

Lists commitments by person or status.

vault:read

Payload

{ "status": "open" }

Response

[{ "commitment_id": "commitment:91b...", "description": "Send trail options" }]

add_commitment

Records a personal, inbound, or shared commitment.

vault:write

Payload

{ "person_id": "person:maya", "direction": "mine", "description": "Send trail options", "due_at": "2026-11-08" }

Response

{ "commitment_id": "commitment:91b...", "status": "open" }

update_commitment

Updates description, due date, direction, or status.

vault:write

Payload

{ "commitment_id": "commitment:91b...", "patch": { "status": "completed" } }

Response

{ "commitment_id": "commitment:91b...", "status": "completed" }

remove_commitment

Removes a commitment from the vault.

vault:write

Payload

{ "commitment_id": "commitment:91b..." }

Response

{ "removed": true }

get_today_overview

Summarizes due follow-ups and open commitments.

vault:read

Payload

{ "date": "2026-11-06" }

Response

{ "date": "2026-11-06", "due_followups": [], "open_commitments": [] }

prepare_person_brief

Combines a person record with recent history and outstanding commitments.

vault:read

Payload

{ "person_id": "person:maya" }

Response

{ "person": { "display_name": "Maya Chen" }, "recent_interactions": [], "open_commitments": [] }

save_context_snapshot

Saves up to 50 selected email, calendar, or other source records supplied by an assistant.

vault:write

Payload

{ "batch_id": "refresh:nov-06", "items": [{ "source_type": "calendar", "title": "Trail planning", "participants": ["maya@example.com"], "occurred_at": "2026-11-09T18:00:00Z" }] }

Response

{ "batch_id": "refresh:nov-06", "saved": 1 }

list_context_snapshots

Lists source snapshots by person or source type.

vault:read

Payload

{ "source_type": "calendar" }

Response

[{ "snapshot_id": "snapshot:8f2...", "title": "Trail planning" }]

Protocol

  • POST JSON-RPC 2.0 messages to /mcp.
  • Accept application/json, text/event-stream.
  • Use protocol version 2025-06-18.
  • Return the initialization mcp-session-id on subsequent calls.