Skip to content
StrataSpace
Sign In

MCP Tools Reference

StrataSpace exposes 35 tools via the Model Context Protocol, organized into groups. By default, core and comments tools are enabled. Choose other groups via the X-Strata-Tool-Groups header.

Tool Groups

Header Configuration

Add the X-Strata-Tool-Groups header to your MCP client configuration to enable tool groups. Use comma-separated group names, or "all" to enable everything.

json
{
  "url": "https://api.strata.space/mcp",
  "headers": {
    "X-Strata-Tool-Groups": "core,comments,agents"
  }
}

Core

default

Read, edit, search, and graph documents and spaces, and create group polls

#app_get_section_content

Get the full content of a document section by document ID and section ID. Returns the section text and heading context; records a document-view audit event.

ParameterTypeDescription
chunkIdstringThe chunk ID to retrieve
documentIdstringThe document ID containing the section

#create_document

Create a document from inline Markdown. folderId sets the audience: a tier folder is visible to its members; omit it for the owner-only personal root. For content that already exists as a file, use presign_document_upload instead.

HTML BLOCKS Code blocks with language html render as live sandboxed previews: no cookies, storage, or network. The only loadable URLs are the vetted libraries /sandbox/libs/mermaid.min.js (then mermaid.initialize({startOnLoad:false}); mermaid.run()), /sandbox/libs/d3.min.js (global d3), /sandbox/libs/three.module.min.js (ES module), and /sandbox/libs/doom.js. Theme with var(--color-foreground), var(--color-muted-foreground), var(--color-primary), var(--color-border); if you set your own colors, set background and text together. Height starts near 360px and follows the content. To chart data from the same document, name a json/csv/tsv/yaml fence (``json name=sales), a table or image with <!-- strata:name=sales --> on the line above it, or use the reserved name frontmatter (scalar fields). The html fence declares up to 8 names (``html uses="sales,team"). Inside the preview strata.data.get(name) returns {kind:'text', format, text} (parse it yourself; d3.csvParse, not split(',')), {kind:'table', columns, rows} (cells are strings), {kind:'frontmatter', values}, {kind:'image', url, width, height, alt}, or {kind:'unavailable', reason}. Re-render on the window strata:data event.

BLOG FRONTMATTER A blog: mapping in the first YAML frontmatter block designs the published post. typography: modern | editorial | expressive | technical. palette: strata | paper. blockControls, tableOfContents, coverInBody: visible | hidden. readingSurface: opaque | translucent (translucent only over a color or gradient wallpaper). accent, background: {light: "#RRGGBB", dark: "#RRGGBB"}, quoted; body text and accent need 4.5:1 contrast in both schemes. fonts.heading, fonts.body: Manrope | Syne | Fira Code | Georgia | Times New Roman | Arial | Helvetica | Verdana | Trebuchet MS | Palatino | Courier New | IBM Plex Mono. summary: up to 160 chars. tags: up to 10, each up to 32 chars. noindex: true | false. series: {name (up to 80 chars), order (integer from 1)}. cover, hero: the name of an image in this document, set with <!-- strata:name=cover --> on the line above it. wallpaper: exactly one of color {light, dark}; gradient {type: linear | radial, stops: 2 to 5 {light, dark}}; pattern {name: dots | grid | lines | paper | topographic | stars, tint: {light, dark}}; image (image name); html (name of an html block, plus fallback: {color: {light, dark}} or {image: name}). Unknown keys, malformed YAML, or invalid values block publishing; edits report blogValidation findings. A presentation: map whose settings do not parse turns presentation mode off; edits, and read_document by a caller who can edit, then report presentationSettings with the parser message.

ParameterTypeDescription
titlestringDocument title
content?stringInitial markdown body
folderId?stringFolder that sets the audience; omit for the owner-only personal root

#create_document_from_template

Create a document from a template, substituting its declared variables. Templates live in templates folders and declare name, description, and variables in frontmatter.

ParameterTypeDescription
templateDocumentIdstringTemplate document to instantiate
titlestringTitle of the new document
folderId?stringFolder that sets the audience; omit for the owner-only personal root
variables?objectValues keyed by the template's declared variable keys

#create_poll

Create a group poll: a new document holding the poll, plus a link people open to vote without an account. Returns documentId, widgetId, editorUrl, poll (options with ids), and share: status created or reused carries shareUrl (the voting link to hand on) and cardUrl; notCreated carries the reason. To retry after an error, pass the same idempotencyKey; it is echoed back. Read votes with get_poll_results.

ParameterTypeDescription
optionsstring[]Choices in display order, 2 to 20, each up to 100 characters
questionstringThe question, also the document title
closesAt?stringRFC 3339 instant votes stop being accepted, default never
folderId?stringFolder to create the poll in, default your personal root
idempotencyKey?stringRetry key, up to 128 visible ASCII characters; omit for a new poll
locale?stringBCP 47 language tag of the poll text
timezone?stringIANA time zone the options' dates are written in

#export_presentation

Export a presentation as standalone HTML or printed PDF. Returns a download URL valid for fifteen minutes. Presenter notes are removed from slide decks; opaque whole-deck HTML is rejected because note removal cannot be proven. A draft whose presentation: settings do not parse is refused: a caller who can edit the document gets the parser message, any other reader a refusal without it. A published edition always exports, with default settings in place of any that do not parse. PDF consumes the document owner's capture allowance; HTML is unmetered. PDF prints every slide in one headless page under a single sixty-second render deadline, with WebGL software-rendered and animation frozen to a still once a small render budget is spent, so a deck of many heavy scenes can time out where the HTML export succeeds.

ParameterTypeDescription
documentIdstring-
format"presentationHtml" | "presentationPdf"Audience export format.
revision?integer (uint32)Published revision; omit for the live projection
viewport?1280 | 1920PDF viewport width, default 1920

#finalize_document_upload

Finish an upload after its PUT, creating the document or replacing an existing one's content. Idempotent. Returns { documentId, bytes, created }.

ParameterTypeDescription
uploadIdstringID from `presign_document_upload`

#find

Search, list, or discover documents, spaces, and folders across the workspace. intent selects the kind of discovery (search, list, recent, related, info) and scope selects where to look. List folders and their scopes (a document's audience comes from its folder) with intent='list', scope.type='folders'. scope is a JSON object with a type field, not a string. Examples: {"scope":{"type":"all"}}, {"scope":{"type":"space","id":"space_..."}}, {"scope":{"type":"document","id":"doc_..."}}. Search uses hybrid keyword + semantic retrieval fused via Reciprocal Rank Fusion, so both short keywords and natural sentences work as queries. Filters cover status, owner, date ranges, includeShared, direction, sinceDays (for intent='recent'), and tokenBudget. Returns a uniform shape with items that carry id, title, snippet, score, and source attribution. Narrow scopes can return zero results even when matching content exists elsewhere in the workspace.

ParameterTypeDescription
intent"search" | "list" | "recent" | "related" | "info"Discovery intent. "search" ranks by relevance, "list" enumerates, "recent" returns newest changes within filters.sinceDays, "related" finds documents similar to scope.id (requires scope.type="document"), "info" returns metadata about the scoped entity
scope{ "type": "all" } | { "id": string; "type": "space" } | { "id": string; "type": "folder" } | { "id": string; "type": "document" } | { "type": "spaces" } | { "type": "folders" } | { "handle"?: string; "type": "published" } | { "slug"?: string; "type": "strataDocumentation" }Where to look. `scope` must be an object with `type`, not a string: `{ "type": "all" }`, `{ "type": "space", "id": "space_..." }`
filters?objectNarrowing filters. Ignored when inapplicable to the chosen intent; for intent="recent", set filters.sinceDays (default 7)
limit?integer (uint32)Max results. Default: 10. Max: 50
nextToken?stringPagination cursor from a prior find result. Pass through unchanged
query?stringSearch text. Required when intent="search"
tokenBudget?integer (uint32)Per-chunk content size budget for intent="search". Default: server-chosen

#get_company_theme

Read company theme CSS and its verified source version for copying into a presentation.

ParameterTypeDescription
documentIdstringTheme source document

#get_document_graph

Get the connection graph neighborhood around a document. Returns nodes (documents) and edges (connections) discovered by BFS traversal.

Optional parameters: - depth: BFS depth (default 2, max 5) - maxNodes: Maximum nodes to return (default 50, max 200)

ParameterTypeDescription
documentIdstringThe document ID to start the graph traversal from
depth?integer (uint32)BFS traversal depth (default 2, max 5)
maxNodes?integer (uint32)Maximum number of nodes to return (default 50, max 200)

#get_image

Retrieve an image from a document as base64-encoded data.

The imageId is found in document content as [Image: alt text (imageId: <id>)] markers or ![alt](strata://image/<id>) in markdown.

Returns the image as inline base64 PNG data that can be viewed directly.

ParameterTypeDescription
documentIdstringDocument the image belongs to. The caller must have `DocumentRead` on this document before bytes are returned
imageIdstringImage ID (SHA256 hex from document content)
maxWidth?integer (uint32)Maximum width to resize to before encoding (saves tokens). Defaults to 1024

#get_poll_results

Read a poll's results: votes per option, voter counts, and voter names when shown to you (always to the owner; to readers only if the owner allows it). widgetId is optional when the document holds one poll.

ParameterTypeDescription
documentIdstringDocument holding the poll
widgetId?stringPoll to read, default the document's only poll

#insert_document_section

Insert Markdown blocks at a heading boundary without touching existing content: position is {kind: beforeSection | afterSection, sectionPath} or {kind: endOfDocument}. sectionPath is a heading path such as "Architecture > Database". Markdown follows the HTML BLOCKS and BLOG FRONTMATTER rules in create_document.

ParameterTypeDescription
documentIdstringDocument to insert into
markdownstringTop-level Markdown blocks to insert
position{ "sectionPath": string; "kind": "beforeSection" } | { "sectionPath": string; "kind": "afterSection" } | { "kind": "endOfDocument" }Heading boundary to insert at

#list_company_themes

List company presentation themes available to copy.

ParameterTypeDescription

#move_document

Move a document into a folder, which changes who can see it. A personal folder is owner-only, a tier folder is visible to its members; to make a document private, move it to the user's personal folder.

ParameterTypeDescription
documentIdstringDocument to move
folderIdstringDestination folder

#presign_document_upload

Start uploading a Markdown file into a new or existing document. Avoids re-emitting bytes you already have. Returns { uploadId, uploadUrl, requiredHeaders, expiresAt }.

Upload sequence: 1. presign_document_upload with contentLength (the file's byte count) and documentId to replace, or title [+folderId] to create 2. PUT the file bytes to uploadUrl with every requiredHeaders entry 3. finalize_document_upload with uploadId

Markdown follows the HTML BLOCKS and BLOG FRONTMATTER rules in create_document.

ParameterTypeDescription
contentLengthinteger (uint64)Exact byte count of the file to PUT
documentId?stringExisting document to replace; omit to create one from `title`
folderId?stringFolder for the created document
title?stringTitle of the document to create; omit when `documentId` is set

#read_document

Read a document's content by ID.

Returns rendered Markdown. Records a document-view audit event. Large documents automatically return a structural outline instead of full content (default budget: 10000 tokens). The sections parameter accepts heading paths from that outline and returns only those sections.

ParameterTypeDescription
documentIdstringDocument ID to read, like `doc_01JAB...`
commentFormat?stringComment output format: "footnotes" (default, inline markdown footnotes) or "structured" (appends a JSON block with full comment thread data)
includeComments?booleanWhether to include comments in the response. Comments are rendered as inline footnotes in the markdown output
includeSuggestions?booleanWhether to include pending suggestions as a JSON block appended to the markdown content
maxTokens?integer (uint32)Token budget (default: 10000). Documents exceeding this return an outline instead of full content. Set to 0 to always get the outline
sections?string[]Heading paths to read, like `["Architecture > Database Layer"]`. Prefix matching: `"Architecture"` returns that section and all sub-sections. Use paths from a prior outline response

#replace_document_text

Replace exact text in a document with new Markdown; set replaceAll to change every match. Prefer this targeted edit over rewrite_document. Markdown follows the HTML BLOCKS and BLOG FRONTMATTER rules in create_document.

ParameterTypeDescription
documentIdstringDocument to edit
newStringstringReplacement text; empty deletes the match
oldStringstringExact text to find
replaceAll?booleanReplace every match, default false

#rewrite_document

Replace a document's whole body with inline Markdown. For content that already exists as a file, use presign_document_upload instead. Markdown follows the HTML BLOCKS and BLOG FRONTMATTER rules in create_document.

ParameterTypeDescription
documentIdstringDocument to replace
newContentstringFull new markdown body

#share_document

Grant a person access to a document by email, emailing an invitation to an external recipient when needed.

ParameterTypeDescription
documentIdstringDocument to share
emailstringRecipient email
role"viewer" | "commenter" | "editor"Access level to grant

#unshare_document

Revoke a user's access to a document.

ParameterTypeDescription
documentIdstringDocument to revoke access on
targetUserIdstringUser whose access is revoked

#validate_presentation

Render presentation slides and return layout, contrast, binding, structure, and theme findings. Always executes checks and stores captures. Costs one capture per slide per viewport, with no repeat charge for the same render key this cycle. Checks at most two slides at one viewport per call. While status is more, the result carries a next continuation that covers the remaining slides and viewports. When status is failed, reason says why: renderTimedOut (a slide did not finish in time; check one slide per call or simplify its heaviest drawing), renderFailed, rendererUnavailable, conflict (safe to run again), limitReached, invalidRequest or internal. Omitted selection covers all slides at both viewports.

ParameterTypeDescription
documentIdstring-
continuation?objectSingle-use continuation from the previous result
slides?integer (uint32)[]Zero-based deck positions, cover included; omit for all
viewports?(1280 | 1920)[]Viewport widths; omit for both

Collaboration

Live presence on documents

#get_presence

Query who is currently viewing or editing a document. Returns a list of collaborators with their entity type, display name, active section, status, and presence color. Useful for understanding who else is working on the document before making edits.

ParameterTypeDescription
documentIdstringDocument ID to query presence for

Comments

Comment threads and edit suggestions

#accept_suggestion

Accept a pending suggestion, applying its edit to the document.

ParameterTypeDescription
documentIdstringDocument the suggestion is on
suggestionIdstringPending suggestion to apply

#create_comment

Comment on a document: start a thread, optionally anchored to quoted text, or reply to one with parentCommentId.

Side effect: a comment or reply that @mentions an agent starts a task for that agent on the document. Mention an agent only when the user asked for that agent to act.

ParameterTypeDescription
bodystringComment text
documentIdstringDocument to comment on
headingContext?string[]Heading breadcrumbs that pick one match when `quotedText` repeats
parentCommentId?stringThread to reply to; omit to start a thread
quotedText?stringExact document text to anchor a new thread to

#list_comments

List comment threads on a document, optionally only active or resolved ones. truncated is true when more threads exist than were returned.

ParameterTypeDescription
documentIdstringDocument to list comments on
status?"active" | "resolved" | nullOnly threads in this status; omit for all

#list_suggestions

List pending suggestions on a document.

ParameterTypeDescription
documentIdstringDocument to list pending suggestions on

#propose_suggestion

Propose a tracked edit that replaces exact text in a document, for a person to accept or reject. Refresh proposals carry baseVersion, sourceRef {documentId, sourceVersion}, and anchor {sectionPath, blockOrdinal, offset}.

ParameterTypeDescription
documentIdstringDocument to suggest an edit on
originalTextstringExact text to replace
replacementTextstringProposed replacement markdown
anchor?objectExact original-text location
baseVersion?integer (uint64)Document revision read before proposing
headingContext?string[]Heading breadcrumbs that pick one match when `originalText` repeats
rationale?stringWhy the edit is suggested
severity?"nitpick" | "improvement" | "issue" | "critical" | nullHow strongly the edit is needed
sourceRef?objectSource and revision justifying the proposal

#reject_suggestion

Reject a pending suggestion without applying it.

ParameterTypeDescription
documentIdstringDocument the suggestion is on
suggestionIdstringPending suggestion to decline

#set_comment_resolved

Resolve a comment thread, or reopen a resolved one with resolved false.

ParameterTypeDescription
commentIdstringThread to resolve or reopen
documentIdstringDocument the thread is on
resolvedbooleantrue resolves the thread, false reopens it

#withdraw_suggestion

Withdraw your own pending suggestion.

ParameterTypeDescription
documentIdstringDocument the suggestion is on
suggestionIdstringYour own pending suggestion to withdraw

Publishing

Publish and unpublish public document snapshots

#get_publish_status

Check the publish status of a document. Returns the current state (draft/published), version number, and whether there are unpublished changes (content hash comparison).

ParameterTypeDescription
documentIdstringDocument ID to check status for

#publish_document

Publish a document to your public profile. Creates a frozen snapshot of the current content. If the content hasn't changed since last publish, returns the existing version. Every successful call records a publication audit event.

Side effects: Creates a PublishedVersion record and copies Yjs state to a versioned S3 key. Your creator profile is provisioned at signup, so no profile is created as a side effect of publishing.

ParameterTypeDescription
documentIdstringDocument ID to publish
pinToProfile?booleanWhether to pin to profile after publishing
presentation?objectWhole-deck notes acknowledgement

#unpublish_document

Unpublish a document, removing it from public view. The document returns to draft state and public URLs return 404. Published version records are retained for potential rollback.

ParameterTypeDescription
documentIdstringDocument ID to unpublish

Agents

Invoke platform and user agents and poll their status

#get_agent_status

Check the status of an agent task.

Returns the current status, tool call count, and output (if completed) or error (if failed).

Possible statuses: pending, running, completed, failed, cancelled, timedOut.

ParameterTypeDescription
taskIdstringThe task ID returned by `invoke_agent`

#invoke_agent

Invoke a platform agent to perform a task.

Specify the agent by ID or by name (mutually exclusive). Optionally provide a target document and a natural-language instruction.

Returns a task ID — use get_agent_status to poll for status and output. The agent executes asynchronously; this tool returns immediately after the task is created.

ParameterTypeDescription
agentId?stringAgent ID to invoke (mutually exclusive with `agent_name`)
agentName?stringAgent name to invoke (mutually exclusive with `agent_id`)
documentId?stringTarget document ID (optional)
idempotencyKey?stringIdempotency key (optional)
instruction?stringNatural-language instruction for the agent

We count page views to see how StrataSpace is doing. If you're happy with it, we'll also remember which link first brought you here so we know what's working. Your data stays with us — we never share it. Privacy policy