以下の内容はhttps://creators.bengo4.com/entry/2025/09/29/100000より取得しました。


自作リモート MCP サーバーを Claude Desktop から使えるようにする

自作リモートMCPサーバーをClaudeDesktopから使えるようにする

将来 AI に仕事を奪われるかもしれない職業… その 1 つであるエンジニアをしています弁護士ドットコム株式会社の井出です。

2024 年 11 月に Anthropic 社が発表した Model Context Protocol (以下、 MCP と略す) についてご存じでしょうか。GitHub や Playwright の MCP を日々活用しているなど MCP についてご存じの方も多いと思います。そのため詳しい説明は省略しますが、公式の説明としては以下のとおりです。

MCP (Model Context Protocol) is an open-source standard for connecting AI applications to external systems.

Model Context Protocol ドキュメント "What is MCP?" より抜粋

modelcontextprotocol.io

さて、GitHub などは公式が MCP サーバーを用意してくれているので問題ありません。しかし RAG を使った自社ドキュメント検索や自分用のエージェントの場合は自分たちで MCP サーバーを用意する必要があります。現状は Stdio Transport を使用して各種リモートリソースと接続するローカル MCP サーバーを構築している方が多いと思いますが、特に複数人が使用する場面においてはローカル MCP サーバーでは MCP サーバーのアップデート対応などが煩雑になってしまいます。一方で、MCP サーバーがリモートにあれば管理も集中的に行うことが可能になります。 このようにリモート MCP サーバーを作成して使うと便利なことがありますが、Claude Desktop などから呼び出すには工夫が必要です。

そこで今回はリモート MCP サーバーの作成と、それを Claude Desktop から使う方法を解説します。

今回やること

簡単なリモート MCP サーバーを作成して、Claude Desktop から呼び出せるようにします。 認可周りに関しては複雑かつ MCP の仕様策定状況が流動的なので今回は取り上げません。

アーキテクチャ概要

Claude Desktop からリモート MCP サーバー呼び出す方法は大きく 2 つあります。

  1. リモート MCP サーバーの コネクタ 機能で呼び出せるようにする。
  2. リモート MCP サーバーを呼び出すプロキシサーバーを作成し、ローカル MCP サーバーとして設定する。

1 番目の方法は OAuth を利用した認可の仕組みをきちんと実装する必要があるため「今回やること」で説明したように今回は取り上げません。そのため 2 番の方法を採用します。また今回利用する MCP フレームワークである FastMCP のプロキシサーバーは、リモート MCP サーバーから取得した情報を利用してあたかもローカル MCP サーバーのように振る舞います。なので一度作成してしまえばプロキシサーバーのコード変更は必要なくなります。

プロキシサーバー経由でリモートMCPサーバーを呼び出すアーキテクチャ図

技術スタック

利用する言語やソフトウェアは下記のとおりです。

Python 3.13

www.python.org

uv

github.com

FastMCP

github.com

Claude Desktop

claude.ai

FastMCP について

FastMCP は Python を使って MCP サーバーやクライアントの開発を容易にするフレームワークです。

FastMCP 2.0 has a comprehensive set of features that go far beyond the core MCP specification, all in service of providing the simplest path to production.

FastMCP GitHub の README より抜粋

github.com

バージョン 1.0 は公式の MCP Python SDK にも組み込まれており、MCP フレームワークの中でも人気のあるものの 1 つとなっています。

開発環境構築

この記事は Mac を前提として説明しています。Windows や Linux の方は、記述されているコマンドやパッケージマネージャをご自身の環境のものと読み替えて実行してください。

開発

以下の 3 つのソフトウェアを開発します。

  • リモート MCP サーバー
  • テスト MCP クライアント
  • プロキシサーバー

準備

事前に Homebrew をインストールしておいてください。

Python 3.13 インストール

brew install python@3.13

uv インストール

brew install uv

仮想環境構築

今回利用するプロジェクトディレクトリを作成します。

# リモート MCP サーバー
mkdir /path/to/test_mcp_server

# テスト MCP クライアント
mkdir /path/to/test_mcp_client

# プロキシサーバー
mkdir /path/to/test_mcp_proxy

それぞれ作成したディレクトリの中に入り仮想環境を構築します。

uv venv .venv -p 3.13
source .venv/bin/activate

プロジェクトを初期化します。

uv init

リモート MCP サーバー

FastMCP パッケージを追加します。

uv add fastmcp

main.py を下記のように修正します。

import asyncio
from fastmcp import FastMCP


mcp = FastMCP("My MCP Server")

@mcp.tool(
    title="Addition Calculator",
    description="Add two variables",
)
def sum(a: int, b: int) -> int:
    return a + b

async def main():
    await mcp.run_async(
        transport="streamable-http",
        host="127.0.0.1",
        port=10080,
        path="/mcp",
    )

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

動作を確認します。

PYTHONDONTWRITEBYTECODE=1 uv run main.py

ログを確認します。

╭────────────────────────────────────────────────────────────────────────────╮
│                                                                            │
│        _ __ ___  _____           __  __  _____________    ____    ____     │
│       _ __ ___ .'____/___ ______/ /_/  |/  / ____/ __ \  |___ \  / __ \    │
│      _ __ ___ / /_  / __ `/ ___/ __/ /|_/ / /   / /_/ /  ___/ / / / / /    │
│     _ __ ___ / __/ / /_/ (__  ) /_/ /  / / /___/ ____/  /  __/_/ /_/ /     │
│    _ __ ___ /_/    \____/____/\__/_/  /_/\____/_/      /_____(*)____/      │
│                                                                            │
│                                                                            │
│                                FastMCP  2.0                                │
│                                                                            │
│                                                                            │
│               🖥️  Server name:     My MCP Server                            │
│               📦 Transport:       Streamable-HTTP                          │
│               🔗 Server URL:      http://127.0.0.1:10080/mcp               │
│                                                                            │
│               🏎️  FastMCP version: 2.12.3                                   │
│               🤝 MCP SDK version: 1.14.0                                   │
│                                                                            │
│               📚 Docs:            https://gofastmcp.com                    │
│               🚀 Deploy:          https://fastmcp.cloud                    │
│                                                                            │
╰────────────────────────────────────────────────────────────────────────────╯


[09/16/25 17:17:25] INFO     Starting MCP server 'My MCP Server' with transport 'streamable-http' on http://127.0.0.1:10080/mcp                               server.py:1572
INFO:     Started server process [23753]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:10080 (Press CTRL+C to quit)

テスト MCP クライアント

FastMCP パッケージを追加します。

uv add fastmcp

main.py を下記のように修正します。

import asyncio
from fastmcp import FastMCP, Client


client = Client("http://127.0.0.1:10080/mcp/")

async def main():
    async with client:
        tools = await client.list_tools()
        print(tools)
        result = await client.call_tool("sum", {"a": 1, "b": 2})
        print(result)

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

動作を確認します。 事前にリモート MCP サーバーを立ち上げておいてください。

PYTHONDONTWRITEBYTECODE=1 uv run main.py

ログを確認します。

[Tool(name='sum', title='Addition Calculator', description='Add two variables', inputSchema={'properties': {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}, 'required': ['a', 'b'], 'type': 'object'}, outputSchema={'properties': {'result': {'title': 'Result', 'type': 'integer'}}, 'required': ['result'], 'title': '_WrappedResult', 'type': 'object', 'x-fastmcp-wrap-result': True}, annotations=None, meta={'_fastmcp': {'tags': []}})]
CallToolResult(content=[TextContent(type='text', text='3', annotations=None, meta=None)], structured_content={'result': 3}, data=3, is_error=False)

プロキシサーバー

FastMCP パッケージを追加します。

uv add fastmcp

main.py を下記のように修正します。

from fastmcp import FastMCP
from fastmcp.server.proxy import ProxyClient


proxy_client = ProxyClient("http://127.0.0.1:10080/mcp/")

proxy = FastMCP.as_proxy(
    proxy_client,
    name="MCP Proxy Server",
)

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

動作を確認します。 事前にリモート MCP サーバーを立ち上げておいてください。

PYTHONDONTWRITEBYTECODE=1 uv run main.py

ログを確認します。

╭────────────────────────────────────────────────────────────────────────────╮
│                                                                            │
│        _ __ ___  _____           __  __  _____________    ____    ____     │
│       _ __ ___ .'____/___ ______/ /_/  |/  / ____/ __ \  |___ \  / __ \    │
│      _ __ ___ / /_  / __ `/ ___/ __/ /|_/ / /   / /_/ /  ___/ / / / / /    │
│     _ __ ___ / __/ / /_/ (__  ) /_/ /  / / /___/ ____/  /  __/_/ /_/ /     │
│    _ __ ___ /_/    \____/____/\__/_/  /_/\____/_/      /_____(*)____/      │
│                                                                            │
│                                                                            │
│                                FastMCP  2.0                                │
│                                                                            │
│                                                                            │
│                 🖥️  Server name:     MCP Proxy Server                       │
│                 📦 Transport:       STDIO                                  │
│                                                                            │
│                 🏎️  FastMCP version: 2.12.3                                 │
│                 🤝 MCP SDK version: 1.14.0                                 │
│                                                                            │
│                 📚 Docs:            https://gofastmcp.com                  │
│                 🚀 Deploy:          https://fastmcp.cloud                  │
│                                                                            │
╰────────────────────────────────────────────────────────────────────────────╯


[09/16/25 18:31:31] INFO     Starting MCP server 'MCP Proxy Server' with transport 'stdio'

Claude Desktop 設定

Claude Desktop の 設定 > 開発者 を開くと下記画像の 設定を編集 ボタンがあります。

設定編集ボタンが表示されている様子

このボタンを押下すると claude_desktop_config.json ファイルのディレクトリが表示されるので、ファイルを開いて編集してください。プロキシサーバーの設定は下記のようになります。

{
  "mcpServers": {
    "addition-calculator": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/test_mcp_proxy/",
        "run",
        "main.py"
      ],
      "env": {
        "PYTHONPATH": "/path/to/test_mcp_proxy/",
        "PYTHONDONTWRITEBYTECODE": "1"
      }
    }
  }
}

json ファイルを保存したら、Claude Desktop を終了させてから起動してください。☓ ボタンを押しただけでは終了しておらず、画面上から消えているだけなので、Claude Desktop のメニューから 終了 を選んで終了させてください。

実行 ! !

下記のようにプロンプトを入力してください。

Additional Calculator を使って下記の足し算をしなさい。
1 + 2

Claude Desktop がプロキシサーバーを呼び出そうとすると下記ダイアログが表示されますので実行を許可してください。

プロキシサーバーの呼び出し許可を求めるダイアログが表示されている様子

プロキシサーバーおよびリモート MCP サーバーの呼び出しが成功すると下記図のように、1 と 2 が引数として与えられ、計算結果の 3 が取得できていることを確認できます。

リモートMCPサーバーからの出力結果が表示されている様子

まとめ

このようにプロキシサーバーを利用することでリモート MCP サーバーを簡単に Claude Desktop から呼び出すことが可能になります。リモート MCP サーバーを本格的にサービスに投入するにはまだ仕様や周辺技術が流動的ということもあり難しいというのが現状です。しかし個人などの限定的な状況でなら便利に使える場面があると考えています。 仕事を奪い合うのではなく AI と共創していく未来を信じていろいろアイデアを考えて試していきたいですね ! 弁護士ドットコムでは AI をどう活用するか考え、開発の現場やサービスへの導入を試行錯誤しています。そういったことに挑戦してみたいエンジニアはぜひ応募を考えていただければと思います。

hrmos.co




以上の内容はhttps://creators.bengo4.com/entry/2025/09/29/100000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14