protocol · two servers

LovedOne MCP and Soft MCP

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.

Which server

Family product

LovedOne Family 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.

Family specification →

Provider product

Sandwich Soft MCP

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.

Provider specification →

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. This site is live at docs.joinsandwich.com. 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.
Family tools
ping · get_user_profile · list_loved_ones · list_family_members · list_inbox_messages · get_inbox_message · list_care_events
Soft tools
ping · get_agency_profile · list_clients · get_client · list_visits · add_visit_note · list_invoices

Naming for marketing

Do not invent a third MCP brand. Map the protocol onto the products you already sell.

  • LovedOne is the family product. Short form: LovedOne MCP.
  • Sandwich Soft is the provider OS. Short form: Soft MCP.
  • Sandwich Pipe is partner ingest into the vault. It is not MCP.

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.

Vendor line. LovedOne is how the family sees care mail. Sandwich Soft is how your agency runs the roster. Soft MCP is how your agent sees your clients — never their siblings’ inboxes.

Auth and keys

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.

Vault, PII, and health data

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.

SOC 2 and questionnaires

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.

Secrets
SHA-256 hashed keys; revoke sets revokedAt; next call fails.
Audit
mcp_audit_log: uid, apiKeyId, method, tool, success, duration. Not arguments or bodies.
Isolation
Every tool re-checks workspace or agency membership. Admin SDK bypasses Firestore rules, so the handler is the control.
Transit / rest
TLS 1.2+ and HSTS at Vercel. Firestore AES-256 (Google-managed). Vault adds application-layer AES-256.
BAA
Google Cloud org-level BAA signed. Vercel Enterprise, Anthropic, and Cloudflare Email Routing terms are open items before a given path is HIPAA-eligible. See the family and provider specs.

Full control narrative: the repo file docs/BAA-HIPAA-SOC2.md.

Connect snippets

Family (Claude Desktop / Cursor):

lovedone-familyjson
{
  "mcpServers": {
    "lovedone-family": {
      "url": "https://api.lovedone.app/mcp/v1",
      "headers": { "Authorization": "Bearer sk-sand-…" }
    }
  }
}

Provider:

sandwich-softjson
{
  "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)