1
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?

スライドの「動く矢印」をAIに作らせる — 自作GIFジェネレーターをMCPサーバー化した話

1
Posted at

TL;DR

  • Googleスライドには矢印を「流す」アニメーションがなく、API でもアニメーションは設定できないので、動く矢印は透過GIFを貼るのが唯一の現実解
  • それをブラウザで作れるツール FlowArrow を作っていたが、AIエージェントにスライド資料を作らせる時代に「人間がWebUIをポチポチする工程」だけが取り残されることに気づいた
  • そこで描画エンジンを Node に移植して CLI + MCPサーバー として npm 公開した。claude mcp add flowarrow -- npx flowarrow mcp するだけで、Claude が create_flow_arrow などのツールでスライド用素材GIFを直接生成できる
# インストール不要で試せます
npx flowarrow --preset m --color "#5f6368" --out arrow.gif

流れる矢印のデモ

背景: Googleスライドで矢印は「流れない」

スライドで処理フローを説明するとき、「データがこう流れる」感を出したくて矢印を動かしたくなります。PowerPoint なら「ワイプ」やモーションパスで実現できますが、Googleスライドのアニメーションは Appear / Fade / Fly in 系のみ。しかも Google Slides API はアニメーション設定に対応していないため、アドオンで後付けもできません。

現実解は「動くGIFを作って画像として貼る」です。GIFなら編集中も発表中もループ再生されます。これをブラウザだけで作れるようにしたのが FlowArrow で、パスをクリックで描いて透過GIFを書き出せます(詳しくは前回の記事で書きました)。

なぜMCP化したか

最近はスライド資料自体を AI に作らせることが増えました(python-pptx、Marp、Google Slides API…)。ただ、AIが作る資料は基本的に静的です。「ここに流れる矢印を置きたい」となった瞬間、人間がWebUIを開いてGIFを作ってダウンロードして…という手作業が挟まります。

ツールの本体は Canvas 2D の描画ロジックで、UIは薄い皮です。ならばエンジンをヘッドレスで動かして MCP (Model Context Protocol) のツールとして生やせば、エージェントが資料生成の流れの中で素材GIFまで自給できるはず — というのが動機です。

使い方

CLI として

# 矢印(プリセット: straight / hook / m / s)
npx flowarrow --preset m --color "#5f6368" --out arrow.gif

# パスを自分で指定(900x470の論理座標)・線が伸びていく描画モード
npx flowarrow arrow --points "80,235 450,120 820,350" --mode draw --space 0

# ローディングスピナー(arc / dots / bars)
npx flowarrow spinner --style dots --color "#4f8cff" --size 200

# 丸で囲む・下線・マーカーの強調アニメ
npx flowarrow highlight --style circle --color "#e5484d" --width 800 --height 400

ポイントは --matte オプションです。GIFの透明は2値(半透明がない)ので、アンチエイリアスのフチを「何色に馴染ませるか」を決める必要があります。貼り先スライドの背景色を --matte "#202124" のように渡すと、その色がGIFの透明色になりフチが目立ちません。これはWeb版と同じ仕様です。

MCPサーバーとして

Claude Code なら1コマンドで登録できます:

claude mcp add flowarrow -- npx flowarrow mcp

汎用のMCPクライアント設定(stdio)なら:

{ "mcpServers": { "flowarrow": { "command": "npx", "args": ["flowarrow", "mcp"] } } }

これで次の3ツールが生えます。

ツール 生成物
create_flow_arrow パスに沿って破線/≫が流れる矢印GIF(パス座標・色・太さ・速さ指定可)
create_spinner くるくる回るローディングGIF(円弧/ドット/バー)
create_highlight 手書き風の「赤ペンで丸く囲む」「下線」「マーカー」GIF

あとは Claude に「アーキテクチャ図のスライドに、左から右に流れるグレーの矢印GIFを作って assets/ に置いて」と言うだけで、エージェントがツールを呼んでGIFを配置してくれます。座標指定もエージェント側がスキーマの説明(900×470論理キャンバス、最後の点が矢じり)を読んで組み立ててくれます。

実装メモ

ブラウザCanvas → node-canvas の移植

描画エンジン(Catmull-Rom スプライン補間 → 弧長パラメータ化 → 破線/シェブロンの等間隔配置)は純粋な Canvas 2D ロジックだったので、node-canvas にそのまま載りました。requestAnimationFrame のプレビュー部分だけ捨てて、「ループ割合 u ∈ [0,1) を受け取って1フレーム描く」純関数として切り出したのが効いています。ループ1周分を u = f/frames で回せば、Web版と完全に同じシームレスループGIFになります。

GIFエンコードと透過

Web版は gif.js(Web Worker 前提)を使っていましたが、Node側は gifenc にしました。フレームごとに:

  1. matte色で塗りつぶし → 上に図形を描画
  2. quantize() で256色パレット化
  3. パレット中で matte色に最も近いインデックスを透明インデックスに指定

とすることで、Web版と同じ「matte色が透明になる」挙動を再現しています。

MCPサーバー部分

@modelcontextprotocol/sdkMcpServer + StdioServerTransport で、ツール定義は zod スキーマを渡すだけです。コアが「設定オブジェクト → GIFバッファ」の関数になっていれば、CLIとMCPは同じ関数を呼ぶ薄いアダプタで済みます。スキーマの describe() にドメイン知識(「matteは貼り先の背景色に合わせる」など)を書いておくと、エージェントが適切な引数を選んでくれるようになります。

まとめ

  • Googleスライドの「動く矢印」問題は透過GIFで解決でき、FlowArrow はそれをWebでもCLIでもMCPでも作れるようになった
  • UIが薄くコアが純関数のツールは、MCP化のコストが驚くほど低い(今回の本体差分は実質4ファイル)
  • 「AIに資料を作らせるときに人間の手作業が挟まる箇所」は、MCPツールの良い狙い目だと思います

リンク:

フィードバック歓迎です!

1
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
1
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?