Hono で MCP サーバーを構築する手順(Agent SDK 版)
タグ:
Hono フレームワークを使って Model Context Protocol (MCP) サーバーを構築する方法を解説。Agent SDK を活用し、Cloudflare Workers 環境で動作する実装手順からテスト方法まで、ステップバイステップで紹介します。
目次
Model Context Protocol(MCP)サーバーを Hono フレームワークで構築する方法を簡単に紹介します。今回は Agent SDK を使用したアプローチを採用し、Cloudflare Workers 環境での動作を前提としています。
Hono プロジェクトの初期設定
まず、新しい Hono プロジェクトを作成しましょう。以下のコマンドを実行して、プロジェクトのセットアップを行います。
npm create hono
対話形式でプロジェクトの設定を行います。今回は Cloudflare Workers + Vite テンプレートを選択してください。
create-hono version 0.18.0
✔ Target directory mcp-hono
? Which template do you want to use?
aws-lambda
bun
cloudflare-workers
❯ cloudflare-workers+vite
続いて、依存関係のインストールとパッケージマネージャーの選択を行います。
✔ Target directory mcp-hono
✔ Which template do you want to use? cloudflare-workers+vite
✔ Do you want to install project dependencies? Yes
✔ Which package manager do you want to use? npm
セットアップが完了したら、開発サーバーを起動して動作確認を行いましょう。
cd mcp-hono
npm run dev
正常に起動すると、以下のような出力が表示されます。
Default inspector port 9229 not available, using 9230 instead
VITE v6.3.5 ready in 1025 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ Debug: http://localhost:5173/__debug
➜ press h + enter to show help
Wrangler 設定の更新
次に、Cloudflare Workers の設定ファイルを更新します。MCP サーバーを動作させるために必要な設定を追加していきます。
wrangler.jsonc
ファイルを以下のように変更してください。
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "mcp-hono",
- "compatibility_date": "2024-04-01",
+ "compatibility_date": "2025-03-10",
"main": "./src/index.tsx",
- "assets": {
- "directory": "./dist"
- }
+ "compatibility_flags": ["nodejs_compat", "nodejs_compat_populate_process_env"],
+ "migrations": [
+ {
+ "new_sqlite_classes": ["MyMCP"],
+ "tag": "v1"
+ }
+ ],
+ "durable_objects": {
+ "bindings": [
+ {
+ "class_name": "MyMCP",
+ "name": "MCP_OBJECT"
+ }
+ ]
+ },
}
この設定により、Node.js 互換性フラグが有効になり、Durable Objects として MCP サーバーを動作させることができるようになります。
設定変更後、型定義ファイルを更新します。
npm run cf-typegen
MCP サーバーの実装
続いて、MCP サーバーの実装を行います。まず、必要な依存関係をインストールしましょう。
npm i agents/mcp @modelcontextprotocol/sdk
新しいファイル src/mcp.ts
を作成し、MCP サーバーのロジックを実装します。
import { McpAgent } from "agents/mcp";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
type State = {}
type Props = {}
export class MyMCP extends McpAgent<Cloudflare.Env, State, Props> {
server = new McpServer({
name: "Hello MCP",
version: "0.0.1",
});
async init() {
this.server.tool("say-hello", "Say hello to the user", {},
async () => {
return {
content: [{
type: "text",
text: "Hello, world!"
}]
}
}
);
}
}
この実装では、シンプルな “say-hello” ツールを定義しています。このツールは呼び出されると “Hello, world!” というメッセージを返します。
Hono から MCP サーバーを提供する
次に、作成した MCP サーバーを Hono アプリケーションに組み込みましょう。src/index.tsx
ファイルを以下のように修正してください。
import { Hono } from 'hono'
import { renderer } from './renderer'
+import { MyMCP } from './mcp';
+export { MyMCP }
const app = new Hono()
app.use(renderer)
+app.mount('/sse', MyMCP.serve('/sse').fetch, { replaceRequest: false})
+app.mount('/mcp', MyMCP.serve('/mcp').fetch, { replaceRequest: false})
app.get('/', (c) => {
return c.render(<h1>Hello!</h1>)
})
export default app
この変更により、MCP サーバーが /sse
と /mcp
エンドポイントでアクセス可能になります。
動作確認とテスト
実装が完了したら、開発サーバーを起動して動作確認を行いましょう。
npm run dev
サーバーが正常に起動すると、以下のような出力が表示されます。
14:03:39 [vite] (mcp_hono) Re-optimizing dependencies because vite config has changed
Default inspector port 9229 not available, using 9230 instead
VITE v6.3.5 ready in 796 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ Debug: http://localhost:5173/__debug
MCP サーバーをテストするために、Cursor などの対応エディターで設定を行います。~/.cursor/mcp.json
ファイルに以下の設定を追加してください。
{
"mcpServers": {
"test": {
"command": "npx",
"args": [ "mcp-remote", "http://localhost:5173/sse" ]
}
}
}
ライブラリの選択について
何パターンかを試してみた感想ですが、 @modelcontextprotocol/sdk
で MCP サーバーを作成する際は、@hono/mcp
パッケージを使用する方が良さそうです。今回のように agents/mcp
で MCP サーバーを作成する場合は、agents
パッケージで直接マウントするだけで十分です。