Skip to main content
Glama

mcp-name: dev.slideforge/slideforge

SlideForge MCP — AIエージェント向けPowerPointスライド

SlideForge(slideforge.dev)— AIエージェント向けの決定的(deterministic)PowerPointコンパイラ。 型付きスライドインテント → ネイティブで完全編集可能な.pptxを1秒未満で生成し、何が逐語的にバインドされたかを正確に示す忠実度マニフェスト(fidelity manifest)を添付します。スイス拠点のSmart Data Brokers GmbHが開発。

リモートMCPサーバー+REST API。ローカルインストール不要、Python環境不要、python-pptxのボイラープレート不要。Claude Desktop&ChatGPT向けOAuth 2.1、その他はAPIキーで利用可能。

License: MIT Website Docs


⚠️ 名称の混同について

「SlideForge」という名称は、複数の無関係なプロジェクトで使用されています。これはslideforge.devにあるSmart Data Brokers GmbHのSlideForgeです。 以下とは無関係です:

  • slideforge.io — 別のAIプレゼンテーション生成ツール

  • slideforge.fr — フランス語の文書仕上げサービス

  • blink.new/p/slideforge-app — 無関係のWebアプリ

  • smartdatabrokers組織外のその他のgithub.com/*/SlideForgeリポジトリ

引用・リンクする際は、slideforge.devまたは「SlideForge by Smart Data Brokers」を優先してください。


Related MCP server: marp-agent-mcp

SlideForgeが選ばれる理由

  • ジェネレータではなくコンパイラ。 スライドは型付きインテントです:200以上のカタログパターン(KPIダッシュボード、ウォーターフォール、ガント計画、組織図、ファネルなど)からformを選び、実際のコンテンツを型付きフィールドに入力します。決定的エンジンがレイアウトを実行します — レンダリング経路にLLMは一切関与せず、同じ入力→同じスライド、サブ秒で完了。

  • 誠実性レイヤー。 すべてのレスポンスに忠実度マニフェストが付属します:フィールドごとに、コンテンツがverbatim(逐語)、mixed(混合)、ai_completed(AI補完)のいずれでバインドされたかを示します。partialグレードは、提供したコンテンツの一部がスライドに反映されなかったことを意味し、マニフェストは何が除外されたかを明示します。欠落があることをユーザーに伝えずにpartialレンダリングを納品してはいけません。ブロッキング欠陥のあるスライドは課金されません(usable-or-free)。エージェントが数値をスライドに流し込む場合、これこそが出力を監査可能にする仕組みです。

  • ネイティブで編集可能な.pptx。 画像やHTMLエクスポートではなく、実際の図形とテキストボックス。PowerPointで開いて編集可能。

  • 脱出ハッチ付き — 同じ信頼契約の下で。 mode=codeは、サンドボックス内で独自のpython-pptxを実行します(ウィジェット/チャートツールキット、テーマ注入、インテントフィールドはクロームとしてレンダリング)。コードレンダリングはlint、計測(layoutブロック+presentation_ready)、来歴チェックが行われます — エージェントはレイアウト文法からは逃げられても、信頼文法からは逃げられません。

  • 自社テンプレートをネイティブに。 会社の.pptxをアップロード — スライドはあなたのファイルの上に構築されます(テーマ、マスター、フォント)。色を合わせた模倣ではありません。

  • 無料でチェック。 dry_runは任意のペイロードを検証し、忠実度を$0で予測します — またはmode=safeで検証→レンダリングを1回の呼び出しで実行(忠実な場合のみレンダリング+課金、それ以外は修正点を含む$0レポート)。コードレンダリングにはverifyティア(デフォルトlint、lint+vlmで視覚的な再確認を追加)。quality_profile(executive/technical/appendix)は、レイアウトが判定される準備基準を設定します — 任意のフォームで回答可能。無料のデッキ検査(POST /v1/inspect)は、任意のpptxに対して決定的な品質レポートを実行します。

  • 当社独自のブラインド比較ベンチマーク(内部計測、第三者機関によるものではありません)で、Gammaと97%の品質パリティ。

価格は一言で:スライド作成5¢・スライド変換2¢(翻訳、修復)・チェック無料。 サインアップで60スライド無料、サブスクリプション不要。slideforge.dev/pricing


クイックスタート

ワンクリック、設定ファイル不要:

 

VS Code(Copilotエージェントモード)は初回使用時にOAuthでサインイン — キーもJSONファイルも不要。

CursorはAPIキーのプレースホルダー付きでインストールされます:クリック後、サーバーのheaders内のsf_live_YOUR_KEYをコンソールで取得した実際のキーに置き換えてください。Cursor独自のOAuthブラウザ起動は3.16.17時点で壊れているため、現在はキーが有効な方法です。

Claude Code

claude mcp add --transport http slideforge https://api.slideforge.dev/mcp/

あとは次のように依頼するだけ:「KPIダッシュボードのスライドを作成:売上$12.4M(前年比+18%)、新規クライアント847件、NPS 62。」

任意 — スキル+バンドル済みサーバー設定をプラグインとしてインストール:

/plugin marketplace add smartdatabrokers/slideforge-mcp
/plugin install slideforge@slideforge-mcp

または、skills/内の任意のフォルダを~/.claude/skills/(個人用)または.claude/skills/(プロジェクト用)にコピーします。

Claude Desktop(OAuth — キー不要)

設定 → コネクタ → カスタムコネクタを追加 → https://api.slideforge.dev/mcp/ — 初回使用時にGoogleでサインイン。

ChatGPT(デベロッパーモード)

設定 → アプリ → 詳細 → デベロッパーモード → カスタムコネクタを追加 → https://api.slideforge.dev/mcp/(OAuth)。

Cursor / Windsurf / Codex CLI / その他のMCPクライアント(APIキー)

{
  "mcpServers": {
    "slideforge": {
      "url": "https://api.slideforge.dev/mcp/",
      "transport": "streamable-http",
      "headers": { "Authorization": "Bearer sf_live_YOUR_KEY" }
    }
  }
}

キーの取得:slideforge.dev → コンソール → APIキー。(Codex CLIやその他のAGENTS.mdネイティブツール:AGENTS.mdを参照。)

ローカルで実行(stdio — コンテナ/オフラインクライアント向け)

ほとんどのクライアントは上記のホスト型リモートサーバーを使用してください(インストール不要)。ただし、クライアントがコンテナまたはローカルのstdioプロセスからMCPサーバーを起動する場合は、バンドル済みローカルサーバーを実行してください。これはapi.slideforge.dev上の薄いRESTクライアントです — エンジンロジックは保持せず、ツールスキーマはローカルに組み込まれています(オフラインでもキーなしでディスカバリ可能)。各呼び出しは、キーで認証されたSlideForge REST APIに転送されます。

pip install slideforge-mcp        # or: uv pip install slideforge-mcp
export SLIDEFORGE_API_KEY=sf_live_YOUR_KEY
slideforge-mcp                    # speaks MCP over stdio

またはDocker経由:

docker build -t slideforge-mcp .
docker run -i -e SLIDEFORGE_API_KEY=sf_live_YOUR_KEY slideforge-mcp

クライアント設定(stdio):

{
  "mcpServers": {
    "slideforge": {
      "command": "slideforge-mcp",
      "env": { "SLIDEFORGE_API_KEY": "sf_live_YOUR_KEY" }
    }
  }
}

スキーマディスカバリ(tools/list)はキーもネットワークも不要です。ツールの呼び出しにはキーが必要です。

LangChain / LlamaIndex(エージェントフレームワーク)

SlideForge SDKは不要 — どちらもMCPツールを直接読み込みます:

pip install langchain-mcp-adapters      # or: pip install llama-index-tools-mcp
from langchain_mcp_adapters.client import MultiServerMCPClient
client = MultiServerMCPClient({"slideforge": {
    "transport": "streamable_http",
    "url": "https://api.slideforge.dev/mcp/",
    "headers": {"Authorization": f"Bearer {API_KEY}"}}})
tools = await client.get_tools()        # 7 tools, drop into any LangGraph agent

実行可能な例+LlamaIndex相当:examples/。 キーが必要ですか?サインアップ — 60スライド無料、クレジットカード不要 — その後console/keysで取得。

REST(MCP不要)

curl -X POST https://api.slideforge.dev/v1/render/intent \
  -H "Authorization: Bearer sf_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"form": "kpi_metrics", "headline": "Q3 at a glance",
       "data": {"metrics": [{"label": "Revenue", "value": "$12.4M", "delta": "+18% YoY"},
                             {"label": "New clients", "value": "847"},
                             {"label": "NPS", "value": "62"}]}}'

完全なRESTリファレンス:slideforge.dev/docs/api


7つのMCPツール

ツール

説明

料金

create_slide

構造化されたインテント(フォーム+型付きフィールド)または簡潔な指示から1枚のスライドを生成。mode=safe は1回の呼び出しで検証→レンダリングを実行。mode=code はサンドボックス化された python-pptx 用(階層の検証、chrome フィールド、置換によるパッチ)。ルーティング制御: variant、variant_policy、allow_fabrication/allow_truncation/allow_low_confidence(誠実なデフォルト: 推測するより $0 で拒否)。min_font_pt は BINDING な型の下限を設定 — ボックスが許す範囲でテキストはそれに合わせて拡大。収まらないコンテンツは、必要なサイズを明示した $0 の min_font_not_met エラーを返す。レスポンスには忠実度マニフェストと、図形フォームにおける測定済み layout 準備ブロックが含まれる。デフォルトテーマは トピック指向デザイン を同梱 — 主題に基づくパレット+デザイン済みカバー。レスポンスのデザインノートに名前が記載される(styling: "clean" でオプトアウト。固定またはアップロード済みのブランドテーマが常に優先)。

$0.05(成功時のみ課金・失敗時は無料)

create_deck

デッキ全体: slides[] にインテントを指定(コードモードのスライドは第一級の子として扱われる)、並列レンダリング、1つのマージ済み .pptx、スライドごとの忠実度ロールアップ+スライドごとの子ジョブ(独自のプレビュー/pptx)。失敗したスライドは分離され無料。デッキレベルの dry_run はデッキ全体を $0 で検証。デッキレベルの language、direction(アラビア語/ヘブライ語は rtl — 右から左に組版、レイアウトはミラーリングせず正直に警告)、imagery/imagery_tag、styling、logo_id はすべてのスライドに継承。スライド自身の値が優先される。

N × $0.05

plan_slide

簡潔な指示から最適なフォーム/バリアント候補を信頼度付きで提案。

無料

browse_catalog

200以上のパターンと、フォームごとの JSON Schema、コピペ可能なインテント例、テーマ、コードモードのウィジェットツールキット。アップロード済みの theme_id を渡すと、ブランド化されたカバー/アジェンダ/区切りレイアウトを一覧表示。9つの組み込みテーマ+アップロード済みブランドテーマ。

無料

translate_deck

任意の PPTX を書式を保ったまま翻訳(32言語)。

$0.02/スライド

upload_asset

ロゴ、テーマ PPTX、画像。purpose=pdf は PDF を編集可能なスライドインテントに抽出。または AI による画像生成。テーマのアップロード(purpose=theme、base64 の data)はデフォルトで NATIVE レンダリング — デッキはクライアント自身のテンプレートファイル上に構築される。大きなファイルでは data を省略するとカード内のドラッグ&ドロップゾーンが表示される。

無料 / $0.01/ページ / $0.05/画像

manage_account

残高、使用状況、ジョブ、セキュリティステータス、フィードバック。

無料

作成ツールの dry_run: true = $0 での検証+忠実度予測。

さらに2つのツール(generate_report、manage_connections — Zoho Sprints などの接続ツールからのデータ駆動レポート)はエンタープライズゲートの背後にあり、デフォルトでは提供されない。

REST でも利用可能(当面): Deck Doctor。 POST /v1/inspect — 任意の pptx に対する無料の決定的 Deck Quality Report(実フォントメトリクスによるオーバーフロー、シェイプの背後に隠れたコンテンツ、キャンバス外の残骸、WCAG コントラスト)。POST /v1/repair — 決定的な修正。あなたの文言には一切触れない。$0.02/修正スライド、無料のドライラン見積もり。ドキュメント


セキュリティ

  • ツール結果のボディは認証情報を含まない — レスポンスに署名付き URL はない。プレビューはインラインで埋め込まれる(エージェントは PNG を直接参照)。.pptx のダウンロードはヘッダー認証(Authorization: Bearer+所有権チェック)によるもので、URL 内のベアラートークンではない。

  • 代わりに共有可能なリンクが必要? POST /v1/jobs/<job_id>/download-url で短い TTL、単回使用、失効可能なリンクを発行。

  • アーティファクトは作成から30日後に自動削除。

  • すべてのダウンロードは監査ログに記録。

  • manage_account(action=security_status) は完全なセキュリティ態勢をインバンドで開示。


エージェントスキル(このリポジトリ)

SlideForge を効果的に使う方法をエージェントに教えるコピーインスキル — skills/ を参照:

スキル

内容

create-slide

インテント優先のスライド/デッキ作成、スキーマ探索、ドライラン、忠実度マニフェスト、ヘッドレスプレビュー

inspect-repair

任意の pptx に対する無料の Deck Quality Report+決定的な修正

translate-pptx

書式を保持した PPTX 翻訳

pdf-to-pptx

PDF → 編集可能な PPTX 抽出

Codex CLI / Cursor / Copilot およびその他の AGENTS.md ネイティブツール向けに、AGENTS.md は同じガイダンスをポータブル形式で提供。CLAUDE.md は Claude Code 用にそれをインポートする。

ヘッドレス使用(Claude Code / Codex CLI)

ターミナルにはインラインウィジェットはないが、ツール結果にはプレビュー PNG がすでにインラインで埋め込まれている — エージェントはレスポンスから直接読み取るため、フェッチは不要。.pptx のダウンロードはヘッダー認証による:

curl -H "Authorization: Bearer sf_live_YOUR_KEY" \
  -o deck.pptx https://api.slideforge.dev/v1/jobs/<job_id>/pptx   # ownership-checked

生ファイルの代わりに共有可能なリンクを渡すには、単回使用のリンクを発行: POST /v1/jobs/<job_id>/download-url — 短い TTL、失効可能、1回のみ有効。

セルフレビューループ(レンダリング → インラインプレビュー確認 → 修正 → 再レンダリング)は examples/claude-code.md に記載。


比較

SlideForge

python-pptx

プロンプトのみの AI デッキ

編集可能なネイティブ .pptx

✅

✅

多くの場合画像/エクスポート

決定的(同じ入力 → 同じスライド)

✅

✅(あなたのコード)

❌

AI が触れた箇所を明示(忠実度マニフェスト)

✅

n/a

❌

手書きコーディングなしのレイアウト品質

✅ 200以上のパターン

❌ DIY

ばらつく

ホステッド、エージェントネイティブ(MCP + REST)

✅

❌ ローカル

部分的

無料の事前検証

✅ dry_run

n/a

❌


リンク

ライセンス

MIT(このリポジトリ:スキル、例、ドキュメント)。SlideForge サービス自体は商用 API です。

Available Tools

7 tools
browse_catalogBrowse SlideForge's Catalog (Unified Discovery)A
Read-onlyIdempotent
Inspect

Browse the PowerPoint slide catalog progressively. No args -> form overview (when-to-use, bound fields, variant counts). family= -> variant one-liners. q= -> ranked search. variant=/prior_id= -> example payload. type=schema + family -> a compact family-level variant chooser (not a sendable contract); type=schema + family + variant -> that variant's exact payload contract (JSON Schema, capacity, field mapping, examples). Free. Code path: type=widgets = the add_widget() catalog (name= for its contract + thumbnail); type=helpers = python-pptx helper signatures. type=themes + an uploaded theme_id -> that template's branded FURNITURE layouts (its own cover/agenda/divider/closing slides + fill schemas + previews) — render via create_slide(form=template_layout, theme_id, data={layout, fills}).

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSemantic search across all variants; returns ranked form/variant matches with scores.
topNoMax results (with type=themes).
nameNoWidget name (with type=widgets): returns the full contract + worked example + a rendered thumbnail.
typeNoOmit for the form overview (or family=/q= to drill in). schema (+family, optionally +variant=) = schema-first discovery: family only returns a compact variant chooser; family+variant returns that variant's exact machine-readable payload contract (JSON Schema for data, capacity limits, intent-field mapping, examples). widgets = the add_widget() catalog for mode=code (name=<widget> for its contract). helpers = python-pptx helper signatures. themes = list themes (built-in + your saved); Default appears first and can be omitted, or use any returned id as theme_id. brands = your brand kits with versions (theme_id=<slug> renders the default version, <slug>@<n> pins n).
limitNoMax results (with q= or family=).
familyNo
offsetNoPagination offset (with q= or family=).
sourceNoTheme source filter (with type=themes). Default all (built-in + your saved).
variantNo
prior_idNo
theme_idNoWith type=themes: an uploaded theme's id -> its branded furniture layouts + fill schemas (render via create_slide(form=template_layout)).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the description's added transparency about result shapes per mode, the 'Free' cost signal, capacity limits, examples, thumbnails, and the explicit 'not a sendable contract' warning is strong value beyond structured data. The description also prevents misuse by clarifying that certain outputs are for chooser/discovery and not executable contracts. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but not wasteful — nearly every clause states a distinct mode or constraint, and the first sentence front-loads the core browsing behavior. That said, the heavy semicolon-separated run-on structure and shorthand such as 'bound fields' and 'FURNITURE' make parsing harder than necessary, so a bit more grouping or bolding would improve scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-optional-parameter, multi-mode discovery tool with no output schema, the description covers most combinations, expected outputs, and even the follow-up rendering path via create_slide. Minor gaps remain, such as how q interacts with family, what type=schema alone returns, and precise return shapes for search results, but these are relatively small given the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema leaves several parameters like family, variant, and prior_id without property descriptions, but the description fills those gaps with concrete mode formulas: 'family=<form> -> variant one-liners', 'variant=/prior_id= -> example payload', and 'type=schema + family + variant' for the exact machine-readable contract. It also maps the ambiguous type parameter across schema, widgets, helpers, themes, and brands, adding meaning far beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource — 'Browse the PowerPoint slide catalog progressively' — and then enumerates the different browsing surfaces (form overview, variants, search, contracts, widgets, helpers, themes). This makes the tool's purpose distinct from siblings like create_slide, plan_slide, and create_deck, which actually generate presentations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit mode-selection guidance: 'No args -> form overview', 'family=<form> -> variant one-liners', 'q=<text> -> ranked search', and it warns that 'type=schema + family' is 'not a sendable contract' while adding variant yields the exact payload contract. It also connects to a sibling for the next step: the theme results 'render via create_slide(form=template_layout, theme_id, data={layout, fills}).' It lacks an explicit global when-not-to-use statement versus alternatives, but the context is otherwise strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_deckCreate Multi-Slide DeckAInspect

Create a complete PowerPoint presentation (.pptx): a whole multi-slide deck, native and editable, in one call. slides is a list of create_slide intents (same form menu + data shapes — see create_slide). Slides fill in parallel and merge into one themed PPTX with page numbers. Include furniture: a hero_statement cover, section_divider breaks, and a closing (hero_statement variant=contact_closing via blocks-free slots).

BLOCKED ($0)? If an error has can_autofix:true, merge its patch into the args at patch_target. Unchanged retries repeat the block. New form: browse_catalog(type=schema) first.

Also: mode=assemble merges existing slide job_ids as-rendered (free; theme_id does NOT re-theme them — render with create_deck(slides=[…], theme_id=…) for a unified theme); mode=fork clones a deck (free). Polling: deck_id == job_id — manage_account(action=job, job_id=<deck_id>).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDefault render. assemble/fork are free deck plumbing.
nameNo
titleNoDeck title (PowerPoint metadata)
slidesNoeach item is a create_slide intent (same form menu, typed fields, and data shapes as create_slide).
deck_idNoExisting deck ID (for mode=fork, or mode=render to update)
dry_runNoDeck-level free pre-flight (cost:0, NO render/PPTX): returns a per-slide validation manifest [{i, form, fidelity_forecast, status, errors}] so you can fix bad slides before spending. A deck is one artifact, so validation is all-or-nothing — put dry_run here, not on individual slides. Resend without dry_run to render.
imageryNoDeck-level imagery mode, inherited by every slide (a slide-level imagery wins). See create_slide.imagery.
job_idsNoSlide job IDs to merge (for mode=assemble)
logo_idNoOptional brand logo (from upload_asset purpose=logo) applied as chrome to every content slide in the deck.
stylingNoDeck-level topical-design switch, inherited by every slide (a slide-level styling wins). See create_slide.styling.
languageNoTarget language
theme_idNo
directionNoDeck-level writing direction, inherited by every slide (a slide-level direction wins) — set it once for an Arabic/Hebrew deck. Covers/dividers rendered on an UPLOADED brand template keep that template's own layout direction. See create_slide.direction.
imagery_tagNoDeck-level subject declaration, inherited by every slide (a slide-level imagery_tag wins). Declare it once for a whole deck. See create_slide.imagery_tag.
force_renderNoIGNORED (deck-level). pptx_url is always returned when at least one slide rendered, so there is nothing to force. Still meaningful on create_slide.
allow_partialNoIGNORED. A deck bills per rendered slide and always returns its pptx; slides that failed or rendered badly are free and named in repair_actions.
strict_policyNoOptional CI-style gate for automated report pipelines. dry_run returns policy_result; render returns rejected/cost:0 if the policy fails.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations: it discloses parallel slide rendering and merge behavior, furniture expectations, dry_run pre-flight with no render/cost, free modes, billing per rendered slide, ignored parameters (force_render/allow_partial), strict_policy rejection behavior, and deck_id==job_id polling. It also explains can_autofix patch recovery, which is behavior not visible from the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and packs useful information efficiently, with semicolon-joined clauses and clear paragraph breaks. It is dense and somewhat sprawling toward the end ('Also:', 'Polling:'), but for a 17-parameter deck-builder tool the detail is largely earned.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description covers the critical output behaviors: pptx_url always returned, dry_run validation manifest, policy failure returning rejected/cost:0, and deck_id==job_id for polling. It does not give a full response shape or explicit worked example, but what an agent needs to invoke and monitor the call correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 88% schema coverage, the schema already carries the baseline, and the description adds value on top: it explains that slides are create_slide intents, that assemble/fork have free/no-retheme semantics, and that deck-level parameters inherit with slide-level wins. It doesn't fully document every parameter (e.g., title, theme_id), but it meaningfully enriches the high-leverage ones.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Create a complete PowerPoint presentation (.pptx): a whole multi-slide deck, native and editable, in one call.' It differentiates from create_slide by emphasizing multi-slide and one-call deck construction, and further clarifies what the deck includes (cover, dividers, closing, page numbers).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete mode guidance: render vs mode=assemble (merge job_ids as-rendered, theme_id does not re-theme) vs mode=fork, and points to manage_account for polling and browse_catalog for blocked new forms. It does not explicitly state when to prefer create_slide or plan_slide, though the 'multi-slide deck' framing implies the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_slideCreate or Inspect a SlideAInspect

Create one PowerPoint slide (.pptx, native, editable) from a structured intent in ONE call: pick a form from the menu and put your content in the typed fields (placed on the slide as given), or pass a brief and let the server route it. Fields tagged (per-form) bind only where the form has that slot — ignored-with-warning elsewhere; see each form's binds in browse_catalog.

BLOCKED ($0)? If an error has can_autofix:true, merge its patch into the args at patch_target. Unchanged retries repeat the block. New form: browse_catalog(type=schema) first.

FORM MENU: agenda_list: an ordered list of sections/topics or learning objectives to walk through bar_rank_chart: bars comparing magnitudes across categories calendar_grid: events on a real calendar - week planner (day x hour) or month grid with event chips (data.events) card_grid: several equal, unordered peer blocks (features, options, pillars, a concept's defined parts, rules/guidelines/common mistakes) case_story: one named story told as evidence: challenge, action, measured result comparison_matrix: options x criteria grid: data.columns x data.rows cycle_flow: a closed loop of ordered stages where the last feeds the first (recurring process) data_table: a plain factual table of records by fields editorial_split: two side-by-side halves: contrast (before/after, problem/solution) or copy/numbered steps beside a picture (image_src) exercise_prompt: an exercise/practice/discussion prompt: instruction + hints; optional problem items with blank answer boxes funnel: a quantity narrowing through ordered stages gantt_plan: tasks as bars across named periods on a schedule grid gauge_score: one score on a dial against a scale hero_statement: a statement slide: covers (typographic/image/exec), from->to/thesis-quote transitions, statement/contact/next-steps closings; supporting points -> takeaway_stack, contacts -> data.contacts, next steps -> data.next_steps hub_spoke: one central element with several elements connected around it image_story: a picture shown WHOLE (uncropped) + prose, or a 1-6 picture/placeholder gallery (data.images); points beside a picture -> editorial_split kpi_metrics: a metrics dashboard: headline metric cards; data.sections (Highlights/Risks/Asks) makes it an exec summary / QBR snapshot layer_stack: stacked layers where higher sits on, and depends on, lower linear_flow: ordered process stages read left to right (or inputs to process to outputs) maturity_staircase: ascending levels climbing to a higher state nested_magnitude: nested containment - each level contains the next org_structure: a reporting hierarchy / org tree position_map: items placed by two axes - named 2x2 cells or scatter positions pyramid_hierarchy: a triangle of stacked tiers, foundation to apex ramp_curve: a continuous rising wedge split into phases - effort or value accumulating over time section_divider: a section-break: big section number + title; blocks = agenda progress chips (emphasis=primary = current) segment_wheel: a wheel of equal segments around a center - peer categories in the round (composition, not flow) status_dashboard: initiatives/workstreams tracked by status, owner, progress strategic_fork: one origin splitting into two mutually exclusive paths, one recommended swimlane_flow: actor/function lanes by phases, task cells, handoffs across lanes swot: the four-quadrant strengths / weaknesses / opportunities / threats grid system_flow_map: architecture/system components: panels with internals (edges optional) or nodes wired by directed arrows takeaway_stack: a title plus a few supporting points, each with one line of detail (executive summary, key findings); optional closing ask timeline_roadmap: milestones/phases laid out along a time axis trend_chart: one or more series plotted over time value_chain: support bands over primary activity columns flowing into a goal arrowhead (data.support = the bands) visual_showcase: one dominant screenshot/image with numbered callouts pointing into it waterfall_bridge: a start value bridged to an end value by plus/minus contributions

Exact per-form data shapes: browse_catalog(type=schema, family=) — the generated,always-current JSON Schema + a worked example. (List-shaped forms take blocks: [{"label","sub","detail":[str],"emphasis"}]; structured forms take typed data.)

Escape modes: mode=code (caller-supplied python-pptx in sandbox, $0.05 — use for forms the menu cannot express: calendars, custom diagrams); mode=status (poll a job, free). Image-led asks (photo covers, full-bleed visuals): hero_statement + image_prompt (+$0.05) or image_src.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoPython code defining build(prs). Canvas 13.33×7.5", coords in inches. Pre-imported: Presentation, Inches, Pt, Emu, RGBColor, MSO_ANCHOR, PP_ALIGN. Helpers: add_text_box(slide, left, top, w, h, text, font_size=12, bold=False, color=None), add_box(slide, left, top, w, h, fill_color=None, line_color=None, corner_radius=0.05), add_icon, add_image (src = path or https://); theme_color(name) → RGBColor. add_widget(slide, name, x, y, w, h, params=|content=, theme=THEME) draws board-grade SSG widgets/charts (cards, waterfall, gantt, funnel…) — names via `browse_catalog(type=widgets)`. Use font_size=, not size=; use fill_color=, not fill=. When chrome is supplied, use `build(prs, slide)` — chrome is pre-rendered. Helper signatures: `browse_catalog(type=helpers)`.
dataNofamily-specific payload — see the documented shapes
dateNodate callout (per-form).
formNothe form menu pick (see description) — the routing field
modeNoDefault: structured intent / brief. safe = validate-then-render in ONE call (renders + bills only if faithful; else $0 invalid report with the fix — recommended, no dry_run round-trip). code = python-pptx escape. status = poll.
nameNo
waitNoAI-image slides block ~10-15s; `false` returns a job_id to poll, not block (mode=brief).
briefNoprose fallback / extra context for fills
blocksNolist: [{"label","sub","detail":[str],"emphasis","icon":lucide-name,"metric":{value,label}}]
detailNoResponse verbosity. Default `compact`: status, form/variant, fidelity (verbatim|mixed|ai_completed), warnings[]/errors[] (only when present), urls, cost. `full` adds a debug object (engine internals, verify events, latency buckets).
job_idNoPrevious job ID (for mode=status, or mode=code patching)
metricNo
verifyNomode=code tier. Default `lint`: static geometry linter (overlap/off-canvas/zero-size) + composer content validators — no LLM. `lint+vlm` adds a VLM second-look (~+3s) and makes a blank/contentless render a $0 error, not a billed warning. `off` skips checks.
cautionNoone-line risk / caveat callout (per-form).
contextNoone-line subtitle/standfirst
dry_runNoFree pre-commit check (intent or mode=code), cost:0, no PPTX: status + warnings/errors, plus fidelity_forecast (verbatim|mixed|ai_completed|would_reject) and which fields bind vs get authored. Fix errors, re-call with dry_run=false to render.
imageryNoCover/section-divider imagery: photo (default — curated stock photo, half-bleed), wash (abstract color wash), off (typographic only). Content slides are never photo-decorated.
logo_idNoOptional brand logo (from upload_asset purpose=logo) drawn as chrome on content slides; covers/section breaks stay clean.
stylingNoTopical design on default themes (default on; the note names it): designed cover + a subject palette (from imagery_tag, or the brief). clean = neutral. Pins never take it.
subjectNocentral entity for forms that have one — hub label, org root, section #, fork origin, media label (per-form).
variantNopin a specific variant within the form (list them via browse_catalog). Unknown variant -> rejected ($0) with the valid list; set allow_variant_fallback to render the family default instead.
headlineNothe assertion-style slide title
languageNoTarget language (default: en)
takeawayNooptional verdict band (per-form). Put the so-what in the headline; add only for a verdict the title can't carry — not every slide.
theme_idNoOptional theme id from browse_catalog(type=themes). Omit for Default (slideforge_standard).
directionNortl typesets AND mirrors the slide right-to-left (Arabic/Hebrew). Never inferred — pass it.
highlightNoone-line emphasis callout (per-form).
image_srcNohttps URL | asset:<id> for image-bearing forms
imagery_tagNoSubject/industry: steers cover/section photos AND the topical palette. Omit = general; `education` = teaching.
min_font_ptNoBinding type floor for prose (exhibit furniture has its own). Type grows to meet it; content that can't fit is a $0 min_font_not_met naming the size needed. Typical: 12.
source_noteNosource / footnote line (per-form).
force_renderNoOn completed_with_errors, pptx_url is null (broken slide). Set true to get it anyway. No cost/status effect.
image_promptNogenerate an image when no image_src (+$0.05)
replacementsNoString replacements on loaded code [{old, new}] (for mode=code with job_id)
variant_policyNoRouted-variant maturity policy: production_safe = if the ROUTED variant is draft/beta, render the family's demo-safe sibling instead (warning names both). Never overrides an explicit variant=. Default best_semantic_match.
include_previewNoInline-preview PAYLOAD only (not execution). Default: default (768px). none omits the inline image and returns just the URLs — it does NOT change sync/async. Use `wait` to control execution.
quality_profileNoThresholds layout.presentation_ready is judged against (executive strictest). Measurement only — never blocks a render or changes cost.
allow_truncationNoMore items than the form holds blocks (it would drop your data); the response names the dropped count + a suggested_split. true renders the capacity subset (fidelity=verbatim_truncated). Default false.
form_descriptionNo
allow_fabricationNoBrief mode only: a bare brief on a DATA form (kpi/funnel/comparison/…) returns would_fabricate at $0 rather than INVENT numbers. Send typed fields for verbatim, or true to let the brief author them (fidelity=ai_completed). Default false.
allow_low_confidenceNoBrief routing only: by default a brief that doesn't match a form clearly returns status=needs_confirmation + candidates at cost:0 (no guessed render). Set true to render the top guess and bill it. Default false.
allow_variant_fallbackNoIf the pinned variant is unknown, render the form's default variant (with a warning) instead of rejecting. Default false.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses cost and failure behavior in detail: $0 blocked/invalid renders, can_autofix patch merging, unchanged retries blocking, safe-mode billing only when faithful, mode=code and image-generation surcharges, and allow_truncation/force_render consequences. Since annotations only signal non-readonly/non-destructive behavior, all of this is highly additive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the tool has 42 parameters and a large form menu, so the length is largely justified. It is well-structured with headings, a compact form menu, and front-loaded purpose; minor redundancy with schema-level mode/block descriptions prevents a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the full decision space: form routing, per-form schema access, failure and billing behavior, escape modes, retry semantics, polling, and response verbosity controls. Despite there being no output schema, the description and detail parameter together give agents enough context to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 93%, so the baseline is 3, but the description adds genuinely valuable semantics: it defines every form menu option, explains list-shaped forms vs structured data payloads, and points to browse_catalog for exact per-form schemas. It also clarifies the tradeoffs between safe and brief modes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence is explicit: 'Create one PowerPoint slide (.pptx, native, editable) from a structured intent in ONE call'. The large form menu and the safe/brief/code/status modes make the tool's scope unmistakable and distinguish it from deck-level or planning siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear routing guidance: use browse_catalog for schemas, use mode=code for forms the menu cannot express, use mode=status to poll, and use dry_run for a free pre-commit check. It does not explicitly contrast with create_deck or plan_slide, but the single-slide scope and form routing make the intended use clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_accountAccount & HistoryA
Destructive
Inspect

SlideForge account for PowerPoint generation: balance, billing, job history, feedback, data controls. All free. Actions: status (balance+plan), usage (spend breakdown), jobs (history), job (single job detail — slide jobs include quality_warnings[]; deck jobs add slides_completed/slides_failed/failed_slides[]), feedback (submit), feedback_list (read your reports back: status + resolution), onboarding (capabilities overview), topup (Stripe checkout link; wallet credits automatically), webhooks/webhook_add/webhook_remove/webhook_test (push endpoint instead of polling to terminal), download_url (fresh short-TTL PPTX link for an owned job — when a result carries no inline URL), security_status (retention + access-model + deletion posture), delete_job (irreversible: job + versions + files) Action delete_asset irreversibly deletes a user-owned uploaded/generated image asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoHTTPS endpoint to receive events (for action=webhook_add). Must be public HTTPS (private/loopback rejected).
daysNoLookback period (for action=usage, default 30)
slugNoReport slug (for action=reports — returns one report's full metadata; omit to list all).
limitNoMax rows (action=jobs default 10; action=feedback_list default 50, max 100)
actionYesOperation (required). feedback → report a defect or request against a render; pass job_id so it is actionable, and ask the user before filing. feedback_list → read YOUR OWN filed reports back, with `status` and the `resolution` written when one was acted on: check it before working around a defect you reported earlier, because it may already be fixed. brand_report → the per-token fidelity report for one of your brand kits (pass theme_id). topup → mints a Stripe checkout link the user pays at directly (wallet credits automatically) — use when a render is refused for balance. reports → list report types; webhook_add registers a push endpoint instead of polling — see the url/events props. delete_job is irreversible. delete_asset is irreversible for user-owned image assets.
amountNoUSD top-up amount (for action=topup, default 10, min 10, max 1000). Volume bonus: $50→+10%, $100→+15%, $200→+20%.
detailNoFor action=status only: default false masks identity fields; true returns full email/user_id diagnostics for the authenticated user.
eventsNoEvent types to subscribe to (for action=webhook_add; default all): job.completed, job.failed, deck.completed, deck.partial, deck.failed.
job_idNoJob ID (for action=job, action=download_url and action=delete_job)
statusNoFilter — action=jobs: queued/generating/complete/failed; action=feedback_list: open/resolved
messageNoWhat went wrong or what you want, in the user's own words (for action=feedback).
asset_idNoImage asset ID (for action=delete_asset). Logos are content-addressed/shared and are not deleted by this action.
categoryNoFeedback category (action=feedback to file under it, action=feedback_list to filter by it). The first nine are slide-quality categories — pair them with job_id.
severityNoFor action=feedback: `bug` = it is broken, `quality` = it rendered but reads poorly, `suggestion` = a request. Defaults to suggestion, so file real defects explicitly or they are triaged as wishes.
webhook_idNoWebhook subscription id (for action=webhook_remove / webhook_test).
include_previewNoPreview (for action=job)
include_childrenNoFor action=jobs: include deck child slides (each carries parent_deck_id) so a deck's slides are discoverable by listing. Default false (parents only). Deck rows roll child cost up to the deck.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing irreversibility of delete_job and delete_asset, automatic wallet credit on topup, volume bonuses, the fact that logos are content-addressed/shared and not deleted, and the severity default to 'suggestion'. These are genuinely useful behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with an action inventory before detailed explanations. Given 18 actions and 17 parameters, the length is largely justified. There is some redundancy where the action parameter description repeats parts of the initial inventory, but it remains scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers most actions and destructive semantics thoroughly, but the missing theme_id parameter for brand_report and the conflicting reports action description are real invocation hazards. Several actions such as onboarding, webhook_test, and security_status lack expected behavior or return detail, and with no output schema the description must carry more weight than it does.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics: amount volume bonuses, detail masking identity fields, include_children cost roll-up, and severity defaulting. However, it loses a point because action=brand_report tells the agent to pass theme_id, yet theme_id is not present in the schema, and reports behavior is described inconsistently between the action summary and the slug parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names the exact domain ('SlideForge account for PowerPoint generation: balance, billing, job history, feedback, data controls') and the action list enumerates the operations in detail. This clearly differentiates the tool from sibling tools like create_slide, create_deck, and upload_asset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit selection guidance: use topup when a render is refused for balance, use webhooks instead of polling, use download_url when a result carries no inline URL, and check feedback_list before working around a previously reported defect. It also instructs the agent to ask the user before filing feedback.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_slidePlan a Slide - Form + Variant CandidatesA
Read-onlyIdempotent
Inspect

Plan a PowerPoint slide before rendering (free): send a short brief, get ranked candidates + a separated verdict — route (which slide: selected|needs_confirmation|ambiguous), input (can it render: ready|extractable_from_brief|needs_structured_data) and next_action. Free (one embedding). Then call create_slide with the chosen form(+variant). route.confidence: calibrated = measured P(route correct) with label high/medium/low cut on it; retrieval_score/retrieval_margin = the raw family-aggregated classifier values (not probabilities; margin can be negative when families contest); source = classifier | structural_router (LLM-rescued). candidate_margin on the top candidate = literal gap between the two shown scores.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo
briefYes
escalateNoDefault true: on a low-confidence route the plan runs the SAME LLM rescue create_slide would (small COGS on that tail only), so plan and create always agree. Set false for a classifier-only, fully free plan (response then flags will_escalate + create_slide_behavior).
variant_policyNoproduction_safe: if the top routed variant is draft/beta, the family's demo-safe sibling leads and route reports both best_semantic and best_production_safe.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior, but the description adds substantial extra context: free one-embedding cost, escalation behavior, calibrated confidence semantics, negative margin meaning, and source distinction. This goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then covers detailed response semantics that are necessary because no output schema exists. It is dense but not padded; the parentheticals are efficient rather than wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description thoroughly explains the returned verdict fields, confidence, retrieval scores, and next steps, compensating for the missing output schema. However, the 'top' parameter remains undocumented and the shape of the candidate ranking is only implied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema documents escalate and variant_policy, but the description does not explain the 'top' parameter at all, and only vaguely references 'a short brief.' With only 50% schema description coverage, the missing 'top' semantics is a meaningful gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: plan a PowerPoint slide before rendering, returning ranked candidates plus a verdict. It explicitly hooks into create_slide for the actual creation step, which differentiates it from the sibling tool create_slide.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use this tool before rendering, it is free, and then call create_slide with the chosen form/variant. It does not exhaustively list when not to use the other siblings, but the workflow guidance is strong and unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

translate_deckTranslate PPTXAInspect

Translate a PowerPoint (.pptx) deck preserving all formatting. $0.02/slide. Supports 32 languages (Latin, Cyrillic, Greek scripts). Provide job_id (from a previous create_slide/create_deck), pptx_url, or pptx_base64.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoJob name
job_idNoSource: previous slide/deck job ID (preferred — no file transfer needed)
pptx_urlNoSource: HTTPS URL to .pptx
pptx_base64NoSource: Base64-encoded .pptx (max ~10 MB)
concise_modeNoPrefer shorter translations for tight text boxes
include_notesNoTranslate speaker notes (default false)
include_tablesNoTranslate table cells (default true)
include_previewNoWait+embed preview (default=wait)
source_languageNoSource language or 'auto' (default auto)
target_languageYesTarget language (required)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false and carry no operational meaning, so the description bears the burden. It adds non-obvious behavioral facts: the '$0.02/slide' cost, the formatting-preservation guarantee, and the 32-language/script scope. It does not disclose what is returned or whether a new job is created, which is the main gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler: purpose+guarantee, cost+language scope, and input routes. The most important information is front-loaded in the first clause, and every sentence adds a distinct fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter paid tool with no output schema, the description covers the critical invocation facts: purpose, cost, language scope, and the three mutually exclusive input methods. The notable omission is result semantics — what the agent receives after translation — which matters because there is no output schema to fill that gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so per baseline this is a 3. The description's one contribution — framing job_id/pptx_url/pptx_base64 as three alternative source routes — largely restates what the schema already says ('preferred — no file transfer needed'). No additional meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Translate a PowerPoint (.pptx) deck'. The qualifier 'preserving all formatting' adds precision, and translation is clearly distinct from the sibling tools (create_slide/create_deck build decks, upload_asset uploads, plan_slide plans, browse_catalog browses). An agent can identify what this tool does instantly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage context: the source must come from 'a previous create_slide/create_deck' job, an HTTPS URL, or base64 — with the workflow implication that translation happens after deck creation. It lacks an explicit when-not-to-use statement naming an alternative, hence not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_assetUpload or Generate AssetAInspect

Upload assets for PowerPoint (.pptx) generation: company template, logo, image, or document — or AI-generate an image.

Purposes: • logo — company logo for chrome (PNG/JPG/SVG, max 5MB) → logo_id • image — image for the Image component (max 10MB) → asset_id • theme — company template PPTX → theme_id; slides with it render NATIVELY on the template (masters/layouts/chrome) • generate_image — AI-generate via prompt → asset_id ($0.05) • translate — PPTX to translate → deck job_id ($0.02/slide; requires target_language) • pdf — PDF → editable slides; pass target_language to also translate • recreate — image OF a slide → editable PPTX slide ($0.10; honest annotate/preserve fallback, refusals free). Use image to just place a picture

Files >3MB (pdf/translate/theme) — and recreate on chat hosts — omit data: a drop-zone appears in the result card; bytes never pass through the agent.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoBase64-encoded file content. Required for logo/image/theme/translate. Optional for pdf — omit to get a drop-zone (recommended for files >3MB).
sizeNoImage dimensions for generate_image (default 1024×1024)
modelNoExplicit gateway model ID. Overrides `quality`.
promptNoImage description (required when purpose=generate_image)
purposeYesAsset type (required). brand = a .pptx/.potx corporate template imported as your brand kit (theme is the same thing under its old name).
qualityNodraft = Flux Schnell. balanced (default) = Gemini Flash Image. premium = Imagen 4 Fast. Overridden by `model`.
filenameNoOriginal filename (for type detection)
positionNoLogo position: top-left / top-right / bottom-left / bottom-right
theme_nameNoName for extracted theme (purpose=theme)
target_languageNoRequired for purpose=translate. Optional for purpose=pdf — chains pdf→pptx→translate in one call.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only signal that this is not read-only, not idempotent, and not destructive. The description goes far beyond that by disclosing prices, native template rendering, the drop-zone fallback ('bytes never pass through the agent'), and the recreate fallback behavior with free refusals.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but extremely well-structured: a one-sentence summary followed by purpose bullets, each containing only unique facts (ID returned, cost, size limit, fallback behavior). There is no fluff or repeated information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

All eight purposes are explained with their required parameters, return IDs, costs, and edge-case handling. With no output schema, the description still prepares the agent for what each call yields (logo_id, asset_id, theme_id, deck job_id), making it complete enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds critical meaning not in the schema: size limits (logo 5MB, image 10MB), per-purpose costs, the effect of omitting data for pdf/translate/theme, and the brand/theme alias. This is exactly the kind of parameter context an agent needs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb ('Upload assets... or AI-generate an image') and resource ('assets for PowerPoint (.pptx) generation'), then breaks down eight distinct purposes. This makes it unmistakable that this tool is the asset-ingestion/generation entry point, and none of the sibling tools handle this scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The bullet list acts as a decision table: each purpose explains when to use it, what it returns, and any special requirements (e.g., target_language for translate). It also gives direct routing advice like 'Use image to just place a picture' for recreate, and recommends omitting data for files >3MB to trigger a drop-zone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv5.9.0
    • Changedbrowse_catalog1 field changed
      • changedInput schema / properties / type / description
        Previous value: -"Omit for the form overview (or family=/q= to drill in). schema (+family, optionally +variant=) = schema-first discovery: family only returns a compact variant chooser; family+variant returns that variant's exact machine-readable payload contract (JSON Schema for data, capacity limits, intent-field mapping, examples). widgets = the add_widget() catalog for mode=code (name=<widget> for its contract). helpers = python-pptx helper signatures. themes = list themes (built-in + your saved); Default appears first and can be omitted, or use any returned id as theme_id."New value: +"Omit for the form overview (or family=/q= to drill in). schema (+family, optionally +variant=) = schema-first discovery: family only returns a compact variant chooser; family+variant returns that variant's exact machine-readable payload contract (JSON Schema for data, capacity limits, intent-field mapping, examples). widgets = the add_widget() catalog for mode=code (name=<widget> for its contract). helpers = python-pptx helper signatures. themes = list themes (built-in + your saved); Default appears first and can be omitted, or use any returned id as theme_id. brands = your brand kits with versions (theme_id=<slug> renders the default version, <slug>@<n> pins n)."
    • Changedcreate_deck6 fields changed
      • changedInput schema / properties / allow_partial / description
        Previous value: -"Non-regret default: if any slide fails, the deck is NOT billed (cost:0) and pptx withheld — the response carries repair_actions (assemble the completed children, free). Set true to render + bill the completed slides and get the partial deck. Default false."New value: +"IGNORED. A deck bills per rendered slide and always returns its pptx; slides that failed or rendered badly are free and named in repair_actions."
      • addedInput schema / properties / direction
        Added value: +{
        +  "description": "Deck-level writing direction, inherited by every slide (a slide-level direction wins) — set it once for an Arabic/Hebrew deck. Covers/dividers rendered on an UPLOADED brand template keep that template's own layout direction. See create_slide.direction.",
        +  "enum": [
        +    "ltr",
        +    "rtl"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / force_render / description
        Previous value: -"If any slide is completed_with_errors, deck pptx_url is null. Set true to get it anyway; complete slides stay downloadable via their per-slide job_id either way. No cost/status effect."New value: +"IGNORED (deck-level). pptx_url is always returned when at least one slide rendered, so there is nothing to force. Still meaningful on create_slide."
      • addedInput schema / properties / imagery
        Added value: +{
        +  "description": "Deck-level imagery mode, inherited by every slide (a slide-level imagery wins). See create_slide.imagery.",
        +  "enum": [
        +    "photo",
        +    "wash",
        +    "off"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / imagery_tag
        Added value: +{
        +  "description": "Deck-level subject declaration, inherited by every slide (a slide-level imagery_tag wins). Declare it once for a whole deck. See create_slide.imagery_tag.",
        +  "enum": [
        +    "general",
        +    "agriculture",
        +    "construction",
        +    "education",
        +    "energy",
        +    "finance",
        +    "government",
        +    "healthcare",
        +    "logistics",
        +    "manufacturing",
        +    "retail",
        +    "technology",
        +    "travel"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en",
        -  "de",
        -  "fr",
        -  "es",
        -  "it",
        -  "pt",
        -  "nl",
        -  "pl"
        -]New value: +[
        +  "en",
        +  "de",
        +  "fr",
        +  "es",
        +  "it",
        +  "pt",
        +  "nl",
        +  "pl",
        +  "ru",
        +  "uk"
        +]
    • Changedcreate_slide7 fields changed
      • changedInput schema / properties / allow_fabrication / description
        Previous value: -"Brief mode only: by default a bare brief on a DATA form (kpi/funnel/comparison/…) returns status=would_fabricate at cost:0 rather than INVENT the numbers/entities. Supply the data as typed fields to render verbatim, or set true to let the brief author them (fidelity=ai_completed). Default false."New value: +"Brief mode only: a bare brief on a DATA form (kpi/funnel/comparison/…) returns would_fabricate at $0 rather than INVENT numbers. Send typed fields for verbatim, or true to let the brief author them (fidelity=ai_completed). Default false."
      • changedInput schema / properties / allow_truncation / description
        Previous value: -"By default, supplying MORE items than a form holds is a blocking error (it would drop your data) — the response names the dropped count + a suggested_split. Set true to render the capacity subset anyway (fidelity=verbatim_truncated, never verbatim). Default false."New value: +"More items than the form holds blocks (it would drop your data); the response names the dropped count + a suggested_split. true renders the capacity subset (fidelity=verbatim_truncated). Default false."
      • addedInput schema / properties / direction
        Added value: +{
        +  "description": "rtl typesets AND mirrors the slide right-to-left (Arabic/Hebrew). Never inferred — pass it.",
        +  "enum": [
        +    "ltr",
        +    "rtl"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / imagery_tag / description
        Previous value: -"Industry bucket for cover/section photos. Omit for the general pool."New value: +"Subject/industry: steers cover/section photos AND the topical palette. Omit = general; `education` = teaching."
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en",
        -  "de",
        -  "fr",
        -  "es",
        -  "it",
        -  "pt",
        -  "nl",
        -  "pl"
        -]New value: +[
        +  "en",
        +  "de",
        +  "fr",
        +  "es",
        +  "it",
        +  "pt",
        +  "nl",
        +  "pl",
        +  "ru",
        +  "uk"
        +]
      • changedInput schema / properties / min_font_pt / description
        Previous value: -"Binding type floor for prose (exhibit furniture has its own). Type grows to meet it; content that can't fit is a $0 min_font_not_met naming the size needed — allow_truncation renders the fitting subset. Typical: 12."New value: +"Binding type floor for prose (exhibit furniture has its own). Type grows to meet it; content that can't fit is a $0 min_font_not_met naming the size needed. Typical: 12."
      • changedInput schema / properties / styling / description
        Previous value: -"Subject-informed palette + designed cover on default themes (on by default; the design note names the choice). clean = neutral look. Pinned themes never take it."New value: +"Topical design on default themes (default on; the note names it): designed cover + a subject palette (from imagery_tag, or the brief). clean = neutral. Pins never take it."
    • Changedmanage_account9 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Operation (required). reports → list report types; webhook_add registers a push endpoint instead of polling — see the url/events props. delete_job is irreversible. delete_asset is irreversible for user-owned image assets."New value: +"Operation (required). feedback → report a defect or request against a render; pass job_id so it is actionable, and ask the user before filing. feedback_list → read YOUR OWN filed reports back, with `status` and the `resolution` written when one was acted on: check it before working around a defect you reported earlier, because it may already be fixed. brand_report → the per-token fidelity report for one of your brand kits (pass theme_id). topup → mints a Stripe checkout link the user pays at directly (wallet credits automatically) — use when a render is refused for balance. reports → list report types; webhook_add registers a push endpoint instead of polling — see the url/events props. delete_job is irreversible. delete_asset is irreversible for user-owned image assets."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "status",
        -  "usage",
        -  "jobs",
        -  "job",
        -  "download_url",
        -  "feedback",
        -  "onboarding",
        -  "reports",
        -  "webhooks",
        -  "webhook_add",
        -  "webhook_remove",
        -  "webhook_test",
        -  "security_status",
        -  "delete_job",
        -  "delete_asset"
        -]New value: +[
        +  "status",
        +  "usage",
        +  "jobs",
        +  "job",
        +  "download_url",
        +  "feedback",
        +  "feedback_list",
        +  "onboarding",
        +  "topup",
        +  "brand_report",
        +  "reports",
        +  "webhooks",
        +  "webhook_add",
        +  "webhook_remove",
        +  "webhook_test",
        +  "security_status",
        +  "delete_job",
        +  "delete_asset"
        +]
      • addedInput schema / properties / amount
        Added value: +{
        +  "description": "USD top-up amount (for action=topup, default 10, min 10, max 1000). Volume bonus: $50→+10%, $100→+15%, $200→+20%.",
        +  "type": "number"
        +}
      • changedInput schema / properties / category / description
        Previous value: -"Feedback category (for action=feedback): bug/feature_request/quality/general"New value: +"Feedback category (action=feedback to file under it, action=feedback_list to filter by it). The first nine are slide-quality categories — pair them with job_id."
      • addedInput schema / properties / category / enum
        Added value: +[
        +  "layout",
        +  "typography",
        +  "contrast",
        +  "content",
        +  "icons",
        +  "images",
        +  "theme",
        +  "chrome",
        +  "consistency",
        +  "bug",
        +  "feature_request",
        +  "testimonial",
        +  "general",
        +  "other"
        +]
      • changedInput schema / properties / limit / description
        Previous value: -"Max jobs (for action=jobs, default 10)"New value: +"Max rows (action=jobs default 10; action=feedback_list default 50, max 100)"
      • changedInput schema / properties / message / description
        Previous value: -"Feedback text (for action=feedback)"New value: +"What went wrong or what you want, in the user's own words (for action=feedback)."
      • addedInput schema / properties / severity
        Added value: +{
        +  "description": "For action=feedback: `bug` = it is broken, `quality` = it rendered but reads poorly, `suggestion` = a request. Defaults to suggestion, so file real defects explicitly or they are triaged as wishes.",
        +  "enum": [
        +    "bug",
        +    "quality",
        +    "suggestion"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / status / description
        Previous value: -"Filter (for action=jobs): queued/generating/complete/failed"New value: +"Filter — action=jobs: queued/generating/complete/failed; action=feedback_list: open/resolved"
    • Changedupload_asset2 fields changed
      • changedInput schema / properties / purpose / description
        Previous value: -"Asset type (required)"New value: +"Asset type (required). brand = a .pptx/.potx corporate template imported as your brand kit (theme is the same thing under its old name)."
      • changedInput schema / properties / purpose / enum
        Previous value: -[
        -  "logo",
        -  "image",
        -  "theme",
        -  "generate_image",
        -  "translate",
        -  "pdf"
        -]New value: +[
        +  "logo",
        +  "image",
        +  "theme",
        +  "brand",
        +  "generate_image",
        +  "translate",
        +  "pdf",
        +  "recreate"
        +]
  2. 7 tool updatesv5.5.4
    • First observedbrowse_catalog
    • First observedcreate_deck
    • First observedcreate_slide
    • First observedmanage_account
    • First observedplan_slide
    • First observedtranslate_deck
    • First observedupload_asset

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct role: catalog exploration, slide planning, single-slide rendering, deck rendering, translation, asset upload, and account management. There is no meaningful overlap that would mislead an agent into picking the wrong tool.

Naming Consistency5/5

All tool names follow the same verb_noun snake_case pattern: browse_catalog, plan_slide, create_slide, create_deck, translate_deck, upload_asset, manage_account. The naming is uniform and predictable.

Tool Count5/5

Seven tools is well-scoped for a PowerPoint generation server. Each tool covers a necessary and distinct part of the workflow without redundancy or bloat.

Completeness4/5

The surface covers the full creation lifecycle: planning, single-slide generation, multi-slide decks, translation, asset ingestion, and account/job management. Minor gaps like no dedicated asset-listing tool or in-place deck editing exist, but agents can work around them via manage_account and browse_catalog.

Maintenance

ActivitySlowing
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers