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 } from '@modelcontextprotocol/hono ' ;
15+ import { Context } from 'hono' ;
1616import { BlankEnv , BlankInput } from 'hono/types' ;
1717
1818/**
@@ -22,6 +22,15 @@ import { BlankEnv, BlankInput } from 'hono/types';
2222 */
2323const logger = new Logger ( ) ;
2424
25+ // `@modelcontextprotocol/hono` が c.set('parsedBody', ...) で格納する値の型を
26+ // Hono の ContextVariableMap に宣言マージで追加する(パッケージ側の型定義に
27+ // 反映されていないための回避策)
28+ declare module 'hono' {
29+ interface ContextVariableMap {
30+ parsedBody : unknown ;
31+ }
32+ }
33+
2534/**
2635 * 許可されていないHTTPメソッドに対するハンドラーです。
2736 *
@@ -93,7 +102,7 @@ const handleError = (
93102 * @returns void
94103 * @private
95104 */
96- const closeResources = async ( server : McpServer , transport : StreamableHTTPTransport ) => {
105+ const closeResources = async ( server : McpServer , transport : WebStandardStreamableHTTPServerTransport ) => {
97106 // 両方のクローズを確実に実行(片方が失敗してももう片方を実行)
98107 const closeResults = await Promise . allSettled ( [
99108 transport . close ( ) ,
@@ -125,15 +134,15 @@ const closeResources = async (server: McpServer, transport: StreamableHTTPTransp
125134 * @private
126135 */
127136const handleRequest = async ( createMcpServer : ( ) => McpServer , c : Context < BlankEnv , '/mcp' , BlankInput > ) => {
128- const transport = new StreamableHTTPTransport ( {
137+ const transport = new WebStandardStreamableHTTPServerTransport ( {
129138 sessionIdGenerator : undefined , // セッションIDを生成しない(ステートレスモード)
130139 enableJsonResponse : true ,
131140 } ) ;
132141 const server = createMcpServer ( ) ;
133142 try {
134143 await server . connect ( transport ) ;
135144 logger . trace ( 'MCP リクエストを受信' ) ;
136- return await transport . handleRequest ( c ) ;
145+ return await transport . handleRequest ( c . req . raw , { parsedBody : c . get ( 'parsedBody' ) } ) ;
137146 } catch ( error ) {
138147 return handleError ( c , error , 'MCP 接続中のエラー:' ) ;
139148 } finally {
@@ -168,7 +177,7 @@ const handleRequest = async (createMcpServer: () => McpServer, c: Context<BlankE
168177 * ```
169178 */
170179export const createHonoApp = ( createMcpServer : ( ) => McpServer ) => {
171- const app = new Hono ( ) ;
180+ const app = createMcpHonoApp ( ) ;
172181
173182 app . post ( '/mcp' , async ( c ) => {
174183 return await handleRequest ( createMcpServer , c ) ;
0 commit comments