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

ClaudeなどのAIアシスタントに「自社のAPIを叩かせたい」「社内DBを検索させたい」と思ったことがあるなら、MCP(Model Context Protocol)は知っておいて損はない。この記事では、MCPサーバーを自前のVPSに置いて運用する際の勘所を整理する。プロトコル自体まだ新しく仕様が変わることもあるので、細かい実装は公式ドキュメント(modelcontextprotocol.io)を都度確認する前提で読んでほしい。

MCPとは何か

MCP(Model Context Protocol)は、AIアシスタントに外部のツールやデータソースを標準化された方法で接続するためのオープンなプロトコル。平たく言うと、AIに「ファイルを読む」「DBを叩く」「外部APIを呼ぶ」といった能力を、決まったインターフェースで持たせる仕組みだ。

MCPが登場する前は、AIに何か機能を持たせようとすると、サービスごとに独自のプラグイン形式やAPI連携を作る必要があった。MCPはそこを共通化しようというもので、一度MCPサーバーを作れば、対応するクライアント(ClaudeやそのほかMCP対応のツール)からそのまま使える。

構成:ホストとサーバー

MCPの登場人物は大きく2つ。

  • MCPホスト — Claude Desktopなど、AIアシスタントを動かすクライアント側
  • MCPサーバー — ツールやリソースを公開する側。これは自作できる

自分でMCPサーバーを書いて、それをVPSに置いて運用する、というのが今回のテーマになる。

トランスポート:ローカルはstdio、リモートはHTTP系

MCPサーバーとホストの通信方式(トランスポート)には種類がある。ローカルで動かす場合は標準入出力(stdio)で親プロセスと直接やり取りするのが定番。一方、VPSに置いて外部のクライアントから使わせる場合はネットワーク越しになるので、HTTP系のトランスポート(Streamable HTTP)を使うことになる。VPSで運用するなら基本的にHTTP系一択と考えていい。

実装のイメージ(Python)

公式のSDKはTypeScriptやPythonなどいくつかの言語で提供されている。Pythonの場合、ざっくりしたイメージは次のような形になる(細部のAPIは変わる可能性があるので、実装時は公式SDKのドキュメントを見てほしい)。

python3 -m venv venv
source venv/bin/activate
pip install mcp
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("my-tools-server")

@mcp.tool()
def get_server_status(hostname: str) -> str:
    """指定したホストの稼働状況を返す"""
    # ここで実際のチェック処理を書く
    return f"{hostname} is up"

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

@mcp.tool()のようなデコレータでツールを定義すると、そのツールには名前・説明・入力スキーマが自動的に付く。AIはその説明を見て「このツールをいつ使うべきか」を判断するので、descriptionは適当に書かず具体的に書いた方がいい。ここは実際に触ってみると効果の差がよく分かる。

VPS運用のポイント

VPSで常駐させるなら、まずsystemdでサービス化しておくのが定石。

[Unit]
Description=My MCP Server
After=network.target

[Service]
User=[サービス用ユーザー]
WorkingDirectory=/home/[ユーザー名]/mcp-server
ExecStart=/home/[ユーザー名]/mcp-server/venv/bin/python server.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

そのうえで、直接ポートを外に晒さずnginxでリバースプロキシを挟み、認証(Basic認証やトークン検証など)を必ず付ける。ここは強調しておきたいのだが、MCPサーバーは「AIに実行権限を渡す窓口」なので、セキュリティ的な重みは普通のWeb APIより一段重いと考えた方がいい。認可の仕組みと入力検証は省略しないこと。

location /mcp/ {
    proxy_pass http://127.0.0.1:8765/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    # ここに認証設定(auth_basicやアプリ側のトークン検証)を追加
}

用途の例

実際に作ってみると使い道は意外と地味なところに転がっている。

  • 社内APIのラッパー(在庫確認、注文照会など)
  • DBの検索ツール(読み取り専用に限定するのが無難)
  • 定型オペレーションの実行(サーバーの再起動、ログの要約取得など)

どれも「AIに人間の代わりに操作させる」窓口になるので、書き込み系の操作を許可する場合は特に慎重に。まずは読み取り専用のツールから試すのがおすすめだ。

まとめ

MCPはAIに外部の能力を持たせるための共通規格で、VPSに自前のMCPサーバーを置けば、社内システムをAIから触れるようにできる。ただしプロトコルはまだ発展途上で、実装の細部は変わりうる。今回書いた内容も大枠の考え方として捉えて、実装時は必ず公式ドキュメントで最新の仕様を確認してほしい。

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