com.lovedone/provider · 0.1.0

Sandwich Soft MCP

Authenticated JSON-RPC for one provider organization. One key lists that agency’s clients — the Postiz-style dashboard pattern — without collecting family API keys. Families use LovedOne Family MCP.

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

What it does

  1. get_agency_profile — agency id, slug, plan, caller role
  2. list_clients — roster, including linkedToFamily
  3. get_client / list_visits — one client or agency-wide events
  4. add_visit_note — write; family inbox copy if linked
  5. list_invoices — ledger rows this agency issued (no money movement)

If the user belongs to more than one agency, pass agencyId. Otherwise the sole membership is used.

It cannot: read a family inbox, list sibling emails, see another agency, dump vault artifacts, or transmit funds.

The other server

This spec

Sandwich Soft MCP

api.lovedone.app/mcp/vendor/v1

One agency. Mint in the Soft portal.

Sibling spec

LovedOne Family MCP

api.lovedone.app/mcp/v1

One household. A family key here is 403. Family spec →

Building a vendor dashboard

Hold one Soft MCP key per agency (or per staff member):

flowtext
get_agency_profile → list_clients → for each client: list_visits, list_invoices

Read structuredContent. Do not ask families for LovedOne keys. Do not store N family keys and iterate them. That fails isolation (and WRONG_SURFACE if you pointed those keys at this URL). Family-visible notes already copy via add_visit_note when the client is linked.

Tools

ping
Smoke test. No PHI.
get_agency_profile
Optional agencyId. Portal URL https://{slug}.soft.joinsandwich.com/. Scope profile:read.
list_clients
clientId, names, linkedToFamily. No family-member emails. No date of birth.
get_client
clientId required. Error if the record belongs to another agency. Recent events included.
list_visits
Optional clientId, limit 1–100. notes may be health-related. Pass clientId unless you need the agency-wide ops view.
add_visit_note
Write. title max 120, notes max 4000. Forwards to Family Inbox when workspaceId and linkedFamilyLovedOneId are set. Scope care_circle:write (OAuth). Not idempotent.
list_invoices
Amounts in cents, status, assignment name. Payment handles are contact pointers, never account numbers. Sandwich does not transmit funds.

In-app cookie alias: POST https://soft.joinsandwich.com/api/mcp. External agents should use the api.lovedone.app URL.

Sandwich Pipe vs this MCP

Soft MCP
Agent API for your roster. loved_ones (agency), agency_events, care_invoices. Bearer key.
Sandwich Pipe
HMAC ingest of partner EHR/EVV webhooks into sandwichpipe-vault. Not a dashboard. Path /sandwichpipe/v1/events.

When Pipe is production, Family MCP list_care_events reads redacted vault fields. Soft MCP still will not dump vault blobs to a vendor agent.

PII, health data, BAA, SOC 2

Client names, visit notes, and invoices can be health-related. Treat visit notes as ePHI when a covered entity is in the path.

You are responsible for:

  • Treating MCP keys like production secrets (secret manager, not git, not Slack).
  • Revoking keys when staff leave.
  • Not pasting visit notes into an unvetted model provider without a BAA if you are a HIPAA business associate.
  • Passing clientId when you only need one person’s notes (minimum necessary).
  • Telling families, in your own privacy notice, that an agent may read the notes you log.

What we have, and what we do not claim yet:

SOC 2 Type II?
No. Controls are designed. Type I is next. The Type II window has not started.
HIPAA for my agency?
Not until we countersign a BAA with you and subprocessors on the path (Vercel Enterprise; Anthropic if you use in-app chat) are in place. Soft MCP does not call a model. Your agent might.
Raw EHR?
Not on this server. Pipe vault, when deployed: Cloud Run, no user routes, application-layer AES-256.
Google Cloud BAA
Org-level BAA signed. Covers Firestore and Cloud Run.
Audit
mcp_audit_log: uid, key id, tool, duration. Not note bodies. TLS 1.2+, HSTS, hashed keys.
Questionnaire line. Controls designed (hashed keys, TLS, per-call membership checks, append-only MCP audit, vault isolated). SOC 2 Type II window not yet started. Ask for docs/BAA-HIPAA-SOC2.md in the platform repo if you need the auditor narrative.

Connect

claude_desktop_config.jsonjson
{
  "mcpServers": {
    "sandwich-soft": {
      "url": "https://api.lovedone.app/mcp/vendor/v1",
      "headers": { "Authorization": "Bearer sk-sand-REPLACE" }
    }
  }
}
list_clientsbash
curl -s https://api.lovedone.app/mcp/vendor/v1 \
  -H "Authorization: Bearer sk-sand-…" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_clients","arguments":{}}}'

In-product: soft.joinsandwich.com/agents (lists both servers). Hub: mcp.html. Family spec: mcp-family.html.