4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FastMCP完全入門ガイド【Part 1】

4
Posted at

FastMCP入門

はじめに

このガイドでは、プログラミングが初めての方でも、FastMCPを使ってAIツールを構築できるようになることを目指しています。

このガイドを読むとできるようになること

  • AIアシスタント(ClaudeやChatGPTなど)に独自の機能を追加できる
  • データベースやAPIをAIに接続できる
  • 社内システムをAIから利用可能にできる
  • AIが使えるカスタムツールを作成できる

Model Context Protocol(MCP)を理解しよう

MCPとは何か?

MCP(Model Context Protocol)は、AI(大規模言語モデル、LLM)と外部のデータやツールをつなぐための「共通の言語」です。

わかりやすい例え:

スマートフォンを思い浮かべてください。

スマートフォンには、充電するためのUSB-Cポートや、イヤホンを接続するためのジャックがあります。

これらの「ポート」があることで、さまざまなメーカーの充電器やイヤホンを自由に接続できます。

MCPは、AIのためのUSB-Cポートのようなものです。

MCPという標準的な接続方法があることで、さまざまなツールやデータをAIに簡単に接続できるようになります。

MCPがない世界の問題

MCPが登場する前は、以下のような問題がありました:

問題1: AIごとに異なる接続方法

  • Claude用のツールはChatGPTでは使えない
  • ChatGPT用のツールはClaude用に作り直す必要がある
  • 同じ機能を何度も実装しなければならない

問題2: データへのアクセスが困難

  • AIは直接データベースにアクセスできない
  • ファイルやドキュメントを読むことができない
  • 社内システムの情報を取得できない

問題3: 機能拡張の複雑さ

  • AIに新しい機能を追加するのが難しい
  • 専門的な知識が必要
  • 開発に時間がかかる

MCPがある世界の利点

MCPが登場したことで、これらの問題が解決されました:

利点1: 標準化された接続方法

  • 一度作ったツールは、MCP対応のすべてのAIで使える
  • 異なるAI間でツールを共有できる
  • 開発の手間が大幅に削減される

利点2: 簡単なデータアクセス

  • AIがデータベースにアクセスできる
  • ファイルやドキュメントを読める
  • 外部APIと連携できる

利点3: 簡単な機能拡張

  • 数行のコードでAIに新機能を追加できる
  • 複雑な設定が不要
  • 誰でも簡単に開発できる

MCPの3つの基本コンポーネント

MCPには、3つの主要な要素があります:

1. Tools(ツール)- AIができる「アクション」

ツールは、AIが実行できる具体的な操作です。

例えば:

  • 計算をする(2 + 3 = 5)
  • メールを送信する
  • データベースに情報を保存する
  • 天気予報を取得する
  • ファイルを作成する

人間に例えると:

「電卓を使って計算する」「電話をかける」「メモを書く」といった具体的な行動です。

2. Resources(リソース)- AIが読める「データ」

リソースは、AIに提供する情報やデータです。

例えば:

  • 設定ファイルの内容
  • ユーザーのプロフィール情報
  • 過去の会話履歴
  • 会社の規則集
  • 商品カタログ

人間に例えると:

「辞書を引く」「マニュアルを読む」「カタログを見る」といった情報収集です。

3. Prompts(プロンプト)- AIとの「定型的な会話」

プロンプトは、よく使う指示のテンプレートです。

例えば:

  • 「このコードをレビューしてください」
  • 「このテキストを要約してください」
  • 「英語に翻訳してください」

人間に例えると:

定型文やテンプレートのようなものです。

MCPの動作イメージ

┌─────────────────────────────────────────┐
│        あなた(ユーザー)                   │
└─────────────┬───────────────────────────┘
              │
              │ 「東京の天気を教えて」
              │
              ↓
┌─────────────────────────────────────────┐
│      AI(Claude、ChatGPTなど)             │
│                                          │
│  「天気を知るには、天気APIツールを         │
│   使えばいいな」                          │
└─────────────┬───────────────────────────┘
              │
              │ MCPを使ってツールを呼び出し
              │
              ↓
┌─────────────────────────────────────────┐
│       FastMCPサーバー                      │
│     (あなたが作るプログラム)               │
│                                          │
│  ツール: get_weather(city="東京")         │
└─────────────┬───────────────────────────┘
              │
              │ APIにリクエスト
              │
              ↓
┌─────────────────────────────────────────┐
│       外部API(天気予報サービス)            │
│                                          │
│  「東京は晴れ、気温25度」                   │
└─────────────┬───────────────────────────┘
              │
              │ 結果を返す
              │
              ↓
┌─────────────────────────────────────────┐
│       FastMCPサーバー                      │
└─────────────┬───────────────────────────┘
              │
              │ 結果をAIに返す
              │
              ↓
┌─────────────────────────────────────────┐
│      AI(Claude、ChatGPTなど)             │
└─────────────┬───────────────────────────┘
              │
              │ 「東京は晴れで、気温は25度です!」
              │
              ↓
┌─────────────────────────────────────────┐
│        あなた(ユーザー)                   │
└─────────────────────────────────────────┘

この一連の流れが、すべてMCPという共通のプロトコルで実現されています。

MCPの具体的な使用例

例1: 社内データベースへのアクセス

あなたの会社に顧客データベースがあるとします。

MCPを使うと:

  1. 顧客情報を検索するツールを作成
  2. AIがそのツールを使って顧客情報を取得
  3. 「田中さんの注文履歴を教えて」という質問に答えられる

例2: 業務の自動化

毎日同じ作業を繰り返している場合:

  1. その作業を実行するツールを作成
  2. AIに「今日の日報を作成して」と指示
  3. AIがツールを使って自動的に作業を実行

例3: 外部サービスとの連携

さまざまなWebサービスを使っている場合:

  1. 各サービスのAPIをツールとして公開
  2. AIが複数のサービスを組み合わせて使用
  3. 「Slackに通知して、Googleカレンダーに予定を追加して」という複雑な操作も可能

FastMCPとは?

ここまでMCPについて説明してきましたが、FastMCPは、このMCPを使ったプログラムを簡単に作れるようにするためのツールです。

例え:

  • MCP = 英語という言語
  • FastMCP = 英語を簡単に学べる教科書

MCPという仕組みは素晴らしいのですが、そのまま使おうとすると複雑です。

FastMCPを使えば、数行のコードでMCPサーバー(AIが使えるツール)を作成できます。

FastMCPの特徴:

  1. シンプル: 難しい設定が不要
  2. Pythonic: Pythonらしい書き方
  3. 高速: すぐに開発できる
  4. 完全: 本番環境に必要な機能がすべて揃っている

誰がMCPを使うべきか?

MCPとFastMCPは、以下のような方に最適です:

  • AIに独自の機能を追加したい開発者
  • 社内システムをAI化したい企業
  • データベースをAIから利用可能にしたい方
  • 業務をAIで自動化したい方
  • AIアプリケーションを構築したい方

プログラミング初心者でも大丈夫?

はい、大丈夫です!

このガイドでは、Pythonの基礎から丁寧に説明しています。

プログラミングの経験がなくても、順番に読み進めることで、FastMCPを使ったAIツールを作れるようになります。


このガイドの構成

Part 1(このパート): Python基礎とFastMCP入門

  1. Pythonプログラミングの基礎

    • 変数、関数、クラスなどの基本
    • Python初心者でも理解できる内容
  2. FastMCPとは

    • MCPプロトコルの詳細
    • FastMCPの概要
  3. FastMCPのインストール

    • 環境構築
    • 最初のプロジェクト作成
  4. 最初のFastMCPサーバー

    • シンプルなツールの作成
    • Claude Desktopへの接続
  5. FastMCPの基本概念

    • ツール、リソース、プロンプトの理解

Part 2: FastMCPコア機能

  • Tools(ツール)の詳細
  • Resources(リソース)の活用
  • Prompts(プロンプト)の作成
  • Context APIの使用
  • 画像処理

Part 3: 高度な機能とデプロイメント

  • クライアント機能
  • 認証システム
  • サーバープロキシ
  • デプロイメント方法
  • テストとデバッグ

学習の進め方

推奨される学習順序

  1. Part 1を最初から最後まで読む

    • Pythonの基礎を理解する
    • FastMCPの基本を学ぶ
  2. 実際にコードを書いて試す

    • 各章のサンプルコードを実行する
    • 自分なりに改変してみる
  3. Part 2とPart 3に進む

    • より高度な機能を学ぶ
    • 実用的なアプリケーションを構築する

学習時間の目安

  • Part 1: 2〜3時間
  • Part 2: 3〜4時間
  • Part 3: 4〜5時間

合計: 約10時間で、FastMCPの基礎から高度な使い方まで習得できます。

必要な前提知識

必須:

  • なし(完全な初心者から始められます)

あると良い:

  • 基本的なパソコン操作
  • コマンドライン(ターミナル)の簡単な使い方

さあ、始めましょう!

それでは、Pythonプログラミングの基礎から学んでいきましょう。

このガイドを読み終える頃には、あなたもAIが使えるカスタムツールを作れるようになっています。


第1章: Pythonプログラミングの基礎


1.1 Pythonとは何か

Pythonは、読みやすく書きやすいプログラミング言語です。

多くの企業やプロジェクトで使用されており、初心者にも学びやすい言語として知られています。

Pythonの特徴:

  • シンプルで読みやすい構文
  • 豊富なライブラリとツール
  • AIや機械学習の分野で広く使用されている
  • クロスプラットフォーム(Windows、Mac、Linuxで動作)

1.2 Pythonのインストール

FastMCPを使用する前に、まずPythonをインストールする必要があります。

Windows:

  1. python.orgにアクセス
  2. 最新のPython(3.10以上)をダウンロード
  3. インストーラーを実行し、「Add Python to PATH」にチェックを入れる
  4. インストール完了

macOS:

macOSにはPythonがプリインストールされていますが、最新版を推奨します。

# Homebrewを使用してインストール
brew install python3

Linux:

# Ubuntuの場合
sudo apt update
sudo apt install python3 python3-pip

インストール確認:

ターミナル(コマンドプロンプト)を開いて、以下のコマンドを実行します。

python3 --version

バージョン番号が表示されれば、正常にインストールされています。


1.3 変数とデータ型

プログラミングでは、データを保存するために「変数」を使用します。

変数の基本:

# 変数の定義
name = "太郎"
age = 25
height = 175.5
is_student = True

主なデータ型:

  1. 文字列(str): テキストデータ

    message = "こんにちは、世界!"
    greeting = 'Hello, World!'
    
  2. 整数(int): 小数点のない数値

    count = 100
    year = 2025
    
  3. 浮動小数点数(float): 小数点を含む数値

    price = 1999.99
    temperature = 36.5
    
  4. ブール値(bool): 真偽値(TrueまたはFalse)

    is_ready = True
    has_error = False
    

1.4 リストと辞書

複数のデータをまとめて扱うためのデータ構造です。

リスト(list):

複数の要素を順序付きで格納します。

# リストの作成
fruits = ["りんご", "バナナ", "オレンジ"]
numbers = [1, 2, 3, 4, 5]

# リストの要素にアクセス
first_fruit = fruits[0]  # "りんご"
second_number = numbers[1]  # 2

# リストに要素を追加
fruits.append("ぶどう")

# リストの長さを取得
length = len(fruits)  # 4

辞書(dict):

キーと値のペアでデータを格納します。

# 辞書の作成
person = {
    "name": "太郎",
    "age": 25,
    "city": "東京"
}

# 辞書の値にアクセス
name = person["name"]  # "太郎"
age = person["age"]    # 25

# 辞書に新しいキーと値を追加
person["email"] = "taro@example.com"

1.5 条件分岐(if文)

条件によって実行する処理を変えるための構文です。

age = 20

if age >= 20:
    print("成人です")
else:
    print("未成年です")

複数の条件:

score = 85

if score >= 90:
    print("優秀です")
elif score >= 70:
    print("良好です")
else:
    print("がんばりましょう")

1.6 ループ(繰り返し)

同じ処理を繰り返し実行するための構文です。

forループ:

# リストの各要素に対して処理
fruits = ["りんご", "バナナ", "オレンジ"]
for fruit in fruits:
    print(fruit)

# 指定回数繰り返す
for i in range(5):
    print(f"繰り返し {i + 1} 回目")

whileループ:

count = 0
while count < 5:
    print(f"カウント: {count}")
    count += 1

1.7 関数の定義

繰り返し使用する処理をまとめたものが「関数」です。

基本的な関数:

def greet():
    print("こんにちは!")

# 関数の呼び出し
greet()

引数を持つ関数:

def greet_person(name):
    print(f"こんにちは、{name}さん!")

greet_person("太郎")  # "こんにちは、太郎さん!"

戻り値を持つ関数:

def add(a, b):
    return a + b

result = add(5, 3)  # 8

複数の引数と戻り値:

def calculate(x, y):
    sum_result = x + y
    product_result = x * y
    return sum_result, product_result

sum_val, product_val = calculate(4, 5)
print(f"合計: {sum_val}, 積: {product_val}")

1.8 型ヒント(Type Hints)

Pythonでは、変数や関数の引数・戻り値の型を明示的に指定できます。

これにより、コードが読みやすくなり、エラーを防ぐことができます。

基本的な型ヒント:

def add(a: int, b: int) -> int:
    return a + b

name: str = "太郎"
age: int = 25
height: float = 175.5

リストや辞書の型ヒント:

from typing import List, Dict

def get_names() -> List[str]:
    return ["太郎", "花子", "次郎"]

def get_person() -> Dict[str, any]:
    return {"name": "太郎", "age": 25}

FastMCPでは、型ヒントが非常に重要です。

型ヒントを使用することで、FastMCPが自動的にツールのスキーマを生成してくれます。


1.9 Docstring(ドキュメント文字列)

関数の説明を記述するための文字列です。

Docstringの書き方:

def calculate_area(width: float, height: float) -> float:
    """
    長方形の面積を計算します。
    
    Args:
        width: 長方形の幅
        height: 長方形の高さ
    
    Returns:
        長方形の面積
    """
    return width * height

FastMCPでは、Docstringが自動的にツールの説明として使用されます。

LLMがツールの使い方を理解するために、Docstringは非常に重要です。


1.10 クラスとオブジェクト

関連するデータと関数をまとめたものが「クラス」です。

クラスの定義:

class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age
    
    def greet(self):
        print(f"こんにちは、私は{self.name}です。")
    
    def get_info(self) -> str:
        return f"{self.name}さんは{self.age}歳です。"

# オブジェクトの作成
person = Person("太郎", 25)
person.greet()  # "こんにちは、私は太郎です。"
info = person.get_info()  # "太郎さんは25歳です。"

FastMCPでも内部的にクラスを使用していますが、基本的な使い方ではクラスを定義する必要はありません。


1.11 モジュールとインポート

他のファイルや外部ライブラリの機能を使用するための仕組みです。

標準ライブラリのインポート:

import math

# 平方根を計算
result = math.sqrt(16)  # 4.0

# 円周率を使用
pi = math.pi  # 3.141592653589793

特定の関数だけをインポート:

from math import sqrt, pi

result = sqrt(25)  # 5.0

外部ライブラリのインポート:

# FastMCPをインポート
from fastmcp import FastMCP

# httpxライブラリをインポート(HTTP通信用)
import httpx

1.12 非同期プログラミングの基礎

非同期プログラミングは、複数の処理を効率的に実行するための手法です。

async/awaitの基本:

import asyncio

# 非同期関数の定義
async def greet_async(name: str):
    await asyncio.sleep(1)  # 1秒待機
    print(f"こんにちは、{name}さん!")

# 非同期関数の実行
async def main():
    await greet_async("太郎")

# イベントループで実行
asyncio.run(main())

FastMCPでは、ツールやリソースを非同期関数として定義できます。

ネットワーク通信やファイルI/Oなど、待機時間が発生する処理では非同期関数を使用すると効率的です。


1.13 エラーハンドリング

プログラムの実行中にエラーが発生した場合の処理方法です。

try-except構文:

def divide(a: int, b: int) -> float:
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("エラー: ゼロで割ることはできません")
        return 0.0
    except Exception as e:
        print(f"予期しないエラー: {e}")
        return 0.0

# 使用例
result1 = divide(10, 2)   # 5.0
result2 = divide(10, 0)   # エラーメッセージが表示され、0.0が返される

FastMCPのツールでも、適切なエラーハンドリングを行うことで、予期しないエラーを防ぐことができます。


第2章: FastMCPとは


2.1 FastMCPの概要

FastMCPは、Model Context Protocol(MCP)を実装した、高レベルのPythonフレームワークです。

MCPは、大規模言語モデル(LLM)にツールやデータを提供するための標準化されたプロトコルです。

FastMCPの目的:

  • LLMが実行できる「ツール」を簡単に定義できる
  • LLMに提供する「データ」(リソース)を公開できる
  • LLMとの対話を効率化する「プロンプト」を定義できる

FastMCPの特徴:

  1. シンプル: 最小限のコードでMCPサーバーを構築
  2. Pythonic: Pythonらしい、読みやすいコード
  3. 高速: 開発から本番環境まで迅速に展開
  4. 完全: 認証、デプロイメント、テストなど、本番環境に必要なすべてを提供

2.2 MCPプロトコルとは

Model Context Protocol(MCP)は、LLMとリソースを接続するための統一的な方法です。

「AIのためのUSB-Cポート」とも呼ばれています。

MCPの3つの主要コンポーネント:

  1. Tools(ツール): LLMが実行できるアクション

    • 計算を行う
    • APIを呼び出す
    • データベースに書き込む
    • など
  2. Resources(リソース): LLMに提供するデータ

    • 設定ファイルの内容
    • データベースのレコード
    • ファイルシステムの情報
    • など
  3. Prompts(プロンプト): 再利用可能な対話テンプレート

    • コードレビューの依頼
    • 要約の生成
    • 質問応答
    • など

MCPの動作イメージ:

┌─────────────┐         ┌──────────────┐         ┌─────────────┐
│    LLM      │ ◀─MCP─▶ │  FastMCPサーバー │ ◀──▶ │  データ/API  │
│   (Claude)  │         │  (あなたのコード)  │       │             │
└─────────────┘         └──────────────┘         └─────────────┘

LLMは、FastMCPサーバーを通じて、ツールを実行したり、データにアクセスしたりできます。


2.3 FastMCP 1.0 と 2.0の違い

FastMCPには2つのメジャーバージョンがあります。

FastMCP 1.0:

  • 2024年に公式MCP Python SDKに統合されました
  • 基本的なサーバー構築機能を提供
  • シンプルなツール定義が可能

FastMCP 2.0(現在のバージョン):

  • 積極的に開発が続けられているバージョン
  • FastMCP 1.0の機能をすべて含む
  • 追加機能:
    • クライアント機能
    • サーバープロキシとコンポジション
    • OpenAPI/FastAPI統合
    • エンタープライズ認証(Google、GitHub、Azure、Auth0など)
    • デプロイメントツール
    • テストフレームワーク
    • ミドルウェアシステム

このガイドでは、FastMCP 2.0を使用します。


2.4 FastMCPのユースケース

FastMCPは、さまざまなシナリオで使用できます。

1. AIアシスタントへのツール提供:

LLM(Claude、ChatGPTなど)に、カスタムツールを提供します。

from fastmcp import FastMCP

mcp = FastMCP("Calculator")

@mcp.tool()
def calculate_tax(amount: float, rate: float) -> float:
    """税額を計算します"""
    return amount * rate

# LLMがこのツールを使用して税額計算を実行できます

2. データベースへのアクセス:

LLMがデータベースにクエリを実行できるようにします。

@mcp.tool()
def search_users(keyword: str) -> list:
    """ユーザーを検索します"""
    # データベースにクエリを実行
    return database.search(keyword)

3. 外部APIの統合:

LLMが外部サービス(天気予報、ニュース、翻訳など)にアクセスできるようにします。

@mcp.tool()
async def get_weather(city: str) -> str:
    """指定された都市の天気を取得します"""
    async with httpx.AsyncClient() as client:
        response = await client.get(f"https://api.weather.com/{city}")
        return response.text

4. 社内システムの統合:

LLMが社内のシステムやデータにアクセスできるようにします。

@mcp.resource("company://employees/{id}")
def get_employee(id: str) -> dict:
    """従業員情報を取得します"""
    return company_db.get_employee(id)

第3章: FastMCPのインストール


3.1 前提条件

FastMCPを使用するには、以下が必要です。

必須:

  • Python 3.10以上
  • インターネット接続(パッケージのダウンロード用)

推奨:

  • uv(高速なPythonパッケージマネージャー)
  • IDE(Visual Studio Code、PyCharmなど)
  • 基本的なコマンドライン操作の知識

3.2 uvのインストール(推奨)

uvは、Pythonパッケージを高速にインストールできるツールです。

macOS/Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

Windows:

powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

Homebrewを使用(macOS):

brew install uv

インストール確認:

uv --version

3.3 FastMCPのインストール

FastMCPをインストールする方法はいくつかあります。

方法1: uvを使用(推奨)

uv pip install fastmcp

方法2: 通常のpipを使用

pip install fastmcp

方法3: 特定のバージョンをインストール

pip install fastmcp==2.13.0

インストール確認:

python -c "import fastmcp; print(fastmcp.__version__)"

バージョン番号が表示されれば、正常にインストールされています。


3.4 開発環境のセットアップ

FastMCPの開発を行う場合、開発用の依存関係もインストールします。

GitHubからクローン:

git clone https://github.com/jlowin/fastmcp.git
cd fastmcp

依存関係のインストール:

uv sync

仮想環境の有効化:

# macOS/Linux
source .venv/bin/activate

# Windows
.venv\Scripts\activate

3.5 IDEのセットアップ

コードを書きやすくするために、IDEをセットアップします。

Visual Studio Code(推奨):

  1. VS Codeをインストール
  2. Python拡張機能をインストール
  3. プロジェクトフォルダを開く
  4. Pythonインタープリタを選択(.venv内のPython)

PyCharm:

  1. PyCharmをインストール
  2. 新しいプロジェクトを作成
  3. Pythonインタープリタを設定(.venv内のPython)

3.6 最初のプロジェクトの作成

FastMCPプロジェクトを作成します。

1. プロジェクトディレクトリを作成:

mkdir my-fastmcp-project
cd my-fastmcp-project

2. 仮想環境を作成:

uv venv
source .venv/bin/activate  # macOS/Linux
.venv\Scripts\activate     # Windows

3. FastMCPをインストール:

uv pip install fastmcp

4. 最初のサーバーファイルを作成:

server.pyという名前のファイルを作成し、以下のコードを記述します。

from fastmcp import FastMCP

# サーバーを作成
mcp = FastMCP("My First Server")

# ツールを定義
@mcp.tool()
def greet(name: str) -> str:
    """名前を受け取って挨拶を返します"""
    return f"こんにちは、{name}さん!"

# サーバーを実行
if __name__ == "__main__":
    mcp.run()

5. サーバーを実行:

python server.py

サーバーが起動し、ツールが利用可能になります。


第4章: 最初のFastMCPサーバー


4.1 シンプルなツールサーバー

最もシンプルなFastMCPサーバーを作成してみましょう。

server.py:

from fastmcp import FastMCP

# サーバーインスタンスを作成
mcp = FastMCP("Calculator")

# 足し算ツールを定義
@mcp.tool()
def add(a: int, b: int) -> int:
    """2つの数を足し算します"""
    return a + b

# 実行
if __name__ == "__main__":
    mcp.run()

コードの説明:

  1. from fastmcp import FastMCP: FastMCPをインポート
  2. mcp = FastMCP("Calculator"): "Calculator"という名前のサーバーを作成
  3. @mcp.tool(): 関数をツールとして登録するデコレータ
  4. def add(a: int, b: int) -> int:: 2つの整数を受け取り、整数を返す関数
  5. """2つの数を足し算します""": ツールの説明(Docstring)
  6. mcp.run(): サーバーを起動

実行方法:

python server.py

サーバーが起動し、STDIOトランスポート(標準入出力)でリクエストを待ち受けます。


4.2 FastMCP CLIの使用

FastMCPには、開発を効率化するCLIツールが付属しています。

サーバーを実行:

fastmcp run server.py

開発モードで実行:

開発モードでは、ファイルが変更されると自動的にサーバーがリロードされます。

fastmcp dev server.py

MCP Inspectorで検査:

MCP Inspectorは、FastMCPサーバーをテストするための対話型ツールです。

fastmcp dev server.py

ブラウザが自動的に開き、ツールをテストできるインターフェースが表示されます。


4.3 複数のツールを持つサーバー

複数のツールを定義してみましょう。

calculator.py:

from fastmcp import FastMCP

mcp = FastMCP("Advanced Calculator")

@mcp.tool()
def add(a: float, b: float) -> float:
    """2つの数を足し算します"""
    return a + b

@mcp.tool()
def subtract(a: float, b: float) -> float:
    """2つの数を引き算します"""
    return a - b

@mcp.tool()
def multiply(a: float, b: float) -> float:
    """2つの数を掛け算します"""
    return a * b

@mcp.tool()
def divide(a: float, b: float) -> float:
    """2つの数を割り算します(bが0の場合はエラー)"""
    if b == 0:
        raise ValueError("ゼロで割ることはできません")
    return a / b

if __name__ == "__main__":
    mcp.run()

このサーバーは、4つのツール(add、subtract、multiply、divide)を提供します。


4.4 Claude Desktopへの接続

FastMCPサーバーをClaude Desktopに接続することで、Claudeがツールを使用できるようになります。

インストールコマンド:

fastmcp install server.py

このコマンドを実行すると、Claude Desktopの設定ファイルが自動的に更新され、サーバーが登録されます。

カスタム名でインストール:

fastmcp install server.py --name "私の計算機サーバー"

環境変数を指定:

fastmcp install server.py -v API_KEY=your_key_here

インストール後:

  1. Claude Desktopを再起動
  2. Claudeに「2 + 3を計算して」と入力
  3. Claudeがaddツールを使用して結果を返します

4.5 エラーハンドリングの追加

ツールにエラーハンドリングを追加して、予期しないエラーを防ぎます。

improved_calculator.py:

from fastmcp import FastMCP

mcp = FastMCP("Safe Calculator")

@mcp.tool()
def safe_divide(a: float, b: float) -> float:
    """
    2つの数を安全に割り算します。
    
    Args:
        a: 割られる数
        b: 割る数
    
    Returns:
        割り算の結果
    
    Raises:
        ValueError: bが0の場合
    """
    try:
        if b == 0:
            raise ValueError("エラー: ゼロで割ることはできません")
        result = a / b
        return result
    except TypeError:
        raise ValueError("エラー: 数値を入力してください")
    except Exception as e:
        raise ValueError(f"予期しないエラー: {str(e)}")

if __name__ == "__main__":
    mcp.run()

エラーハンドリングのポイント:

  1. try-exceptブロックで例外を捕捉
  2. 意味のあるエラーメッセージを返す
  3. 適切な例外の種類を使用(ValueError、TypeErrorなど)
  4. Docstringでエラーの可能性を記述

4.6 型ヒントの重要性

FastMCPでは、型ヒントが非常に重要です。

型ヒントを使用することで、FastMCPが自動的にスキーマを生成します。

型ヒントなし(非推奨):

@mcp.tool()
def add(a, b):
    """2つの数を足し算します"""
    return a + b

この場合、FastMCPはaとbの型を自動的に推測できません。

型ヒントあり(推奨):

@mcp.tool()
def add(a: int, b: int) -> int:
    """2つの数を足し算します"""
    return a + b

この場合、FastMCPはaとbがint型であることを理解し、適切なスキーマを生成します。

より詳細な型ヒント:

from typing import List, Dict, Optional

@mcp.tool()
def process_data(
    items: List[str],
    config: Dict[str, any],
    timeout: Optional[int] = None
) -> Dict[str, any]:
    """
    データを処理します。
    
    Args:
        items: 処理する文字列のリスト
        config: 設定オプションの辞書
        timeout: タイムアウト時間(秒)、Noneの場合は無制限
    
    Returns:
        処理結果を含む辞書
    """
    # 処理を実行
    result = {"status": "success", "items": items}
    return result

4.7 Docstringのベストプラクティス

Docstringは、ツールの説明としてLLMに提供されます。

明確で詳細なDocstringを書くことで、LLMがツールを正しく使用できるようになります。

良いDocstringの例:

@mcp.tool()
def calculate_bmi(weight_kg: float, height_m: float) -> float:
    """
    BMI(ボディマス指数)を計算します。
    
    BMIは、体重(kg)を身長(m)の2乗で割った値です。
    健康的なBMIの範囲は18.5〜24.9とされています。
    
    Args:
        weight_kg: 体重(キログラム)、正の数値
        height_m: 身長(メートル)、正の数値
    
    Returns:
        BMI値(float)
    
    Example:
        >>> calculate_bmi(70, 1.75)
        22.86
    """
    if weight_kg <= 0 or height_m <= 0:
        raise ValueError("体重と身長は正の数値である必要があります")
    
    bmi = weight_kg / (height_m ** 2)
    return round(bmi, 2)

Docstringのセクション:

  1. 概要: ツールが何をするかの簡潔な説明
  2. 詳細説明: 必要に応じて追加情報
  3. Args: 各引数の説明
  4. Returns: 戻り値の説明
  5. Raises: 発生する可能性のある例外
  6. Example: 使用例

4.8 デフォルト引数の使用

ツールにデフォルト引数を設定することで、より柔軟に使用できます。

example.py:

from fastmcp import FastMCP

mcp = FastMCP("Flexible Tools")

@mcp.tool()
def greet(name: str, greeting: str = "こんにちは") -> str:
    """
    カスタマイズ可能な挨拶を返します。
    
    Args:
        name: 挨拶する相手の名前
        greeting: 挨拶の言葉(デフォルト: "こんにちは")
    
    Returns:
        挨拶文
    """
    return f"{greeting}{name}さん!"

if __name__ == "__main__":
    mcp.run()

使用例:

# デフォルト引数を使用
result1 = greet("太郎")  # "こんにちは、太郎さん!"

# カスタム挨拶を指定
result2 = greet("花子", "おはようございます")  # "おはようございます、花子さん!"

4.9 サーバーのメタデータ

FastMCPサーバーには、メタデータを追加できます。

metadata_server.py:

from fastmcp import FastMCP

# 依存関係を指定してサーバーを作成
mcp = FastMCP(
    name="Data Analyzer",
    dependencies=["pandas", "numpy", "matplotlib"]
)

@mcp.tool()
def analyze_data(data: list) -> dict:
    """データを分析します"""
    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(data)
    result = {
        "mean": float(np.mean(data)),
        "std": float(np.std(data)),
        "count": len(data)
    }
    return result

if __name__ == "__main__":
    mcp.run()

依存関係の指定:

dependenciesパラメータに依存パッケージのリストを指定すると、FastMCPが自動的にそれらをインストールします。


4.10 サーバーの実行オプション

サーバーを実行する際、さまざまなオプションを指定できます。

STDIOトランスポート(デフォルト):

if __name__ == "__main__":
    mcp.run()  # デフォルトでSTDIOを使用

HTTPトランスポート:

if __name__ == "__main__":
    mcp.run(transport="http", host="0.0.0.0", port=8000)

SSEトランスポート:

if __name__ == "__main__":
    mcp.run(transport="sse", host="127.0.0.1", port=8000)

Streamable HTTPトランスポート:

if __name__ == "__main__":
    mcp.run(
        transport="streamable-http",
        host="127.0.0.1",
        port=8000,
        path="/mcp"
    )

第5章: FastMCPの基本概念


5.1 ツール、リソース、プロンプトの違い

FastMCPには、3つの主要なコンポーネントがあります。

Tools(ツール):

  • LLMが実行できるアクション
  • 計算、API呼び出し、データベース操作など
  • POST/PUTリクエストに似ている
  • 副作用(データの変更)を伴う可能性がある

例: データベースにレコードを追加する、メールを送信する

Resources(リソース):

  • LLMに提供するデータ
  • 読み取り専用
  • GETリクエストに似ている
  • 副作用を伴わない

例: 設定ファイルの内容を取得する、ユーザープロフィールを読み取る

Prompts(プロンプト):

  • 再利用可能な対話テンプレート
  • LLMとの標準的なやり取りパターン
  • 一貫性のあるプロンプトを提供

例: コードレビューの依頼、要約の生成


5.2 いつツールを使うべきか

以下のような場合にツールを使用します。

1. アクションを実行する:

@mcp.tool()
def send_email(to: str, subject: str, body: str) -> str:
    """メールを送信します"""
    # メール送信処理
    return "メールを送信しました"

2. データを変更する:

@mcp.tool()
def update_user(user_id: int, name: str) -> dict:
    """ユーザー情報を更新します"""
    # データベースを更新
    return {"id": user_id, "name": name, "updated": True}

3. 計算を実行する:

@mcp.tool()
def calculate_interest(principal: float, rate: float, years: int) -> float:
    """複利計算を実行します"""
    return principal * ((1 + rate) ** years)

5.3 いつリソースを使うべきか

以下のような場合にリソースを使用します。

1. 静的なデータを提供する:

@mcp.resource("config://version")
def get_version() -> str:
    """アプリケーションのバージョンを返します"""
    return "2.0.1"

2. 読み取り専用のデータを公開する:

@mcp.resource("users://{user_id}/profile")
def get_user_profile(user_id: str) -> dict:
    """ユーザープロフィールを取得します"""
    # データベースから読み取り
    return {"id": user_id, "name": "太郎", "email": "taro@example.com"}

3. システム情報を提供する:

@mcp.resource("system://status")
def get_system_status() -> dict:
    """システムの状態を返します"""
    return {"status": "online", "uptime": 12345}

5.4 いつプロンプトを使うべきか

以下のような場合にプロンプトを使用します。

1. 標準的な対話パターンを定義する:

@mcp.prompt()
def code_review(code: str) -> str:
    """コードレビューを依頼します"""
    return f"以下のコードをレビューしてください:\n\n{code}"

2. 再利用可能なテンプレートを作成する:

@mcp.prompt()
def summarize_text(text: str, max_words: int = 100) -> str:
    """テキストを要約します"""
    return f"{max_words}語以内で以下のテキストを要約してください:\n\n{text}"

5.5 デコレータの使い方

FastMCPでは、デコレータを使用して関数を登録します。

基本的なデコレータ:

@mcp.tool()
def my_tool():
    pass

@mcp.resource("uri://pattern")
def my_resource():
    pass

@mcp.prompt()
def my_prompt():
    pass

デコレータのオプション:

# ツールの名前を指定
@mcp.tool(name="custom_name")
def my_function():
    pass

# プロンプトのタイトルを指定
@mcp.prompt(title="カスタムタイトル")
def my_prompt():
    pass

FastMCP入門ガイドの全文はこちら👇

4
4
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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?