😸

Pythonで簡単なMCPサーバーを自作してみた

に公開

前回はplaywright MCPをclaude desktopで動かしてみたので
https://zenn.dev/dxclab/articles/c745dd3c69c77b
今回は自作したMCPサーバーをclaude desktopから動かしてみようと思います。

TypeScriptやJavaなどもありますが、今回はPython公式SDKをみながら作ってみます。
https://github.com/modelcontextprotocol/python-sdk?tab=readme-ov-file#mcp-python-sdk

1. MCPサーバー作成

作るのは日本語の日付(例:"2025年4月8日")をYYYY-MM-DD形式に変換するだけのシンプルなものです。Claude for desktopで自然言語で指示を送り、ツールを使って変換してもらいます。

プロジェクトの作成

公式が推奨しているuvを使って仮想環境でプロジェクトフォルダを作成します。

uv init mcp-server-demo
cd mcp-server-demo
uv add "mcp[cli]"

*uv add mcpを実行するにはpythonのバージョンが3.10以上である必要があります。

コード作成

mcp-server-demoのなかにserver.pyを作り、以下のコードを記述します。

from mcp.server.fastmcp import FastMCP
from datetime import datetime

mcp = FastMCP("DateConverter")

@mcp.tool()
def convert_date_format(text: str) -> str:
    try:
        dt = datetime.strptime(text, "%Y年%m月%d日")
        return dt.strftime("%Y-%m-%d")
    except Exception as e:
        return f"変換に失敗しました: {e}"

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

tool部分以外はSDKのQuickstart通りに書いています。

Claude for desktopの設定

Claude for desktopの設定ファイルであるclaude_desktop_config.jsonに以下のように記述することで、今回作ったdate-converterをclaudeで起動できるようになります。

{
  "mcpServers": {
    "date-converter": {
      "command": "uv",
      "args": [
        "--directory",
        "<mcp-server-demoの絶対パス>,
        "run",
        "server.py"
      ],
      "alwaysAllow": ["convert_date_format"],
      "disabled": false
    }
  }
}

argscommandに渡す引数リストであり、実行コマンドとしてはこうなります。
uv --directory <mcp-server-demoの絶対パス> run server.py
alwaysAllowにツール名を指定することで、ツール呼び出し時の確認ダイアログをスキップさせます。
disabledfalseにしておけばMCPサーバーを有効にできます。
Claude Desktopを再起動後、このMCPサーバーが使えるようになります。

2. Claude desktopで実行

プロンプトで以下のように指示します。

2025年5月6日をMCPを使ってyyyy-mm-dd形式に変換してください。

以下のように、MCPサーバーを使用してYYYY-MM-DD形式に変換してくれました。

date-converterのMCPサーバーを使用して、2025年5月6日を2025-05-06(yyyy-mm-dd形式)に変換しました!

3. まとめ

今回はPythonで簡単なMCPサーバーを作り、claude desktopで動かしてみました。
LLMが不得意なタスクはMCPで確実に処理させるなど、便利な使い方ができそうです。

Discussion