MCP 도구 참고
StrataSpace는 Model Context Protocol을 통해 38개의 도구를 그룹별로 제공합니다. 기본적으로 핵심 도구와 댓글 도구가 활성화되어 있습니다. X-Strata-Tool-Groups 헤더로 다른 그룹을 선택할 수 있습니다.
도구 그룹
문서와 스페이스 읽기, 편집, 검색 및 그래프 조회, 그룹 투표 만들기
app_get_section_contentcreate_checklistcreate_documentcreate_pollcreate_signup_sheetexport_presentationfinalize_document_uploadfindget_checklistget_company_themeget_document_graphget_imageget_poll_resultsget_signup_sheetinsert_document_sectionlist_company_themesmove_documentpresign_document_uploadread_documentreplace_document_textrewrite_documentshare_documentunshare_documentvalidate_presentation문서에서의 라이브 프레즌스
get_presence댓글 스레드 및 편집 제안
accept_suggestioncreate_commentlist_commentslist_suggestionspropose_suggestionreject_suggestionset_comment_resolvedwithdraw_suggestion공개 문서 스냅샷 게시 및 취소
get_publish_statuspublish_documentunpublish_document플랫폼 및 사용자 에이전트 호출과 상태 폴링
get_agent_statusinvoke_agent헤더 구성
MCP 클라이언트 구성에 X-Strata-Tool-Groups 헤더를 추가하여 도구 그룹을 활성화합니다. 쉼표로 구분된 그룹 이름을 사용하거나 "all"을 사용하여 모든 것을 활성화합니다.
{
"url": "https://api.strata.space/mcp",
"headers": {
"X-Strata-Tool-Groups": "core,comments,agents"
}
}코어
기본값문서와 스페이스 읽기, 편집, 검색 및 그래프 조회, 그룹 투표 만들기
#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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
chunkId | string | The chunk ID to retrieve |
documentId | string | The document ID containing the section |
#create_checklist
Create a group checklist, like a packing list: a new document holding it, plus a link anyone in the group opens to check items off without an account. Returns the same shape as create_poll, with checklist (items with ids) in place of poll. Read progress with get_checklist.
| 매개변수 | 타입 | 설명 |
|---|---|---|
items | string[] | Items in display order, 1 to 30, each up to 80 characters |
title | string | What the list is for, also the document title |
folderId? | string | Folder to create the checklist in, default your personal root |
idempotencyKey? | string | Retry key, up to 128 visible ASCII characters; omit for a new checklist |
locale? | string | BCP 47 language tag of the list text |
timezone? | string | IANA time zone the list is written in |
#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. The app's CSS variables follow light and dark mode and are a safe default: --color-foreground, --color-muted-foreground, --color-border and --color-card for text and surfaces, --color-primary (brand cyan) and --color-secondary-foreground (brand purple) for emphasis, --color-success, --color-warning and --color-destructive for status, and --color-chart-1 to --color-chart-5 for data series. You are free to use your own palette, gradients or imagery instead, especially when the request asks for something creative. Either way, use color to encode meaning rather than one accent on grey, say what each color means, and if you set your own colors, set background and text together so both modes stay readable. 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
title | string | Document title |
content? | string | Initial markdown body |
folderId? | string | Folder that sets the audience; omit for the owner-only personal root |
#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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
options | string[] | Choices in display order, 2 to 20, each up to 100 characters |
question | string | The question, also the document title |
allowMultiple? | boolean | Let each person pick every option that works for them, like dates, default false |
closesAt? | string | RFC 3339 instant votes stop being accepted, default never |
folderId? | string | Folder to create the poll in, default your personal root |
idempotencyKey? | string | Retry key, up to 128 visible ASCII characters; omit for a new poll |
locale? | string | BCP 47 language tag of the poll text |
timezone? | string | IANA time zone the options' dates are written in |
#create_signup_sheet
Create a group sign-up sheet, like a potluck list: a new document holding it, plus a link anyone in the group opens to claim what they will bring, without an account. Each item can be claimed by one person, who gives a name; only they or the owner can release it. Returns the same shape as create_poll, with signupSheet (items with ids) in place of poll. Read claims with get_signup_sheet.
| 매개변수 | 타입 | 설명 |
|---|---|---|
items | string[] | Items people claim, in display order, 1 to 30, each up to 80 characters |
title | string | What the sheet is for, also the document title |
folderId? | string | Folder to create the sheet in, default your personal root |
idempotencyKey? | string | Retry key, up to 128 visible ASCII characters; omit for a new sheet |
locale? | string | BCP 47 language tag of the sheet text |
timezone? | string | IANA time zone the sheet is 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | - |
format | "presentationHtml" | "presentationPdf" | Audience export format. |
revision? | integer (uint32) | Published revision; omit for the live projection |
viewport? | 1280 | 1920 | PDF 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 }.
| 매개변수 | 타입 | 설명 |
|---|---|---|
uploadId | string | ID 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. intent='info' with scope.type='document' returns a body-free summary — documentVersion, open comment and pending suggestion counts, a link, and presence when the collaboration group is enabled — the cheap way to poll whether a document moved since you read it. 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
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? | object | Narrowing 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? | string | Pagination cursor from a prior find result. Pass through unchanged |
query? | string | Search text. Required when intent="search" |
tokenBudget? | integer (uint32) | Per-chunk content size budget for intent="search". Default: server-chosen |
#get_checklist
Read a checklist: each item checked or not, how many are done, and who last set each item when names are shown to you (always to the owner; to readers only if the owner allows it). widgetId is optional when the document holds one checklist.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document holding the checklist |
widgetId? | string | Checklist to read, default the document's only checklist |
#get_company_theme
Read company theme CSS and its verified source version for copying into a presentation.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Theme 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)
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | The 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  in markdown.
Returns the image as inline base64 PNG data that can be viewed directly.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document the image belongs to. The caller must have `DocumentRead` on this document before bytes are returned |
imageId | string | Image 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: people per option, how many answered, and voter names when shown to you (always to the owner; to readers only if the owner allows it). In a poll with mode multiple one person can appear under several options, and an empty optionIds means none worked for them. widgetId is optional when the document holds one poll.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document holding the poll |
widgetId? | string | Poll to read, default the document's only poll |
#get_signup_sheet
Read a sign-up sheet: each item open or claimed, how many are claimed, and who claimed each when names are shown to you (always to the owner; to readers only if the owner allows it). widgetId is optional when the document holds one sign-up sheet.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document holding the sign-up sheet |
widgetId? | string | Sign-up sheet to read, default the document's only one |
#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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document to insert into |
markdown | string | Top-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.
| 매개변수 | 타입 | 설명 |
|---|
#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. A document in a team folder cannot be moved into a personal folder. A personal document can be moved into a personal folder only by its owner, and only into their own.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document to move |
folderId | string | Destination 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
contentLength | integer (uint64) | Exact byte count of the file to PUT |
documentId? | string | Existing document to replace; omit to create one from `title` |
folderId? | string | Folder for the created document |
title? | string | Title 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document ID to read, like `doc_01JAB...` |
commentFormat? | string | Comment output format: "footnotes" (default, inline markdown footnotes) or "structured" (appends a JSON block with full comment thread data) |
includeComments? | boolean | Whether to include comments in the response. Comments are rendered as inline footnotes in the markdown output |
includeSuggestions? | boolean | Whether 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document to edit |
newString | string | Replacement text; empty deletes the match |
oldString | string | Exact text to find |
replaceAll? | boolean | Replace 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document to replace |
newContent | string | Full new markdown body |
#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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | - |
continuation? | object | Single-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 |
협업
문서에서의 라이브 프레즌스
#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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document ID to query presence for |
댓글
댓글 스레드 및 편집 제안
#accept_suggestion
Accept a pending suggestion, applying its edit to the document.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document the suggestion is on |
suggestionId | string | Pending 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
body | string | Comment text |
documentId | string | Document to comment on |
headingContext? | string[] | Heading breadcrumbs that pick one match when `quotedText` repeats |
parentCommentId? | string | Thread to reply to; omit to start a thread |
quotedText? | string | Exact document text to anchor a new thread to |
voice? | "agent" | "sponsor" | Whose voice the comment is in. Use `sponsor` only when the user supplied the substance of the comment and you are posting it for them. Use the default, `agent`, for your own judgment. Default: `agent` |
#list_comments
List comment threads on a document, optionally only active or resolved ones. truncated is true when more threads exist than were returned.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document to list comments on |
status? | "active" | "resolved" | null | Only threads in this status; omit for all |
#list_suggestions
List pending suggestions on a document.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document 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}.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document to suggest an edit on |
originalText | string | Exact text to replace |
replacementText | string | Proposed replacement markdown |
anchor? | object | Exact original-text location |
baseVersion? | integer (uint64) | Document revision read before proposing |
headingContext? | string[] | Heading breadcrumbs that pick one match when `originalText` repeats |
rationale? | string | Why the edit is suggested |
severity? | "nitpick" | "improvement" | "issue" | "critical" | null | How strongly the edit is needed |
sourceRef? | object | Source and revision justifying the proposal |
#reject_suggestion
Reject a pending suggestion without applying it.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document the suggestion is on |
suggestionId | string | Pending suggestion to decline |
#set_comment_resolved
Resolve a comment thread, or reopen a resolved one with resolved false.
| 매개변수 | 타입 | 설명 |
|---|---|---|
commentId | string | Thread to resolve or reopen |
documentId | string | Document the thread is on |
resolved | boolean | true resolves the thread, false reopens it |
#withdraw_suggestion
Withdraw your own pending suggestion.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document the suggestion is on |
suggestionId | string | Your own pending suggestion to withdraw |
게시
공개 문서 스냅샷 게시 및 취소
#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).
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document ID to publish |
pinToProfile? | boolean | Whether to pin to profile after publishing |
presentation? | object | Whole-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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
documentId | string | Document ID to unpublish |
에이전트
플랫폼 및 사용자 에이전트 호출과 상태 폴링
#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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
taskId | string | The 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.
| 매개변수 | 타입 | 설명 |
|---|---|---|
agentId? | string | Agent ID to invoke (mutually exclusive with `agent_name`) |
agentName? | string | Agent name to invoke (mutually exclusive with `agent_id`) |
documentId? | string | Target document ID (optional) |
idempotencyKey? | string | Idempotency key (optional) |
instruction? | string | Natural-language instruction for the agent |