🎨

作図MCPサーバーを作ってみた(Docker + PUML)

に公開

初めに

今回はFastMCPを使って作図を行えるMCPサーバーを作ってみました。
マルチモーダルモデルではなくても以下のような簡単な作図をさせることができます。

プロンプト
ウォーターフォールモデルを作図してみて
結果
ウォーターフォールモデルの図を生成しました。以下のURLから確認できます。

URL: http://localhost:8080/api/v1/data/waterfall_model.png

githubにソースコードを公開していますので、ご興味がありましたらクローンして使ってみてください。(※ Dockerが必須です。)
https://github.com/yama-is-bocchi/draw-mcp-server

構成

ツールのシグネチャは以下の通りです。

get_draw_mcp_server.py
    @mcp.tool()
    def draw_puml(puml_code: str, filename: str) -> str:
        """Draws a diagram from the given PUML code using PlantUML.

        This tool receives PUML code and generates a diagram using PlantUML.
        It returns a URL referencing the generated diagram.

        Parameters
        ----------
        puml_code : str
            The PlantUML code to be rendered into a diagram.
        filename : str.
            Saved file name (example: image.png)

        Returns
        -------
        str
            A URL referencing the generated diagram.

        """

pumlのコード,ファイル名をパラメータにして、作図した結果の画像ファイルをFastAPIで配信します。
こうすることでマルチモーダルモデルではなくても作図することができます。

別スレッドでファイルの配信サーバーを起動するので、SSE接続を前提として作成しました。

mcp_config.json
{
  "mcpServers": {
    "draw-mcp": {
      "type": "sse",
      "url": "http://localhost:8000/sse"
    }
  }
}

他にも環境変数にユーザー名とパスワードを設定することで、アクセス時にベーシック認証を適用できるようにしています。
コード全体としては1000行程度です。

使用例

冒頭で紹介した作図以外にも勉強用など様々な用途で利用できます。

プロンプト
OpenID Connect の流れを作図して教えて。
結果
OpenID Connect の認可コードフローを示すシーケンス図を生成しました。\
以下のリンクから図を確認できます:

🔗 __[OpenID Connect Flow 図を見る](http://localhost:8080/api/v1/data/openid_connect_flow.png)__

この図では、ユーザー、クライアント(RP)、認可サーバー(IdP)、リソースサーバー(API)の間で行われる典型的な OpenID Connect のやり取りを示しています。

__流れの概要:__

1. ユーザーがクライアントにアクセス要求を送る
2. クライアントがユーザーを認可サーバーへリダイレクト
3. ユーザーが認可サーバーで認証
4. 認可サーバーが認可コードをクライアントに返す
5. クライアントが認可コードを使ってトークンを要求
6. 認可サーバーが ID トークンとアクセストークンを返す
7. クライアントがアクセストークンを使って API にアクセス
8. API が保護リソースを返す

これにより、OpenID Connect の全体的な認証・認可の流れを視覚的に理解できます

注意点

このような構成にすることで簡単に柔軟な作図が行えるMCPサーバーを作れます。
こちらの実装は便利な反面、いくつか注意点があります。

  • ベースLLMがPUMLを学習していない場合は全く使い物になりません。
  • ベースLLMが危険なコードを生成した場合、そのまま実行することになります。

今回の構成はこちらのMCPサーバーを参考にして作成しました ↓
https://github.com/neo4j-contrib/mcp-neo4j

これらのMCPサーバーも似た構成でCypherクエリをパラメータとして受け取り、実行した結果を返すツールを提供しています。
柔軟なクエリ操作が出来て使いやすいですが、エージェントが生成した危険なクエリをそのまま実行してしまう可能性があります。

まとめ

今後もこのような構成のツールを提供するMCPサーバーは増えてくると思われます。
使用者が危険性や脆弱性を見極めて、接続する必要があります。

今回のようなベースLLMが学習している前提のツールは、簡単に作れて柔軟性も高いので参考にしてみてください。

来栖川電算

Discussion