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())
このコードのポイントを説明します:
- FastMCPクラス:簡単なMCPサーバー実装を提供
- @mcp.tool()デコレータ:関数をMCPツールとして登録
- TypeHint:引数と戻り値の型を明示(必須)
- docstring:ツールの説明文(Claude が参照)
- stdio_server:標準入出力による安全な通信
MCPサーバーの仕組みとして、Toolsという概念があります。Toolsは、Claudeが実行できる機能の単位です。上記の例では、hello_worldとadd_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つの実用的なツールを追加しました:
- ファイル読み取り:テキストファイルの内容を取得
- ファイル書き込み:内容をファイルに保存
- 天気情報取得:外部API連携の例
- ディレクトリ一覧:フォルダ構成の確認
リソース機能の実装
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ツールの可能性が大きく広がります。
