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 linkedschedule_visit — schedule a visit; shows in list_visitslist_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.
Public discovery (GET /mcp/vendor/v1) lists the same catalog
as the tool registry: name, one-line description, read or write, and the
OAuth scope. Full inputSchema is only on authenticated
tools/list.
profile:read. Optional agencyId. Portal URL https://soft.lovedone.app/?slug={slug}.care_circle:read. clientId, names, linkedToFamily. No family-member emails. No date of birth.care_circle:read. clientId required. Error if the record belongs to another agency. Recent events included.care_circle:read. Optional clientId, limit 1–100. Includes scheduled visits (status: scheduled, scheduledFor). notes may be health-related. Pass clientId unless you need the agency-wide ops view.profile:read, care_circle:read, care_circle:write. Writes require care_circle:write; a read-only token is denied with insufficient_scope.care_circle:write (OAuth). title max 120, notes max 4000. Forwards to Family Inbox when workspaceId and linkedFamilyLovedOneId are set. Not idempotent.care_circle:write (OAuth). clientId, title, scheduledFor (ISO-8601 or Unix ms). Creates agency_events type scheduled, status scheduled — same helper as the Soft portal. Appears in list_visits.care_circle:read. 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.lovedone.app/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.lovedone.app/agents (lists both servers). Hub: mcp.html. Family spec: mcp-family.html.