Model Context Protocol (MCP) の 2025-03-26 の仕様では新たに Streamable HTTP が追加され、リモート MCP サーバーへの注目が集まっています。従来の MCP サーバーは stdio を使用してローカルで実行されることが一般的であったため、デスクトップアプリケーションや CLI ツールのみで利用されるなど、利用シーンが限られていました。
Streamable HTTP を使用することで、リモートの MCP サーバーを Web アプリケーションから利用されることが期待されます。Claude の Web 版ではリモート MCP サーバー経由で MCP サーバーにアクセスできるようになったことが発表されています。
この記事では Next.js を使用して Vercel 上に MCP サーバーを構築する方法を紹介します。完成したコードは以下のリポジトリで確認できます。
Next.js プロジェクトを作成する
まずは以下のコマンドを実行して Next.js プロジェクトを作成します。
npx create-next-app@latest my-mcp-server
続いて以下のパッケージをインストールします。
@vercel/mcp-adapter
: Vercel 上で MCP サーバーを構築するためのアダプター。HTTP Streamable と従来の方式である SSE の両方に対応しているzod
: バリデーションライブラリ。ツールのインターフェイスを定義するために使用する
npm install @vercel/mcp-adapter zod
API ルートを作成する
続いて Next.js の API Routes を使用して MCP サーバーのエンドポイントを作成します。app/[transport]/route.ts
に以下のコードを追加します。
import { createMcpHandler } from "@vercel/mcp-adapter";
import { z } from "zod";
const handler = createMcpHandler((server) => {
server.tool(
// ツールの名前
"dice_roll",
// ツールの説明
"サイコロを振った結果を返します",
// ツールの引数のスキーマ
{
sides: z.number().min(1).max(100).default(6).describe("サイコロの面の数"),
},
// ツールの実行関数
async ({ sides }) => {
// サイコロを振る
const result = Math.floor(Math.random() * sides) + 1;
// 結果を返す
return {
content: [{ type: "text", text: result.toString() }],
};
}
);
});
export { handler as GET, handler as POST, handler as DELETE };
createMcpHandler
関数を使用して MCP サーバーのハンドラーを作成します。引数のコールバック関数で server
オブジェクトを受け取り、tool
メソッドを使用してツールを定義します。
handler
は GET
、POST
、DELETE
メソッドのエンドポイントとしてエクスポートします。これにより、HTTP ストリーミングと従来の SSE の両方に対応した MCP サーバーが作成されます。
ローカルで実行する
まずはローカル環境で試してみましょう。SSE トランスポートに必要な状態を管理するために Redis が必要です。docker-compose.yml
を使用して Redis を起動します。
version: "3.8"
services:
redis:
image: redis:latest
ports:
- "6379:6379"
docker compose up -d
Redis が起動したら、以下のコマンドを実行して Next.js アプリケーションを起動します。
REDIS_URL=redis://localhost:6379 npm run dev
正しく MCP サーバーを構築できているか確認するために MCP Inspector を使用しましょう。これは GUI ベースで MCP サーバーのデバッグを行うためのツールです。
npx @modelcontextprotocol/inspector
http://127.0.0.1:6274 にアクセスして MCP Inspector を開きます。「Transport Type」で「Streamable HTTP」を選択し、URL 欄に http://localhost:3000/mcp
を入力して「Connect」ボタンをクリックします。
「List Tools」ボタンをクリックすると、実装した dice_roll
ツールが表示されます。「Run Tool」ボタンをクリックすると、ツールを実行できます。結果が表示されていることを確認してください。
同様に /sse
エンドポイントでも動作することを確認します。「Transport Type」を「SSE」に変更し、URL 欄に http://localhost:3000/sse
を入力して「Connect」ボタンをクリックします。
デプロイする
Vercel にデプロイするために GitHub リポジトリとの連携を行います。あらかじめ GitHub リポジトリを作成しておきましょう。https://vercel.com/new から GitHub リポジトリを選択します。
デプロイボタンをクリックしてデプロイを開始します。
SSE トランスポートをサポートするために Redis が必要です。デプロイ後のダッシュボード画面で「Storage」タブをクリックし、「Create Database」ボタンをクリックします。
ダイアログが表示されるので、「Marketplace Database Providers」から「Redis」を選択します。
その後リージョンとプランを選択するとデータベースが作成されます。作成されたら「Settings」タブをクリックし、接続情報を確認します。環境変数 REDIS_URL
は自動で設定されます。
Redis の作成が完了したら再度デプロイを行っておきましょう。デプロイが完了したら、MCP Inspector を使用して MCP サーバーに接続します。URL 欄には https://<your-deployment-url>/mcp
を入力します。
まとめ
@vercel/mcp-adapter
を使用することで、Vercel 上に MCP サーバーを構築できる- Vercel 上に構築した MCP サーバーは HTTP ストリーミングと従来の SSE の両方に対応している
- SSE トランスポートを使用するためには Redis が必要
- MCP サーバーは MCP Inspector を使用してデバッグできる