MCPサーバ(モック)を生成AIにサクッと作ってもらう

サイボウズ・ラボの中谷です。サイボウズの「AIやっていき」というチームにも所属しています。このチームは、サイボウズ社内にAIの新技術を紹介したり、AIに関するPoCを作って導入のイメージを共有したりと、チーム横断的に活動しています。4月15日に発表されたばかりのkintone AIラボにも協力しています。

さて、最近AI界隈では MCP(Model Context Protocol)がとても話題になっていますね。

github.com

これは Anthropic 社が提案している AI(大規模言語モデル)と AI 以外のリソース(データやサービス)を接続するベンダー非依存の通信規格(プロトコル)です。お互いが MCP を話すことで、任意の AI ツール(MCP クライアント/ホスト)と外部リソース(MCP サーバ)を接続して賢い処理ができるようになります。
こうした相互接続を目的としたプロトコルは、多くのステークホルダーが参加することでエコシステムが構成されて強力になります。正直なところ、ライバル社の規格に他の AI 企業が乗っかるとしてももう少し先だろうと、のほほんと思っていたのですが、なんと3月27日に OpenAI 社が、そして 4月10日に Google 社が MCP のサポートを表明したことで*1事実上のデファクトスタンダードになり、今や猫も杓子も MCP みたいな状態です。


cloud.google.com

どうしてここまで盛り上がっているか? それは、MCPがデファクトスタンダードとなったことで、「AI に対応している」とは「MCP をしゃべる」と同じ意味を指すようになるからです。つまり今後は、AI の領域でビジネスをするなら MCP 対応は避けられません。「インターネットに対応している」が「HTTP をしゃべる」に同一視される状況を想像するとわかりやすいでしょうか。

しかし既存のサービスが MCP をサポートすることで AI 対応となる、と言われてもなかなかピンとは来ません。新しい技術の宿命ですね。例えば今のインターネットも、それが存在する世界の知識・経験なしに理解するのは困難でしょう。

そういうとき、試作品を作って実現イメージを経験したり、仮説を実証したりするのがPoC(Proof of Concept)の役割ですよね。検証や実証に十分な機能を持った試作品を、できるだけ低コストで素早く作れると嬉しいです。そんな試作品こそ AI にサクッと作ってもらいましょう。

ここではスケジュール機能(サイボウズなので!)を題材とします。まずはスケジュールを構成するシンプルな機能をリストアップします。試作品なので最小機能で行きましょう。

  • ユーザリストの取得
  • スケジュールの取得・登録・変更・削除

スケジュール以外の機能が作りたい場合は、同様の基本的な操作をイメージしてください。自社や自分の組織の運営しているサービスにAPIがあれば、それが参考になるでしょう。

たったこれだけでも本物のサービスに接続するとなると大変です(諸々のセキュリティが気になるケースはさらに面倒です)。なので、モックにします。つまりデータはMCPサーバの中でだけ保持されており、どこにも保存しません。ChatGPTなどに以下のように相談してみます。

グループウェアのスケジュールを管理するMCPサーバのモックを作りたいです。
MCPサーバのツールはユーザリストの取得、スケジュールの取得・登録・変更・削除の機能を用意してください。

最近のAIはこのように相談すると、仕様が不明な部分は適当に決めつつコードを書いてくれます。出てきたものをいきなり動かすのではなく、意図を伝えそこねた部分はプロンプトに追加・調整して再生成させます。

ここでは誰でも試せるように ChatGPT や Gemini などのチャットAIで説明しますが、最近流行りの Cursor や Cline などの AI エディターを使ってもいいです。ただ個人的には、要件や仕様を決めていくステップはAIエディターで逐次的にプログラミングするより、プロンプトを書き直して再生成するほうが好みです。モックのMCPサーバならせいぜい100~200行程度のコードで済むので、チャットAIでも1回で十分生成できますしね。

そのように再生成を繰り返して、曖昧だった部分がハッキリするように条件を書き足し、プロンプトを育てていくと次のようになりました。動作確認に必要なダミーデータもランダムに生成してもらっています。

グループウェアのスケジュールを管理するMCPサーバのモックを作りたいです。
MCPサーバのツールはユーザリストの取得、スケジュールの取得(指定された日付やユーザで絞り込み。どちらも省略可能)、およびスケジュールIDを指定して登録・変更・削除の機能を用意してください。
データはオンメモリで保持し、永続化は不要です。


スケジュールの項目は以下のようにしてください。ユーザ名やタイトルは日本語にしてください。

  • タイトル
  • 開始時刻、終了時刻(日時情報)
  • 参加ユーザ(複数可)
  • 種別(ミーティング・来訪など)



ユーザは3名があらかじめ登録され、スケジュールの既存データはMCPサーバ起動時にダミーデータが適当に登録されます。生成するデータの期間は起動した日付の前後1週間としてください。
ユーザごとにスケジュールの入る確率(各ユーザのスケジュール数をその確率に比例させる)を設定できるようにし、確率はそれぞれ 0.2, 0.3, 0.4 としてください。複数ユーザが参加するスケジュールを適度に生成するようにしてください。

さて、ここからが今回の記事のポイント、このようなプロンプトに対してちゃんと動く MCP サーバを生成してもらうコツです。まず、そもそもの話として、実は AI は MCP を知らないので、全然関係ない別の MCP の話をしがちです。。MCP の本家 Claude でも MCP を学習していないわけですから、当然と言えば当然。

そこで、AI に MCP を教えてあげる必要があります。ChatGPT や Gemini なら、以下のようにリンクを張って読んで理解するように言えばOKです。Claude はリンクを読めないので、PDF として印刷し添付しましょう。最近の ChatGPT なら過去ログを参照するようになったので、一度これをやっておくと次からは「 MCP 」が通じることが期待できます。

まずは以下を読んでMCPについて深く理解をして下さい。
https://modelcontextprotocol.io/docs/concepts/architecture
https://modelcontextprotocol.io/quickstart/server

次に、参考にすべきサンプルコードを明示的に指定します。Claude Desktop に対応した MCP サーバのプログラミングについては、公式のチュートリアル(Quick Start)が最も参考になります。このチュートリアルに従って Weather サンプルを動かしておくと、そのコード weather.py がちょうどいいサンプルになります。

modelcontextprotocol.io

ちなみにサンプルコードを指定しないと、そのままでは動かないコードが生成されました。修正は難しくはないですが、サンプルコードを貼るだけで無修正で動くなら、そのほうがいいですよね。

そしてもう1つ、期待通りに動く MCP サーバのための大事なポイントがあります。それを含めた完成版のプロンプトを見てみましょう。

{作ってほしい MCP サーバのプロンプト}


開発はサンプルに従ってPythonコードで行ってください。
MCPサーバの各ハンドラのdocstringはLLMにそのツールの仕様を教えるdescriptionになるので、過不足のないよう簡潔かつ詳細に英語で記述してください。


### サンプルコード


{サンプルコード : weather.py}

最後の重要ポイントは、ツールの説明(Description)の書き方を指示するプロンプトです。実は AI はMCPサーバのツールの説明を読んで、指示の実行にそのツールが必要かどうか、それに渡すべき情報と受け取る情報のフォーマットを判断します。したがって AI を意図通りに働かせるには、ツールの説明をしっかり書くことが重要です。逆にこの MCP ツールの説明がいい加減だと、ツールを使ってほしいときに使ってもらえなかったり、ツールがエラーになって、入力データのフォーマットを忖度しながら何度も試行錯誤したりします。

イメージとしては、AI をプロジェクトに参加したばかりの新入社員だと思って、説明を読めば忖度なしにわかるようにしておくわけです。例えば最終的に生成されたモック MCP サーバのコードでは、スケジュール取得ツール get_schedules の説明は以下のようになっていました。公式の MCP の Python モジュールではメソッドの Docstring(def の次の行から始まる文字列部分) がそのまま MCP ツールの説明に使われます。

@mcp.tool()
async def get_schedules(date: Optional[str] = None, user: Optional[str] = None) -> List[Dict[str, Any]]:
    """
    Get schedules optionally filtered by date and/or user.

    Args:
        date: Optional string in 'YYYY-MM-DD' format. If provided, schedules
              are filtered to those that start on the given date.
        user: Optional user name in Japanese. If provided, schedules
              are filtered to those that include the given user.

    Returns:
        A list of schedules (dict), each containing:
            - id (int)
            - title (str)
            - start_time (str: ISO8601 datetime)
            - end_time (str: ISO8601 datetime)
            - participants (List[str])
            - type (str)
    """

このくらい書いてあれば、新入社員(AI)でもツールの使い方がわかりそうですよね。

このプロンプトから生成された MCP サーバをClaude Desktopに組み込んで動かしてみます。組み込み手順は先のチュートリアルのとおりです。サンプルコードを明示的に weather.py にしておくことで、組み込み手順も同一になります。

ただし、ハマりポイントとして Claude Desktop は「ちゃんと終了&再起動」しないと MCP サーバの変更を読み込んでくれません。具体的には、ウィンドウの閉じるボタン(「✕」)で閉じても常駐プロセスが残っています。Claude Desktop のメニュー「ファイル>終了」から終了して、もう一度起動すると新しく組み込んだ MCP サーバが有効になります。

そうしてスケジュールMCPサーバ(モック)を組み込んだ Claude Desktop で、例えば「全員の空いている時間に30分の合同ミーティングを設定して」や「佐藤さんは明後日お休みするそうなので、入ってる予定を全部キャンセルして」という指示に対して、スケジュールの取得や登録、削除などをうまく呼び出して実行してくれました。



スケジュールのごく基本的な機能を MCP サーバのツールとして用意するだけで、自然言語でスケジュールを操作できるようになりました。これを見れば、「MCP サポート」が「AI 対応」を意味するという言葉にも納得ですよね。

今はまだ MCP クライアント(MCPホスト)が Claude Desktop や Visual Studio Code など一部に限られていますが、今後は様々なクライアントが登場し、スマートフォンなどにも搭載されたり、いっそ OS が MCP をネイティブサポートしたりなどといった動きが活発になっていくことが予想されます。MCP で大騒ぎするだけの理由がちゃんとあるわけですね。

*1:GoogleはMCPのサポートと同時に、MCP と類似した Agent2Agent(A2A)というプロトコルも発表しています。