シンプルな四則演算MCPサーバーを作ってClaude for Desktopから使ってみる

# はじめに
最近MCPという言葉をよく見かけるため、キャッチアップ目的で四則演算を行う簡単なMCPサーバーを作成してみました。
本記事では、Claude for DesktopとMCPサーバを連携させて、プロンプト入力～レスポンスを取得できるところまで確認してみます。

# ゴール
Claude for Desktopで入力したプロンプト対し、MCPサーバで四則演算を実行してレスポンスが返ってくることまで確認します。
以下画像のようなイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/efcad013-b32c-4b5c-b268-2a7d332b282b.png)

# 環境
- mcp：1.6.0
- python：3.12

## 環境構築

### uvパッケージマネージャのインストール

まず、RustベースのPythonパッケージ管理ツールであるuvをインストールします。

https://docs.astral.sh/uv/#highlights

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

mac、Linuxのインストールコマンドについては以下のドキュメントに記載されてます。

https://docs.astral.sh/uv/getting-started/installation/#standalone-installer


### プロジェクト作成と仮想環境のセットアップ

pythonプロジェクトの作成と仮想環境の有効化を行います。

- `uv init`： Python プロジェクトを作成
- `uv venv`：仮想環境の作成
- `.venv\Scripts\activate`：仮想環境をアクティブにする

https://docs.astral.sh/uv/getting-started/features/#projects
https://docs.astral.sh/uv/getting-started/features/#the-pip-interface
https://docs.astral.sh/uv/pip/environments/#using-a-virtual-environment

```PowerShell:PowerShell
uv init .
uv venv
.venv\Scripts\activate
```

### 必要なパッケージのインストール

MCPサーバーの実装に必要なパッケージをインストールします。

```PowerShell:PowerShell
uv add "mcp[cli]"
```

https://pypi.org/project/mcp/#installation

## 四則演算MCPサーバーの実装

四則演算を行うスクリプトを作成します。
`calculator.py`ファイルを作成し、以下のコードを記述します。

以下のスクリプトでは次の4つの計算機能を実装しています。

1. `add`：2つの数値を足し算する
2. `subtract`：第一引数から第二引数を引く
3. `multiply`：2つの数値を掛け算する
4. `divide`：第一引数を第二引数で割る

```python:calculator.py
from typing import Union
from mcp.server.fastmcp import FastMCP

# MCPサーバー初期化
mcp = FastMCP("calculator")

@mcp.tool()
async def add(a: Union[int, float], b: Union[int, float]) -> str:
    """足し算"""
    result = float(a + b)
    return f"[MCP計算] {a} + {b} = {result}"

@mcp.tool()
async def subtract(a: Union[int, float], b: Union[int, float]) -> str:
    """引き算"""
    result = float(a - b)
    return f"[MCP計算] {a} - {b} = {result}"

@mcp.tool()
async def multiply(a: Union[int, float], b: Union[int, float]) -> str:
    """掛け算"""
    result = float(a * b)
    return f"[MCP計算] {a} × {b} = {result}"

@mcp.tool()
async def divide(a: Union[int, float], b: Union[int, float]) -> str:
    """割り算"""
    if b == 0:
        raise ZeroDivisionError("0で割ることはできません")
    result = float(a / b)
    return f"[MCP計算] {a} ÷ {b} = {result}"

if __name__ == "__main__":
    # サーバー起動
    mcp.run(transport='stdio')
```

各関数に`@mcp.tool()`デコレータを付けることで、これらの関数がMCPツールとして登録されます。
また、Claude for Desktopで表示される計算結果がMCP経由であることを視覚的に確認したいので、返り値のプレフィックスに`[MCP計算]`の文字列と記載しました。

## Claude for Desktopとの連携方法

### 設定ファイルの編集

Claude for Desktopをインストール後、設定ファイルを編集してMCPサーバーと連携させます。

https://claude.ai/download

編集したい設定ファイルは、`claude_desktop_config.json`です。
Claude for Desktopを起動して、`Ctrl+,`で設定ページを開きます。
開発者タブ > 構成を編集 を押下すると`claude_desktop_config.json`が存在する階層をエクスプローラーで開けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/163bc1d4-15c5-4c63-92e0-0e67098533f3.png)

設定ファイルに以下の内容を追記します。

```json:claude_desktop_config.json
{
    "mcpServers": {
        "calculator": {
            "command": "uv",
            "args": [
                "--directory",
                "calculator.pyが存在する階層の絶対パス",
                "run",
                "calculator.py"
            ]
        }
    }
}
```

https://modelcontextprotocol.io/quickstart/server#testing-your-server-with-claude-for-desktop

ディレクトリ階層の絶対パスについてpowershellでpwdで取得すると、
```
~~\hoge1\hoge2\hoge3
```
のような形式ですがこのまま記載するとJSONのフォーマットエラーになりました。
 > Invalid escape character in string.
 
パスを指定する際にはバックスラッシュを二重にする（`\\`）形で記載しました。
```:修正後
~~\\hoge1\\hoge2\\hoge3
```

## 実際に動かしてみる
設定が完了したら、Claude for Desktopを再起動します。

起動後、左下のツールアイコン（ハンマー）をクリックすると、登録したMCPツールが4つ表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/7b45c07d-b87f-4bdd-99f5-3e78084b82e6.png)

このくらいの計算であればMCPを使わずともできそうですが、今回はMCP経由で計算を行いたいので明示的にMCPを使うことをプロンプトに記載してみます。

```:プロンプト
5 + 3は？ MCPを使って計算して
```

:::note warn
ポップアップの表示について

 > “calculator”（ローカル）からのツールを許可しますか？

プロンプト入力後、上記文言のポップアップが出たので本記事ではこれを許可しています。
:::


以下のレスポンスが返ってきました。

```:レスポンス
5 + 3の計算をツールを使って行います。

[MCP計算] 5 + 3 = 8.0

ツールを使って計算した結果、5 + 3 = 8です。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/efcad013-b32c-4b5c-b268-2a7d332b282b.png)

「addの結果を表示」という折りたたみセクションの表示から、MCPツールのaddが使われていることが分かります。

試しに掛け算、割り算も試してみました。

```:プロンプト
(23.45 × 67.89) ÷ 13.5 は？ MCPを使って計算して
```

以下のようにMCPツールのmultiply（掛け算）、divide（割り算）を使えてそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/66ffd3b7-7629-4225-a004-22e5e1831253.png)


## 終わりに

本記事では、シンプルな四則演算を行うMCPサーバーを作成し、Claude for Desktopから呼び出してみました。
今回はMCPサーバから外部のAPIを叩くようなことはしませんでしたが、近々やってみようと思います。


# 参考

- https://zenn.dev/coco9122/articles/mcp-server-coco9122
- https://dev.classmethod.jp/articles/model-context-protocol-weather-server-tutorial/
- https://modelcontextprotocol.io/quickstart/server#windows
- https://docs.astral.sh/uv/#highlights
- https://docs.astral.sh/uv/getting-started/features/#projects
- https://docs.astral.sh/uv/getting-started/features/#the-pip-interface
- https://docs.astral.sh/uv/pip/environments/#using-a-virtual-environment