1010 */
1111
1212import { Logger } from '@aws-lambda-powertools/logger' ;
13- import { StreamableHTTPTransport } from '@hono/mcp ' ;
14- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp ' ;
15- import { Context , Hono } from 'hono' ;
13+ import { McpServer , WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server ' ;
14+ import { createMcpHonoApp , CreateMcpHonoAppOptions } from '@modelcontextprotocol/hono ' ;
15+ import { Context } from 'hono' ;
1616import { BlankEnv , BlankInput } from 'hono/types' ;
1717
1818/**
@@ -22,31 +22,14 @@ import { BlankEnv, BlankInput } from 'hono/types';
2222 */
2323const logger = new Logger ( ) ;
2424
25- /**
26- * 許可されていないHTTPメソッドに対するハンドラーです。
27- *
28- * @remarks
29- * 405エラーのJSONレスポンスを返します。
30- *
31- * @param c Honoのコンテキスト
32- * @returns 405エラーのJSONレスポンス
33- * @private
34- */
35- const methodNotAllowedHandler = async (
36- c : Context < BlankEnv , '/mcp' , BlankInput > ,
37- ) => {
38- return c . json (
39- {
40- jsonrpc : '2.0' ,
41- error : {
42- code : - 32000 ,
43- message : 'メソッドは許可されていません。' ,
44- } ,
45- id : null ,
46- } ,
47- { status : 405 } ,
48- ) ;
49- } ;
25+ // `@modelcontextprotocol/hono` が c.set('parsedBody', ...) で格納する値の型を
26+ // Hono の ContextVariableMap に宣言マージで追加する(パッケージ側の型定義に
27+ // 反映されていないための回避策)
28+ declare module 'hono' {
29+ interface ContextVariableMap {
30+ parsedBody : unknown ;
31+ }
32+ }
5033
5134/**
5235 * サーバーエラー発生時の共通エラーハンドラーです。
@@ -93,7 +76,7 @@ const handleError = (
9376 * @returns void
9477 * @private
9578 */
96- const closeResources = async ( server : McpServer , transport : StreamableHTTPTransport ) => {
79+ const closeResources = async ( server : McpServer , transport : WebStandardStreamableHTTPServerTransport ) => {
9780 // 両方のクローズを確実に実行(片方が失敗してももう片方を実行)
9881 const closeResults = await Promise . allSettled ( [
9982 transport . close ( ) ,
@@ -125,15 +108,15 @@ const closeResources = async (server: McpServer, transport: StreamableHTTPTransp
125108 * @private
126109 */
127110const handleRequest = async ( createMcpServer : ( ) => McpServer , c : Context < BlankEnv , '/mcp' , BlankInput > ) => {
128- const transport = new StreamableHTTPTransport ( {
111+ const transport = new WebStandardStreamableHTTPServerTransport ( {
129112 sessionIdGenerator : undefined , // セッションIDを生成しない(ステートレスモード)
130113 enableJsonResponse : true ,
131114 } ) ;
132115 const server = createMcpServer ( ) ;
133116 try {
134117 await server . connect ( transport ) ;
135118 logger . trace ( 'MCP リクエストを受信' ) ;
136- return await transport . handleRequest ( c ) ;
119+ return await transport . handleRequest ( c . req . raw , { parsedBody : c . get ( 'parsedBody' ) } ) ;
137120 } catch ( error ) {
138121 return handleError ( c , error , 'MCP 接続中のエラー:' ) ;
139122 } finally {
@@ -167,21 +150,12 @@ const handleRequest = async (createMcpServer: () => McpServer, c: Context<BlankE
167150 * const app = createHonoApp(createMcpServer);
168151 * ```
169152 */
170- export const createHonoApp = ( createMcpServer : ( ) => McpServer ) => {
171- const app = new Hono ( ) ;
153+ export const createHonoApp = ( createMcpServer : ( ) => McpServer , options ?: CreateMcpHonoAppOptions ) => {
154+ const app = createMcpHonoApp ( options ) ;
172155
173- app . post ( '/mcp' , async ( c ) => {
156+ app . all ( '/mcp' , async ( c ) => {
174157 return await handleRequest ( createMcpServer , c ) ;
175158 } ) ;
176159
177- app . get ( '/mcp' , async ( c ) => {
178- return await handleRequest ( createMcpServer , c ) ;
179- } ) ;
180-
181- app . put ( '/mcp' , methodNotAllowedHandler ) ;
182- app . delete ( '/mcp' , methodNotAllowedHandler ) ;
183- app . patch ( '/mcp' , methodNotAllowedHandler ) ;
184- app . options ( '/mcp' , methodNotAllowedHandler ) ;
185-
186160 return app ;
187161} ;
0 commit comments