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 パッケージで直接マウントするだけで十分です。

    参考資料

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark