llms.txt
+56 −14
− 2. `host.docs.put(name, content)` — once per document (this recipe's own− corpus: 8 documents, ~22 KiB total, well under the 2 MiB per-document− cap).− | tools:write | tools:read, tools:call | 182 |− 1. Declare the table (typed columns: text, integer, real, timestamp, boolean, json):− ```− 2. Append your rows in batches of 200 -- five calls covers 1,000 rows:− ```− | `resources` | yes | yes | `resources` | `host.table.list` | `resources/list`, `resources/read`, `resources/templates/list`, `resources/subscribe`, `resources/unsubscribe` | - |− Generated by `scripts/protocol-frames-check.sh` from `FRAME_SEQUENCES`; do not hand-edit. A response is `application/json` when it is one frame and `text/event-stream` when more than one frame is sent (`{1}` exactly one, `{0,1}` optional, `{0,n}` any number). Take the last `result` or `error` frame. Per request type, in order: `initialize` = `result` {1}; `tools/list` = `result` {1}; `tools/call:keyed` = `notifications/tools/list_changed` {0,1}, `notifications/prompts/list_changed` {0,1}, `resul− 3. `host.sync.get(sync_id="<step1.sync_id>")` -- the sync row; polled until the first receipt (`last_run`) exists− 4. `host.sync.list()`− 5. `host.sync.delete(sync_id="<step1.sync_id>")` -- stops the schedule; the `orders` table stays− Expected cost: 6 calls (the 1 signup included), within 90 s.+ An operator pauses and resumes signups without a shell with the admin+ tool `admin.signup_pause` (`message` to pause, optional `until`;+ `resume: true` to lift), which writes the same pause file.+ ### Sub-agents+ <!-- quickstart-recipe:sub_agent_key -->+ 1. As the lead: `host.key.delegate` `{"can_delegate":true,"label":"helper","scopes":["tools:call"],"ttl_s":3600}` returns `key`, `label`.+ 2. As the helper, with the `key` call 1 returned: `host.key.delegate` `{"scopes":["read","write","tools:write","state:read","state:write","secrets:write","keys:manage","admin"],"ttl_s":60}` fails `scope_escalation` (asking for `read`, `write`, `tools:write`, `state:read`, `state:write`, `secrets:write`, `keys:manage`, `admin`).+ 3. As the lead: `host.key.revoke` `{"cascade":true,"label":"helper"}` `revoked` >= 1.+ Hand the helper the `key` call 1 returned, never your own. It holds `tools:call` only: any other scope fails `scope_escalation`, as call 2 shows.+ Call 3 revokes it and its children; the helper's next call fails `key_revoked`.+ <!-- /quickstart-recipe:sub_agent_key -->+ Documents are text the host indexes itself; a vector index built elsewhere (LlamaIndex, Chroma, pgvector) is not importable: export its source documents and put them.+ 2. `host.docs.put_many(documents)` — up to 50 documents per call, each+ `{name, content}` (or `content_base64`); this recipe's own corpus is one+ call: 8 documents, ~22 KiB total, well under the 2 MiB per-document cap.+ Every document gets its own `stored` / `replaced` / `skipped` / `refused`+ row, so one refusal never undoes another.+ | tools:write | tools:read, tools:call | 184 |+ 1. One call, no file tool needed -- the server fetches the 1,000-row fixture itself:+ host.table.create(name="expenses", source_url="https://mcphost.dev/examples/sample-1000.csv")+ ```+ 2. Or declare the table yourself (typed columns: text, integer, real, timestamp,+ boolean, json) and append your rows in batches of 200 -- five calls covers 1,000 rows:+ ```+ | `resources` | yes | no | `resources` | `host.table.list` | `resources/list`, `resources/read`, `resources/templates/list`, `resources/subscribe`, `resources/unsubscribe` | - |+ Generated by `scripts/protocol-frames-check.sh` from `FRAME_SEQUENCES`; do not hand-edit. A response is `application/json` when it is one frame and `text/event-stream` when more than one frame is sent (`{1}` exactly one, `{0,1}` optional, `{0,n}` any number). Take the last `result` or `error` frame. Per request type, in order: `initialize` = `result` {1}; `tools/list` = `result` {1}; `tools/call:keyed` = `notifications/tools/list_changed` {0,1}, `notifications/prompts/list_changed` {0,1}, `resul+ - `host.docs.put_many`+ - `host.probe.progress`+ - `host_docs_put_many`+ - `host_probe_progress`+ | `chart_invalid_mark` | no | none | 1 | fix-and-resend |+ | `handle_not_found` | no | none | 1 | fix-and-resend |+ | `handle_quota_exceeded` | no | none | 1 | do-not-retry |+ | `lineage_blocked` | no | none | 1 | fix-and-resend |+ | `not_found` | no | none | 1 | fix-and-resend |+ | `quota_exceeded` | no | none | 1 | do-not-retry |+ | `table_already_exists` | no | none | 1 | fix-and-resend |+ | `table_bound_exceeded` | no | none | 1 | fix-and-resend |+ | `table_column_not_found` | no | none | 1 | fix-and-resend |+ | `table_not_found` | no | none | 1 | fix-and-resend |