0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GenUにPowerPoint生成MCP「Spec-Driven Presentation Maker」を連携してコケまくった話

0
Posted at

はじめに

本記事はGenUのAgent BuilderにSpec-Driven Presentation Makerを連携するときにハマった内容をまとめた記事です。
現状では公式手順docs/ja/add-to-gateway.mdだけではうまく動作せず、Claude Codeにログ等を解析してもらって追加で対応した内容を記載していきます。

本記事は個人検証の結果です。検証時点(2026-06)の情報であり、公式リポジトリの更新で解消されている可能性があります。最新情報は各公式リポジトリを参照してください。

公式情報

Spec-Driven Presentation Maker(SDPM)とは

Spec-Driven Presentation Maker(通称:SDPM)とはAWSが公開しているオープンソースのプレゼンテーション作成ツールです。
最近よく耳にする仕様駆動開発の考え方をプレゼンテーション資料の作成に採用しています。
AIと対話する形式で作成を進めていき、次の3フェーズで資料の設計を行います。

  1. ブリーフィング:聞き手は誰か、何を伝えたいか、聞き手にどうなってほしいかを定義
  2. アウトライン:1スライド1メッセージの原則で、各スライドが答えるべき疑問と、その答えを定義
  3. アートディレクション:色使い、フォント、ビジュアルの方向性を定義

4つのレイヤーがある

SDPMは4つのレイヤーが用意されており、用途に応じて最小限のリソースのみで構築が可能です。

レイヤー ユースケース AWSアカウント
Layer 1:Skill(Engine) Kiro CLIで個人利用 不要
Layer 2:ローカルMCPサーバー ローカル MCP(Claude Desktop、VS Code、Kiro) 不要
Layer 3:リモートMCPサーバー チームデプロイ 必要
Layer 4:Agent+ WebUI フルスタック(Web UI + チャット) 必要

GenUの連携にはLayer 2までが必要です。
SDPMをLayer 4Layer 3で構築していてもLayer 2までの部分が使われるようです。

手順外で対応したこと

1. shared/モジュールの欠落(No module named 'shared')

症状
GenUのAgent Builderで、sdpmのツールが使えない(upload_file_to_s3_and_retrieve_s3_url など GenU組み込みツールしか出ない)。
Runtimeのログに ModuleNotFoundError: No module named 'shared' が出ている。

原因
公式手順ではSDPMからskillフォルダとmcp-localフォルダの2つのみをコピーする。
server.pyは/var/taskからimport sharedをしようとするが、shared/がない。

対応
<path-to-sdpm>/shared$GENU_RUNTIME_DIR/sdpm-sharedにコピー
$GENU_RUNTIME_DIR/DockerfileEXPOSE行の前にshared関連を追記
→GenUを再デプロイ

terminal
cp -r <path-to-sdpm>/shared $GENU_RUNTIME_DIR/sdpm-shared
$GENU_RUNTIME_DIR/Dockerfile
# EXPOSEの前に以下を追記
COPY sdpm-shared/ ./sdpm-shared/
RUN ln -s /var/task/sdpm-shared /var/task/shared

2. LibreOffice 未導入(measure 失敗でループ)

症状
GenUでAn error occurred while processing your request: Event loop reached maximum iteration count (20). Please contact the administrator.というエラーが表示される。
RuntimeのログでMeasure error: SVG export failed. Is LibreOffice (soffice) installed?が連発している

原因
measure_slidesはレイアウト測定にLibreOfficeを使い、composeワークフローがこれを多用する。GenUのコンテナにLibreOfficeが入っていないため、measure_slidesが失敗してループする。

対応
$GENU_RUNTIME_DIR/Dockerfileにlibreoffice関連のインストールを追記してGenU再デプロイ
※イメージサイズが数百MB増の為、CodeBuildでタイムアウトしないかどうか注意が必要

$GENU_RUNTIME_DIR/Dockerfile
# EXPOSEの前に追記
# LibreOffice (Impress) + poppler + 日本語フォント: sdpm の measure_slides / preview 用
RUN apt-get update && apt-get install -y --no-install-recommends \
      libreoffice-impress \
      poppler-utils \
      fonts-noto-cjk \
 && apt-get clean && rm -rf /var/lib/apt/lists/*

3. システムプロンプトの修正(ワークフロー名・順序・存在しないツール排除)

症状
GenUでAn error occurred while processing your request: Event loop reached maximum iteration count (20). Please contact the administrator.というエラーが表示される。(2.同様)
Runtimeのログでread_workflows: 'default' not found / 'create-new-2-outline' not foundのように存在しないツール呼び出しがされている

原因
公式手順のシステムプロンプト欄に記載されているwrite_file / concat_files / sample_template_dark等が存在しない。
ワークフロー名や順序をAIが推測してしまうため存在しないツールやワークフローを実行しようとする

対応
Agent Builderのシステムプロンプトに手順やツールを明記する(GenUの再デプロイは不要)

Agent Builderシステムプロンプト
あなたはプレゼンテーション設計アシスタントです。spec-driven-presentation-maker の MCP ツールを使って PowerPoint スライドを作成してください。

重要なルール:

- ワークフローは read_workflows で読み込みます。利用可能なワークフロー名は以下のみです。これ以外の名前(例: create-new-2-outline, create-new-2-build など番号を変えた名前)は存在しないので絶対に使わないでください。番号やフェーズ名から名前を推測してはいけません。

  【新規プレゼン作成の手順(この順序で read_workflows を呼ぶ)】
  1. create-new-1-briefing
  2. create-new-1-outline
  3. create-new-1-art-direction
  4. create-new-2-compose
  5. create-new-3-review

  【その他の用途】
  - 既存PPTX編集: edit-existing
  - スタイル作成: create-style
  - 翻訳: translate-pptx

- 各ワークフローは一度だけ read_workflows で読めば十分です。同じワークフローを何度も読み直さないでください。一度読んだら、その内容に従って次の工程に進んでください。
- もしワークフロー名が分からなくなったら、推測せず list_workflows を呼んで正確な一覧を取得してから read_workflows を呼んでください。
- init_presentation は最初に一度だけ呼び、以降は同じ deck_id を使い続けてください。新しい deck を作り直さないでください。
- read_guides に渡せるのは guides/ にあるガイド名のみです(slide-json-spec はワークフローであり guides ではないので read_guides では使えません)。ガイド名が不明なら list_guides で確認してください。
- スライドのJSONは run_python ツールで書き込みます。run_python の code 引数の中で write_json("slides/<スライド名>.json", データ) を使ってください(例: write_json("slides/title.json", {...}))。run_python には deck_id 引数を必ず渡してください。パスは deck ディレクトリからの相対パスです(例: "slides/title.json")。
- 重要: スライドは必ず1枚ずつ書いてください。複数スライドを一度にまとめて生成しないでください。
- write_file や concat_files というツールは存在しません。使わないでください。ファイルの結合も不要です。generate_pptx が slides/ 配下のJSONを自動的にまとめます。
- Code Interpreter は使わないでください(サンドボックスが MCP ツールと分離されています)。ファイル書き込みは上記の run_python を使ってください。
- generate_pptx の引数は deck_id のみです。slides_json_path や template といった引数は存在しないので渡さないでください。

正しい作成手順:
  1. init_presentation(name="プレゼン名") を呼び、返り値の output_dir を deck_id として以降のすべてのツール呼び出しで使う(init_presentation は一度だけ)
  2. apply_style(deck_id=deck_id, style="elegant-dark")  ※ダーク系の例。利用可能なスタイルは list_styles で確認できます(border, corporate-executive, cute-playful, elegant-dark, elegant-light, flat-shadow, lumina, tech-cyber)
  3. 各スライドを1枚ずつ、run_python の code 内で write_json("slides/<名前>.json", {...}) を使って書き込む(deck_id を渡すこと)
  4. generate_pptx(deck_id=deck_id) を呼ぶ。出力は deck_id/output.pptx に生成される
  5. upload_file_to_s3_and_retrieve_s3_url に deck_id/output.pptx のパスを渡してアップロードし、S3 URL を Markdown リンク形式で提示する: [ファイル名.pptx](S3_URL)

- 同じ工程を繰り返さず、上記の手順を順番に一度ずつ進めてください。すでに完了した工程をやり直さないでください。

- スライドのJSON構造やレイアウトのルールが分からない場合は、read_guides や read_examples を参照してください(ガイド名は list_guides で確認)。テンプレートは blank-dark または blank-light が利用可能です(list_templates で確認できます)。

4. 反復上限 MAX_ITERATIONS を 20 → 60

症状
GenUでAn error occurred while processing your request: Event loop reached maximum iteration count (20). Please contact the administrator.というエラーが表示される。(2.同様)
Runtimeのログでread_workflows×24・init_presentation×14 で序盤空転、.json written が0件のまま20到達
No.3の対応でプロンプトを修正しても同様エラーが発生する

原因
純粋に上限が低い
AIに調査させるとsdpm の多段フローは6-7枚で30-40ツール呼び出し程度とのこと
→GenU側の反復上限20では足りない

対応
generative-ai-use-cases/packages/cdk/lib/construct/generic-agent-core.tsMAX_ITERATIONS: '任意の数字',を追記してGenU再デプロイ
※Dockerイメージの再ビルド不要(環境変数の更新のみ)

generative-ai-use-cases/packages/cdk/lib/construct/generic-agent-core.ts
private loadConfigurations(env: string, bucketName: string) {
  return {

  // ...略
  
    agentBuilder:{

      // ...略

      environmentVariables: {
        FILE_BUCKET: bucketName,
        MCP_CONFIG_PATH: '/var/task/mcp-configs/agent-builder/mcp.json',
        SUPPORTED_CACHE_FIELDS: JSON.stringify(SUPPORTED_CACHE_FIELDS),
        MAX_ITERATIONS: '60',   // ← これを追加(場合に応じて数字を変更)
      },
    },
  };
},

トラブルシュートTips

ログの解析自体はClaude Codeに任せましたが、見るべきポイントは次のとおりでした。

  • Runtimeログの場所/aws/bedrock-agentcore/runtimes/...-DEFAULT
  • sdpmが起動しているかの確認:ログの Loaded N MCP tools from K serversK(サーバ数) を見る。sdpm込みなら4。合計ツール数だけ見るとsdpmの欠落を見逃しやすい
  • ループの主因の特定:ツール呼び出し名の出現回数を集計し、最も多いツールとその Error executing tool ... を見ると原因にあたりがつく
  • 「最大反復回数(20)」エラーは多義的:(a)sdpm未起動 (b)ツール拒否の連続リトライ (c)ワークフロー名 not found (d)上限不足 など原因が複数ある。必ずログで実際のツール呼び出しと結果を確認して切り分ける
  • MCPサーバ一覧が出ないとき:フロントのキャッシュが原因のことがある。フルの cdk deploy を通せば基本は自動で反映されるが、出ない場合はCloudFrontのキャッシュ無効化やブラウザのハードリロードを試す
  • Git Bash利用時:ロググループ名のスラッシュがパス変換されるため export MSYS_NO_PATHCONV=1 を設定しておく

まとめ

GenUのAgent BuilderにSDPMを連携するにあたり、現状では公式手順に加えて4つの作業が必要でした。

  • shared/フォルダのコピー(No module named 'shared'の解消)
  • LibreOfficeの導入(measure_slidesのループ解消)
  • システムプロンプトの修正(ワークフロー名・順序の明記、存在しないツールを使わせない)
  • MAX_ITERATIONSの引き上げ(20→60)

また、GenU連携で実際に使われるのはLayer 2までで、GenU連携だけであればSDPM本体をLayer 3やLayer 4までデプロイする必要はありませんでした。

途中原因分からなすぎて挫けそうでしたが、Claude Codeに助けてもらい何とか動かすことができました。(やっぱりAIは偉大)
同じように躓いている方の参考になれば幸いです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?