com.lovedone/family-inbox · 0.2.0

LovedOne Family MCP

Authenticated JSON-RPC for one household. The caller is a family member, or an agent holding that member’s key. This is not a multi-client vendor API. Providers use Sandwich Soft MCP.

POST https://api.lovedone.app/mcp/v1

What it does

After initialize and tools/list, a typical agent:

  1. get_user_profile — confirm workspace
  2. list_loved_ones — ids and @lovedone.app addresses
  3. list_family_members — who else is on the circle
  4. list_inbox_messages then get_inbox_message — mail as plaintext
  5. list_care_events — redacted Pipe events if Pipe is live

Writes (invite a sibling, mint a provider code, allocate an inbox) stay in the LovedOne UI in 0.2.0.

It cannot: list another family, act as a vendor dashboard, return HTML or attachment bytes, return raw FHIR, or move money.

The other server

This spec

LovedOne Family MCP

api.lovedone.app/mcp/v1

One household. Mint at inbox.lovedone.app.

Sibling spec

Sandwich Soft MCP

api.lovedone.app/mcp/vendor/v1

One agency roster. Do not collect family keys to build this. Provider spec →

Authentication

Bearer key
Authorization: Bearer sk-sand-… minted at Settings → MCP API keys. Shown once. Stored as SHA-256.
Session cookie
In-app agents on inbox.lovedone.app. No extra key.
OAuth 2.1 + PKCE
Hosted connectors. Discovery at /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource on inbox.lovedone.app. Scopes: profile:read, care_circle:read.

Transport: JSON-RPC 2.0, one POST per call, protocol 2025-03-26. Handshake name com.lovedone/family-inbox, version 0.2.0. Prefer structuredContent. Rate limit 60/min per key. Alias: POST https://inbox.lovedone.app/api/mcp.

Tools

ping
Uid, tenant, auth method. No PHI.
get_user_profile
Caller identity and workspace name/id/plan. Does not list sibling emails. Scope profile:read.
list_loved_ones
Id, name, inbox address. No date of birth, no medications. Workspace resolved from the caller’s email. Scope care_circle:read.
list_family_members
Role, relationship, status, email. Emails are PII. Do not log them in third-party traces if you can avoid it.
list_inbox_messages
lovedOneId required, limit 1–50. Subject, sender, category, 280-character plaintext preview. No HTML. PHI may be present in subjects.
get_inbox_message
messageId and lovedOneId required. Plaintext capped at 8 000 characters. Attachment metadata only. Ownership: message workspace and loved-one id must match.
list_care_events
Redacted vault events. If Pipe is not connected: pipeAvailable: false, empty list. Never returns raw FHIR, raw MIME, or partner HMAC.

Vault, PII, and health data

Family Inbox mail can be ePHI: appointment reminders, lab portals, EOBs, pharmacy notices, discharge summaries. We treat it that way in the control set (audit, encryption, least privilege) even when the family is a consumer user.

Raw partner payloads live in GCP project sandwichpipe-vault: Cloud Run, no user routes, Google-managed AES-256 plus application-layer AES-256, a single redaction-worker service account, HMAC-signed egress of already-redacted events into nunabot-472b3. This HTTP handler does not read raw artifacts.

We do not claim HIPAA coverage for a given customer until a BAA is in place for that relationship. Google Cloud’s org-level BAA covers Firestore and Cloud Run. Vercel Enterprise BAA, Anthropic (in-app chat), and Cloudflare Email Routing terms are open items in the binder.

If you connect this MCP to a model provider, you are disclosing inbox plaintext to that provider. If you are a covered entity or business associate, you need a BAA with that provider before you send PHI.

SOC 2

Not attested yet. Type I is next. Type II needs a 6–12 month evidence window. Say that on questionnaires.

Secrets
Hashed keys. Revoke from Settings. Next call fails.
Audit
mcp_audit_log: caller, tool, timestamp, duration. Not message bodies.
Isolation
Every tool re-checks workspace membership. Admin SDK bypasses Firestore rules, so the handler is the control.
Transit / rest
TLS 1.2+, HSTS, Firestore AES-256. Vault adds application-layer AES-256.
Least privilege
HTML withheld. Attachment bytes withheld. Vault HMAC withheld. Other families unreachable.
Type II gaps
Key rotation SLA, SIEM export of audit logs, documented access-review cadence.

Connect

claude_desktop_config.jsonjson
{
  "mcpServers": {
    "lovedone-family": {
      "url": "https://api.lovedone.app/mcp/v1",
      "headers": { "Authorization": "Bearer sk-sand-REPLACE" }
    }
  }
}
initializebash
curl -s https://api.lovedone.app/mcp/v1 \
  -H "Authorization: Bearer sk-sand-…" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"docs","version":"0"}}}'

In-product: inbox.lovedone.app/agents (lists both servers). Hub: mcp.html. Provider spec: mcp-vendor.html.