AWSLab

PresentonのMCPサーバーをClaude Codeから使う

スポンサーラベル
MCPクライアントとPresentonのやりとり。initializeでMcp-Session-Idを受け取り、notifications/initializedを送ってからtools/listでツールを問い合わせ、tools/callで実行する。認証は毎リクエストのBearerヘッダー AWS

当サイトはアフィリエイト広告を利用しています。

PresentonをAWSに構築するで立てた環境を、しばらく REST API から叩いていました。定例資料の自動生成にはそれで足りますが、「この議事録からスライドを作って」と会話の流れで頼みたい場面もあります。

Presenton には MCP サーバーが内蔵されていて、Claude Code のような MCP クライアントから直接スライドを作らせられます。

本記事では、その MCP エンドポイントに実際にプロトコルを喋らせて確かめた内容をまとめます。結論を先に書くと、READMEに載っているツール名は実機と一致しませんでした。

1. MCPサーバーは何をしてくれるのか

MCP(Model Context Protocol)は、AI クライアントに外部ツールを渡すための規格です。Presenton は /mcp にエンドポイントを持っていて、対応クライアントから「スライドを作る」という道具として呼べます。

REST API との違いは呼ぶ側です。REST は自分でスクリプトを書いて叩きますが、MCP なら AI が必要と判断したときに自分で呼びます。

REST APIMCP
呼ぶ人自分のスクリプトAI クライアント
向く用途定例バッチ、既存システムへの組み込み会話の流れでの都度生成
認証sk-presenton-… の Bearer同じキーを使う

MCP 関連の連載としては、以前 Claude CodeにMCP経由でNetBoxを接続する を書きました。そちらは読み取り専用のサーバーでしたが、今回は書き込む側、つまり作らせる用途になります。

2. 接続に必要なもの

用意するのは API キー1本だけです。管理画面の Admin → API keys で発行します。REST API と同じキーがそのまま使えます。

クライアント側の設定はこの形になります。Claude Code ならプロジェクト直下の .mcp.json に置きます。

{
  "mcpServers": {
    "presenton": {
      "type": "http",
      "url": "http://203.0.113.10/mcp",
      "headers": {
        "Authorization": "Bearer sk-presenton-XXXX"
      }
    }
  }
}

キーは毎リクエストのヘッダーで送ります。 ブラウザのログインCookieは受け付けられません。REST と MCP で同じキーを使い回せるので、鍵の管理箇所は増えません。

なおキーには有効期限があり、既定は90日です。定常運用に組み込むなら、更新の段取りを先に決めておいたほうが安全です。

3. 実際に喋らせてみる

クライアントを立てる前に、プロトコルを直接叩いて生きているか確かめました。

MCPクライアントとPresentonのやりとり。initializeでMcp-Session-Idを受け取り、notifications/initializedを送ってからtools/listでツールを問い合わせ、tools/callで実行する。認証は毎リクエストのBearerヘッダー

最初は initialize です。

# セッションを開く。Accept に text/event-stream を含めるのが必須
curl -X POST http://203.0.113.10/mcp \
  -H "Authorization: Bearer sk-presenton-XXXX" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize",
       "params":{"protocolVersion":"2025-11-25","capabilities":{},
                 "clientInfo":{"name":"my-client","version":"1.0"}}}'

返ってきた応答がこれです。

{
  "protocolVersion": "2025-11-25",
  "capabilities": {
    "prompts": {"listChanged": true},
    "resources": {"subscribe": false, "listChanged": true},
    "tools": {"listChanged": true}
  },
  "serverInfo": {"name": "Presenton API (OpenAPI)", "version": "3.2.4"}
}

押さえておく点が2つあります。

ひとつは応答が text/event-stream で返ることです。JSON がそのまま返ってくるわけではなく、data: 行に包まれた SSE 形式です。素の curl で見ると読みにくいので、クライアント側でパースが要ります。

もうひとつはレスポンスヘッダーの Mcp-Session-Id です。以降のリクエストにはこれを付けます。付け忘れると後続が通りません。

initialize のあとに notifications/initialized を送ります。これは通知なので id を付けません。 付けると仕様違反になります。

4. ツールは3つしかない

握手が済んだら tools/list を投げます。ここが本記事で一番の発見でした。

READMEのツール名は実機と違う。READMEはstart_smart_presentationやupload_filesなどを挙げているが、実機のtools/listはgenerate_presentation・generate_presentation_async・get_presentation_generation_statusの3個だけを返す

実機が返してきたのは3個だけです。

generate_presentation                同期で生成する
generate_presentation_async          非同期で生成する
get_presentation_generation_status   非同期の進捗を見る

一方 README には、start_smart_presentation / get_job_status / start_template_generation / upload_template_assets / upload_files といった名前が並んでいます。どれも実機には存在しませんでした。

理由は serverInfo に出ています。「Presenton API (OpenAPI)」という名前のとおり、この MCP サーバーは REST の OpenAPI 定義から機械的に生成されたラッパーです。README が説明しているのは別の実装か、別バージョンのものと考えられます。

ドキュメントを写してスクリプトを書くと動きません。 接続したら、まず tools/list を1回叩いて実際の名前を確かめてください。

引数は REST の生成エンドポイントとほぼ同じで、generate_presentation は14個を受け付けます。content だけが必須です。

content(必須) / slides_markdown / instructions / tone / verbosity
web_search / n_slides / language / template / include_table_of_contents
include_title_slide / files / export_as / trigger_webhook

最後の trigger_webhook は REST 側のパラメータ表には無かったものです。登録済みの Webhook を叩くかどうかを、呼び出しごとに選べます。

5. MCP経由で生成する

tools/call で実行します。

{
  "jsonrpc": "2.0", "id": 3, "method": "tools/call",
  "params": {
    "name": "generate_presentation",
    "arguments": {
      "content": "情報システム部門のセキュリティ研修の案内",
      "n_slides": 3, "language": "Japanese", "export_as": "pptx"
    }
  }
}

64.7秒で3枚が生成されました。 isErrorfalse で、結果は structuredContent に入って返ります。

{
  "presentation_id": "d0e05d6f-…",
  "path": "/app_data/exports/users/…/….pptx",
  "edit_path": "/presentation?id=d0e05d6f-…"
}

REST と同じく、返るのはファイル本体ではなくサーバー上のパスです。AI に「作って」と頼んだ結果として受け取れるのはこのパスなので、ファイルを手元に落とす経路は別に用意する必要があります。画面の編集URLを開いてダウンロードするか、サーバー側から取り出す仕組みを作ることになります。

同期版で1分前後かかるので、会話の途中で待たせたくないなら generate_presentation_async を使い、get_presentation_generation_status で進捗を見る形が向いています。

6. つまずきどころ

6.1 READMEのキー管理APIは存在しない

README は、キーの発行と失効に次のエンドポイントを使うと書いています。

POST /api/v1/admin/api-keys
GET  /api/v1/admin/api-keys
POST /api/v1/admin/api-keys/{api_key_id}/revoke

稼働中のルートを列挙したところ、admin/api-keys は1本もありませんでした。 /api/v1/admin/ 配下にあるのは provider-settingsusers だけです。

実機でキーを扱うのはこちらでした。

POST /api/v1/auth/token/create
GET  /api/v1/auth/token/list
POST /api/v1/auth/token/revoke

ツール名と同じ構図です。MCPまわりのREADMEは、実装に追いついていないと考えて読むほうが安全です。

6.2 管理系はAPIキーでは呼べない

ついでに確かめたところ、GET /api/v1/admin/users は API キーでは403でした。

{"detail": "Admin browser session required"}

APIキーは発行したユーザーとして動くため、管理者のブラウザセッションが要る操作はできません。 MCP から利用者アカウントを払い出す、といった使い方は現状できません。

6.3 デスクトップ版ではMCPが使えない

Electron のデスクトップアプリでは MCP サーバーが無効になっています。認証が既定で切られているため、衝突を避けるための措置です。MCP を使うならサーバー構成(Docker)が前提になります。

7. まとめ

  • /mcp は MCP 2025-11-25 の Streamable HTTP。 応答は text/event-stream で返り、Mcp-Session-Id を以降のリクエストに付ける
  • 認証はRESTと同じ sk-presenton-… キー。 ブラウザのCookieは不可。既定90日で失効する
  • ツールは3個だけ。 generate_presentation / generate_presentation_async / get_presentation_generation_status
  • READMEのツール名とキー管理APIは実機に存在しない。 serverInfo が示すとおりRESTから機械生成されたラッパーで、接続したら必ず tools/list で確かめる
  • MCP経由の生成は3枚で64.7秒。返るのはファイルではなくパスなので、手元に落とす経路は別に用意する
  • デスクトップ版ではMCPが無効

本記事の内容は検証環境(presenton-verify)で実際にプロトコルを往復させて確かめたものです。ただし、Claude Code の .mcp.json に登録して使う手順そのものは通していません(設定ファイルの形式はドキュメントに沿ったものです)。エンドポイント側が仕様どおりに応答することは確認済みなので、あとはクライアント側の登録だけになります。

会話の流れでスライドを作らせるという用途に、MCP はよく合います。ただドキュメントと実機の差が大きいので、組み込む前に tools/list で現物を確認してください。

コメント

タイトルとURLをコピーしました