For renderer LLMs
Mandaire exposes a single MCP server. Your AI connects once, authenticates once, and reaches everything — the person's full life graph, communications, calendar, files, synthesis — through one uniform verb shape. No endpoint proliferation. No per-feature integrations.
Connection
Endpoint: https://mcp.mandaire.com/mcp
Transport: Streamable HTTP (MCP spec v2025-03-26)
Auth: OAuth 2.1 with Dynamic Client Registration (DCR)
Your client registers dynamically. Send a DCR POST /register, receive a client_id, exchange for a bearer token, attach to every request. The full OAuth metadata is at https://mcp.mandaire.com/.well-known/oauth-authorization-server.
For Claude.ai and Claude Desktop: add https://mcp.mandaire.com as an MCP server URL. The auth flow runs automatically on first connect.
The tool surface
Everything a renderer LLM needs to do — read about a person, search communications, write back an observation, query open calendar, retrieve synthesis — flows through mandaire(). One permission grant covers all routine access.
A fifth tool, tool_telemetry, is registered for Mandaire-internal observability. Renderer LLMs do not call it directly.
The verb shape
Defaults. verb defaults to SELECT. depth defaults to "standard" for external callers and auto-upgrades to "deep" for the data owner.
Read kinds (partial). person, email, message, event, photo, trip, note, file, topic, context, recall, open_commitments, catch_me_up, entity_state, inference_claim, open_writeback_slots.
Write kinds. ai_observation (INSERT), correction, task, state, inference_claim (UPDATE confirm/reject).
The full catalog is in mandaire(from_kind="system", fields=["protocol"]) or get_protocol_spec().
The response envelope
confidence is 0.0–1.0. Phrase hedging accordingly. Never present a 0.6 result as certain.
absent_knowledge_caveats — surface these. Gaps are facts, not noise.
expectedness — SUPPRESS (the user already knows), SURFACE_NOVEL, or SURFACE_INTERESTING_IF_TRUE. Use this to decide what to lead with.
disclosure_applied — confirms the policy ran. Do not re-filter; Mandaire already did.
writeback_slot_id — present on nil-result SELECTs. See below.
Nil results and the writeback slot
When a SELECT returns empty — count: 0 or found: false — the envelope includes a writeback_slot_id:
The slot is Mandaire saying: I do not know this yet. If you learn it from the user, close the loop.
What to do. Disclose the gap to the user. Do not invent an answer. If the user then tells you the answer, write it back and include the slot ID.
The slot closes automatically. Future queries find the fact. Slots expire after 14 days if never closed.
You can query open slots:
The three required INSERT fields
ai_observation declares its source, its tier, and its confidence.1. claim_source — who provided this?
If claim_source is omitted, Mandaire infers it from trigger_reason. If neither is present, the INSERT is rejected.
2. claim_tier — what validation pathway does this need?
3. confidence — how certain are you?
Overstating confidence is worse than understating. Low-confidence rows enter a 30-day review window; high-confidence rows land silently. The pipeline gates on this number.
What stays private
What your AI sees. Only what the user's disclosure policy permits. Every SELECT passes through a policy pre-flight before the response is returned. The disclosure_applied envelope field confirms this ran.
What requires a purpose declaration. Sensitive from_kinds (correction_history, disclosure_policy, health data, personality profiles) require an explicit purpose= parameter. Without it, the call is rejected with a clear hint.
What is never exposed. Raw credentials, payment data, SSNs, passwords. PII pattern detection runs on every INSERT and rejects claims containing these patterns before they reach storage.
Write accountability. Every AI observation is audit-logged with source_attribution, trigger_reason, claim_source, and a confidence value. The user can review and reject any AI-written claim.
System prompt integration
Add this to your system prompt to enable the writeback loop:
The MCP tool instructions served by get_protocol_spec() cover the full verb catalog, the from_kind list, and worked examples. You do not need to pre-load all of it. The tool descriptions are self-documenting.
Anti-patterns
❌ Fan out multiple calls to assemble one person profile. Every sub-call is a round trip. Use one call with depth="deep".
❌ Discover a topic then fetch context in two separate calls. Use ask= in one call on the right from_kind.
❌ Pre-meeting prep via three calls. Use from_kind="event" with purpose="preparing_for_meeting". The server assembles attendee context, related threads, and open commitments in one pass.
❌ Reason from training data when the user has synthesis on the topic. Call Mandaire first. Training data is stale by months; Mandaire's synthesis is current.
❌ Pick a candidate when result.ambiguity_warning is set. Ask the user to disambiguate. Silently choosing the first result can write facts to the wrong person.
❌ Call from_kind="recall" after from_kind="person" for the same entity. Check result.recall_not_required first. If True, recall adds nothing; the person call already synthesised it.
❌ Retry a timed-out call with identical arguments. Mandaire caches SELECT results for 5 minutes. An identical retry hits the same timeout path. Use depth="standard" for the first call and upgrade only if the initial result is insufficient.
Quick reference