Bisque Presentations
Create narrated presentations from HTML, poll build status, list them, read one back as text.
사용해야 할까요
품질 및 안전성
발견 사항 (2)
- HIGH
- MEDIUMget_presentation_context에서
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"presentations": {
"url": "https://bisque.cloud/presentations/mcp"
}
}
}원격 엔드포인트
https://bisque.cloud/presentations/mcpstreamable-http할 수 있는 일
도구 목록
도구 (19)
🟢get_presentation_spec
Fetch the html-presentation/v1 authoring contract: document structure, the dual landscape/vertical layout rule, and the narration markup that makes slides speak. Call this BEFORE authoring for create_presentation — documents written without it publish with missing audio.
입력 스키마
{
"type": "object",
"properties": {},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"format": {
"type": "string"
},
"spec": {
"type": "string",
"description": "The full authoring recipe + format contract, markdown."
}
},
"required": [
"format",
"spec"
]
}🔴create_presentation(audio, indexHtml, title, slug, presentationId, ...)
Generate a narrated presentation from an html-presentation/v1 document. BEFORE authoring, call get_presentation_spec and follow it exactly — slides without its narration markup publish SILENT. Returns a presentationId and the watch URL. Narration runs in the background and the inline player tracks it on its own, so reply to the user as soon as this returns and do not call get_presentation_status unless the user asks whether it is done.
입력 스키마
{
"type": "object",
"properties": {
"audio": {
"type": "array",
"description": "Optional. One entry per slide YOU narrated, from the JSON `bisque-voice` prints — word timings, duration, size and digest. Send it and your audio is used (free, unlimited, any OS); leave it out and the server narrates. The response says how many slides speak, and names any that published silent.",
"items": {
"type": "object"
}
},
"indexHtml": {
"type": "string",
"minLength": 1,
"maxLength": 4194304,
"description": "Full html-presentation/v1 document (the presentation-format meta gate applies)."
},
"title": {
"type": "string",
"maxLength": 200,
"description": "Display title for the watch page and listings. Omit to use the title parsed from the document."
},
"slug": {
"type": "string",
"description": "URL slug; defaults to a slugified title."
},
"presentationId": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "Stable id for idempotent re-creates; defaults to slug-<hash(userId:slug)>."
},
"visibility": {
"type": "string",
"enum": [
"private",
"unlisted",
"public"
],
"default": "unlisted",
"description": "unlisted (the default) is shareable by link and plays in chat-embedded players; private requires the owner to sign in, so an inline chat player shows a sign-in wall instead of playing — choose private only when the user asked for it."
},
"handle": {
"type": "string",
"description": "Publish under a specific channel handle you own."
},
"designMd": {
"type": "string",
"description": "Design frontmatter mapped to theme tokens."
},
"contextMd": {
"type": "string",
"description": "Shared-with-viewer context.md."
},
"voiceId": {
"type": "string",
"description": "Narration voice. ElevenLabs: a bare id or cloud:<id>. Self-hosted Kokoro: kokoro:<id> (e.g. kokoro:af_heart); local:<id> is accepted as a synonym. Omit to use the voice saved on the account (bisque.cloud/account), falling back to the server default."
},
"madeWith": {
"type": "array",
"maxItems": 8,
"items": {
"type": "string",
"maxLength": 80
},
"description": "Credit the models that made this: the model you are running as, and the narration engine or voice service if you know it — e.g. [\"Claude Opus 5\", \"Kokoro af_heart\"]. Shown to viewers in the watch page's ⋯ menu. Send it on every create; omitting it keeps whatever a previous publish recorded."
},
"speechSpeed": {
"type": "number",
"description": "Narration speed multiplier passed to the voice. Omit for the server default."
},
"voiceStability": {
"type": "number",
"description": "Voice stability setting passed to the narration engine. Omit for the server default."
},
"dryRun": {
"type": "boolean",
"default": false,
"description": "Sandbox: run every check a real create runs (format, slug and org conflicts, tier cap, credit preflight) and write nothing. The reply has status \"validated\" and the webUrl a real create would publish at. Use it to test an integration without touching the channel."
},
"assets": {
"type": "array",
"maxItems": 20,
"description": "Files the document references relative to itself — fonts, images, Lottie/Rive animations, sound-effect audio, video clips. The SERVER fetches each https url at create time and stores it in the bundle, so reference `assets/...` paths in your HTML and list the sources here instead of inlining base64. 10MB per asset, 30MB total.",
"items": {
"type": "object",
"required": [
"path",
"url"
],
"additionalProperties": false,
"properties": {
"path": {
"type": "string",
"description": "Bundle-relative path your HTML references, e.g. assets/fonts/inter-600.woff2. Must start with assets/."
},
"url": {
"type": "string",
"description": "Public https source to fetch the bytes from (e.g. a fonts.gstatic.com woff2 URL, an image URL)."
},
"sha256": {
"type": "string",
"pattern": "^sha256:[a-fA-F0-9]{64}$",
"description": "Optional integrity pin — the create fails if the fetched bytes hash differently."
}
}
}
}
},
"required": [
"indexHtml"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"presentationId": {
"type": "string"
},
"webUrl": {
"type": "string",
"description": "Shareable watch URL (live once status is ready)."
},
"status": {
"type": "string",
"enum": [
"ready",
"queued"
],
"description": "ready = nothing needed narration; queued = narration runs in the background — poll get_presentation_status."
},
"statusUrl": {
"type": "string"
},
"narration": {
"type": "object",
"required": [
"narratedSlides",
"totalSlides",
"estimatedChars"
],
"properties": {
"narratedSlides": {
"type": "integer"
},
"totalSlides": {
"type": "integer"
},
"estimatedChars": {
"type": "integer"
}
}
}
},
"required": [
"presentationId",
"webUrl",
"status",
"statusUrl",
"narration"
]
}🔴publish_narrated_presentation(indexHtml, audio, assets, title, slug, ...)
DEPRECATED: call create_presentation with an `audio` array instead — it is the same thing in one call, and the slides are viewable while the narration lands. Publish an html-presentation/v1 document using audio YOU synthesized locally (e.g. with `bisque-voice`) — free, unlimited, and works on macOS, Linux and Windows. Send each narrated slide's word timings and MP3 metadata; the server assembles presentation.json (recomputing cues from your narration markers) and returns one upload URL per MP3. Then PUT each file and POST the returned completeUrl with the returned `files` array. RE-PUBLISHING: `audio` is optional — any narrated slide you omit reuses the audio from the last publish whenever its narration text and speechSpeed are unchanged, so an HTML-only edit needs no synthesis at all. The response reports `reused`, `synthesized`, and `staleSlides` (narrated slides whose text changed and have no audio — synthesize exactly those and publish again). Use create_presentation instead to have the server narrate.
입력 스키마
{
"type": "object",
"properties": {
"indexHtml": {
"type": "string",
"minLength": 1,
"maxLength": 4194304,
"description": "Full html-presentation/v1 document (the presentation-format meta gate applies)."
},
"audio": {
"type": "array",
"description": "One entry per slide you synthesized, from the JSON `bisque-voice` prints on stdout. `words`, `durationMs`, `size` and `hash` map across verbatim. Optional: omit a slide (or the whole array) and its audio carries forward from the previous publish if the narration text is unchanged — otherwise that slide publishes silent and is listed in `staleSlides`. A FIRST publish with nothing to carry forward is rejected.",
"items": {
"type": "object",
"required": [
"words",
"durationMs",
"size",
"hash"
],
"additionalProperties": false,
"properties": {
"slideIndex": {
"type": "integer",
"minimum": 0,
"description": "0-based index of the slide in the document. Use this or slideKey."
},
"slideKey": {
"type": "string",
"description": "Manifest slide key, e.g. slide-00. Use this or slideIndex."
},
"words": {
"type": "array",
"description": "Word timings in SECONDS, 1:1 with the narration's whitespace tokens. Rejected if the count differs — cue markers index this array by position, so a mismatch silently misplaces every later cue.",
"items": {
"type": "object",
"required": [
"word",
"start",
"end"
],
"additionalProperties": false,
"properties": {
"word": {
"type": "string"
},
"start": {
"type": "number"
},
"end": {
"type": "number"
}
}
}
},
"durationMs": {
"type": "integer",
"minimum": 1,
"description": "Audio duration in whole milliseconds."
},
"size": {
"type": "integer",
"minimum": 1,
"description": "Encoded MP3 byte count."
},
"hash": {
"type": "string",
"pattern": "^sha256:[a-fA-F0-9]{64}$",
"description": "sha256:<64 hex> digest of the MP3 bytes."
},
"exact": {
"type": "boolean",
"description": "Pass through bisque-voice's `exact`. False means timings were distributed proportionally; reported back as a warning."
},
"contentType": {
"type": "string",
"const": "audio/mpeg",
"description": "Rejected unless audio/mpeg — a WAV would publish mislabelled."
},
"voice": {
"type": "string"
},
"speed": {
"type": "number"
},
"chunks": {
"type": "integer"
}
}
}
},
"assets": {
"type": "array",
"description": "Files the document references relative to itself — fonts, images, SVG, Lottie, Rive, bundled audio cues. html-presentation/v1 requires these to be self-hosted, so a presentation that renders locally is broken once published unless they travel with it. Each gets an upload URL back alongside the MP3s; PUT them the same way. Paths must be under `assets/` — the server owns index.html, presentation.json and context.md, and the manifest owns audio/. Omit for a presentation that references nothing.",
"items": {
"type": "object",
"required": [
"path",
"size",
"hash"
],
"additionalProperties": false,
"properties": {
"path": {
"type": "string",
"description": "Bundle-relative path, e.g. assets/fonts/inter.woff2. Must start with `assets/`; no absolute paths and no `..` segments."
},
"size": {
"type": "integer",
"minimum": 0,
"description": "Byte length of the file you are about to upload."
},
"hash": {
"type": "string",
"description": "sha256:<64 hex chars> of those bytes, prefix included."
},
"contentType": {
"type": "string",
"description": "Ignored. The server derives the content type from the file extension so one map decides how every asset is served."
}
}
}
},
"title": {
"type": "string",
"maxLength": 200,
"description": "Display title for the watch page and listings. Omit to use the title parsed from the document."
},
"slug": {
"type": "string",
"description": "URL slug; defaults to a slugified title."
},
"presentationId": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "Stable id for idempotent re-publishes; defaults to slug-<hash(userId:slug)>."
},
"visibility": {
"type": "string",
"enum": [
"private",
"unlisted",
"public"
],
"default": "unlisted",
"description": "unlisted (the default) is shareable by link and plays in chat-embedded players; private requires the owner to sign in, so an inline chat player shows a sign-in wall instead of playing — choose private only when the user asked for it."
},
"handle": {
"type": "string",
"description": "Publish under a specific channel handle you own."
},
"designMd": {
"type": "string",
"description": "Design frontmatter mapped to theme tokens."
},
"contextMd": {
"type": "string",
"description": "Shared-with-viewer context.md."
},
"voiceId": {
"type": "string",
"description": "Records what actually spoke, e.g. kokoro:af_heart for a locally synthesized Kokoro voice. No audio is generated server-side."
},
"madeWith": {
"type": "array",
"maxItems": 8,
"items": {
"type": "string",
"maxLength": 80
},
"description": "Credit the models that made this: the model you are running as, and the engine that synthesized the audio you are uploading — e.g. [\"Claude Opus 5\", \"Kokoro af_heart\"]. Shown to viewers in the watch page's ⋯ menu. Send it on every publish; omitting it keeps whatever a previous publish recorded."
},
"speechSpeed": {
"type": "number",
"description": "Must match the speed you synthesized at — it is part of the audio cache key, so changing it on a re-publish makes every slide stale instead of carrying forward."
},
"voiceStability": {
"type": "number",
"description": "Records the stability setting you synthesized at. No audio is generated server-side."
}
},
"required": [
"indexHtml"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"presentationId": {
"type": "string"
},
"webUrl": {
"type": "string",
"description": "Shareable watch URL."
},
"uploadUrls": {
"type": "array",
"description": "One pre-signed PUT per file to upload.",
"items": {
"type": "object",
"required": [
"path",
"url",
"method",
"headers"
],
"properties": {
"path": {
"type": "string"
},
"url": {
"type": "string"
},
"method": {
"type": "string",
"enum": [
"PUT"
]
},
"headers": {
"type": "object"
}
}
}
},
"completeUrl": {
"type": "string",
"description": "POST here after every PUT, echoing `files` back verbatim."
},
"publishId": {
"type": "string"
},
"files": {
"type": "array",
"description": "Echo back verbatim as the complete call's `files`.",
"items": {
"type": "object"
}
},
"reused": {
"type": "array",
"items": {
"type": "string"
},
"description": "Slide keys whose audio carried forward — no upload."
},
"synthesized": {
"type": "array",
"items": {
"type": "string"
},
"description": "Slide keys this request supplied audio for."
},
"staleSlides": {
"type": "array",
"items": {
"type": "string"
},
"description": "Narrated slide keys that will publish SILENT — synthesize exactly these and publish again."
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"presentationId",
"webUrl",
"uploadUrls",
"completeUrl",
"publishId",
"files",
"reused",
"synthesized",
"staleSlides",
"warnings"
]
}🟢get_presentation_status(presentationId)
Fetch the build state and result URL for a presentationId.
입력 스키마
{
"type": "object",
"properties": {
"presentationId": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "The presentationId returned by create_presentation or publish_narrated_presentation."
}
},
"required": [
"presentationId"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"presentationId": {
"type": "string"
},
"webUrl": {
"type": "string",
"description": "Shareable watch URL."
},
"publishStatus": {
"type": "string"
},
"ready": {
"type": "boolean",
"description": "True once the presentation is viewable."
},
"visibility": {
"type": "string"
},
"narration": {
"type": "object",
"description": "Narration progress: status (complete | partial | failed | …) and per-slide errors when partial/failed."
}
},
"required": [
"presentationId",
"publishStatus",
"ready"
]
}🟢list_presentations(limit, visibility, cursor)
List the authenticated user's presentations, newest first. One call returns at most `limit` of them. A non-null `nextCursor` in the response means more presentations remain: call again with `cursor` set to that value to get the page after this one, and keep going until `nextCursor` is null.
입력 스키마
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum number of presentations to return per page."
},
"visibility": {
"type": "string",
"enum": [
"private",
"unlisted",
"public"
],
"description": "Return only presentations with this visibility. Omit to return every one of them."
},
"cursor": {
"type": "string",
"description": "The `nextCursor` from a previous call, to read the page after that one. Omit it to start at the newest presentation."
}
},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"nextCursor": {
"type": [
"string",
"null"
],
"description": "Pass this back as `cursor` for the next page. Null when this page is the last one."
},
"presentations": {
"type": "array",
"description": "Newest first.",
"items": {
"type": "object",
"required": [
"presentationId",
"title",
"slug",
"visibility",
"publishStatus",
"webUrl"
],
"properties": {
"presentationId": {
"type": "string"
},
"title": {
"type": "string"
},
"slug": {
"type": "string"
},
"visibility": {
"type": "string"
},
"publishStatus": {
"type": "string"
},
"webUrl": {
"type": "string"
},
"createdAt": {
"type": [
"string",
"null"
],
"description": "ISO 8601, null when unknown."
}
}
}
}
},
"required": [
"presentations",
"nextCursor"
]
}🟢get_presentation_analytics(presentationId)
Watch analytics for one of your presentations: views, likes, completion rate, per-slide retention funnel, traffic sources, distinct signed-in/anonymous viewers, and organization email domains (personal providers filtered). Lets an agent read how its own published briefings performed.
입력 스키마
{
"type": "object",
"properties": {
"presentationId": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "The presentationId whose view counts and survey responses you want."
}
},
"required": [
"presentationId"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"presentationId": {
"type": "string"
},
"title": {
"type": "string"
},
"slug": {
"type": "string"
},
"webUrl": {
"type": "string"
},
"viewCount": {
"type": "integer"
},
"likeCount": {
"type": "integer"
},
"completedCount": {
"type": "integer"
},
"uniqueViewers": {
"type": "integer",
"description": "Distinct signed-in viewers."
},
"anonViewers": {
"type": "integer"
},
"completionRate": {
"type": [
"number",
"null"
],
"description": "completedCount / viewCount, 0..1; null when no views."
},
"slideReach": {
"type": "array",
"description": "Retention funnel ordered by slide index.",
"items": {
"type": "object",
"required": [
"slideIndex",
"reached"
],
"properties": {
"slideIndex": {
"type": "integer"
},
"reached": {
"type": "integer"
}
}
}
},
"sources": {
"type": "object",
"description": "Traffic source → view count."
},
"orgDomains": {
"type": "array",
"description": "Organization email domains of signed-in viewers (personal providers filtered), sorted desc.",
"items": {
"type": "object",
"required": [
"domain",
"viewers"
],
"properties": {
"domain": {
"type": "string"
},
"viewers": {
"type": "integer"
}
}
}
}
},
"required": [
"presentationId",
"title",
"slug",
"viewCount",
"likeCount",
"completedCount",
"uniqueViewers",
"anonViewers",
"completionRate",
"slideReach",
"sources",
"orgDomains"
]
}🟢get_presentation_context(url, handle, slug)
Load any shared Bisque presentation for reading: its metadata, the full per-slide narration transcript with timestamps, and the context.md file its author shipped for agents (extra background the slides summarize). Target it by watch URL (https://bisque.today/p/{handle}/{slug}) or by handle + slug — it does not have to be yours. Use this to read, summarize, cite, or answer questions about a presentation: ground your answers in the returned transcript and context, and cite slides as [slide N].
입력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"description": "Watch URL, e.g. https://bisque.today/p/{handle}/{slug}. Provide this OR handle + slug."
},
"handle": {
"type": "string",
"maxLength": 80,
"description": "Channel handle (leading @ allowed)."
},
"slug": {
"type": "string",
"maxLength": 80,
"description": "URL slug, the last path segment of the watch URL. Use with handle, or pass url instead."
}
},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"presentationId": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"handle": {
"type": "string"
},
"slug": {
"type": "string"
},
"webUrl": {
"type": "string"
},
"visibility": {
"type": "string"
},
"publishedAt": {
"type": [
"string",
"null"
],
"description": "ISO 8601, null when unknown."
},
"transcript": {
"type": "array",
"description": "Per-slide narration, ordered by slide index.",
"items": {
"type": "object",
"required": [
"slideIndex",
"startSec",
"title",
"text"
],
"properties": {
"slideIndex": {
"type": "integer"
},
"startSec": {
"type": "number"
},
"title": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
},
"transcriptTruncatedSlides": {
"type": "integer",
"description": "Content slides the size-capped transcript dropped; 0 = complete."
},
"contextMd": {
"type": [
"string",
"null"
],
"description": "The bundle's context.md (shared agent-facing background); null when the presentation ships none."
},
"contextTruncated": {
"type": "boolean"
}
},
"required": [
"presentationId",
"title",
"handle",
"slug",
"webUrl",
"visibility",
"transcript",
"transcriptTruncatedSlides",
"contextMd",
"contextTruncated"
]
}🔴update_channel(description, image_url, handle)
Update one of your channels. Set the description — the line a stranger reads in a search result or a link unfurl, at most 160 characters, empty to clear it and go back to naming the newest presentations. Set the avatar from an image URL, which is fetched, center-cropped square and resized. Pass either or both. Omit handle to use your default channel.
입력 스키마
{
"type": "object",
"properties": {
"description": {
"type": "string",
"description": "What the channel publishes, in the owner's words. Empty clears it.",
"maxLength": 160
},
"image_url": {
"type": "string",
"description": "https URL of the avatar image (any common format, ≤10 MB).",
"minLength": 1,
"maxLength": 2000
},
"handle": {
"type": "string",
"description": "Which of your channel handles to update; defaults to your default username.",
"minLength": 3,
"maxLength": 30
}
},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"handle": {
"type": "string"
},
"channelUrl": {
"type": "string",
"description": "Public channel page carrying the update."
},
"updated": {
"type": "array",
"items": {
"type": "string"
},
"description": "Field names that were written."
},
"failed": {
"type": "array",
"description": "Fields that did not apply, each with the reason. A field listed here left the channel unchanged; the ones in updated still took effect.",
"items": {
"type": "object",
"required": [
"field",
"reason"
],
"properties": {
"field": {
"type": "string"
},
"reason": {
"type": "string"
}
}
}
},
"description": {
"type": [
"string",
"null"
],
"description": "The stored line, or null when the write cleared it."
}
},
"required": [
"handle",
"channelUrl",
"updated"
]
}🟡create_artifact(title, content, type, description, icon, ...)
Publish an HTML page or a Markdown document as a Bisque Artifact: a persistent, versioned page at a stable URL that people can open, comment on, and that you can update later with update_artifact. Pass the whole document as content. The call waits for the page to be ready and returns its URL. It is private to you unless you pass audience or share_with. A page that should remember what people do on it (a checklist, a poll, a sign-up sheet) declares capabilities ['state.read','state.write'] and, when some paths need different access, state.rules; it then reads and writes JSON documents through window.bisque.state. For a narrated presentation use create_presentation instead.
입력 스키마
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "A short name, the way a document or app is named."
},
"content": {
"type": "string",
"description": "The full document. For html: a complete page (styles and scripts inline; it runs in a sandboxed frame with no network). For markdown: the Markdown source."
},
"type": {
"type": "string",
"enum": [
"html",
"markdown"
],
"description": "Default html."
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "One sentence saying what the page is; shown in listings."
},
"icon": {
"type": "string",
"maxLength": 256,
"description": "An emoji that stands for the page, e.g. 📊. The tab and Home Screen show icon_image, not this."
},
"icon_image": {
"type": "string",
"description": "The page's own icon: the favicon in the browser tab and the icon a phone puts on its Home Screen. A data URL: an SVG (data:image/svg+xml,<svg …>) or a base64 PNG, JPEG, WebP, or GIF, at most 512 KB, cropped to a square. An SVG must be self-contained (no links to other files, fonts, or stylesheets); draw shapes rather than text. Without one the page shows the Bisque icon."
},
"audience": {
"type": "string",
"enum": [
"owner",
"users",
"public"
],
"description": "Who can open the link. owner: only you. users: the people in share_with. public: anyone with the link."
},
"share_with": {
"type": "array",
"maxItems": 100,
"description": "People to grant access by email (or uid), with a role. [{ \"email\": \"[email protected]\", \"role\": \"viewer\" }]. viewer opens it; editor can also publish new content. Implies audience \"users\" when audience is omitted.",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"email": {
"type": "string",
"description": "The person's account email."
},
"uid": {
"type": "string",
"description": "Their Bisque uid, if known."
},
"role": {
"type": "string",
"enum": [
"viewer",
"editor"
],
"description": "Default viewer."
}
}
}
},
"listed": {
"type": "boolean",
"description": "Show it in listings (the org library, public discovery) rather than link-only. Default false."
},
"capabilities": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"enum": [
"state.read",
"state.write",
"events.emit",
"viewer.identity"
]
},
"description": "What the page may do at run time. state.read and state.write give it JSON documents at window.bisque.state (get, patch, list, subscribe); viewer.identity tells it who is viewing (window.bisque.viewer); events.emit lets it record typed Events. Omit for a page that only shows things."
},
"state": {
"type": "object",
"additionalProperties": false,
"properties": {
"rules": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "A slash path the rule covers, and everything below it; '' is the root. A trailing {self} names each person's own document under the prefix."
},
"read": {
"type": "string",
"enum": [
"anyone",
"viewer",
"contributor",
"owner"
]
},
"write": {
"type": "string",
"enum": [
"viewer",
"contributor",
"owner"
]
}
}
}
}
},
"description": "Who may read and write which paths of the page's data, by the minimum role: viewer (can open), contributor (a data grant, separate from editing the page), owner. Absent means: everyone who can open reads, contributors and the owner write. Example poll: [{path:'votes',read:'viewer',write:'owner'},{path:'votes/{self}',write:'viewer'}]."
}
},
"required": [
"title",
"content"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"html",
"markdown",
"presentation"
]
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"icon": {
"type": "string"
},
"icon_image_url": {
"type": [
"string",
"null"
],
"description": "The page icon set with icon_image; null for the Bisque icon."
},
"organization_id": {
"type": "string"
},
"group_id": {
"type": "string"
},
"audience_mode": {
"type": "string",
"description": "Who can open it: owner, users, org, or public."
},
"discoverability": {
"type": "string",
"enum": [
"unlisted",
"listed"
]
},
"viewer_version_mode": {
"type": "string",
"enum": [
"latest",
"pinned"
]
},
"latest_version_id": {
"type": "string"
},
"published_version_id": {
"type": [
"string",
"null"
],
"description": "The Version viewers see; null until a publication is ready."
},
"url": {
"type": "string",
"description": "The viewer page."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"version_id": {
"type": "string",
"description": "The Version this call authored."
},
"version_number": {
"type": "integer"
},
"publication_status": {
"type": "string",
"enum": [
"queued",
"processing",
"ready",
"failed"
],
"description": "ready means the URL serves this content now. queued or processing means it is still being prepared; call get_artifact to check. failed carries publication_error."
},
"publication_error": {
"type": [
"object",
"null"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
},
"required": [
"artifact_id",
"type",
"title",
"audience_mode",
"discoverability",
"published_version_id",
"url",
"version_id",
"publication_status"
]
}🟢list_artifacts(scope, type, limit, cursor)
List Artifacts you own (scope owned, the default), ones shared with you (shared), or both (all), newest first. Each item carries its id, title, who can open it, and its URL.
입력 스키마
{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"owned",
"shared",
"all"
],
"description": "Default owned."
},
"type": {
"type": "string",
"enum": [
"html",
"markdown",
"presentation"
],
"description": "Only this type."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"description": "Page size, default 25."
},
"cursor": {
"type": "string",
"description": "next_cursor from a prior page."
}
},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"artifact_id",
"type",
"title",
"audience_mode",
"discoverability",
"published_version_id",
"url"
],
"properties": {
"artifact_id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"html",
"markdown",
"presentation"
]
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"icon": {
"type": "string"
},
"icon_image_url": {
"type": [
"string",
"null"
],
"description": "The page icon set with icon_image; null for the Bisque icon."
},
"organization_id": {
"type": "string"
},
"group_id": {
"type": "string"
},
"audience_mode": {
"type": "string",
"description": "Who can open it: owner, users, org, or public."
},
"discoverability": {
"type": "string",
"enum": [
"unlisted",
"listed"
]
},
"viewer_version_mode": {
"type": "string",
"enum": [
"latest",
"pinned"
]
},
"latest_version_id": {
"type": "string"
},
"published_version_id": {
"type": [
"string",
"null"
],
"description": "The Version viewers see; null until a publication is ready."
},
"url": {
"type": "string",
"description": "The viewer page."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
}
}
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"required": [
"items",
"next_cursor"
]
}🟢get_artifact(artifact_id)
Read one Artifact: title, who can open it, the Version viewers see (published_version_id, null while a publication is still being prepared), and its URL.
입력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"pattern": "^art_[a-zA-Z0-9]+$",
"description": "The Artifact id (art_…)."
}
},
"required": [
"artifact_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"html",
"markdown",
"presentation"
]
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"icon": {
"type": "string"
},
"icon_image_url": {
"type": [
"string",
"null"
],
"description": "The page icon set with icon_image; null for the Bisque icon."
},
"organization_id": {
"type": "string"
},
"group_id": {
"type": "string"
},
"audience_mode": {
"type": "string",
"description": "Who can open it: owner, users, org, or public."
},
"discoverability": {
"type": "string",
"enum": [
"unlisted",
"listed"
]
},
"viewer_version_mode": {
"type": "string",
"enum": [
"latest",
"pinned"
]
},
"latest_version_id": {
"type": "string"
},
"published_version_id": {
"type": [
"string",
"null"
],
"description": "The Version viewers see; null until a publication is ready."
},
"url": {
"type": "string",
"description": "The viewer page."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [
"artifact_id",
"type",
"title",
"audience_mode",
"discoverability",
"published_version_id",
"url"
]
}🟡update_artifact(artifact_id, content, title, description, icon, ...)
Change an Artifact you own or edit. Pass content to publish a new Version of the page at the same URL (the whole document, not a diff; earlier Versions stay in the history). Pass title, description, icon, or icon_image to change those. Any combination in one call. With content the call waits for the new Version to be live before returning. The new Version keeps the base Version's capabilities and state rules unless you pass capabilities or state.
입력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"pattern": "^art_[a-zA-Z0-9]+$",
"description": "The Artifact id (art_…)."
},
"content": {
"type": "string",
"description": "The complete new document, same type as before."
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 2000,
"description": "null clears it."
},
"icon": {
"type": [
"string",
"null"
],
"maxLength": 256,
"description": "null clears it."
},
"icon_image": {
"type": [
"string",
"null"
],
"description": "The page's own icon: the favicon in the browser tab and the icon a phone puts on its Home Screen. A data URL: an SVG (data:image/svg+xml,<svg …>) or a base64 PNG, JPEG, WebP, or GIF, at most 512 KB, cropped to a square. An SVG must be self-contained (no links to other files, fonts, or stylesheets); draw shapes rather than text. Without one the page shows the Bisque icon. null goes back to the Bisque icon."
},
"capabilities": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"enum": [
"state.read",
"state.write",
"events.emit",
"viewer.identity"
]
},
"description": "What the page may do at run time. state.read and state.write give it JSON documents at window.bisque.state (get, patch, list, subscribe); viewer.identity tells it who is viewing (window.bisque.viewer); events.emit lets it record typed Events. Omit for a page that only shows things."
},
"state": {
"type": "object",
"additionalProperties": false,
"properties": {
"rules": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "A slash path the rule covers, and everything below it; '' is the root. A trailing {self} names each person's own document under the prefix."
},
"read": {
"type": "string",
"enum": [
"anyone",
"viewer",
"contributor",
"owner"
]
},
"write": {
"type": "string",
"enum": [
"viewer",
"contributor",
"owner"
]
}
}
}
}
},
"description": "Who may read and write which paths of the page's data, by the minimum role: viewer (can open), contributor (a data grant, separate from editing the page), owner. Absent means: everyone who can open reads, contributors and the owner write. Example poll: [{path:'votes',read:'viewer',write:'owner'},{path:'votes/{self}',write:'viewer'}]."
}
},
"required": [
"artifact_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"html",
"markdown",
"presentation"
]
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"icon": {
"type": "string"
},
"icon_image_url": {
"type": [
"string",
"null"
],
"description": "The page icon set with icon_image; null for the Bisque icon."
},
"organization_id": {
"type": "string"
},
"group_id": {
"type": "string"
},
"audience_mode": {
"type": "string",
"description": "Who can open it: owner, users, org, or public."
},
"discoverability": {
"type": "string",
"enum": [
"unlisted",
"listed"
]
},
"viewer_version_mode": {
"type": "string",
"enum": [
"latest",
"pinned"
]
},
"latest_version_id": {
"type": "string"
},
"published_version_id": {
"type": [
"string",
"null"
],
"description": "The Version viewers see; null until a publication is ready."
},
"url": {
"type": "string",
"description": "The viewer page."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"version_id": {
"type": "string",
"description": "The Version this call authored."
},
"version_number": {
"type": "integer"
},
"publication_status": {
"type": "string",
"enum": [
"queued",
"processing",
"ready",
"failed"
],
"description": "ready means the URL serves this content now. queued or processing means it is still being prepared; call get_artifact to check. failed carries publication_error."
},
"publication_error": {
"type": [
"object",
"null"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
},
"required": [
"artifact_id",
"type",
"title",
"audience_mode",
"discoverability",
"published_version_id",
"url"
]
}🔴share_artifact(artifact_id, audience, share_with, listed, delete_threads)
Set who can open an Artifact you own. audience picks the rule; share_with is the complete list of named people (it replaces the previous list; omit it to keep the current one). Going public deletes every comment thread, so a public change on an Artifact with threads is refused unless delete_threads is true. Returns the URL to send.
입력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"pattern": "^art_[a-zA-Z0-9]+$",
"description": "The Artifact id (art_…)."
},
"audience": {
"type": "string",
"enum": [
"owner",
"users",
"public"
],
"description": "Who can open the link. owner: only you. users: the people in share_with. public: anyone with the link."
},
"share_with": {
"type": "array",
"maxItems": 100,
"description": "People to grant access by email (or uid), with a role. [{ \"email\": \"[email protected]\", \"role\": \"viewer\" }]. viewer opens it; editor can also publish new content. Implies audience \"users\" when audience is omitted.",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"email": {
"type": "string",
"description": "The person's account email."
},
"uid": {
"type": "string",
"description": "Their Bisque uid, if known."
},
"role": {
"type": "string",
"enum": [
"viewer",
"editor"
],
"description": "Default viewer."
}
}
}
},
"listed": {
"type": "boolean",
"description": "Show it in listings (the org library, public discovery) rather than link-only. Default false."
},
"delete_threads": {
"type": "boolean",
"description": "Allow going public on an Artifact that has comment threads, deleting them."
}
},
"required": [
"artifact_id",
"audience"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string"
},
"audience_mode": {
"type": "string"
},
"discoverability": {
"type": "string",
"enum": [
"unlisted",
"listed"
]
},
"grants": {
"type": "array",
"items": {
"type": "object",
"properties": {
"principal": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"id": {
"type": "string"
}
}
},
"role": {
"type": "string",
"enum": [
"viewer",
"editor"
]
},
"email": {
"type": [
"string",
"null"
]
},
"name": {
"type": [
"string",
"null"
]
}
}
}
},
"url": {
"type": "string"
},
"public_sharing_allowed": {
"type": "boolean"
},
"external_sharing_allowed": {
"type": "boolean"
}
},
"required": [
"artifact_id",
"audience_mode",
"discoverability",
"grants",
"url"
]
}🔴delete_artifact(artifact_id)
Delete an Artifact you own. Its URL stops working for everyone. Confirm with the user before calling this.
입력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"pattern": "^art_[a-zA-Z0-9]+$",
"description": "The Artifact id (art_…)."
}
},
"required": [
"artifact_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string"
},
"deleted": {
"type": "boolean"
},
"already_deleted": {
"type": "boolean"
}
},
"required": [
"artifact_id",
"deleted"
]
}🟢list_artifact_threads(artifact_id, status, activated_only, after, cursor)
List the comment threads people left on one of your Artifacts, newest activity first. Pass activated_only: true to get only the threads where someone mentioned the agent, which are the ones you may reply to and resolve. Each thread carries its anchor (what it is pinned to), the version it was left on, a preview, and agent_activated.
입력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"pattern": "^art_[a-zA-Z0-9]+$",
"description": "The Artifact id (art_…)."
},
"status": {
"type": "string",
"enum": [
"open",
"resolved",
"all"
],
"description": "Default open."
},
"activated_only": {
"type": "boolean",
"description": "Only threads where the agent was mentioned."
},
"after": {
"type": "string",
"description": "RFC 3339 date-time; only threads with activity after it."
},
"cursor": {
"type": "string",
"description": "next_cursor from a prior page."
}
},
"required": [
"artifact_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"thread_id",
"artifact_id",
"status",
"anchor",
"version_number",
"preview",
"message_count",
"agent_activated",
"created_by",
"created_at",
"last_message_at"
],
"properties": {
"thread_id": {
"type": "string"
},
"artifact_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"open",
"resolved"
]
},
"anchor": {
"type": "object",
"description": "Where the thread is pinned: kind element (selector, snapshot, slide), text (quote), or page."
},
"version_id": {
"type": "string"
},
"version_number": {
"type": "integer"
},
"root_message_id": {
"type": "string"
},
"preview": {
"type": "string"
},
"message_count": {
"type": "integer"
},
"participants": {
"type": "array",
"items": {
"type": "string"
}
},
"mentions": {
"type": "array",
"items": {
"type": "string"
}
},
"agent_activated": {
"type": "boolean",
"description": "True once someone mentioned the agent; only then may the agent reply or resolve."
},
"created_by": {
"type": "object",
"description": "Who wrote it: { kind: \"user\", uid, name, handle, avatarUrl } or { kind: \"agent\", principal, name, via }."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"last_message_at": {
"type": "string"
},
"resolved_at": {
"type": [
"string",
"null"
]
}
}
}
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"required": [
"artifact_id",
"items",
"next_cursor"
]
}🟢get_artifact_thread(artifact_id, thread_id)
Read one comment thread on an Artifact with every message, oldest first. Mentions in a body look like @[Name](mention:uid); a mention of the agent is @[Agent](mention:agent).
입력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"pattern": "^art_[a-zA-Z0-9]+$",
"description": "The Artifact id (art_…)."
},
"thread_id": {
"type": "string",
"pattern": "^thr_[a-zA-Z0-9]+$",
"description": "The thread id (thr_…)."
}
},
"required": [
"artifact_id",
"thread_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"thread_id": {
"type": "string"
},
"artifact_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"open",
"resolved"
]
},
"anchor": {
"type": "object",
"description": "Where the thread is pinned: kind element (selector, snapshot, slide), text (quote), or page."
},
"version_id": {
"type": "string"
},
"version_number": {
"type": "integer"
},
"root_message_id": {
"type": "string"
},
"preview": {
"type": "string"
},
"message_count": {
"type": "integer"
},
"participants": {
"type": "array",
"items": {
"type": "string"
}
},
"mentions": {
"type": "array",
"items": {
"type": "string"
}
},
"agent_activated": {
"type": "boolean",
"description": "True once someone mentioned the agent; only then may the agent reply or resolve."
},
"created_by": {
"type": "object",
"description": "Who wrote it: { kind: \"user\", uid, name, handle, avatarUrl } or { kind: \"agent\", principal, name, via }."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"last_message_at": {
"type": "string"
},
"resolved_at": {
"type": [
"string",
"null"
]
},
"messages": {
"type": "array",
"items": {
"type": "object",
"required": [
"message_id",
"thread_id",
"author",
"body",
"created_at"
],
"properties": {
"message_id": {
"type": "string"
},
"thread_id": {
"type": "string"
},
"artifact_id": {
"type": "string"
},
"author": {
"type": "object",
"description": "Who wrote it: { kind: \"user\", uid, name, handle, avatarUrl } or { kind: \"agent\", principal, name, via }."
},
"body": {
"type": "string"
},
"mentions": {
"type": "array",
"items": {
"type": "string"
}
},
"attachments": {
"type": "array",
"items": {
"type": "object"
}
},
"reactions": {
"type": "object"
},
"created_at": {
"type": "string"
},
"edited_at": {
"type": [
"string",
"null"
]
}
}
}
}
},
"required": [
"thread_id",
"artifact_id",
"status",
"anchor",
"version_number",
"preview",
"message_count",
"agent_activated",
"created_by",
"created_at",
"last_message_at",
"messages"
]
}🟡create_artifact_thread(artifact_id, body, anchor)
Leave a new comment thread on one of your Artifacts, as the agent. Without an anchor the thread is a general comment on the page. The thread is activated from the start, so you can reply to it and resolve it later. Mention a person with @[Name](mention:uid) using ids from the Artifact's mentionables.
입력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"pattern": "^art_[a-zA-Z0-9]+$",
"description": "The Artifact id (art_…)."
},
"body": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "Markdown subset: bold, italic, code, links, lists."
},
"anchor": {
"type": "object",
"description": "Optional pin. { kind: \"page\", slideId, slideIndex, timeSec } for a slide or time; { kind: \"element\", selector, xFrac, yFrac, snapshot: { tag, text }, slideId, slideIndex, cueTarget, timeSec } for an element; { kind: \"text\", quote, prefix, suffix, selector, slideId, slideIndex } for a passage."
}
},
"required": [
"artifact_id",
"body"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"thread_id": {
"type": "string"
},
"artifact_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"open",
"resolved"
]
},
"anchor": {
"type": "object",
"description": "Where the thread is pinned: kind element (selector, snapshot, slide), text (quote), or page."
},
"version_id": {
"type": "string"
},
"version_number": {
"type": "integer"
},
"root_message_id": {
"type": "string"
},
"preview": {
"type": "string"
},
"message_count": {
"type": "integer"
},
"participants": {
"type": "array",
"items": {
"type": "string"
}
},
"mentions": {
"type": "array",
"items": {
"type": "string"
}
},
"agent_activated": {
"type": "boolean",
"description": "True once someone mentioned the agent; only then may the agent reply or resolve."
},
"created_by": {
"type": "object",
"description": "Who wrote it: { kind: \"user\", uid, name, handle, avatarUrl } or { kind: \"agent\", principal, name, via }."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"last_message_at": {
"type": "string"
},
"resolved_at": {
"type": [
"string",
"null"
]
},
"messages": {
"type": "array",
"items": {
"type": "object",
"required": [
"message_id",
"thread_id",
"author",
"body",
"created_at"
],
"properties": {
"message_id": {
"type": "string"
},
"thread_id": {
"type": "string"
},
"artifact_id": {
"type": "string"
},
"author": {
"type": "object",
"description": "Who wrote it: { kind: \"user\", uid, name, handle, avatarUrl } or { kind: \"agent\", principal, name, via }."
},
"body": {
"type": "string"
},
"mentions": {
"type": "array",
"items": {
"type": "string"
}
},
"attachments": {
"type": "array",
"items": {
"type": "object"
}
},
"reactions": {
"type": "object"
},
"created_at": {
"type": "string"
},
"edited_at": {
"type": [
"string",
"null"
]
}
}
}
}
},
"required": [
"thread_id",
"artifact_id",
"status",
"anchor",
"version_number",
"preview",
"message_count",
"agent_activated",
"created_by",
"created_at",
"last_message_at",
"messages"
]
}🟡reply_to_artifact_thread(artifact_id, thread_id, body)
Post a reply in a comment thread as the agent. Allowed only on activated threads (agent_activated true): someone mentioned the agent, or the agent started the thread. People see it as "Agent · via <your name>".
입력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"pattern": "^art_[a-zA-Z0-9]+$",
"description": "The Artifact id (art_…)."
},
"thread_id": {
"type": "string",
"pattern": "^thr_[a-zA-Z0-9]+$",
"description": "The thread id (thr_…)."
},
"body": {
"type": "string",
"minLength": 1,
"maxLength": 4000
}
},
"required": [
"artifact_id",
"thread_id",
"body"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"message_id": {
"type": "string"
},
"thread_id": {
"type": "string"
},
"artifact_id": {
"type": "string"
},
"author": {
"type": "object",
"description": "Who wrote it: { kind: \"user\", uid, name, handle, avatarUrl } or { kind: \"agent\", principal, name, via }."
},
"body": {
"type": "string"
},
"mentions": {
"type": "array",
"items": {
"type": "string"
}
},
"attachments": {
"type": "array",
"items": {
"type": "object"
}
},
"reactions": {
"type": "object"
},
"created_at": {
"type": "string"
},
"edited_at": {
"type": [
"string",
"null"
]
}
},
"required": [
"message_id",
"thread_id",
"author",
"body",
"created_at"
]
}⚪resolve_artifact_thread(artifact_id, thread_id, resolved)
Mark a comment thread resolved (resolved: true) or reopen it (resolved: false), as the agent. Allowed only on activated threads. Resolve after you have addressed the comment, usually after republishing the Artifact; reply first so the person can see what changed.
입력 스키마
{
"type": "object",
"properties": {
"artifact_id": {
"type": "string",
"pattern": "^art_[a-zA-Z0-9]+$",
"description": "The Artifact id (art_…)."
},
"thread_id": {
"type": "string",
"pattern": "^thr_[a-zA-Z0-9]+$",
"description": "The thread id (thr_…)."
},
"resolved": {
"type": "boolean"
}
},
"required": [
"artifact_id",
"thread_id",
"resolved"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"thread_id": {
"type": "string"
},
"artifact_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"open",
"resolved"
]
},
"anchor": {
"type": "object",
"description": "Where the thread is pinned: kind element (selector, snapshot, slide), text (quote), or page."
},
"version_id": {
"type": "string"
},
"version_number": {
"type": "integer"
},
"root_message_id": {
"type": "string"
},
"preview": {
"type": "string"
},
"message_count": {
"type": "integer"
},
"participants": {
"type": "array",
"items": {
"type": "string"
}
},
"mentions": {
"type": "array",
"items": {
"type": "string"
}
},
"agent_activated": {
"type": "boolean",
"description": "True once someone mentioned the agent; only then may the agent reply or resolve."
},
"created_by": {
"type": "object",
"description": "Who wrote it: { kind: \"user\", uid, name, handle, avatarUrl } or { kind: \"agent\", principal, name, via }."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"last_message_at": {
"type": "string"
},
"resolved_at": {
"type": [
"string",
"null"
]
}
},
"required": [
"thread_id",
"artifact_id",
"status",
"anchor",
"version_number",
"preview",
"message_count",
"agent_activated",
"created_by",
"created_at",
"last_message_at"
]
}권장 프롬프트
list_presentationsget_presentation_speclist_presentationslist_presentationsget_presentation_specget_presentation_spec커뮤니티
증거