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
get_agency_profile — agency id, slug, plan, caller rolelist_clients — roster, including linkedToFamilyget_client / list_visits — one client or agency-wide eventsadd_visit_note — write; family inbox copy if linkedlist_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.
api.lovedone.app/mcp/vendor/v1
One agency. Mint in the Soft portal.
api.lovedone.app/mcp/v1
One household. A family key here is 403. Family spec →
Hold one Soft MCP key per agency (or per staff member):
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.
agencyId. Portal URL https://{slug}.soft.joinsandwich.com/. Scope profile:read.clientId, names, linkedToFamily. No family-member emails. No date of birth.clientId required. Error if the record belongs to another agency. Recent events included.clientId, limit 1–100. notes may be health-related. Pass clientId unless you need the agency-wide ops view.title max 120, notes max 4000. Forwards to Family Inbox when workspaceId and linkedFamilyLovedOneId are set. Scope care_circle:write (OAuth). Not idempotent.
In-app cookie alias: POST https://soft.joinsandwich.com/api/mcp.
External agents should use the api.lovedone.app URL.
loved_ones (agency), agency_events, care_invoices. Bearer key.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.
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:
clientId when you only need one person’s notes (minimum necessary).What we have, and what we do not claim yet:
mcp_audit_log: uid, key id, tool, duration. Not note bodies. TLS 1.2+, HSTS, hashed keys.docs/BAA-HIPAA-SOC2.md in the platform repo if you need the
auditor narrative.
{
"mcpServers": {
"sandwich-soft": {
"url": "https://api.lovedone.app/mcp/vendor/v1",
"headers": { "Authorization": "Bearer sk-sand-REPLACE" }
}
}
}
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.