Two authenticated Model Context Protocol servers. They share a host
(api.lovedone.app) and a key prefix (sk-sand-).
They do not share tenancy, tools, or audit purpose. A family key on the
vendor URL returns HTTP 403 WRONG_SURFACE.
Short names: LovedOne MCP (family) and
Soft MCP (providers). Pipe is ingest, not MCP.
api.lovedone.app/mcp/v1
Adult children coordinating a household. Lists loved ones, members,
and inbox mail as plaintext. Registry com.lovedone/family-inbox 0.2.0.
api.lovedone.app/mcp/vendor/v1
Home-care, tech-support, and trades vendors. One key lists that
agency's clients, visits, and invoices. Registry com.lovedone/provider 0.1.0.
Both pages, and both in-product agent screens (inbox.lovedone.app/agents and soft.joinsandwich.com/agents), list the other server so a developer who lands on the wrong host still sees the difference.
docs.lovedone.app is the same Vercel project
(sandwich-platform-docs). Add that domain, then CNAME
docs on the lovedone.app Cloudflare zone to
cname.vercel-dns.com. Until then the lovedone host does
not resolve. Prefer the lovedone host for MCP once it is live, because
the API host is already api.lovedone.app.
ping · get_user_profile · list_loved_ones · list_family_members · list_inbox_messages · get_inbox_message · list_care_eventsping · get_agency_profile · list_clients · get_client · list_visits · add_visit_note · list_invoicesDo not invent a third MCP brand. Map the protocol onto the products you already sell.
api.lovedone.app is an API host, not a product name. Both
servers live there so partner and agent traffic share one apex.
/mcp/v1 is family. /mcp/vendor/v1 is Soft.
Say the product first, then MCP. Do not say “Sandwich MCP”
without Family or Soft after it. That was the old single-server name
and it is how people mix the two.
Keys look like sk-sand- plus 64 hex characters. Plaintext
is shown once at mint. Firestore stores SHA-256. Each key is tagged
surface: family or surface: agency. The HTTP
handler compares that tag to the endpoint. Mismatch is HTTP 403
WRONG_SURFACE.
Mint family keys at inbox.lovedone.app/settings/mcp-keys. Mint Soft keys in the portal under Settings → MCP keys (owner or admin). OAuth 2.1 + PKCE is available for hosted connectors. Session cookies work for in-app agents on each product host.
Transport: JSON-RPC 2.0, one POST per call, protocol
2025-03-26. Prefer structuredContent on tool
results. Rate limit: 60 requests/minute per key.
Family Inbox subjects and bodies can be PHI (appointments, labs, EOBs). Soft visit notes can be health-related. Tools return plaintext, never raw HTML (XSS plus extra PHI in quoted threads). Attachment bytes are not returned.
Raw EHR and inbound MIME live in GCP project sandwichpipe-vault
on Cloud Run. No user routes. Application-layer AES-256 plus Google-managed
keys. Family MCP list_care_events reads already-redacted
fields only, and only when Pipe is connected. Soft MCP never dumps vault
blobs.
Sibling emails appear on Family list_family_members only.
Soft list_clients does not return family-member emails.
We are not SOC 2 attested yet. Type I (control design at a point in time) is the next formal step. Type II needs a 6–12 month evidence window we have not opened. Say that plainly on vendor security forms.
revokedAt; next call fails.mcp_audit_log: uid, apiKeyId, method, tool, success, duration. Not arguments or bodies.
Full control narrative: the repo file docs/BAA-HIPAA-SOC2.md.
Family (Claude Desktop / Cursor):
{
"mcpServers": {
"lovedone-family": {
"url": "https://api.lovedone.app/mcp/v1",
"headers": { "Authorization": "Bearer sk-sand-…" }
}
}
}
Provider:
{
"mcpServers": {
"sandwich-soft": {
"url": "https://api.lovedone.app/mcp/vendor/v1",
"headers": { "Authorization": "Bearer sk-sand-…" }
}
}
}
Do not put a Soft key in the family slot, or the reverse.
LovedOne Family MCP specification · Sandwich Soft MCP specification · Sandwich Pipe · Public sandbox (not PHI)