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 の Python は pip 未導入かつ 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=alwaysMemoryMax の組み合わせです。API 側は mcp_serversmcp_toolset を両方書きます。

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

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