Claude MCPサーバー作成ガイド – AIアプリ連携を10分で実装

プラグのような接続コネクタが複数の光る回路に繋がっている様子

Claudeの機能をもっと拡張したいと思いませんか?独自のツールやAPIと連携させて、AIアシスタントをより強力にしたいけれど、実装が複雑で手が出せない…。そんな課題を解決するのがMCPサーバーです。

この記事では、Claude連携のMCPサーバーをPythonで実装する方法を、初心者にもわかりやすく解説します。10分で動く最小構成から実用的な機能追加まで、段階的に説明します。コピペで使えるサンプルコード付きなので、すぐに実践できます。

目次

MCPサーバーとは

Model Context Protocolの概要

MCPサーバーを理解するために、まずModel Context Protocol(MCP)について説明します。MCPは2024年11月にAnthropicが発表した標準プロトコルで、AIアプリケーションと外部システムを安全に連携させるための仕組みです。

AnthropicはMCPを「AI用のUSB-Cポートのような役割を果たす」と表現しています。つまり、異なるアプリケーション同士を標準的な方法で接続できる技術です。

MCPの特徴は以下の通りです:

  • 標準化された通信:JSON-RPCベースの通信プロトコルを採用
  • 安全性:stdio(標準入出力)による安全な通信方式
  • 多言語対応:TypeScript、Python、Rust SDKが利用可能

実際に、MCPはLinux Foundation下のAgentic AI Foundationに寄贈され、OpenAI、Google、Microsoft、AWSなどの主要企業がサポートを表明しています。月間97百万回のSDKダウンロード実績もあり、業界標準として急速に普及しています。

Claude連携のメリット

MCPサーバーを実装してClaude連携することで、以下のメリットが得られます:

メリット 具体例
機能拡張 ファイル操作、データベースアクセス、Web API呼び出し
リアルタイム情報 最新の株価、天気、ニュース取得
業務システム連携 CRM、メール送信、タスク管理ツール
専門ツール統合 画像生成、音声変換、データ解析

例えば、あなたの会社の顧客管理システムとClaude連携すれば、Claudeに質問するだけで情報を取得できます。「顧客Aの過去の購入履歴を教えて」と聞けば、データベースから情報を取得して回答してくれます。

従来のAI連携は複雑なAPI開発が必要でしたが、MCPサーバーを使えば標準的な仕組みで簡単に実装できるのです。

開発環境の準備

工具箱から整理された開発ツールが配置されている様子
開発に必要なツールと環境を整備

Python環境とSDKのインストール

MCPサーバー開発を始めるには、Python環境の準備が必要です。まず、Python 3.8以上がインストールされていることを確認してください。

次に、公式Python SDKをインストールします:


pip install mcp

プロジェクトを効率的に始めるために、公式プロジェクトテンプレート生成ツールも活用できます:


# 新規プロジェクト作成
npx @modelcontextprotocol/create-python-server my-mcp-server
cd my-mcp-server

このツールを使えば、コマンド一つで初期プロジェクト構成が作成されます。TypeHintとdocstringからの自動ツール定義機能も備えているため、開発効率が大幅に向上します。

Claude Desktopの設定準備

Claude Desktopは、MCPサーバーを実際にテストするためのクライアントアプリケーションです。まだインストールしていない場合は、公式サイトからダウンロードしてください。

Claude Desktopの設定ファイルは以下の場所にあります:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

後ほど、作成したMCPサーバーをこの設定ファイルに登録して連携テストを行います。

10分で作る最小MCPサーバー

プロジェクト初期化

最初に、最もシンプルなMCPサーバーを作ってみましょう。新しいディレクトリを作成して、必要なファイルを準備します:


mkdir simple-mcp-server
cd simple-mcp-server

requirements.txtを作成します:


mcp>=1.0.0

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


pip install -r requirements.txt

最小構成のコード実装

公式Python SDKのFastMCPクラスを使用して、最小構成のMCPサーバーを実装します。server.pyファイルを作成してください:


#!/usr/bin/env python3
import asyncio
from mcp.server.fastmcp import FastMCP

# MCPサーバーのインスタンスを作成
mcp = FastMCP("Simple MCP Server")

@mcp.tool()
def hello_world() -> str:
    """
    シンプルな挨拶メッセージを返します
    
    Returns:
        str: 挨拶メッセージ
    """
    return "Hello from MCP Server!"

@mcp.tool()
def add_numbers(a: int, b: int) -> int:
    """
    2つの数値を足し算します
    
    Args:
        a: 最初の数値
        b: 2番目の数値
    
    Returns:
        int: 計算結果
    """
    return a + b

async def main():
    from mcp.server.stdio import stdio_server
    async with stdio_server() as (read_stream, write_stream):
        await mcp.run(read_stream, write_stream, mcp.create_initialization_options())

if __name__ == "__main__":
    asyncio.run(main())

このコードのポイントを説明します:

  1. FastMCPクラス:簡単なMCPサーバー実装を提供
  2. @mcp.tool()デコレータ:関数をMCPツールとして登録
  3. TypeHint:引数と戻り値の型を明示(必須)
  4. docstring:ツールの説明文(Claude が参照)
  5. stdio_server:標準入出力による安全な通信

MCPサーバーの仕組みとして、Toolsという概念があります。Toolsは、Claudeが実行できる機能の単位です。上記の例では、hello_worldadd_numbersの2つのツールを定義しています。

Claude Desktopとの接続

作成したMCPサーバーをClaude Desktopから使えるように設定します。Claude Desktopの設定ファイル(claude_desktop_config.json)を以下のように編集してください:


{
  "mcpServers": {
    "simple-server": {
      "command": "python",
      "args": ["/path/to/your/simple-mcp-server/server.py"]
    }
  }
}

注意/path/to/your/simple-mcp-server/の部分は、あなたの実際のプロジェクトパスに置き換えてください。

設定完了後、Claude Desktopを再起動してください。正常に接続されると、画面下部に「🔧」アイコンが表示され、利用可能なツールが確認できます。

Claude で「2と3を足してください」と質問すると、add_numbersツールが実行されて「5」という結果が返されるはずです。これで、最小構成のMCPサーバーが完成しました!

実用的なMCPサーバー実装例

複数の歯車が組み合わさって動作している機械装置
高度な機能を組み合わせた実用実装

ツール機能の追加

基本的なMCPサーバーができたので、より実用的な機能を追加してみましょう。ファイル操作とWeb API連携の例を実装します。

advanced_server.pyを作成します:


#!/usr/bin/env python3
import asyncio
import json
import os
from datetime import datetime
from typing import Dict, List
import requests
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Advanced MCP Server")

@mcp.tool()
def read_file(file_path: str) -> str:
    """
    指定されたファイルの内容を読み取ります
    
    Args:
        file_path: 読み取るファイルのパス
    
    Returns:
        str: ファイルの内容
    """
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            return file.read()
    except FileNotFoundError:
        return f"エラー: ファイル '{file_path}' が見つかりません"
    except Exception as e:
        return f"エラー: {str(e)}"

@mcp.tool()
def write_file(file_path: str, content: str) -> str:
    """
    指定されたファイルに内容を書き込みます
    
    Args:
        file_path: 書き込み先ファイルのパス
        content: 書き込む内容
    
    Returns:
        str: 操作結果のメッセージ
    """
    try:
        os.makedirs(os.path.dirname(file_path), exist_ok=True)
        with open(file_path, 'w', encoding='utf-8') as file:
            file.write(content)
        return f"ファイル '{file_path}' に正常に書き込みました"
    except Exception as e:
        return f"エラー: {str(e)}"

@mcp.tool()
def get_weather(city: str) -> Dict:
    """
    指定された都市の天気情報を取得します(OpenWeatherMap API使用)
    
    Args:
        city: 都市名(日本語可)
    
    Returns:
        Dict: 天気情報
    """
    api_key = os.getenv('OPENWEATHER_API_KEY')
    if not api_key:
        return {"error": "OpenWeatherMap API キーが設定されていません"}
    
    try:
        url = f"http://api.openweathermap.org/data/2.5/weather"
        params = {
            'q': city,
            'appid': api_key,
            'units': 'metric',
            'lang': 'ja'
        }
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()
        
        data = response.json()
        return {
            "city": data["name"],
            "temperature": data["main"]["temp"],
            "description": data["weather"][0]["description"],
            "humidity": data["main"]["humidity"],
            "timestamp": datetime.now().isoformat()
        }
    except requests.RequestException as e:
        return {"error": f"API リクエストエラー: {str(e)}"}
    except Exception as e:
        return {"error": f"予期しないエラー: {str(e)}"}

@mcp.tool()
def list_directory(directory_path: str) -> List[Dict]:
    """
    指定されたディレクトリの内容一覧を取得します
    
    Args:
        directory_path: ディレクトリのパス
    
    Returns:
        List[Dict]: ファイル・フォルダの情報リスト
    """
    try:
        items = []
        for item in os.listdir(directory_path):
            item_path = os.path.join(directory_path, item)
            items.append({
                "name": item,
                "type": "directory" if os.path.isdir(item_path) else "file",
                "size": os.path.getsize(item_path) if os.path.isfile(item_path) else None,
                "modified": datetime.fromtimestamp(os.path.getmtime(item_path)).isoformat()
            })
        return items
    except Exception as e:
        return [{"error": f"ディレクトリ読み取りエラー: {str(e)}"}]

async def main():
    from mcp.server.stdio import stdio_server
    async with stdio_server() as (read_stream, write_stream):
        await mcp.run(read_stream, write_stream, mcp.create_initialization_options())

if __name__ == "__main__":
    asyncio.run(main())

この実装では、4つの実用的なツールを追加しました:

  1. ファイル読み取り:テキストファイルの内容を取得
  2. ファイル書き込み:内容をファイルに保存
  3. 天気情報取得:外部API連携の例
  4. ディレクトリ一覧:フォルダ構成の確認

リソース機能の実装

MCPには、ToolsとResourcesという2つの機能提供方式があります。Toolsは実行可能な機能、Resourcesは読み取り可能な情報源です。

Resourcesを追加した例:


@mcp.resource("file://logs/{filename}")
def read_log_file(filename: str) -> str:
    """
    ログファイルの内容を読み取り専用で提供します
    
    Args:
        filename: ログファイル名
    
    Returns:
        str: ログファイルの内容
    """
    log_path = f"logs/{filename}"
    try:
        with open(log_path, 'r', encoding='utf-8') as file:
            return file.read()
    except Exception as e:
        return f"ログファイル読み取りエラー: {str(e)}"

Resourcesを使うことで、Claudeが参照する情報源を効率的に管理できます。

エラーハンドリング

実用的なMCPサーバーには、適切なエラーハンドリングが必要です。上記のコードでも実装していますが、重要なポイントをまとめます:

エラータイプ 対処法
外部API通信エラー タイムアウト設定、リトライ機構 timeout=10
ファイルアクセスエラー 存在確認、権限チェック FileNotFoundError
環境設定エラー 必須設定の事前確認 os.getenv() チェック
予期しないエラー 汎用的な例外キャッチ except Exception

エラーメッセージは、Claudeと利用者の両方にとってわかりやすい形で返すことが重要です。

本番運用の注意点

盾のシンボルと安全な金庫が組み合わされたセキュリティの概念図
本番環境でのセキュリティと安定性

セキュリティ設定

MCPサーバーを本番環境で運用する際は、セキュリティ対策が不可欠です。重要な設定項目を紹介します:

環境変数による機密情報管理: API キーやデータベース接続情報は、環境変数で管理してください。


import os
from dotenv import load_dotenv

load_dotenv()

API_KEY = os.getenv('OPENWEATHER_API_KEY')
DB_PASSWORD = os.getenv('DATABASE_PASSWORD')

入力値検証: ユーザーからの入力は必ず検証してください。


import os.path

def read_file(file_path: str) -> str:
    # パストラバーサル攻撃の防止
    if '..' in file_path or file_path.startswith('/'):
        return "エラー: 不正なファイルパスです"
    
    # 許可されたディレクトリ内のファイルのみアクセス
    safe_path = os.path.join('allowed_directory', file_path)
    # 以下、ファイル読み取り処理...

権限制限: MCPサーバーは最小限の権限で実行してください。本番環境では、専用のユーザーアカウントを作成することを推奨します。

パフォーマンス最適化

本番運用では、パフォーマンス最適化も重要です:

非同期処理の活用


import asyncio
import aiohttp

@mcp.tool()
async def fetch_multiple_urls(urls: List[str]) -> List[Dict]:
    """
    複数のURLを並行して取得します
    """
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_url(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        return results

キャッシュ機能: 頻繁にアクセスされるデータはキャッシュして、レスポンス時間を改善してください。

ログ出力: 運用中の問題調査のために、適切なログ出力を実装することも大切です。


import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@mcp.tool()
def important_operation() -> str:
    logger.info("重要な処理を開始")
    try:
        # 処理内容
        result = "処理完了"
        logger.info(f"処理結果: {result}")
        return result
    except Exception as e:
        logger.error(f"処理エラー: {str(e)}")
        return f"エラーが発生しました: {str(e)}"

FAQ

Q: MCPサーバーの作成にPython以外の言語は使えますか?

A: はい、Model Context Protocolの公式仕様によると、TypeScript、Python、Rust SDKが利用可能です。ただし、Python SDKが最も豊富な機能と文書を提供しているため、初心者にはPythonをお勧めします。

Q: Claude Desktop以外のクライアントでMCPサーバーは使えますか?

A: はい、Claude CodeやAI Workstationなど、MCPプロトコルに対応した任意のクライアントで使用できます。MCPは標準プロトコルなので、対応アプリケーションが増えることが期待されます。

Q: 作成したMCPサーバーで商用サービスはできますか?

A: MCPプロトコル自体はオープンソースで、商用利用に制限はありません。ただし、連携する外部サービス(OpenWeatherMap APIなど)の利用規約は別途確認が必要です。

Q: MCPサーバーの動作が不安定な場合の対処法は?

A: まず、ログファイルでエラー内容を確認してください。よくある原因は、環境変数の設定不備、ファイルパスの間違い、外部API制限の超過などです。また、Claude Desktopを再起動すると解決する場合もあります。

Q: 複数のMCPサーバーを同時に使うことはできますか?

A: はい、Claude Desktopの設定ファイルで複数のMCPサーバーを登録すれば、同時に利用できます。ツール名が重複しないよう注意してください。

まとめ

この記事では、Claudeと連携するMCPサーバーの作成方法を、基礎から実用レベルまで詳しく解説しました。重要なポイントをまとめます:

  • MCPは2024年11月にAnthropicが発表した標準プロトコルで、AI連携の新しいスタンダード
  • Python SDKを使えば、わずか10分で基本的なMCPサーバーを実装可能
  • Tools機能で実行可能な機能を、Resources機能で参照可能な情報源を提供
  • 本番運用では、セキュリティ対策とパフォーマンス最適化が重要

次のステップとして、あなたの業務に特化したツールを追加してみてください。例えば、社内データベース連携、メール送信、画像処理など、具体的なニーズに応じた機能を実装することで、Claudeがより強力なアシスタントになります。

また、Claude 3.5 Sonnetの詳しいレビューも参考にして、Claude の最新機能を活用してください。MCPサーバーと組み合わせることで、AIツールの可能性が大きく広がります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次