🧰

意外とシンプル!FastMCPでMCPサーバを解説

に公開

意外とシンプル!FastMCPでMCPサーバを解説

はじめに

MCPサーバー、最近よく聞いたり見たりすることが多いですよね。「AIに他のツールを使わせるようにする仕組み」――言葉で聞くとなんとなくイメージはできるんですが、実装や裏側の仕組みがイマイチ分からなくてモヤモヤしていました。

今回、FastMCPという簡単にMCPサーバーを作れるPythonフレームワークを使って、自分でMCPサーバーを作ってみました。いざ作ってみるとコードもすごいシンプルだし、裏側の仕組みもすごいシンプルだったんです。

この記事では、Claude Codeを使った超シンプルな実装手順と、裏側の仕組みを紹介します。


MCPツールとは?


簡単に言うと、AIに外部のツールを追加できる仕組みです。

MCPサーバーがない場合

ユーザーが「今年の合計給料と毎月の平均給料を教えて」とAIに聞いても、AIは給料なんて調べられないので「給料は分かりません」という回答をしてしまいます。

MCPサーバーがある場合

AIがMCPサーバーを使って給料を調べようとし、MCPサーバーにリクエストを送る。MCPサーバーが給与管理データベースにアクセスして給料情報をAIに返却する。そしてAIが「合計は800万円、平均は50万円でした」と回答できるようになります。


今回作ったもの

MCPサーバーの概要が分かったところで、まず今回作成したMCPツールを紹介します。

YouTubeの動画URLを渡すと英語字幕を返却するMCPツールです。

Youtube動画のURLと一緒に「この動画を要約して」とClaudeに入力すると、「tube-lingoというMCPサーバのget_transcriptというツールを実行しますか?」と聞かれるので「Yes」を選択。

すると実際にMCPサーバを実行し、英語字幕を取得し、その内容を使って動画の要約をしてくれます。

ちなみにMCPサーバーを利用しない場合は、YouTubeの動画の要約に失敗します。


MCPサーバーのコードと連携設定

では実際のコードを見てみましょう。
コードのファイルは server.pytranscript.py の2つだけです。MCPサーバーを実装しているのは server.py で、本体はたった25行程度です。

実装のポイント

https://github.com/daisuke0412/tube-lingo/blob/master/mcp-server/server.py

1. MCPサーバーの定義

FastMCPを使って「tube-lingo」という名前のMCPサーバーを定義します。

2. MCPツールデコレーター

関数に @mcp.tool デコレーターをつけることで、AIがこの関数を実行して処理結果を取得できるようになります。

3. ドキュメンテーション(最重要ポイント)

AIはドキュメンテーションの記載を見て、このツールが何ができるのか、どういった引数が必要なのかを判断します。「YouTubeの動画のURLから英語字幕を取得する」と記載しておくと、AIに「この動画を要約して」と質問した時に、AIが勝手にこのMCPツール get_transcript を実行して動画の字幕を取得し、内容の要約を行ってくれます。

4. サーバーの起動

最後に mcp.run() でMCPサーバーを起動できるようにしておきます。

YouTube字幕の取得処理自体はただのPythonの処理なので、MCPサーバー用の実装は server.py に記載されているものが全てです。

Claude Codeとの連携設定

https://github.com/daisuke0412/tube-lingo/blob/master/.mcp.json

MCPサーバーを実装したら、次はClaude Codeがこれを実行できるようにします。

プロジェクトのルートにある .mcp.json に、「tube-lingo」という名前でコマンドや引数を記載します。これだけでClaude Codeが起動した時にこのサーバーを認識して、必要に応じてMCPサーバーを利用できるようになります。

実装も設定もこれだけで、MCPサーバーが動きます。


裏側の仕組み


実装がシンプルなのは分かりましたが、裏側ではどういうやり取りが行われているのでしょうか?Claude CodeがMCPサーバーを使う全体の流れを見ていきましょう。

ステップ1:mcp.jsonの読み込み


シンプルにJSONファイルを読み込むだけです。

ステップ2:MCPサーバーの起動と初期化

  1. サーバー起動.mcp.json に記載されたコマンドと引数を使ってサーバーを起動(例:python server.py
  2. 初期化リクエスト ― Claude Codeが initialize リクエストを送信
  3. レスポンス ― MCPサーバーが「MCPサーバーの情報、ツールを提供している」という内容のレスポンスを返す

ステップ3:ツール一覧の取得


Claude Codeがツールリストの提供をリクエストすると、MCPサーバーは自分が持っているツールの情報(description、properties等)をClaude Codeに返却します。ここで返却される情報は、先ほどコードに書いたドキュメンテーションやパラメーター定義が設定されます。

ステップ4:ツールの呼び出し


必要に応じて tools/call メソッドでツールの名前や引数を渡すことで、MCPサーバーのツールを実行します。

ローカル vs リモート

ここまではローカルで動作するMCPサーバーとのやり取りを見てきましたが、リモート(インターネット上)で動作しているMCPサーバーとも連携できます。

連携方法はほぼ同じで、リモートのMCPサーバーと連携する時には .mcp.jsontypeurl を記載します。こうすると、ステップ2の「サーバー起動」だけをスキップして、初期化(initialize)やツールリスト取得を指定したURLのサーバーに送り、同じようにツールの呼び出しができるようになります。

{
  "mcpServers": {
    "context7": {
      "type": "http",
      "url": "https://mcp.context7.com/mcp",
    }
  }
}

まとめ

自分でMCPサーバーを作って、コードとその裏側の仕組みを紹介しました。

  • 実装はたった25行 ― FastMCPを使えば驚くほどシンプル
  • 裏側の仕組みもシンプル ― JSON読み込み → サーバー起動 → 初期化 → ツール一覧取得 → ツール呼び出し
  • ドキュメンテーションが重要 ― AIがツールを理解し適切に使うための鍵
  • ローカルでもリモートでも ― ほぼ同じ仕組みで連携可能

コードはGitHubに公開していますので、興味のある方はぜひ見てみてください。

https://github.com/daisuke0412/tube-lingo

https://www.youtube.com/watch?v=l67c1zadC1M

Discussion