※本ページには広告(アフィリエイトプログラム等)が含まれます。
※本ページには広告(アフィリエイトプログラム等)が含まれます。コマンドの出力は 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_serversとmcp_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 install は externally-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 にサーバーを登録するだけでは動きません。tools に mcp_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_name は mcp_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 に登録したのにツールが呼ばれません
結論:tools に mcp_toolset を書いていない可能性が高いです。mcp_servers だけではバリデーションエラーになります。mcp_server_name が mcp_servers の name と一致しているかも確認してください。
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 - 🎯 API →
mcp_serversとmcp_toolsetを両方書く
出力は 2026年8月16日時点で運用中の VPS から採取したものです。常駐プロセスの設計はsystemd のユニットファイル、API 費用の詰め方はLLM API のコスト最適化、メモリが足りないときはスワップの追加にまとめています。
