Skip to content

Commit 4da08ee

Browse files
committed
リソースリークの修正
1 parent eb68aad commit 4da08ee

2 files changed

Lines changed: 30 additions & 38 deletions

File tree

example/lambda/index.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,25 @@ import { createHonoApp } from 'aws-lambda-mcp-server';
66

77
const logger = new Logger();
88

9-
const server = new McpServer({
10-
name: 'hello-server',
11-
version: '1.0.0',
12-
});
13-
14-
server.tool(
15-
'say_hello',
16-
{ who: z.string() },
17-
async ({ who }) => ({
18-
content: [{
19-
type: 'text',
20-
text: `${who} さん、こんにちは!`,
21-
}],
22-
}),
23-
);
9+
const createMcpServer = () => {
10+
const server = new McpServer({
11+
name: 'hello-server',
12+
version: '1.0.0',
13+
});
2414

25-
const app = createHonoApp(server);
15+
server.tool(
16+
'say_hello',
17+
{ who: z.string() },
18+
async ({ who }) => ({
19+
content: [{
20+
type: 'text',
21+
text: `${who} さん、こんにちは!`,
22+
}],
23+
}),
24+
);
25+
return server;
26+
};
27+
const app = createHonoApp(createMcpServer);
2628

2729
// Lambda handler
2830
export const handler = handle(app);

package/src/index.ts

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -119,32 +119,33 @@ const closeResources = async (server: McpServer, transport: StreamableHTTPTransp
119119
* @remarks
120120
* サーバーとトランスポートの接続・リクエスト処理・エラーハンドリングを行います。
121121
*
122-
* @param server MCPサーバーインスタンス
122+
* @param createMcpServer MCPサーバーインスタンスを生成するファクトリ関数
123123
* @param c Honoのコンテキスト
124124
* @returns MCPレスポンス
125125
* @private
126126
*/
127-
const handleRequest = async (server: McpServer, c: Context<BlankEnv, '/mcp', BlankInput>) => {
127+
const handleRequest = async (createMcpServer: () => McpServer, c: Context<BlankEnv, '/mcp', BlankInput>) => {
128128
const transport = new StreamableHTTPTransport({
129129
sessionIdGenerator: undefined, // セッションIDを生成しない(ステートレスモード)
130130
enableJsonResponse: true,
131131
});
132+
const server = createMcpServer();
132133
try {
133134
await server.connect(transport);
134135
logger.trace('MCP リクエストを受信');
135136
return await transport.handleRequest(c);
136137
} catch (error) {
138+
return handleError(c, error, 'MCP 接続中のエラー:');
139+
} finally {
140+
// エラーの有無に関わらず必ずリソースをクローズ
137141
try {
138142
await closeResources(server, transport);
139-
} catch (closeError) {
140-
const errorDetails = closeError instanceof Error
141-
? { message: closeError.message, stack: closeError.stack }
142-
: closeError;
143-
logger.error('Transport close failed after connection error:', { closeError: errorDetails });
143+
} catch {
144+
// クローズエラーは既にcloseResources内でログ出力されているため、
145+
// ここでは追加のエラーハンドリングは不要
146+
logger.warn('リソースクローズ中に追加エラーが発生しましたが、処理を継続します');
144147
}
145-
return handleError(c, error, 'MCP 接続中のエラー:');
146148
}
147-
148149
};
149150

150151
/**
@@ -167,22 +168,11 @@ export const createHonoApp = (createMcpServer: () => McpServer) => {
167168
const app = new Hono();
168169

169170
app.post('/mcp', async (c) => {
170-
const server = createMcpServer();
171-
172-
try {
173-
return await handleRequest(server, c);
174-
} finally {
175-
await server.close();
176-
}
171+
return await handleRequest(createMcpServer, c);
177172
});
178173

179174
app.get('/mcp', async (c) => {
180-
const server = createMcpServer();
181-
try {
182-
return await handleRequest(server, c);
183-
} finally {
184-
await server.close();
185-
}
175+
return await handleRequest(createMcpServer, c);
186176
});
187177

188178
app.put('/mcp', methodNotAllowedHandler);

0 commit comments

Comments
 (0)