Veltioblog

Python で MCP サーバーを実装し、Claude Desktop から利用する

Python で MCP サーバーを実装し、Claude Desktop から利用する方法を学んだので記録しました。


このブログは azukiazusa さんのブログの TypeScript で MCP サーバーを実装し、Claude Desktop から利用する に触発されて、Python で MCP サーバーを実装し、MCP ってどんなんだろうーというのを自分で学んでみた記録です。

そのため、僕のように MCP ってなんぞやみたいな人は azukiazusa さんのブログを読んでみると良いと思います。

このブログはあくまでそのブログを参考に、Python で MCP サーバーを実装して試してみたという二次ブログなので、そこはご了承ください。

題材

最近、領収書を処理するための AI ツールがほしいなと思っていたので、それを題材にしました。

実装は以下のリポジトリにあります。

https://github.com/zztkm/ryousyusyo-syori

この MCP サーバーを利用すると、以下のように領収書に記載の「日付」「店名」「金額」を抽出することができます。

MCP サーバーの利用例

ちなみに題材のツールは Ollama に依存しているので、もし利用される場合は README.md を読んで環境構築をしてください。

Python で MCP サーバーを実装する

Python で MCP サーバーを実装するときには FastMCP を利用しました。

Quickstart - FastMCP を読んでもらえれば分かる通り、非常に簡単に MCP サーバーを実装することができます。

実装例

from fastmcp import FastMCP

mcp = FastMCP("My MCP Server")

@mcp.tool()
def greet(name: str) -> str:
    return f"Hello, {name}!"

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

コードは https://gofastmcp.com/getting-started/quickstart#running-the-server より引用しています。

MCP サーバーを動かす

MCP サーバーを実装したら、次はどのように動かすかですが、僕は uv を使って動かしました。

まず、MCP サーバーの Python パッケージを uv tool でインストールします (ここらへんは ryousyusyo-syori リポジトリの README.md に書いてあります)。

uv tool install git+https://github.com/zztkm/ryousyusyo-syori

そうすると、以下のように MCP サーバーを起動することができます。

uvx --from ryousyusyo-syori ryousyusyo-server

uv だと言っていたのに、いきなり uvx を出してごめんなさい。

https://docs.astral.sh/uv/concepts/tools/ を読んでもらえれば分かる通り、uvxuv tool run のエイリアスです。

Claude Desktop から MCP サーバーを利用する

それでは、実際に MCP サーバーを Claude Desktop から利用してみましょう。

まず、Claude Desktop を起動し、設定を開いて、claude_desktop_config.json ファイルを開きます。

次に以下のように MCP サーバーの設定を追加します。

{
  "mcpServers": {
    "receiptProcessor": {
      "command": "uvx",
      "args": [
        "--from",
        "ryousyusyo-syori",
        "ryousyusyo-server"
      ]
    }
  }
}

この設定が完了したら、Claude Desktop を再起動します。

そうすると、MCP サーバーが起動し、Claude Desktop から利用できるようになります。

あとは、Claude Desktop のチャット画面で以下のように入力することで、MCP サーバーを利用することができます。

"C:\Users\you\Downloads\test.jpg"
このレシート画像の情報を抽出してください

結果は、最初にお見せしたスクリーンショットのようになります。

店舗名の解析はプロンプトを頑張れば精度をあげられるかもしれませんが、面倒なのでわかんない場合は「不明」にしてねと指示をしています、いつか改善したい...

まとめ

今回の学びは、MCP サーバーが持つ可能性を感じた、ということではなく、MCP サーバーを作ってそれを使うというのが思っていたよりも簡単だったということです。

これツール化したら便利そうだなと思ったら、Python でさくっと MCP サーバーを実装して、MCP クライアントから利用してみたら良いんだなと思います。