
将来 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?" より抜粋
さて、GitHub などは公式が MCP サーバーを用意してくれているので問題ありません。しかし RAG を使った自社ドキュメント検索や自分用のエージェントの場合は自分たちで MCP サーバーを用意する必要があります。現状は Stdio Transport を使用して各種リモートリソースと接続するローカル MCP サーバーを構築している方が多いと思いますが、特に複数人が使用する場面においてはローカル MCP サーバーでは MCP サーバーのアップデート対応などが煩雑になってしまいます。一方で、MCP サーバーがリモートにあれば管理も集中的に行うことが可能になります。 このようにリモート MCP サーバーを作成して使うと便利なことがありますが、Claude Desktop などから呼び出すには工夫が必要です。
そこで今回はリモート MCP サーバーの作成と、それを Claude Desktop から使う方法を解説します。
今回やること
簡単なリモート MCP サーバーを作成して、Claude Desktop から呼び出せるようにします。 認可周りに関しては複雑かつ MCP の仕様策定状況が流動的なので今回は取り上げません。
アーキテクチャ概要
Claude Desktop からリモート MCP サーバー呼び出す方法は大きく 2 つあります。
- リモート MCP サーバーの
コネクタ機能で呼び出せるようにする。 - リモート MCP サーバーを呼び出すプロキシサーバーを作成し、ローカル MCP サーバーとして設定する。
1 番目の方法は OAuth を利用した認可の仕組みをきちんと実装する必要があるため「今回やること」で説明したように今回は取り上げません。そのため 2 番の方法を採用します。また今回利用する MCP フレームワークである FastMCP のプロキシサーバーは、リモート MCP サーバーから取得した情報を利用してあたかもローカル MCP サーバーのように振る舞います。なので一度作成してしまえばプロキシサーバーのコード変更は必要なくなります。

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