MCPサーバーをVPSで動かしてAIエージェントにツールを持たせる

※本ページには広告(アフィリエイトプログラム等)が含まれます。

※本ページには広告(アフィリエイトプログラム等)が含まれます。コマンドの出力は 2026年8月16日時点で運用中の VPS(Debian 12・メモリ 958MB)から採取した実測値、API の仕様は同日の Anthropic 公式ドキュメントの記載です。

🎯 結論:VPS に置けるが、Debian 12 では pip の段階で止まる

結論から書きます。MCP サーバーは常駐プロセスなので VPS と相性がよく、メモリ 958MB の小さな箱でも動きます。ただし Debian 12 では最初の pip install で止まります。pip が入っていないうえ、システムの Python が「外部管理」としてロックされているためです。

もう 1 つ、Claude API から呼ぶときの落とし穴があります。サーバーを登録するだけでは動かず、ツールセットの宣言とセットで書く必要があります。片方だけだとバリデーションエラーになります。

  • 常駐させる → systemd の unit ファイル。Restart=always で自動復帰
  • ⚠️ Debian 12 の Pythonpip 未導入 + PEP 668 でロックpython3-venv を先に入れる
  • ⚠️ Claude API から呼ぶmcp_serversmcp_toolset両方が必要
  • 公開ポートに素で置く → 公開ポートは置いた瞬間から総当たりの対象になる

MCP とは何か

AI とツールをつなぐ共通の口

MCP(Model Context Protocol)は、AI モデルに外部のツールやデータを渡すための共通プロトコルです。サービスごとに独自の連携を書く代わりに、1 つの決まった形でサーバーを立てれば、対応するクライアントから使えるという考え方です。

ホストとサーバー

構成は単純で、AI 側(ホスト/クライアント)と、機能を提供する側(サーバー)に分かれます。VPS に置くのはサーバー側です。自前のデータベースを検索させたい、社内の API を叩かせたい、といった用途がここに入ります。

VPS と相性がいい理由

MCP サーバーは起動しっぱなしの常駐プロセスです。ローカル PC だと電源を切ると止まりますが、VPS なら止まりません。この性質は systemd で管理する常駐サービスとまったく同じなので、既存の運用にそのまま乗ります

トランスポートを選ぶ

ローカルは stdio、リモートは HTTP 系

トランスポート 使う場面 ネットワーク露出
stdio 同じマシンでクライアントが起動する なし
HTTP 系 別のマシン・クラウドから呼ぶ あり/対策が必要

VPS に置いて外から呼ぶなら HTTP 系になります。ここで初めてネットワークに口が開くので、後述のセキュリティの話が効いてきます。

迷ったら stdio で作ってから移す

最初から HTTP で組むと、認証やエラーハンドリングの問題と、ツールのロジックの問題が同時に降ってきます。stdio で動くものを作ってからトランスポートを差し替えるほうが切り分けが楽です。

⚠️ Debian 12 で最初に詰まるところ

pip が入っていない

Debian 12 のクリーンな環境で Python の依存を入れようとすると、まずここで止まります。

$ python3 --version
Python 3.11.2

$ python3 -m pip --version
/usr/bin/python3: No module named pip

システムの Python はロックされている

pip を入れても、そのままではシステムの Python に書き込めません。PEP 668 のマーカーファイルが置かれているためです。

$ ls /usr/lib/python3.11/EXTERNALLY-MANAGED
/usr/lib/python3.11/EXTERNALLY-MANAGED

このファイルがあると、pip installexternally-managed-environment というエラーで止まります。OS のパッケージ管理と衝突させないための仕組みなので、無理に外すべきものではありません。

venv も最初は作れない

「では仮想環境で」と考えるのが正しい方向ですが、Debian ではここにもう 1 段あります。

$ python3 -m venv myenv
The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.

⚠️ python3 -m venv --help は通るので「venv は使える」と誤解しやすいのが厄介です。実際に作ろうとして初めて失敗します。正解は先にパッケージを入れることです。

$ sudo apt install python3-venv
$ python3 -m venv ~/mcp/venv
$ ~/mcp/venv/bin/pip install <必要なパッケージ>

systemd で常駐させる

unit ファイル

作った仮想環境の Python を絶対パスで指定します。systemd の PATH は対話シェルと違うので、ここを相対で書くと起動しません。

[Unit]
Description=MCP server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=<user>
WorkingDirectory=/home/<user>/mcp
ExecStart=/home/<user>/mcp/venv/bin/python server.py
Restart=always
RestartSec=5
MemoryMax=200M

[Install]
WantedBy=multi-user.target

メモリ上限を付ける理由

手元の環境の余力はこの程度です。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:             958         499         163          68         532         458

使えるのは 458MB。ここで MCP サーバーが暴走すると、関係のない Web サーバーや DB まで OOM Killer に巻き込まれますMemoryMax を付けておけば、被害はそのプロセスに閉じます。

起動と確認

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now mcp
$ journalctl -u mcp -f

公開するときに考えること

公開ポートは置いた瞬間から探索される

これは実感ではなく数字で確認できます。手元の VPS で直近 7 日間のエラーログを集計したところ、157 件のうち 137 件(87%)が SSH ポートへの総当たりでした。認証にすら到達していない接続がこれだけあります。

MCP サーバーを素で公開すれば、同じことが起きます。「まだ何も置いていないから大丈夫」という判断はしないでください。

露出を減らす順番

方法 露出 手間
stdio のまま、同じマシンで完結 なし
VPN・SSH トンネル越しに限定
接続元 IP を絞って公開
認証付きで全世界に公開

上から順に検討して、要件を満たす一番上の行で止めるのが安全です。

ログを見る前提で作る

systemd で動かしていれば標準出力がそのまま journal に入るので、journalctl -u mcp で追えます。障害の切り分け方はAI を使ったログの切り分けにまとめています。

Claude API から呼ぶ

⚠️ 2 つ書かないと動かない

ここが最も間違えやすいところです。mcp_servers にサーバーを登録するだけでは動きません。toolsmcp_toolset を書いて、名前で紐づける必要があります。片方だけだとバリデーションエラーで弾かれます。

client.beta.messages.create(
    model="claude-opus-5",
    max_tokens=1024,
    betas=["mcp-client-2025-11-20"],
    mcp_servers=[
        {"type": "url", "url": "https://example.com/sse", "name": "my-mcp"}
    ],
    tools=[
        {"type": "mcp_toolset", "mcp_server_name": "my-mcp"}   # ← これが必須
    ],
    messages=[...],
)

mcp_server_namemcp_servers 側の name と一致している必要があります。

出力が大きいと自動でファイルに逃がされる

ツールの戻り値が 10 万文字(おおむね 2.5 万トークン)を超えると、自動的にサンドボックス内のファイルへ退避され、モデルには切り詰めたプレビューとファイルパスが渡ります。設定は不要です。

⚠️ 閾値はトークン数ではなく文字数である点に注意してください。日本語を大量に返すツールでは、思ったより早くこの境界に当たります。

使えるプラットフォームが限られる

プラットフォーム MCP コネクタ
Claude API(第一者) ベータで利用可
Microsoft Foundry ベータ
Amazon Bedrock 非対応
Google Vertex AI 非対応

Bedrock や Vertex AI 経由で使う前提の構成なら、MCP コネクタは選べません。設計の初期に確認しておく項目です。

よくある質問

Q1. メモリ 1GB の VPS で MCP サーバーは動きますか?

結論:動きます。手元の環境はメモリ 958MB で、空きは 458MB でした。MCP サーバー自体は軽量な常駐プロセスなので収まります。ただし MemoryMax を付けて、暴走時に他のサービスを巻き込まないようにしてください。

Q2. Debian 12 で pip install が失敗します

結論:pip が未導入で、かつシステムの Python が PEP 668 でロックされています。/usr/lib/python3.11/EXTERNALLY-MANAGED が存在するためです。sudo apt install python3-venv で仮想環境を作れるようにしてから、その中の pip を使ってください。

Q3. venv を作ろうとすると ensurepip のエラーが出ます

結論:python3-venv パッケージが入っていません。Debian では venv が本体から分離されています。紛らわしいことに python3 -m venv --help は通るので、実際に作るまで気づきません。

Q4. stdio と HTTP はどちらを選ぶべきですか?

結論:同じマシンで完結するなら stdio、別マシンから呼ぶなら HTTP 系です。stdio はネットワークに口が開かないぶん安全です。まず stdio で動くものを作り、必要になってからトランスポートを差し替えると切り分けが楽になります。

Q5. Claude API に登録したのにツールが呼ばれません

結論:toolsmcp_toolset を書いていない可能性が高いです。mcp_servers だけではバリデーションエラーになります。mcp_server_namemcp_serversname と一致しているかも確認してください。

Q6. Amazon Bedrock からも使えますか?

結論:2026年8月16日時点では使えません。MCP コネクタは Claude API(第一者)と Microsoft Foundry でベータ提供されており、Amazon Bedrock と Google Vertex AI は非対応です。

まとめ

MCP サーバーは常駐プロセスなので VPS に置くのが素直です。メモリ 958MB の環境でも動きます。詰まるのはたいてい MCP そのものではなく、Debian の Python パッケージ事情と、API 側の書き方のほうです。

  • 🎯 環境python3-venv を先に入れる(pip 未導入 + PEP 668)
  • 🎯 常駐 → systemd + Restart=always + MemoryMax
  • 🎯 APImcp_serversmcp_toolset両方書く

出力は 2026年8月16日時点で運用中の VPS から採取したものです。常駐プロセスの設計はsystemd のユニットファイル、API 費用の詰め方はLLM API のコスト最適化、メモリが足りないときはスワップの追加にまとめています。

読んで頂いて有り難うございます!