Agentic rails
Build an app next to MOS
MOS exposes a versioned REST API (/api/v1/**)
and an MCP server (/api/v1/mcp) so agents and
external apps can build against a team's data with nothing but a team API
token. MOS stays the system of record; your app is a UX
shell. A token can only ever see its own team's rows — RLS + the token's
team are the tenant boundary.
Coverage matrix
Every surface × REST v1 read/write × MCP tool × token scope × gap. Every Live cell was verified by calling the endpoint with a real team key, not by reading code.
| Surface | REST v1 | MCP tool | Scope | Gap |
|---|---|---|---|---|
| Data tables — list/create | R W GET /api/v1/tables/tables | list_tables | *:read / *:write | Route is tables/tables; index advertises data/tables (G-2). No table DELETE. |
| Data tables — rows | R W GET .../{id}/rows | query_rows, insert_row | * | No row UPDATE / DELETE (G-3). |
| Data tables — columns | R W GET .../{id}/columns | — | *:read | No column create/update/delete via API (G-3). |
| Data tables — formulas | — | — | — | No endpoint (G-4). Formulas only editable in the admin UI. |
| Data tables — views | — | — | — | No endpoint (G-4). |
| Data tables — row audit | — | — | — | No endpoint (G-4). row_audit is internal-only. |
| Knowledge bases | R W GET /api/v1/bases | list_bases | * | Read/append only. No block update/delete, no base delete. |
| Forms — schema | R W GET /api/v1/forms | list_forms | forms:read | No submit-a-form endpoint and no list-submissions endpoint via token (G-5). |
| Review packets | R W GET /api/v1/review/packets | — | * | No MCP tool. No read of answers / verdicts (advise-and-consent) via API (G-6). |
| Artifacts | R W GET /api/v1/artifacts, GET /{id} | — | * | Full CRUD (the most complete surface). No MCP tool. |
| Workflows | R W ️ GET /api/v1/workflows 500 live | list_workflows (same 500) | *:read | Live 500 — schema drift in the query (G-7). No run/trigger via token. |
| Context (RAG) | R W POST /api/v1/context | — | *:read | Retrieval only. No MCP tool. |
| Wellness | R W GET /api/v1/wellness, .../consent, .../observations | — | * | Fully wired (best-covered vertical). No MCP tool. |
| Commerce (Stripe) | — | create_invoice, create_quote, create_checkout, create_subscription | *:write | MCP-only — no v1 REST equivalents (G-8). |
| Browser extension | R W GET .../extension/{rules,tools,vault} | — | * | Purpose-built for the Ask-Page extension; tools is module-gated (403 when off). |
| MCP (unified actions) | R W GET /api/v1/mcp/actions | (is itself MCP) | * | Tenant-gated by modules.mcp_export (403 when off — off by default). Exposes every defineAction. |
| Contacts / CRM | — | — | — | Absent from v1. Rich API exists at /api/contacts/ but is session-only** (G-9). Scope resource contacts exists but no route consumes it. |
| Files / media | — | — | — | Absent from v1. /api/files/, /api/media/ are session-only (G-10). No token upload/download/list. |
| Scheduling | — | — | — | Absent from v1 (G-11). No event-types / availability / bookings for tokens. |
| EMR read surfaces | — | — | — | Absent from v1. /api/emr/** + FHIR are session/portal-scoped, not token routes (G-12). Scope resource emr exists but no v1 route. |
| Comms — send | — | — | — | Read-only. GET /api/v1/comms/threads (phi) exists; no send-message endpoint via token (G-13). (Threads 404'd on cmf — module-gated.) |
| Articles / blog | — | — | — | Absent from v1. /api/admin/articles* is session-only (G-14). |
| Config | R W ️ partial | — | — | Only extension/rules exposes some brand/config. No general team-config read (G-15). |
| Events / webhooks | — | — | — | No subscription mechanism for external builders (G-16). Webhooks exist but are admin-configured (/api/admin/webhooks), not a token-driven "subscribe to changes". |
R = REST v1 read · W = REST v1 write · badge color: green = verified live,
amber = present but caveated, ghost = absent. Full legend in the quickstart and the
source doc docs/api/agentic-rails.md.
The gaps, ranked
What an external builder cannot do yet, ranked by how much it blocks the "adjacent app" promise. P0 blocks a real build today. Each gap is a tracked task under the launch-readiness epic.
"Subscribe to changes" (the quickstart's third call) has no implementation. An adjacent app must poll.
The CRM is the most-wanted surface; a builder cannot read/write contacts with a token.
No token upload/download — adjacent apps can't attach or fetch media.
Almost every route requires resource:"*", so you cannot mint a least-privilege token (e.g. "forms:read only"). Defeats the scope model.
Live 500 (schema drift). The one workflow read surface is broken; list_workflows MCP tool inherits it.
No row UPDATE/DELETE, no column CRUD — a table-backed app can't edit or delete.
No booking/availability for tokens — blocks scheduling-driven adjacent apps.
/api/v1 says data/tables (403); the real route is tables/tables (200). Self-docs point builders at a dead path.
Read-only comms; no programmatic message send.
FHIR/EMR exists but not as token routes; needs a scoped read surface.
Packets are listable but the advise-and-consent verdict isn't exposed.
Deeper table features are UI-only.
Can read a form's schema but not submit to it or list responses via token.
create_invoice/quote/checkout/subscription have no REST twin — non-MCP clients can't reach them.
Blog/articles are session-only.
Only extension brand config is exposed.
Ready to build?
Mint a team token, make your first three calls, and point Claude or Cursor at the MCP server — the quickstart walks you through it in five minutes.
Open the quickstart