[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-directus-monospace":3,"mdc-8hjxo2-key":28,"related-repo-directus-monospace":1335,"related-org-directus-monospace":1342},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":19,"repoUrl":20,"updatedAt":21,"license":22,"forks":19,"topics":23,"repo":24,"sourceUrl":26,"mdContent":27},"monospace","perform data operations on Monospace instances","Use when doing ANY task against a Monospace instance. Triggers: reading, creating, updating, deleting, querying, filtering, sorting, or paginating data via the Monospace REST API or the @monospace\u002Fsdk (createClient, readMany, createOne, updateOne); generating a typed SDK client (`npx @monospace\u002Fsdk generate`, monospace.config.ts); connecting to or using the Monospace MCP server; minting API keys or authenticating; inspecting collections, fields, relations, or schema. Do NOT use for legacy Directus v9 \u002F @directus\u002Fsdk — Monospace is a different product with a different API and SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"directus","Directus","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdirectus.png",[12,16],{"name":13,"slug":14,"type":15},"REST API","rest-api","tag",{"name":17,"slug":18,"type":15},"SDK","sdk",0,"https:\u002F\u002Fgithub.com\u002Fdirectus\u002Fmonospace-agent-skills","2026-07-12T07:51:15.348897",null,[],{"repoUrl":20,"stars":19,"forks":19,"topics":25,"description":22},[],"https:\u002F\u002Fgithub.com\u002Fdirectus\u002Fmonospace-agent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fmonospace","---\nname: monospace\ndescription: \"Use when doing ANY task against a Monospace instance. Triggers: reading, creating, updating, deleting, querying, filtering, sorting, or paginating data via the Monospace REST API or the @monospace\u002Fsdk (createClient, readMany, createOne, updateOne); generating a typed SDK client (`npx @monospace\u002Fsdk generate`, monospace.config.ts); connecting to or using the Monospace MCP server; minting API keys or authenticating; inspecting collections, fields, relations, or schema. Do NOT use for legacy Directus v9 \u002F @directus\u002Fsdk — Monospace is a different product with a different API and SDK.\"\nmetadata:\n  author: monospace\n  version: \"0.1.0\"\n---\n\n# Monospace\n\nDrive a Monospace instance from an agent: query and mutate data via the REST API or the typed SDK, generate instance-correct types, and use the MCP server. This page is a router — read the principles and the inline traps, then load the reference for the task.\n\n## Core principles\n\n**1. You almost certainly don't know this API. Don't guess — use the ground truth.**\nMonospace is not in most training data, so do not invent endpoints, SDK methods, or types from memory. The SDK is `@monospace\u002Fsdk` (`createClient` + per-collection delegates). Get the real shape from generated types (`npx @monospace\u002Fsdk generate`) or the live OpenAPI doc (`GET \u002Fapi\u002F\u003Cproject>\u002Fopenapi`), plus the references below. (If you happen to know Directus: it is a different product — don't assume its APIs carry over.)\n\n**2. Generate types, then write against them.**\nThe most reliable way to get the data shape right is to generate a typed client from the running instance: `npx @monospace\u002Fsdk generate` reads the live OpenAPI document and emits a typed client matching *that instance's* schema. Prefer generated types over hand-written shapes. See [references\u002Fsdk.md](references\u002Fsdk.md).\n\n**3. Verify against current docs \u002F OpenAPI before implementing.**\nFor anything not covered here, fetch the canonical OpenAPI doc (`GET \u002Fapi\u002F\u003Cproject>\u002Fopenapi`, or `\u002Fapi\u002Fsystem\u002Fopenapi`) or the Monospace docs. The OpenAPI doc is generated from the live schema, so it is always correct for the instance.\n\n**4. Inspect before you mutate, then verify.**\nRead the schema \u002F list items (read-only) before writing. After a write, read it back to confirm. A change without verification is incomplete.\n\n**5. Recover, don't loop.**\nIf an approach fails 2-3 times, stop and reconsider — check the error body (it carries a `message`), the schema, and permissions. Retrying the same call rarely fixes it.\n\n## Critical traps (read before writing any data code)\n\nThese are verified, easy-to-miss behaviors. Getting them wrong fails silently.\n\n- **Responses are enveloped as `{ \"data\": ... }`.** A list returns `{ data: [...] }`, a single item `{ data: {...} }`. The SDK strips the *top-level* envelope for you, but **nested to-many relations stay enveloped** — relation data sits under `relation.data`, and the SDK does NOT unwrap it. Reach into `item.\u003Crelation>.data` (to-one relations are accessed directly).\n- **Methods take a single options object, not positional args.** `readOne`\u002F`updateOne`\u002F`deleteOne` take `{ key, ... }`; `createOne({ data: \u003Cobject>, fields })` (single object under `data`); `createMany` takes `{ data, fields }`; `updateMany` takes `{ filter, data, fields }`; `deleteMany` takes `{ filter, fields? }`. There is no `readOne(id)` form. Collections are cased as named (`client.Articles`, not `client.articles`).\n- **Deletes return no content unless `fields` is provided.** `deleteOne({ key })` \u002F `deleteMany({ filter })` return void; pass `fields` only when you need deleted rows back.\n- **`fields` defaults to top-level primitives only.** Relations are not returned unless you select them. The SDK sends `fields: ['*']` by default (top-level), so request nested fields explicitly to get relations.\n- **Filter operators are underscore-prefixed.** `_eq _neq _lt _lte _gt _gte _in _nin _between _nbetween _contains _icontains _ncontains _nicontains _starts_with _nstarts_with _ends_with _nends_with _null`; combine with `_and _or _not`; for to-many relations use quantifiers `_some _every _none`. `_null` is only valid on nullable fields. Full table in [references\u002Frest-api.md](references\u002Frest-api.md).\n- **Sort uses the object form, not `-field`.** Use `sort: [{ \u003Cfield>: { direction: 'asc' | 'desc' } }]`. The `-created_at` shorthand is rejected by the engine.\n- **No `search` param, no `page`\u002Fcursor pagination, no aggregates yet.** Paginate with `limit` (default 100) + `offset`; request `meta=totalCount` when you need the total matching row count. Aggregate\u002Fgroup params parse but are silently ignored today.\n\n## Connect to a Monospace instance\n\nYou need three things: the **host** (engine base URL), the **project** slug (Monospace is multi-project; most data routes are `\u002Fapi\u002F\u003Cproject>\u002F...`), and a **token**. Create an API key in the Studio under **Account → Access → API Keys** (`\u002Faccount\u002Faccess#api-keys`; API endpoint `POST \u002Fapi\u002Fsystem\u002Fapi-keys`), or log in with `POST \u002Fapi\u002Fauth\u002Fproviders\u002F\u003Cname>\u002Fpassword\u002Flogin` for a user access token. Prefer `Authorization: Bearer \u003Ctoken>` for agents\u002Fscripts; the API also accepts an `access_token` query parameter or session cookie, but send only one credential source per request.\n\nTwo ways an agent works with the data:\n- **MCP server** — best for agentic CRUD + schema work inside a chat\u002Fcoding agent. Set it up below.\n- **SDK \u002F REST** — best for writing application code. See [references\u002Fsdk.md](references\u002Fsdk.md) and [references\u002Frest-api.md](references\u002Frest-api.md).\n\n## MCP server setup (recommended for agentic work)\n\nThe Monospace MCP server is served by the engine, **per project**, over streamable-HTTP.\n\n- **Endpoint:** `POST https:\u002F\u002F\u003Chost>\u002Fapi\u002F\u003Cproject>\u002Fmcp` (per-project; POST only; protocol `2025-11-25`).\n- **Auth:** `Authorization: Bearer \u003Ctoken>` or, only when headers are unavailable, `access_token=\u003Ctoken>` query parameter populated from a secret store (API key or user access token). Do not send both. Use session cookies for browser flows, not agent config. The project needs the `ai:mcp` entitlement, and each tool runs under the token's RBAC.\n\nConfig (`.mcp.json` at the project root):\n```jsonc\n{\n  \"mcpServers\": {\n    \"monospace\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002FYOUR_HOST\u002Fapi\u002FYOUR_PROJECT\u002Fmcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${MONOSPACE_API_KEY}\" }\n    }\n  }\n}\n```\n\n**Tools exposed (7):** `list_items`, `create_items`, `update_item`, `delete_item` (CRUD under the caller's permissions), `read_schema` (needs `dataModel:read`), `read_data_sources` (`dataModel:read` + `dataSource:read`), and `mutate_schema` (`dataModel:edit` — can be destructive).\n\n**Troubleshooting:** `curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" -X POST https:\u002F\u002F\u003Chost>\u002Fapi\u002F\u003Cproject>\u002Fmcp` — a `401` means it's up but unauthenticated (expected without a token); `403` means the credential is valid but forbidden by RBAC or missing entitlement; `404` means the path is wrong; a hang or refusal means it's unreachable. If tools aren't visible: confirm the URL includes the right `\u003Cproject>`, the credential is present (`Authorization: Bearer` header or `access_token` query parameter, not both), and the project has `ai:mcp` enabled. Full details + RBAC and the per-tool input schemas: [references\u002Fmcp-and-auth.md](references\u002Fmcp-and-auth.md).\n\n## Generate a typed SDK client (codegen)\n\n```bash\nnpx @monospace\u002Fsdk init       # scaffold monospace.config.ts (output defaults to .\u002Fsrc\u002Fgenerated\u002Fmonospace)\nnpx @monospace\u002Fsdk login      # store credentials in the OS keyring (or set MONOSPACE_API_KEY)\nnpx @monospace\u002Fsdk generate   # fetch the live OpenAPI and emit \u003Coutput>\u002Findex.ts\n```\nThe generated `index.ts` exports a `createClient` bound to your instance's schema — import it from your generated output (default `.\u002Fsrc\u002Fgenerated\u002Fmonospace`; match your project's path\u002Falias), not from `@monospace\u002Fsdk`, for fully-typed queries. Remote mode fetches `GET \u002Fapi\u002F\u003Cproject>\u002Fopenapi` (auth required); local mode reads a saved OpenAPI JSON via `input`. Details, flags, and a zero-to-typed-client sequence: [references\u002Fsdk.md](references\u002Fsdk.md).\n\n## Reference guides\n\n| Topic | Reference | Load when |\n| --- | --- | --- |\n| Query engine, envelope, endpoints, error shapes, raw REST | [references\u002Frest-api.md](references\u002Frest-api.md) | Calling the API directly, or in a non-TS language |\n| `createClient`, typed delegates, codegen workflow, error classes | [references\u002Fsdk.md](references\u002Fsdk.md) | Writing TypeScript against the SDK or generating types |\n| CRUD recipes with the traps annotated | [references\u002Fdata-workflows.md](references\u002Fdata-workflows.md) | Reading\u002Fwriting data and you want a known-good pattern |\n| MCP tools + schemas, API keys, auth modes, `.mcp.json` | [references\u002Fmcp-and-auth.md](references\u002Fmcp-and-auth.md) | Setting up MCP, authenticating, or choosing\u002Fusing a tool |\n",{"data":29,"body":32},{"name":4,"description":6,"metadata":30},{"author":4,"version":31},"0.1.0",{"type":33,"children":34},"root",[35,43,49,56,100,133,158,168,186,192,197,583,589,669,674,708,714,726,785,798,892,984,1061,1067,1144,1199,1205,1329],{"type":36,"tag":37,"props":38,"children":39},"element","h1",{"id":4},[40],{"type":41,"value":42},"text","Monospace",{"type":36,"tag":44,"props":45,"children":46},"p",{},[47],{"type":41,"value":48},"Drive a Monospace instance from an agent: query and mutate data via the REST API or the typed SDK, generate instance-correct types, and use the MCP server. This page is a router — read the principles and the inline traps, then load the reference for the task.",{"type":36,"tag":50,"props":51,"children":53},"h2",{"id":52},"core-principles",[54],{"type":41,"value":55},"Core principles",{"type":36,"tag":44,"props":57,"children":58},{},[59,65,67,74,76,82,84,90,92,98],{"type":36,"tag":60,"props":61,"children":62},"strong",{},[63],{"type":41,"value":64},"1. You almost certainly don't know this API. Don't guess — use the ground truth.",{"type":41,"value":66},"\nMonospace is not in most training data, so do not invent endpoints, SDK methods, or types from memory. The SDK is ",{"type":36,"tag":68,"props":69,"children":71},"code",{"className":70},[],[72],{"type":41,"value":73},"@monospace\u002Fsdk",{"type":41,"value":75}," (",{"type":36,"tag":68,"props":77,"children":79},{"className":78},[],[80],{"type":41,"value":81},"createClient",{"type":41,"value":83}," + per-collection delegates). Get the real shape from generated types (",{"type":36,"tag":68,"props":85,"children":87},{"className":86},[],[88],{"type":41,"value":89},"npx @monospace\u002Fsdk generate",{"type":41,"value":91},") or the live OpenAPI doc (",{"type":36,"tag":68,"props":93,"children":95},{"className":94},[],[96],{"type":41,"value":97},"GET \u002Fapi\u002F\u003Cproject>\u002Fopenapi",{"type":41,"value":99},"), plus the references below. (If you happen to know Directus: it is a different product — don't assume its APIs carry over.)",{"type":36,"tag":44,"props":101,"children":102},{},[103,108,110,115,117,123,125,131],{"type":36,"tag":60,"props":104,"children":105},{},[106],{"type":41,"value":107},"2. Generate types, then write against them.",{"type":41,"value":109},"\nThe most reliable way to get the data shape right is to generate a typed client from the running instance: ",{"type":36,"tag":68,"props":111,"children":113},{"className":112},[],[114],{"type":41,"value":89},{"type":41,"value":116}," reads the live OpenAPI document and emits a typed client matching ",{"type":36,"tag":118,"props":119,"children":120},"em",{},[121],{"type":41,"value":122},"that instance's",{"type":41,"value":124}," schema. Prefer generated types over hand-written shapes. See ",{"type":36,"tag":126,"props":127,"children":129},"a",{"href":128},"references\u002Fsdk.md",[130],{"type":41,"value":128},{"type":41,"value":132},".",{"type":36,"tag":44,"props":134,"children":135},{},[136,141,143,148,150,156],{"type":36,"tag":60,"props":137,"children":138},{},[139],{"type":41,"value":140},"3. Verify against current docs \u002F OpenAPI before implementing.",{"type":41,"value":142},"\nFor anything not covered here, fetch the canonical OpenAPI doc (",{"type":36,"tag":68,"props":144,"children":146},{"className":145},[],[147],{"type":41,"value":97},{"type":41,"value":149},", or ",{"type":36,"tag":68,"props":151,"children":153},{"className":152},[],[154],{"type":41,"value":155},"\u002Fapi\u002Fsystem\u002Fopenapi",{"type":41,"value":157},") or the Monospace docs. The OpenAPI doc is generated from the live schema, so it is always correct for the instance.",{"type":36,"tag":44,"props":159,"children":160},{},[161,166],{"type":36,"tag":60,"props":162,"children":163},{},[164],{"type":41,"value":165},"4. Inspect before you mutate, then verify.",{"type":41,"value":167},"\nRead the schema \u002F list items (read-only) before writing. After a write, read it back to confirm. A change without verification is incomplete.",{"type":36,"tag":44,"props":169,"children":170},{},[171,176,178,184],{"type":36,"tag":60,"props":172,"children":173},{},[174],{"type":41,"value":175},"5. Recover, don't loop.",{"type":41,"value":177},"\nIf an approach fails 2-3 times, stop and reconsider — check the error body (it carries a ",{"type":36,"tag":68,"props":179,"children":181},{"className":180},[],[182],{"type":41,"value":183},"message",{"type":41,"value":185},"), the schema, and permissions. Retrying the same call rarely fixes it.",{"type":36,"tag":50,"props":187,"children":189},{"id":188},"critical-traps-read-before-writing-any-data-code",[190],{"type":41,"value":191},"Critical traps (read before writing any data code)",{"type":36,"tag":44,"props":193,"children":194},{},[195],{"type":41,"value":196},"These are verified, easy-to-miss behaviors. Getting them wrong fails silently.",{"type":36,"tag":198,"props":199,"children":200},"ul",{},[201,265,390,430,453,500,533],{"type":36,"tag":202,"props":203,"children":204},"li",{},[205,217,219,225,227,233,235,240,242,247,249,255,257,263],{"type":36,"tag":60,"props":206,"children":207},{},[208,210,216],{"type":41,"value":209},"Responses are enveloped as ",{"type":36,"tag":68,"props":211,"children":213},{"className":212},[],[214],{"type":41,"value":215},"{ \"data\": ... }",{"type":41,"value":132},{"type":41,"value":218}," A list returns ",{"type":36,"tag":68,"props":220,"children":222},{"className":221},[],[223],{"type":41,"value":224},"{ data: [...] }",{"type":41,"value":226},", a single item ",{"type":36,"tag":68,"props":228,"children":230},{"className":229},[],[231],{"type":41,"value":232},"{ data: {...} }",{"type":41,"value":234},". The SDK strips the ",{"type":36,"tag":118,"props":236,"children":237},{},[238],{"type":41,"value":239},"top-level",{"type":41,"value":241}," envelope for you, but ",{"type":36,"tag":60,"props":243,"children":244},{},[245],{"type":41,"value":246},"nested to-many relations stay enveloped",{"type":41,"value":248}," — relation data sits under ",{"type":36,"tag":68,"props":250,"children":252},{"className":251},[],[253],{"type":41,"value":254},"relation.data",{"type":41,"value":256},", and the SDK does NOT unwrap it. Reach into ",{"type":36,"tag":68,"props":258,"children":260},{"className":259},[],[261],{"type":41,"value":262},"item.\u003Crelation>.data",{"type":41,"value":264}," (to-one relations are accessed directly).",{"type":36,"tag":202,"props":266,"children":267},{},[268,273,275,281,283,289,290,296,298,304,306,312,314,320,322,328,330,336,337,343,344,350,351,357,358,364,366,372,374,380,382,388],{"type":36,"tag":60,"props":269,"children":270},{},[271],{"type":41,"value":272},"Methods take a single options object, not positional args.",{"type":41,"value":274}," ",{"type":36,"tag":68,"props":276,"children":278},{"className":277},[],[279],{"type":41,"value":280},"readOne",{"type":41,"value":282},"\u002F",{"type":36,"tag":68,"props":284,"children":286},{"className":285},[],[287],{"type":41,"value":288},"updateOne",{"type":41,"value":282},{"type":36,"tag":68,"props":291,"children":293},{"className":292},[],[294],{"type":41,"value":295},"deleteOne",{"type":41,"value":297}," take ",{"type":36,"tag":68,"props":299,"children":301},{"className":300},[],[302],{"type":41,"value":303},"{ key, ... }",{"type":41,"value":305},"; ",{"type":36,"tag":68,"props":307,"children":309},{"className":308},[],[310],{"type":41,"value":311},"createOne({ data: \u003Cobject>, fields })",{"type":41,"value":313}," (single object under ",{"type":36,"tag":68,"props":315,"children":317},{"className":316},[],[318],{"type":41,"value":319},"data",{"type":41,"value":321},"); ",{"type":36,"tag":68,"props":323,"children":325},{"className":324},[],[326],{"type":41,"value":327},"createMany",{"type":41,"value":329}," takes ",{"type":36,"tag":68,"props":331,"children":333},{"className":332},[],[334],{"type":41,"value":335},"{ data, fields }",{"type":41,"value":305},{"type":36,"tag":68,"props":338,"children":340},{"className":339},[],[341],{"type":41,"value":342},"updateMany",{"type":41,"value":329},{"type":36,"tag":68,"props":345,"children":347},{"className":346},[],[348],{"type":41,"value":349},"{ filter, data, fields }",{"type":41,"value":305},{"type":36,"tag":68,"props":352,"children":354},{"className":353},[],[355],{"type":41,"value":356},"deleteMany",{"type":41,"value":329},{"type":36,"tag":68,"props":359,"children":361},{"className":360},[],[362],{"type":41,"value":363},"{ filter, fields? }",{"type":41,"value":365},". There is no ",{"type":36,"tag":68,"props":367,"children":369},{"className":368},[],[370],{"type":41,"value":371},"readOne(id)",{"type":41,"value":373}," form. Collections are cased as named (",{"type":36,"tag":68,"props":375,"children":377},{"className":376},[],[378],{"type":41,"value":379},"client.Articles",{"type":41,"value":381},", not ",{"type":36,"tag":68,"props":383,"children":385},{"className":384},[],[386],{"type":41,"value":387},"client.articles",{"type":41,"value":389},").",{"type":36,"tag":202,"props":391,"children":392},{},[393,406,407,413,415,421,423,428],{"type":36,"tag":60,"props":394,"children":395},{},[396,398,404],{"type":41,"value":397},"Deletes return no content unless ",{"type":36,"tag":68,"props":399,"children":401},{"className":400},[],[402],{"type":41,"value":403},"fields",{"type":41,"value":405}," is provided.",{"type":41,"value":274},{"type":36,"tag":68,"props":408,"children":410},{"className":409},[],[411],{"type":41,"value":412},"deleteOne({ key })",{"type":41,"value":414}," \u002F ",{"type":36,"tag":68,"props":416,"children":418},{"className":417},[],[419],{"type":41,"value":420},"deleteMany({ filter })",{"type":41,"value":422}," return void; pass ",{"type":36,"tag":68,"props":424,"children":426},{"className":425},[],[427],{"type":41,"value":403},{"type":41,"value":429}," only when you need deleted rows back.",{"type":36,"tag":202,"props":431,"children":432},{},[433,443,445,451],{"type":36,"tag":60,"props":434,"children":435},{},[436,441],{"type":36,"tag":68,"props":437,"children":439},{"className":438},[],[440],{"type":41,"value":403},{"type":41,"value":442}," defaults to top-level primitives only.",{"type":41,"value":444}," Relations are not returned unless you select them. The SDK sends ",{"type":36,"tag":68,"props":446,"children":448},{"className":447},[],[449],{"type":41,"value":450},"fields: ['*']",{"type":41,"value":452}," by default (top-level), so request nested fields explicitly to get relations.",{"type":36,"tag":202,"props":454,"children":455},{},[456,461,462,468,470,476,478,484,486,492,494,499],{"type":36,"tag":60,"props":457,"children":458},{},[459],{"type":41,"value":460},"Filter operators are underscore-prefixed.",{"type":41,"value":274},{"type":36,"tag":68,"props":463,"children":465},{"className":464},[],[466],{"type":41,"value":467},"_eq _neq _lt _lte _gt _gte _in _nin _between _nbetween _contains _icontains _ncontains _nicontains _starts_with _nstarts_with _ends_with _nends_with _null",{"type":41,"value":469},"; combine with ",{"type":36,"tag":68,"props":471,"children":473},{"className":472},[],[474],{"type":41,"value":475},"_and _or _not",{"type":41,"value":477},"; for to-many relations use quantifiers ",{"type":36,"tag":68,"props":479,"children":481},{"className":480},[],[482],{"type":41,"value":483},"_some _every _none",{"type":41,"value":485},". ",{"type":36,"tag":68,"props":487,"children":489},{"className":488},[],[490],{"type":41,"value":491},"_null",{"type":41,"value":493}," is only valid on nullable fields. Full table in ",{"type":36,"tag":126,"props":495,"children":497},{"href":496},"references\u002Frest-api.md",[498],{"type":41,"value":496},{"type":41,"value":132},{"type":36,"tag":202,"props":501,"children":502},{},[503,515,517,523,525,531],{"type":36,"tag":60,"props":504,"children":505},{},[506,508,514],{"type":41,"value":507},"Sort uses the object form, not ",{"type":36,"tag":68,"props":509,"children":511},{"className":510},[],[512],{"type":41,"value":513},"-field",{"type":41,"value":132},{"type":41,"value":516}," Use ",{"type":36,"tag":68,"props":518,"children":520},{"className":519},[],[521],{"type":41,"value":522},"sort: [{ \u003Cfield>: { direction: 'asc' | 'desc' } }]",{"type":41,"value":524},". The ",{"type":36,"tag":68,"props":526,"children":528},{"className":527},[],[529],{"type":41,"value":530},"-created_at",{"type":41,"value":532}," shorthand is rejected by the engine.",{"type":36,"tag":202,"props":534,"children":535},{},[536,557,559,565,567,573,575,581],{"type":36,"tag":60,"props":537,"children":538},{},[539,541,547,549,555],{"type":41,"value":540},"No ",{"type":36,"tag":68,"props":542,"children":544},{"className":543},[],[545],{"type":41,"value":546},"search",{"type":41,"value":548}," param, no ",{"type":36,"tag":68,"props":550,"children":552},{"className":551},[],[553],{"type":41,"value":554},"page",{"type":41,"value":556},"\u002Fcursor pagination, no aggregates yet.",{"type":41,"value":558}," Paginate with ",{"type":36,"tag":68,"props":560,"children":562},{"className":561},[],[563],{"type":41,"value":564},"limit",{"type":41,"value":566}," (default 100) + ",{"type":36,"tag":68,"props":568,"children":570},{"className":569},[],[571],{"type":41,"value":572},"offset",{"type":41,"value":574},"; request ",{"type":36,"tag":68,"props":576,"children":578},{"className":577},[],[579],{"type":41,"value":580},"meta=totalCount",{"type":41,"value":582}," when you need the total matching row count. Aggregate\u002Fgroup params parse but are silently ignored today.",{"type":36,"tag":50,"props":584,"children":586},{"id":585},"connect-to-a-monospace-instance",[587],{"type":41,"value":588},"Connect to a Monospace instance",{"type":36,"tag":44,"props":590,"children":591},{},[592,594,599,601,606,608,614,616,621,623,628,629,635,637,643,645,651,653,659,661,667],{"type":41,"value":593},"You need three things: the ",{"type":36,"tag":60,"props":595,"children":596},{},[597],{"type":41,"value":598},"host",{"type":41,"value":600}," (engine base URL), the ",{"type":36,"tag":60,"props":602,"children":603},{},[604],{"type":41,"value":605},"project",{"type":41,"value":607}," slug (Monospace is multi-project; most data routes are ",{"type":36,"tag":68,"props":609,"children":611},{"className":610},[],[612],{"type":41,"value":613},"\u002Fapi\u002F\u003Cproject>\u002F...",{"type":41,"value":615},"), and a ",{"type":36,"tag":60,"props":617,"children":618},{},[619],{"type":41,"value":620},"token",{"type":41,"value":622},". Create an API key in the Studio under ",{"type":36,"tag":60,"props":624,"children":625},{},[626],{"type":41,"value":627},"Account → Access → API Keys",{"type":41,"value":75},{"type":36,"tag":68,"props":630,"children":632},{"className":631},[],[633],{"type":41,"value":634},"\u002Faccount\u002Faccess#api-keys",{"type":41,"value":636},"; API endpoint ",{"type":36,"tag":68,"props":638,"children":640},{"className":639},[],[641],{"type":41,"value":642},"POST \u002Fapi\u002Fsystem\u002Fapi-keys",{"type":41,"value":644},"), or log in with ",{"type":36,"tag":68,"props":646,"children":648},{"className":647},[],[649],{"type":41,"value":650},"POST \u002Fapi\u002Fauth\u002Fproviders\u002F\u003Cname>\u002Fpassword\u002Flogin",{"type":41,"value":652}," for a user access token. Prefer ",{"type":36,"tag":68,"props":654,"children":656},{"className":655},[],[657],{"type":41,"value":658},"Authorization: Bearer \u003Ctoken>",{"type":41,"value":660}," for agents\u002Fscripts; the API also accepts an ",{"type":36,"tag":68,"props":662,"children":664},{"className":663},[],[665],{"type":41,"value":666},"access_token",{"type":41,"value":668}," query parameter or session cookie, but send only one credential source per request.",{"type":36,"tag":44,"props":670,"children":671},{},[672],{"type":41,"value":673},"Two ways an agent works with the data:",{"type":36,"tag":198,"props":675,"children":676},{},[677,687],{"type":36,"tag":202,"props":678,"children":679},{},[680,685],{"type":36,"tag":60,"props":681,"children":682},{},[683],{"type":41,"value":684},"MCP server",{"type":41,"value":686}," — best for agentic CRUD + schema work inside a chat\u002Fcoding agent. Set it up below.",{"type":36,"tag":202,"props":688,"children":689},{},[690,695,697,701,703,707],{"type":36,"tag":60,"props":691,"children":692},{},[693],{"type":41,"value":694},"SDK \u002F REST",{"type":41,"value":696}," — best for writing application code. See ",{"type":36,"tag":126,"props":698,"children":699},{"href":128},[700],{"type":41,"value":128},{"type":41,"value":702}," and ",{"type":36,"tag":126,"props":704,"children":705},{"href":496},[706],{"type":41,"value":496},{"type":41,"value":132},{"type":36,"tag":50,"props":709,"children":711},{"id":710},"mcp-server-setup-recommended-for-agentic-work",[712],{"type":41,"value":713},"MCP server setup (recommended for agentic work)",{"type":36,"tag":44,"props":715,"children":716},{},[717,719,724],{"type":41,"value":718},"The Monospace MCP server is served by the engine, ",{"type":36,"tag":60,"props":720,"children":721},{},[722],{"type":41,"value":723},"per project",{"type":41,"value":725},", over streamable-HTTP.",{"type":36,"tag":198,"props":727,"children":728},{},[729,753],{"type":36,"tag":202,"props":730,"children":731},{},[732,737,738,744,746,752],{"type":36,"tag":60,"props":733,"children":734},{},[735],{"type":41,"value":736},"Endpoint:",{"type":41,"value":274},{"type":36,"tag":68,"props":739,"children":741},{"className":740},[],[742],{"type":41,"value":743},"POST https:\u002F\u002F\u003Chost>\u002Fapi\u002F\u003Cproject>\u002Fmcp",{"type":41,"value":745}," (per-project; POST only; protocol ",{"type":36,"tag":68,"props":747,"children":749},{"className":748},[],[750],{"type":41,"value":751},"2025-11-25",{"type":41,"value":389},{"type":36,"tag":202,"props":754,"children":755},{},[756,761,762,767,769,775,777,783],{"type":36,"tag":60,"props":757,"children":758},{},[759],{"type":41,"value":760},"Auth:",{"type":41,"value":274},{"type":36,"tag":68,"props":763,"children":765},{"className":764},[],[766],{"type":41,"value":658},{"type":41,"value":768}," or, only when headers are unavailable, ",{"type":36,"tag":68,"props":770,"children":772},{"className":771},[],[773],{"type":41,"value":774},"access_token=\u003Ctoken>",{"type":41,"value":776}," query parameter populated from a secret store (API key or user access token). Do not send both. Use session cookies for browser flows, not agent config. The project needs the ",{"type":36,"tag":68,"props":778,"children":780},{"className":779},[],[781],{"type":41,"value":782},"ai:mcp",{"type":41,"value":784}," entitlement, and each tool runs under the token's RBAC.",{"type":36,"tag":44,"props":786,"children":787},{},[788,790,796],{"type":41,"value":789},"Config (",{"type":36,"tag":68,"props":791,"children":793},{"className":792},[],[794],{"type":41,"value":795},".mcp.json",{"type":41,"value":797}," at the project root):",{"type":36,"tag":799,"props":800,"children":805},"pre",{"className":801,"code":802,"language":803,"meta":804,"style":804},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"mcpServers\": {\n    \"monospace\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002FYOUR_HOST\u002Fapi\u002FYOUR_PROJECT\u002Fmcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${MONOSPACE_API_KEY}\" }\n    }\n  }\n}\n","jsonc","",[806],{"type":36,"tag":68,"props":807,"children":808},{"__ignoreMap":804},[809,820,829,838,847,856,865,874,883],{"type":36,"tag":810,"props":811,"children":814},"span",{"class":812,"line":813},"line",1,[815],{"type":36,"tag":810,"props":816,"children":817},{},[818],{"type":41,"value":819},"{\n",{"type":36,"tag":810,"props":821,"children":823},{"class":812,"line":822},2,[824],{"type":36,"tag":810,"props":825,"children":826},{},[827],{"type":41,"value":828},"  \"mcpServers\": {\n",{"type":36,"tag":810,"props":830,"children":832},{"class":812,"line":831},3,[833],{"type":36,"tag":810,"props":834,"children":835},{},[836],{"type":41,"value":837},"    \"monospace\": {\n",{"type":36,"tag":810,"props":839,"children":841},{"class":812,"line":840},4,[842],{"type":36,"tag":810,"props":843,"children":844},{},[845],{"type":41,"value":846},"      \"type\": \"http\",\n",{"type":36,"tag":810,"props":848,"children":850},{"class":812,"line":849},5,[851],{"type":36,"tag":810,"props":852,"children":853},{},[854],{"type":41,"value":855},"      \"url\": \"https:\u002F\u002FYOUR_HOST\u002Fapi\u002FYOUR_PROJECT\u002Fmcp\",\n",{"type":36,"tag":810,"props":857,"children":859},{"class":812,"line":858},6,[860],{"type":36,"tag":810,"props":861,"children":862},{},[863],{"type":41,"value":864},"      \"headers\": { \"Authorization\": \"Bearer ${MONOSPACE_API_KEY}\" }\n",{"type":36,"tag":810,"props":866,"children":868},{"class":812,"line":867},7,[869],{"type":36,"tag":810,"props":870,"children":871},{},[872],{"type":41,"value":873},"    }\n",{"type":36,"tag":810,"props":875,"children":877},{"class":812,"line":876},8,[878],{"type":36,"tag":810,"props":879,"children":880},{},[881],{"type":41,"value":882},"  }\n",{"type":36,"tag":810,"props":884,"children":886},{"class":812,"line":885},9,[887],{"type":36,"tag":810,"props":888,"children":889},{},[890],{"type":41,"value":891},"}\n",{"type":36,"tag":44,"props":893,"children":894},{},[895,900,901,907,909,915,916,922,923,929,931,937,939,945,947,953,954,959,961,967,969,975,976,982],{"type":36,"tag":60,"props":896,"children":897},{},[898],{"type":41,"value":899},"Tools exposed (7):",{"type":41,"value":274},{"type":36,"tag":68,"props":902,"children":904},{"className":903},[],[905],{"type":41,"value":906},"list_items",{"type":41,"value":908},", ",{"type":36,"tag":68,"props":910,"children":912},{"className":911},[],[913],{"type":41,"value":914},"create_items",{"type":41,"value":908},{"type":36,"tag":68,"props":917,"children":919},{"className":918},[],[920],{"type":41,"value":921},"update_item",{"type":41,"value":908},{"type":36,"tag":68,"props":924,"children":926},{"className":925},[],[927],{"type":41,"value":928},"delete_item",{"type":41,"value":930}," (CRUD under the caller's permissions), ",{"type":36,"tag":68,"props":932,"children":934},{"className":933},[],[935],{"type":41,"value":936},"read_schema",{"type":41,"value":938}," (needs ",{"type":36,"tag":68,"props":940,"children":942},{"className":941},[],[943],{"type":41,"value":944},"dataModel:read",{"type":41,"value":946},"), ",{"type":36,"tag":68,"props":948,"children":950},{"className":949},[],[951],{"type":41,"value":952},"read_data_sources",{"type":41,"value":75},{"type":36,"tag":68,"props":955,"children":957},{"className":956},[],[958],{"type":41,"value":944},{"type":41,"value":960}," + ",{"type":36,"tag":68,"props":962,"children":964},{"className":963},[],[965],{"type":41,"value":966},"dataSource:read",{"type":41,"value":968},"), and ",{"type":36,"tag":68,"props":970,"children":972},{"className":971},[],[973],{"type":41,"value":974},"mutate_schema",{"type":41,"value":75},{"type":36,"tag":68,"props":977,"children":979},{"className":978},[],[980],{"type":41,"value":981},"dataModel:edit",{"type":41,"value":983}," — can be destructive).",{"type":36,"tag":44,"props":985,"children":986},{},[987,992,993,999,1001,1007,1009,1015,1017,1023,1025,1031,1033,1039,1041,1046,1048,1053,1055,1060],{"type":36,"tag":60,"props":988,"children":989},{},[990],{"type":41,"value":991},"Troubleshooting:",{"type":41,"value":274},{"type":36,"tag":68,"props":994,"children":996},{"className":995},[],[997],{"type":41,"value":998},"curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" -X POST https:\u002F\u002F\u003Chost>\u002Fapi\u002F\u003Cproject>\u002Fmcp",{"type":41,"value":1000}," — a ",{"type":36,"tag":68,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":41,"value":1006},"401",{"type":41,"value":1008}," means it's up but unauthenticated (expected without a token); ",{"type":36,"tag":68,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":41,"value":1014},"403",{"type":41,"value":1016}," means the credential is valid but forbidden by RBAC or missing entitlement; ",{"type":36,"tag":68,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":41,"value":1022},"404",{"type":41,"value":1024}," means the path is wrong; a hang or refusal means it's unreachable. If tools aren't visible: confirm the URL includes the right ",{"type":36,"tag":68,"props":1026,"children":1028},{"className":1027},[],[1029],{"type":41,"value":1030},"\u003Cproject>",{"type":41,"value":1032},", the credential is present (",{"type":36,"tag":68,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":41,"value":1038},"Authorization: Bearer",{"type":41,"value":1040}," header or ",{"type":36,"tag":68,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":41,"value":666},{"type":41,"value":1047}," query parameter, not both), and the project has ",{"type":36,"tag":68,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":41,"value":782},{"type":41,"value":1054}," enabled. Full details + RBAC and the per-tool input schemas: ",{"type":36,"tag":126,"props":1056,"children":1058},{"href":1057},"references\u002Fmcp-and-auth.md",[1059],{"type":41,"value":1057},{"type":41,"value":132},{"type":36,"tag":50,"props":1062,"children":1064},{"id":1063},"generate-a-typed-sdk-client-codegen",[1065],{"type":41,"value":1066},"Generate a typed SDK client (codegen)",{"type":36,"tag":799,"props":1068,"children":1072},{"className":1069,"code":1070,"language":1071,"meta":804,"style":804},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx @monospace\u002Fsdk init       # scaffold monospace.config.ts (output defaults to .\u002Fsrc\u002Fgenerated\u002Fmonospace)\nnpx @monospace\u002Fsdk login      # store credentials in the OS keyring (or set MONOSPACE_API_KEY)\nnpx @monospace\u002Fsdk generate   # fetch the live OpenAPI and emit \u003Coutput>\u002Findex.ts\n","bash",[1073],{"type":36,"tag":68,"props":1074,"children":1075},{"__ignoreMap":804},[1076,1102,1123],{"type":36,"tag":810,"props":1077,"children":1078},{"class":812,"line":813},[1079,1085,1091,1096],{"type":36,"tag":810,"props":1080,"children":1082},{"style":1081},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1083],{"type":41,"value":1084},"npx",{"type":36,"tag":810,"props":1086,"children":1088},{"style":1087},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1089],{"type":41,"value":1090}," @monospace\u002Fsdk",{"type":36,"tag":810,"props":1092,"children":1093},{"style":1087},[1094],{"type":41,"value":1095}," init",{"type":36,"tag":810,"props":1097,"children":1099},{"style":1098},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1100],{"type":41,"value":1101},"       # scaffold monospace.config.ts (output defaults to .\u002Fsrc\u002Fgenerated\u002Fmonospace)\n",{"type":36,"tag":810,"props":1103,"children":1104},{"class":812,"line":822},[1105,1109,1113,1118],{"type":36,"tag":810,"props":1106,"children":1107},{"style":1081},[1108],{"type":41,"value":1084},{"type":36,"tag":810,"props":1110,"children":1111},{"style":1087},[1112],{"type":41,"value":1090},{"type":36,"tag":810,"props":1114,"children":1115},{"style":1087},[1116],{"type":41,"value":1117}," login",{"type":36,"tag":810,"props":1119,"children":1120},{"style":1098},[1121],{"type":41,"value":1122},"      # store credentials in the OS keyring (or set MONOSPACE_API_KEY)\n",{"type":36,"tag":810,"props":1124,"children":1125},{"class":812,"line":831},[1126,1130,1134,1139],{"type":36,"tag":810,"props":1127,"children":1128},{"style":1081},[1129],{"type":41,"value":1084},{"type":36,"tag":810,"props":1131,"children":1132},{"style":1087},[1133],{"type":41,"value":1090},{"type":36,"tag":810,"props":1135,"children":1136},{"style":1087},[1137],{"type":41,"value":1138}," generate",{"type":36,"tag":810,"props":1140,"children":1141},{"style":1098},[1142],{"type":41,"value":1143},"   # fetch the live OpenAPI and emit \u003Coutput>\u002Findex.ts\n",{"type":36,"tag":44,"props":1145,"children":1146},{},[1147,1149,1155,1157,1162,1164,1170,1172,1177,1179,1184,1186,1192,1194,1198],{"type":41,"value":1148},"The generated ",{"type":36,"tag":68,"props":1150,"children":1152},{"className":1151},[],[1153],{"type":41,"value":1154},"index.ts",{"type":41,"value":1156}," exports a ",{"type":36,"tag":68,"props":1158,"children":1160},{"className":1159},[],[1161],{"type":41,"value":81},{"type":41,"value":1163}," bound to your instance's schema — import it from your generated output (default ",{"type":36,"tag":68,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":41,"value":1169},".\u002Fsrc\u002Fgenerated\u002Fmonospace",{"type":41,"value":1171},"; match your project's path\u002Falias), not from ",{"type":36,"tag":68,"props":1173,"children":1175},{"className":1174},[],[1176],{"type":41,"value":73},{"type":41,"value":1178},", for fully-typed queries. Remote mode fetches ",{"type":36,"tag":68,"props":1180,"children":1182},{"className":1181},[],[1183],{"type":41,"value":97},{"type":41,"value":1185}," (auth required); local mode reads a saved OpenAPI JSON via ",{"type":36,"tag":68,"props":1187,"children":1189},{"className":1188},[],[1190],{"type":41,"value":1191},"input",{"type":41,"value":1193},". Details, flags, and a zero-to-typed-client sequence: ",{"type":36,"tag":126,"props":1195,"children":1196},{"href":128},[1197],{"type":41,"value":128},{"type":41,"value":132},{"type":36,"tag":50,"props":1200,"children":1202},{"id":1201},"reference-guides",[1203],{"type":41,"value":1204},"Reference guides",{"type":36,"tag":1206,"props":1207,"children":1208},"table",{},[1209,1233],{"type":36,"tag":1210,"props":1211,"children":1212},"thead",{},[1213],{"type":36,"tag":1214,"props":1215,"children":1216},"tr",{},[1217,1223,1228],{"type":36,"tag":1218,"props":1219,"children":1220},"th",{},[1221],{"type":41,"value":1222},"Topic",{"type":36,"tag":1218,"props":1224,"children":1225},{},[1226],{"type":41,"value":1227},"Reference",{"type":36,"tag":1218,"props":1229,"children":1230},{},[1231],{"type":41,"value":1232},"Load when",{"type":36,"tag":1234,"props":1235,"children":1236},"tbody",{},[1237,1258,1283,1304],{"type":36,"tag":1214,"props":1238,"children":1239},{},[1240,1246,1253],{"type":36,"tag":1241,"props":1242,"children":1243},"td",{},[1244],{"type":41,"value":1245},"Query engine, envelope, endpoints, error shapes, raw REST",{"type":36,"tag":1241,"props":1247,"children":1248},{},[1249],{"type":36,"tag":126,"props":1250,"children":1251},{"href":496},[1252],{"type":41,"value":496},{"type":36,"tag":1241,"props":1254,"children":1255},{},[1256],{"type":41,"value":1257},"Calling the API directly, or in a non-TS language",{"type":36,"tag":1214,"props":1259,"children":1260},{},[1261,1271,1278],{"type":36,"tag":1241,"props":1262,"children":1263},{},[1264,1269],{"type":36,"tag":68,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":41,"value":81},{"type":41,"value":1270},", typed delegates, codegen workflow, error classes",{"type":36,"tag":1241,"props":1272,"children":1273},{},[1274],{"type":36,"tag":126,"props":1275,"children":1276},{"href":128},[1277],{"type":41,"value":128},{"type":36,"tag":1241,"props":1279,"children":1280},{},[1281],{"type":41,"value":1282},"Writing TypeScript against the SDK or generating types",{"type":36,"tag":1214,"props":1284,"children":1285},{},[1286,1291,1299],{"type":36,"tag":1241,"props":1287,"children":1288},{},[1289],{"type":41,"value":1290},"CRUD recipes with the traps annotated",{"type":36,"tag":1241,"props":1292,"children":1293},{},[1294],{"type":36,"tag":126,"props":1295,"children":1297},{"href":1296},"references\u002Fdata-workflows.md",[1298],{"type":41,"value":1296},{"type":36,"tag":1241,"props":1300,"children":1301},{},[1302],{"type":41,"value":1303},"Reading\u002Fwriting data and you want a known-good pattern",{"type":36,"tag":1214,"props":1305,"children":1306},{},[1307,1317,1324],{"type":36,"tag":1241,"props":1308,"children":1309},{},[1310,1312],{"type":41,"value":1311},"MCP tools + schemas, API keys, auth modes, ",{"type":36,"tag":68,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":41,"value":795},{"type":36,"tag":1241,"props":1318,"children":1319},{},[1320],{"type":36,"tag":126,"props":1321,"children":1322},{"href":1057},[1323],{"type":41,"value":1057},{"type":36,"tag":1241,"props":1325,"children":1326},{},[1327],{"type":41,"value":1328},"Setting up MCP, authenticating, or choosing\u002Fusing a tool",{"type":36,"tag":1330,"props":1331,"children":1332},"style",{},[1333],{"type":41,"value":1334},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1336,"total":813},[1337],{"slug":4,"name":4,"fn":5,"description":6,"org":1338,"tags":1339,"stars":19,"repoUrl":20,"updatedAt":21},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1340,1341],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"items":1343,"total":885},[1344,1360,1371,1387,1400,1411,1424,1435,1447],{"slug":1345,"name":1345,"fn":1346,"description":1347,"org":1348,"tags":1349,"stars":1357,"repoUrl":1358,"updatedAt":1359},"rstore-directus","integrate rstore with Directus","Use when integrating rstore with Directus runtime\u002Fschema helpers, generated Directus collections, Directus REST query options, cache-side Directus filtering, singleton handling, primary key stripping, and Directus-backed create\u002Fupdate\u002Fdelete behavior; also use before writing custom Directus fetch or mutation code around rstore collections. Pair with rstore-vue for collection\u002Fquery\u002Fform semantics and with framework-specific Directus skills for Vite or Nuxt wiring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1350,1353,1356],{"name":1351,"slug":1352,"type":15},"API Development","api-development",{"name":1354,"slug":1355,"type":15},"Database","database",{"name":9,"slug":8,"type":15},425,"https:\u002F\u002Fgithub.com\u002Fdirectus\u002Frstore","2026-07-12T07:51:07.357988",{"slug":1361,"name":1361,"fn":1362,"description":1363,"org":1364,"tags":1365,"stars":1357,"repoUrl":1358,"updatedAt":1370},"rstore-monospace","integrate rstore with Monospace REST APIs","Use when integrating rstore with Monospace REST and OpenAPI helpers, generated Monospace collections, Monospace REST query options, primary key overrides, createMonospaceRestClient, createMonospaceRstorePlugin, createMonospaceQuery, and schema generation from remote or local OpenAPI documents; also use before writing custom Monospace REST CRUD around rstore collections.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1366,1369],{"name":1367,"slug":1368,"type":15},"OpenAPI","openapi",{"name":13,"slug":14,"type":15},"2026-07-12T07:51:08.612664",{"slug":1372,"name":1372,"fn":1373,"description":1374,"org":1375,"tags":1376,"stars":1357,"repoUrl":1358,"updatedAt":1386},"rstore-nuxt","integrate rstore into Nuxt applications","Use when wiring rstore into a Nuxt app end-to-end — module setup, auto-registered collections\u002Fplugins, SSR cache hydration, generated template\u002Fauto-import issues, and cross-module extension; also use before adding a custom `server\u002Fapi` route, Nitro handler, or ad hoc `useFetch`\u002F`$fetch` composable for collection data in an rstore-powered Nuxt app — prefer rstore collection APIs (`find*`, `query`, `liveQuery`) and plugin hooks over hand-rolled endpoints or fetch refs; pair with the `rstore-vue` skill for collection\u002Fquery\u002Fform behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1377,1380,1383],{"name":1378,"slug":1379,"type":15},"Frontend","frontend",{"name":1381,"slug":1382,"type":15},"Nuxt","nuxt",{"name":1384,"slug":1385,"type":15},"Vue","vue","2026-07-12T07:51:06.114663",{"slug":1388,"name":1388,"fn":1389,"description":1390,"org":1391,"tags":1392,"stars":1357,"repoUrl":1358,"updatedAt":1399},"rstore-nuxt-drizzle","expose Drizzle data in Nuxt applications","Use when exposing Drizzle-backed data in Nuxt, OR before writing a custom `server\u002Fapi` route, Nitro `defineEventHandler`, H3 handler, or REST\u002FCRUD endpoint that reads or writes a Drizzle table — prefer the module's generated endpoints, `allowTables`, `hooksForTable`, and `publishRstoreDrizzleRealtimeUpdate` over hand-rolled routes; also covers generating collections\u002FAPI routes from schema, adding a new Drizzle table to the rstore API, fixing `Collection \"\u003Cname>\" is not allowed` errors, fetch\u002Ffilter\u002Fpaginate, create\u002Fupdate\u002Fdelete, realtime, offline, and table-level access control; pair with `rstore-nuxt` for Nuxt integration and `rstore-vue` for collection\u002Fquery\u002Fform behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1393,1394,1395,1398],{"name":1351,"slug":1352,"type":15},{"name":1354,"slug":1355,"type":15},{"name":1396,"slug":1397,"type":15},"Drizzle","drizzle",{"name":1381,"slug":1382,"type":15},"2026-07-12T07:51:10.079641",{"slug":1401,"name":1401,"fn":1402,"description":1403,"org":1404,"tags":1405,"stars":1357,"repoUrl":1358,"updatedAt":1410},"rstore-nuxt-monospace","integrate Monospace into Nuxt applications","Use when wiring Monospace into a Nuxt app with @rstore\u002Fnuxt-monospace, including rstoreMonospace config, remote or local OpenAPI generation, generated #build templates, runtime plugin setup, auto-imported useMonospace, runtimeApiKey handling, primaryKeys, and generated rstore collections. Pair with rstore-monospace for shared REST\u002FOpenAPI behavior, rstore-nuxt for Nuxt store integration, and rstore-vue for query\u002Fform usage.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1406,1407,1408,1409],{"name":1351,"slug":1352,"type":15},{"name":9,"slug":8,"type":15},{"name":1381,"slug":1382,"type":15},{"name":1384,"slug":1385,"type":15},"2026-07-12T07:51:12.752798",{"slug":1412,"name":1412,"fn":1413,"description":1414,"org":1415,"tags":1416,"stars":1357,"repoUrl":1358,"updatedAt":1423},"rstore-vite-directus","integrate Directus into Vite applications","Use when wiring Directus into a plain Vite\u002FVue app with @rstore\u002Fvite-directus, including rstoreDirectus config, virtual:rstore-directus modules, generated rstore-directus.d.ts declarations, build-time Directus introspection, and store setup with the generated schema and directusPlugin. Pair with rstore-directus for shared Directus adapter behavior and rstore-vue for collection\u002Fquery\u002Fform usage.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1417,1418,1419,1422],{"name":1351,"slug":1352,"type":15},{"name":9,"slug":8,"type":15},{"name":1420,"slug":1421,"type":15},"Vite","vite",{"name":1384,"slug":1385,"type":15},"2026-07-12T07:51:11.475964",{"slug":1425,"name":1425,"fn":1426,"description":1427,"org":1428,"tags":1429,"stars":1357,"repoUrl":1358,"updatedAt":1434},"rstore-vite-monospace","integrate Monospace into Vite applications","Use when wiring Monospace into a plain Vite\u002FVue app with @rstore\u002Fvite-monospace, including rstoreMonospace config, remote or local OpenAPI generation, virtual:rstore-monospace modules, generated rstore-monospace.d.ts declarations, runtimeApiKey handling, primaryKeys, and store setup with the generated schema and monospacePlugin.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1430,1431,1432,1433],{"name":1351,"slug":1352,"type":15},{"name":9,"slug":8,"type":15},{"name":1420,"slug":1421,"type":15},{"name":1384,"slug":1385,"type":15},"2026-07-12T07:51:14.078949",{"slug":1436,"name":1436,"fn":1437,"description":1438,"org":1439,"tags":1440,"stars":1357,"repoUrl":1358,"updatedAt":1446},"rstore-vue","manage application data with rstore in Vue","Use when handling app data in Vue with `@rstore\u002Fvue` — fetch items\u002Flists, keep queries reactive or live, create\u002Fupdate\u002Fdelete records with forms, manage cache consistency, and debug store\u002Fquery\u002Fsubscription behavior across collections; also use before writing a custom fetch composable, ad hoc fetch ref, or bespoke cache layer for collection data — prefer `find*`, `query`, `liveQuery`, `createForm`, and `definePlugin` hooks over hand-rolled fetching\u002Fcaching.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1441,1444,1445],{"name":1442,"slug":1443,"type":15},"Debugging","debugging",{"name":1378,"slug":1379,"type":15},{"name":1384,"slug":1385,"type":15},"2026-07-12T07:51:04.87426",{"slug":4,"name":4,"fn":5,"description":6,"org":1448,"tags":1449,"stars":19,"repoUrl":20,"updatedAt":21},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1450,1451],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15}]