Agent server tools

Every tool on the agent server (POST /orgs/{orgId}/mcp). List them at runtime with tools/list; call one with tools/call ({ "name": …, "arguments": { … } }). Inputs below come from each tool's real inputSchema. Almost every write tool takes a spaceId (from list_spaces).
Capability and token-scope are checked per tool: read tools need docs.read, write tools need docs.write and the write token scope. Tools that end in a call_api-style loopback (the studio writes, list_entities, call_api) re-enter the API carrying your own credentials, so the controller's own RBAC and validation decide them.
Discovery & read
Tool | What it does |
|---|---|
| The spaces in this organization: what each one is, and what one piece of it is called. |
| What one piece of this space is made of: its named sections, which are required, what each is for, and its parameters. Returns JSON Schema, usable directly as the schema of a structured response. |
| One piece, section by section as markdown, with what is still missing. |
| What is in a space, newest or in reading order, with whether each is published. |
| Find things by their words. With a spaceId it searches that space; without one it searches everything the caller can read — documentation, discussions and posts alike, which is how a question gets answered when the docs do not cover it yet. |
Authoring
Tool | What it does |
|---|---|
| Write one piece of a space — a page, a post, a release, an incident, whatever this space holds. Send markdown per named section; anything belonging to no section goes in `body`. The reply says which required sections are still empty. |
| Replace one named section. Idempotent — sending it twice writes it once. |
| Make a new space. The kind decides what a piece of it is and how it reads; a CUSTOM space takes its own architecture in `shape`. |
| Make a piece readable by the people it is for. Some kinds are live as soon as they are written; the reply says so rather than pretending it did something. |
create_item note: send markdown per named section in sections; anything belonging to no section goes in body. Section keys and preset names come from get_space_shape.
Studio writes
Tool | What it does |
|---|---|
| Move a roadmap item into a status lane — the board is organised by these lanes, so this is how you say a request is planned, in progress, shipped or declined. The status must be one the roadmap declares; read the space shape or the board first if unsure. |
| File a forum topic under a category, or clear it. Categories are how a forum is organised and filtered, so this is the tool for triaging where a discussion belongs. Pass null to remove the category. The category must be one that exists in this space. |
| The everyday forum-moderation actions on one topic: pin or unpin it to the top of the list, close it to new replies or reopen it, accept a reply as the answer (or clear the accepted answer with a null postId), and reclassify it between a discussion and a question. Pick the action; supply postId only when accepting an answer and kind only when reclassifying. |
| Update one piece of a status page — a monitor (the thing whose health is shown) or an incident (an ongoing or past disruption). Pass the changed fields in `patch`; only what you send is changed. Use it to rename or reconfigure a monitor, or to post an update to an incident or change its state. |
| Set a documentation page's declared metadata fields — the structured values a page carries (its declared params), as distinct from its prose. This is the metadata gap update_section does not cover: that tool writes a section's markdown, this writes the fields. Send only the fields you mean to change; they are validated against the page's shape. |
| Set an item's declared fields — the canonical write for the structured values a piece carries beyond its sections (status, owner, tags and the like, whatever this space declares). Send only the fields you mean to change; they are validated against the space shape. |
| List a space's structural pieces so you have their ids before a studio write: 'categories' (forum) for set_topic_category, 'monitors' and 'incidents' (status) for edit_status_component, and 'lanes' (roadmap). Returns the raw API response for that kind. For topics/pages themselves use list_items. |
These route through the same loopback path call_api uses, so the controller's RBAC and validation decide them and there is no way to reach another org's space.
moderate_topic behaviour: close/reopen toggle replies (close moves out of PUBLISHED, reopen returns to it — archiving is a separate verb); accept_answer needs a postId (or a null one to clear the accepted answer); set_kind to DISCUSSION drops any accepted answer.
Retrieval (support-shaped)
Tool | What it does |
|---|---|
| What fixes a described symptom. Answers with the slots that resolve it, not with whole pages — and suppresses examples, which share vocabulary with a symptom and otherwise outrank the answer. |
| What must already be true before a task will work. Answers only from slots declared as prerequisites, so a reader who would have failed at step four learns why first. |
| Propose a correction to a slot you found to be wrong. It lands as a change request for a person to approve — never as an edit — and is capped per day. The workspace must have suggestions turned on. |
Narrow, typed retrieval verbs that answer with the resolving slots, not whole pages.
Escape hatch
Tool | What it does |
|---|---|
| Anything else the REST API can do — members, moderation, categories, roadmap lanes, status incidents, theme, settings, webhooks, billing, plus your own tokens (/pats), invites, profile (/users, /identity) and creating an org (POST /orgs). Read forumulate://openapi for the routes. Paths must be under /orgs/<this org>, /public/, /space-types, /docs-json, /pats, /invites, /users or /identity; your own permissions still decide the answer. |
call_api allowlist
The path must match one of these prefixes (defence in depth on top of the normal guards), and must not contain ..:
/orgs/… (only /orgs/{this org}/… — another org's path is rejected 403)
/public/…
/space-types
/search
/docs-json
/pats your own tokens
/invites accept an invite
/users your profile
/identity your identityAnything else — the internal, platform-admin and webhook-receiver surfaces — is unreachable, exactly as it is from the internet. Response bodies over 100 KB are truncated (with a …truncated marker) rather than dropped.