aws-lambda-mcp-server 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -20
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +165 -0
- package/package.json +16 -10
- package/eslint.config.ts +0 -72
- package/src/index.ts +0 -107
- package/tsconfig-eslint.json +0 -15
- package/tsconfig.json +0 -38
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# aws-lambda-mcp-server
|
|
2
2
|
|
|
3
|
+
[](https://badge.fury.io/js/aws-lambda-mcp-server)
|
|
4
|
+
|
|
3
5
|
AWS Lambda上でMCP(Model Context Protocol)サーバー機能を提供するためのライブラリです。
|
|
4
6
|
APIエンドポイントの実装や、各種AWSサービスとの連携を簡易化することを目的としています。
|
|
5
7
|
|
|
@@ -19,29 +21,33 @@ TypeScriptでの利用例です。
|
|
|
19
21
|
|
|
20
22
|
```typescript
|
|
21
23
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
22
|
-
import {
|
|
24
|
+
import { createHonoApp } from 'aws-lambda-mcp-server';
|
|
23
25
|
import { handle } from 'hono/aws-lambda';
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
26
|
+
import { z } from 'zod';
|
|
27
|
+
|
|
28
|
+
// MCPサーバーのファクトリ関数を用意
|
|
29
|
+
const createMcpServer = () => {
|
|
30
|
+
const server = new McpServer({
|
|
31
|
+
name: 'my-mcp-server',
|
|
32
|
+
version: '1.0.0',
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// MCPサーバーのインスタンスにToolsやResourcesなどを設定する
|
|
36
|
+
server.tool(
|
|
37
|
+
'say_hello',
|
|
38
|
+
{ who: z.string() },
|
|
39
|
+
async ({ who }) => ({
|
|
40
|
+
content: [{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: `${who} さん、こんにちは!`
|
|
43
|
+
}]
|
|
44
|
+
})
|
|
45
|
+
);
|
|
46
|
+
return server;
|
|
47
|
+
};
|
|
42
48
|
|
|
43
49
|
// Hono アプリケーションを作成
|
|
44
|
-
const app = createHonoApp(
|
|
50
|
+
const app = createHonoApp(createMcpServer);
|
|
45
51
|
|
|
46
52
|
// AWS Lambdaのエントリポイントとして利用
|
|
47
53
|
export const handler = handle(app);
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Context Protocol (MCP) サーバーを Hono フレームワーク上で動作させるエントリーポイント。
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* `createHonoApp` 関数を通じて、/mcp エンドポイントでMCPサーバーを提供します。
|
|
6
|
+
* - POST/GET /mcp: MCPリクエストの受信・処理
|
|
7
|
+
* - その他のHTTPメソッド: 405 Method Not Allowed
|
|
8
|
+
*
|
|
9
|
+
* 内部的にエラーハンドリングやリソースクローズ処理も行います。
|
|
10
|
+
*/
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
import { Hono } from 'hono';
|
|
13
|
+
import { BlankEnv } from 'hono/types';
|
|
14
|
+
/**
|
|
15
|
+
* Honoアプリケーションを生成し、/mcpエンドポイントでMCPサーバーを提供します。
|
|
16
|
+
*
|
|
17
|
+
* @remarks
|
|
18
|
+
* POST/GET /mcp でMCPリクエストを受け付け、他のHTTPメソッドは405を返します。
|
|
19
|
+
*
|
|
20
|
+
* @param createMcpServer MCPサーバーインスタンスを生成するファクトリ関数
|
|
21
|
+
* @returns Honoアプリケーションインスタンス
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { createHonoApp } from '...';
|
|
26
|
+
* import { createMcpServer } from './your-mcp-server';
|
|
27
|
+
* const app = createHonoApp(createMcpServer);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare const createHonoApp: (createMcpServer: () => McpServer) => Hono<BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAC;AA0IlD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,aAAa,GAAI,iBAAiB,MAAM,SAAS,0DAiB7D,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Context Protocol (MCP) サーバーを Hono フレームワーク上で動作させるエントリーポイント。
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* `createHonoApp` 関数を通じて、/mcp エンドポイントでMCPサーバーを提供します。
|
|
6
|
+
* - POST/GET /mcp: MCPリクエストの受信・処理
|
|
7
|
+
* - その他のHTTPメソッド: 405 Method Not Allowed
|
|
8
|
+
*
|
|
9
|
+
* 内部的にエラーハンドリングやリソースクローズ処理も行います。
|
|
10
|
+
*/
|
|
11
|
+
import { Logger } from '@aws-lambda-powertools/logger';
|
|
12
|
+
import { StreamableHTTPTransport } from '@hono/mcp';
|
|
13
|
+
import { Hono } from 'hono';
|
|
14
|
+
/**
|
|
15
|
+
* ロガーインスタンス(AWS Lambda Powertools)。
|
|
16
|
+
*
|
|
17
|
+
* @private
|
|
18
|
+
*/
|
|
19
|
+
const logger = new Logger();
|
|
20
|
+
/**
|
|
21
|
+
* 許可されていないHTTPメソッドに対するハンドラーです。
|
|
22
|
+
*
|
|
23
|
+
* @remarks
|
|
24
|
+
* 405エラーのJSONレスポンスを返します。
|
|
25
|
+
*
|
|
26
|
+
* @param c Honoのコンテキスト
|
|
27
|
+
* @returns 405エラーのJSONレスポンス
|
|
28
|
+
* @private
|
|
29
|
+
*/
|
|
30
|
+
const methodNotAllowedHandler = async (c) => {
|
|
31
|
+
return c.json({
|
|
32
|
+
jsonrpc: '2.0',
|
|
33
|
+
error: {
|
|
34
|
+
code: -32000,
|
|
35
|
+
message: 'メソッドは許可されていません。',
|
|
36
|
+
},
|
|
37
|
+
id: null,
|
|
38
|
+
}, { status: 405 });
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* サーバーエラー発生時の共通エラーハンドラーです。
|
|
42
|
+
*
|
|
43
|
+
* @remarks
|
|
44
|
+
* エラー内容をロギングし、500エラーのJSONレスポンスを返します。
|
|
45
|
+
*
|
|
46
|
+
* @param c Honoのコンテキスト
|
|
47
|
+
* @param reason エラー理由
|
|
48
|
+
* @param logMessage ログ出力用メッセージ
|
|
49
|
+
* @returns 500エラーのJSONレスポンス
|
|
50
|
+
* @private
|
|
51
|
+
*/
|
|
52
|
+
const handleError = (c, reason, logMessage) => {
|
|
53
|
+
const errorDetails = reason instanceof Error
|
|
54
|
+
? { message: reason.message, stack: reason.stack, name: reason.name }
|
|
55
|
+
: { reason };
|
|
56
|
+
logger.error(logMessage, errorDetails);
|
|
57
|
+
return c.json({
|
|
58
|
+
jsonrpc: '2.0',
|
|
59
|
+
error: {
|
|
60
|
+
code: -32603,
|
|
61
|
+
message: '内部サーバーエラー',
|
|
62
|
+
},
|
|
63
|
+
id: null,
|
|
64
|
+
}, { status: 500 });
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* MCPサーバーおよびトランスポートのリソースをクローズします。
|
|
68
|
+
*
|
|
69
|
+
* @remarks
|
|
70
|
+
* どちらか一方のクローズに失敗しても、もう一方は必ず実行されます。
|
|
71
|
+
*
|
|
72
|
+
* @param server MCPサーバーインスタンス
|
|
73
|
+
* @param transport トランスポートインスタンス
|
|
74
|
+
* @returns void
|
|
75
|
+
* @private
|
|
76
|
+
*/
|
|
77
|
+
const closeResources = async (server, transport) => {
|
|
78
|
+
// 両方のクローズを確実に実行(片方が失敗してももう片方を実行)
|
|
79
|
+
const closeResults = await Promise.allSettled([
|
|
80
|
+
transport.close(),
|
|
81
|
+
server.close(),
|
|
82
|
+
]);
|
|
83
|
+
// クローズエラーをログ出力
|
|
84
|
+
closeResults.forEach((result, index) => {
|
|
85
|
+
if (result.status === 'rejected') {
|
|
86
|
+
const resourceName = index === 0 ? 'transport' : 'server';
|
|
87
|
+
const error = result.reason;
|
|
88
|
+
const errorDetails = error instanceof Error
|
|
89
|
+
? { message: error.message, stack: error.stack }
|
|
90
|
+
: error;
|
|
91
|
+
logger.error(`Error closing ${resourceName}:`, { error: errorDetails });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* MCPリクエストを処理します。
|
|
97
|
+
*
|
|
98
|
+
* @remarks
|
|
99
|
+
* サーバーとトランスポートの接続・リクエスト処理・エラーハンドリングを行います。
|
|
100
|
+
*
|
|
101
|
+
* @param createMcpServer MCPサーバーインスタンスを生成するファクトリ関数
|
|
102
|
+
* @param c Honoのコンテキスト
|
|
103
|
+
* @returns MCPレスポンス
|
|
104
|
+
* @private
|
|
105
|
+
*/
|
|
106
|
+
const handleRequest = async (createMcpServer, c) => {
|
|
107
|
+
const transport = new StreamableHTTPTransport({
|
|
108
|
+
sessionIdGenerator: undefined, // セッションIDを生成しない(ステートレスモード)
|
|
109
|
+
enableJsonResponse: true,
|
|
110
|
+
});
|
|
111
|
+
const server = createMcpServer();
|
|
112
|
+
try {
|
|
113
|
+
await server.connect(transport);
|
|
114
|
+
logger.trace('MCP リクエストを受信');
|
|
115
|
+
return await transport.handleRequest(c);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return handleError(c, error, 'MCP 接続中のエラー:');
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
// エラーの有無に関わらず必ずリソースをクローズ
|
|
122
|
+
try {
|
|
123
|
+
await closeResources(server, transport);
|
|
124
|
+
}
|
|
125
|
+
catch (closeError) {
|
|
126
|
+
// クローズエラーは既にcloseResources内でログ出力されているため、
|
|
127
|
+
// ここでは追加のエラーハンドリングは不要だが、エラーの詳細を記録
|
|
128
|
+
const errorDetails = closeError instanceof Error
|
|
129
|
+
? { message: closeError.message, stack: closeError.stack }
|
|
130
|
+
: closeError;
|
|
131
|
+
logger.error('リソースクローズ中に追加エラーが発生しましたが、処理を継続します', { closeError: errorDetails });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Honoアプリケーションを生成し、/mcpエンドポイントでMCPサーバーを提供します。
|
|
137
|
+
*
|
|
138
|
+
* @remarks
|
|
139
|
+
* POST/GET /mcp でMCPリクエストを受け付け、他のHTTPメソッドは405を返します。
|
|
140
|
+
*
|
|
141
|
+
* @param createMcpServer MCPサーバーインスタンスを生成するファクトリ関数
|
|
142
|
+
* @returns Honoアプリケーションインスタンス
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```ts
|
|
146
|
+
* import { createHonoApp } from '...';
|
|
147
|
+
* import { createMcpServer } from './your-mcp-server';
|
|
148
|
+
* const app = createHonoApp(createMcpServer);
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export const createHonoApp = (createMcpServer) => {
|
|
152
|
+
const app = new Hono();
|
|
153
|
+
app.post('/mcp', async (c) => {
|
|
154
|
+
return await handleRequest(createMcpServer, c);
|
|
155
|
+
});
|
|
156
|
+
app.get('/mcp', async (c) => {
|
|
157
|
+
return await handleRequest(createMcpServer, c);
|
|
158
|
+
});
|
|
159
|
+
app.put('/mcp', methodNotAllowedHandler);
|
|
160
|
+
app.delete('/mcp', methodNotAllowedHandler);
|
|
161
|
+
app.patch('/mcp', methodNotAllowedHandler);
|
|
162
|
+
app.options('/mcp', methodNotAllowedHandler);
|
|
163
|
+
return app;
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwRCxPQUFPLEVBQVcsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JDOzs7O0dBSUc7QUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO0FBRTVCOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxFQUNuQyxDQUF3QyxFQUN4QyxFQUFFO0lBQ0YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUNYO1FBQ0UsT0FBTyxFQUFFLEtBQUs7UUFDZCxLQUFLLEVBQUU7WUFDTCxJQUFJLEVBQUUsQ0FBQyxLQUFLO1lBQ1osT0FBTyxFQUFFLGlCQUFpQjtTQUMzQjtRQUNELEVBQUUsRUFBRSxJQUFJO0tBQ1QsRUFDRCxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FDaEIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FDbEIsQ0FBd0MsRUFDeEMsTUFBZSxFQUNmLFVBQWtCLEVBQ2xCLEVBQUU7SUFDRixNQUFNLFlBQVksR0FBRyxNQUFNLFlBQVksS0FBSztRQUMxQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRTtRQUNyRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxD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QUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsZUFBZ0MsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFdkIsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzNCLE9BQU8sTUFBTSxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLE9BQU8sTUFBTSxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUN6QyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDM0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUU3QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kZWwgQ29udGV4dCBQcm90b2NvbCAoTUNQKSDjgrXjg7zjg5Djg7zjgpIgSG9ubyDjg5Xjg6zjg7zjg6Djg6/jg7zjgq/kuIrjgafli5XkvZzjgZXjgZvjgovjgqjjg7Pjg4jjg6rjg7zjg53jgqTjg7Pjg4jjgIJcbiAqXG4gKiBAcmVtYXJrc1xuICogYGNyZWF0ZUhvbm9BcHBgIOmWouaVsOOCkumAmuOBmOOBpuOAgS9tY3Ag44Ko44Oz44OJ44Od44Kk44Oz44OI44GnTUNQ44K144O844OQ44O844KS5o+Q5L6b44GX44G+44GZ44CCXG4gKiAtIFBPU1QvR0VUIC9tY3A6IE1DUOODquOCr+OCqOOCueODiOOBruWPl+S/oeODu+WHpueQhlxuICogLSDjgZ3jga7ku5bjga5IVFRQ44Oh44K944OD44OJOiA0MDUgTWV0aG9kIE5vdCBBbGxvd2VkXG4gKlxuICog5YaF6YOo55qE44Gr44Ko44Op44O844OP44Oz44OJ44Oq44Oz44Kw44KE44Oq44K944O844K544Kv44Ot44O844K65Yem55CG44KC6KGM44GE44G+44GZ44CCXG4gKi9cblxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGF3cy1sYW1iZGEtcG93ZXJ0b29scy9sb2dnZXInO1xuaW1wb3J0IHsgU3RyZWFtYWJsZUhUVFBUcmFuc3BvcnQgfSBmcm9tICdAaG9uby9tY3AnO1xuaW1wb3J0IHsgTWNwU2VydmVyIH0gZnJvbSAnQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvbWNwLmpzJztcbmltcG9ydCB7IENvbnRleHQsIEhvbm8gfSBmcm9tICdob25vJztcbmltcG9ydCB7IEJsYW5rRW52LCBCbGFua0lucHV0IH0gZnJvbSAnaG9uby90eXBlcyc7XG5cbi8qKlxuICog44Ot44Ks44O844Kk44Oz44K544K/44Oz44K577yIQVdTIExhbWJkYSBQb3dlcnRvb2xz77yJ44CCXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuXG4vKipcbiAqIOioseWPr+OBleOCjOOBpuOBhOOBquOBhEhUVFDjg6Hjgr3jg4Pjg4njgavlr77jgZnjgovjg4/jg7Pjg4njg6njg7zjgafjgZnjgIJcbiAqXG4gKiBAcmVtYXJrc1xuICogNDA144Ko44Op44O844GuSlNPTuODrOOCueODneODs+OCueOCkui/lOOBl+OBvuOBmeOAglxuICpcbiAqIEBwYXJhbSBjIEhvbm/jga7jgrPjg7Pjg4bjgq3jgrnjg4hcbiAqIEByZXR1cm5zIDQwNeOCqOODqeODvOOBrkpTT07jg6zjgrnjg53jg7PjgrlcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IG1ldGhvZE5vdEFsbG93ZWRIYW5kbGVyID0gYXN5bmMgKFxuICBjOiBDb250ZXh0PEJsYW5rRW52LCAnL21jcCcsIEJsYW5rSW5wdXQ+LFxuKSA9PiB7XG4gIHJldHVybiBjLmpzb24oXG4gICAge1xuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiAtMzIwMDAsXG4gICAgICAgIG1lc3NhZ2U6ICfjg6Hjgr3jg4Pjg4njga/oqLHlj6/jgZXjgozjgabjgYTjgb7jgZvjgpPjgIInLFxuICAgICAgfSxcbiAgICAgIGlkOiBudWxsLFxuICAgIH0sXG4gICAgeyBzdGF0dXM6IDQwNSB9LFxuICApO1xufTtcblxuLyoqXG4gKiDjgrXjg7zjg5Djg7zjgqjjg6njg7znmbrnlJ/mmYLjga7lhbHpgJrjgqjjg6njg7zjg4/jg7Pjg4njg6njg7zjgafjgZnjgIJcbiAqXG4gKiBAcmVtYXJrc1xuICog44Ko44Op44O85YaF5a6544KS44Ot44Ku44Oz44Kw44GX44CBNTAw44Ko44Op44O844GuSlNPTuODrOOCueODneODs+OCueOCkui/lOOBl+OBvuOBmeOAglxuICpcbiAqIEBwYXJhbSBjIEhvbm/jga7jgrPjg7Pjg4bjgq3jgrnjg4hcbiAqIEBwYXJhbSByZWFzb24g44Ko44Op44O855CG55SxXG4gKiBAcGFyYW0gbG9nTWVzc2FnZSDjg63jgrDlh7rlipvnlKjjg6Hjg4Pjgrvjg7zjgrhcbiAqIEByZXR1cm5zIDUwMOOCqOODqeODvOOBrkpTT07jg6zjgrnjg53jg7PjgrlcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGhhbmRsZUVycm9yID0gKFxuICBjOiBDb250ZXh0PEJsYW5rRW52LCAnL21jcCcsIEJsYW5rSW5wdXQ+LFxuICByZWFzb246IHVua25vd24sXG4gIGxvZ01lc3NhZ2U6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCBlcnJvckRldGFpbHMgPSByZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgID8geyBtZXNzYWdlOiByZWFzb24ubWVzc2FnZSwgc3RhY2s6IHJlYXNvbi5zdGFjaywgbmFtZTogcmVhc29uLm5hbWUgfVxuICAgIDogeyByZWFzb24gfTtcbiAgbG9nZ2VyLmVycm9yKGxvZ01lc3NhZ2UsIGVycm9yRGV0YWlscyk7XG4gIHJldHVybiBjLmpzb24oXG4gICAge1xuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiAtMzI2MDMsXG4gICAgICAgIG1lc3NhZ2U6ICflhoXpg6jjgrXjg7zjg5Djg7zjgqjjg6njg7wnLFxuICAgICAgfSxcbiAgICAgIGlkOiBudWxsLFxuICAgIH0sXG4gICAgeyBzdGF0dXM6IDUwMCB9LFxuICApO1xufTtcblxuLyoqXG4gKiBNQ1DjgrXjg7zjg5Djg7zjgYrjgojjgbPjg4jjg6njg7Pjgrnjg53jg7zjg4jjga7jg6rjgr3jg7zjgrnjgpLjgq/jg63jg7zjgrrjgZfjgb7jgZnjgIJcbiAqXG4gKiBAcmVtYXJrc1xuICog44Gp44Gh44KJ44GL5LiA5pa544Gu44Kv44Ot44O844K644Gr5aSx5pWX44GX44Gm44KC44CB44KC44GG5LiA5pa544Gv5b+F44Ga5a6f6KGM44GV44KM44G+44GZ44CCXG4gKlxuICogQHBhcmFtIHNlcnZlciBNQ1DjgrXjg7zjg5Djg7zjgqTjg7Pjgrnjgr/jg7PjgrlcbiAqIEBwYXJhbSB0cmFuc3BvcnQg44OI44Op44Oz44K544Od44O844OI44Kk44Oz44K544K/44Oz44K5XG4gKiBAcmV0dXJucyB2b2lkXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBjbG9zZVJlc291cmNlcyA9IGFzeW5jIChzZXJ2ZXI6IE1jcFNlcnZlciwgdHJhbnNwb3J0OiBTdHJlYW1hYmxlSFRUUFRyYW5zcG9ydCkgPT4ge1xuICAvLyDkuKHmlrnjga7jgq/jg63jg7zjgrrjgpLnorrlrp/jgavlrp/ooYzvvIjniYfmlrnjgYzlpLHmlZfjgZfjgabjgoLjgoLjgYbniYfmlrnjgpLlrp/ooYzvvIlcbiAgY29uc3QgY2xvc2VSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICB0cmFuc3BvcnQuY2xvc2UoKSxcbiAgICBzZXJ2ZXIuY2xvc2UoKSxcbiAgXSk7XG5cbiAgLy8g44Kv44Ot44O844K644Ko44Op44O844KS44Ot44Kw5Ye65YqbXG4gIGNsb3NlUmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGluZGV4ID09PSAwID8gJ3RyYW5zcG9ydCcgOiAnc2VydmVyJztcbiAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LnJlYXNvbjtcbiAgICAgIGNvbnN0IGVycm9yRGV0YWlscyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgPyB7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFjayB9XG4gICAgICAgIDogZXJyb3I7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGNsb3NpbmcgJHtyZXNvdXJjZU5hbWV9OmAsIHsgZXJyb3I6IGVycm9yRGV0YWlscyB9KTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBNQ1Djg6rjgq/jgqjjgrnjg4jjgpLlh6bnkIbjgZfjgb7jgZnjgIJcbiAqXG4gKiBAcmVtYXJrc1xuICog44K144O844OQ44O844Go44OI44Op44Oz44K544Od44O844OI44Gu5o6l57aa44O744Oq44Kv44Ko44K544OI5Yem55CG44O744Ko44Op44O844OP44Oz44OJ44Oq44Oz44Kw44KS6KGM44GE44G+44GZ44CCXG4gKlxuICogQHBhcmFtIGNyZWF0ZU1jcFNlcnZlciBNQ1DjgrXjg7zjg5Djg7zjgqTjg7Pjgrnjgr/jg7PjgrnjgpLnlJ/miJDjgZnjgovjg5XjgqHjgq/jg4jjg6rplqLmlbBcbiAqIEBwYXJhbSBjIEhvbm/jga7jgrPjg7Pjg4bjgq3jgrnjg4hcbiAqIEByZXR1cm5zIE1DUOODrOOCueODneODs+OCuVxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgaGFuZGxlUmVxdWVzdCA9IGFzeW5jIChjcmVhdGVNY3BTZXJ2ZXI6ICgpID0+IE1jcFNlcnZlciwgYzogQ29udGV4dDxCbGFua0VudiwgJy9tY3AnLCBCbGFua0lucHV0PikgPT4ge1xuICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgU3RyZWFtYWJsZUhUVFBUcmFuc3BvcnQoe1xuICAgIHNlc3Npb25JZEdlbmVyYXRvcjogdW5kZWZpbmVkLCAvLyDjgrvjg4Pjgrfjg6fjg7NJROOCkueUn+aIkOOBl+OBquOBhO+8iOOCueODhuODvOODiOODrOOCueODouODvOODie+8iVxuICAgIGVuYWJsZUpzb25SZXNwb25zZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IHNlcnZlciA9IGNyZWF0ZU1jcFNlcnZlcigpO1xuICB0cnkge1xuICAgIGF3YWl0IHNlcnZlci5jb25uZWN0KHRyYW5zcG9ydCk7XG4gICAgbG9nZ2VyLnRyYWNlKCdNQ1Ag44Oq44Kv44Ko44K544OI44KS5Y+X5L+hJyk7XG4gICAgcmV0dXJuIGF3YWl0IHRyYW5zcG9ydC5oYW5kbGVSZXF1ZXN0KGMpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBoYW5kbGVFcnJvcihjLCBlcnJvciwgJ01DUCDmjqXntprkuK3jga7jgqjjg6njg7w6Jyk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8g44Ko44Op44O844Gu5pyJ54Sh44Gr6Zai44KP44KJ44Ga5b+F44Ga44Oq44K944O844K544KS44Kv44Ot44O844K6XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsb3NlUmVzb3VyY2VzKHNlcnZlciwgdHJhbnNwb3J0KTtcbiAgICB9IGNhdGNoIChjbG9zZUVycm9yKSB7XG4gICAgICAvLyDjgq/jg63jg7zjgrrjgqjjg6njg7zjga/ml6LjgatjbG9zZVJlc291cmNlc+WGheOBp+ODreOCsOWHuuWKm+OBleOCjOOBpuOBhOOCi+OBn+OCgeOAgVxuICAgICAgLy8g44GT44GT44Gn44Gv6L+95Yqg44Gu44Ko44Op44O844OP44Oz44OJ44Oq44Oz44Kw44Gv5LiN6KaB44Gg44GM44CB44Ko44Op44O844Gu6Kmz57Sw44KS6KiY6YyyXG4gICAgICBjb25zdCBlcnJvckRldGFpbHMgPSBjbG9zZUVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgPyB7IG1lc3NhZ2U6IGNsb3NlRXJyb3IubWVzc2FnZSwgc3RhY2s6IGNsb3NlRXJyb3Iuc3RhY2sgfVxuICAgICAgICA6IGNsb3NlRXJyb3I7XG4gICAgICBsb2dnZXIuZXJyb3IoJ+ODquOCveODvOOCueOCr+ODreODvOOCuuS4reOBq+i/veWKoOOCqOODqeODvOOBjOeZuueUn+OBl+OBvuOBl+OBn+OBjOOAgeWHpueQhuOCkue2mee2muOBl+OBvuOBmScsIHsgY2xvc2VFcnJvcjogZXJyb3JEZXRhaWxzIH0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBIb25v44Ki44OX44Oq44Kx44O844K344On44Oz44KS55Sf5oiQ44GX44CBL21jcOOCqOODs+ODieODneOCpOODs+ODiOOBp01DUOOCteODvOODkOODvOOCkuaPkOS+m+OBl+OBvuOBmeOAglxuICpcbiAqIEByZW1hcmtzXG4gKiBQT1NUL0dFVCAvbWNwIOOBp01DUOODquOCr+OCqOOCueODiOOCkuWPl+OBkeS7mOOBkeOAgeS7luOBrkhUVFDjg6Hjgr3jg4Pjg4njga80MDXjgpLov5TjgZfjgb7jgZnjgIJcbiAqXG4gKiBAcGFyYW0gY3JlYXRlTWNwU2VydmVyIE1DUOOCteODvOODkOODvOOCpOODs+OCueOCv+ODs+OCueOCkueUn+aIkOOBmeOCi+ODleOCoeOCr+ODiOODqumWouaVsFxuICogQHJldHVybnMgSG9ub+OCouODl+ODquOCseODvOOCt+ODp+ODs+OCpOODs+OCueOCv+ODs+OCuVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlSG9ub0FwcCB9IGZyb20gJy4uLic7XG4gKiBpbXBvcnQgeyBjcmVhdGVNY3BTZXJ2ZXIgfSBmcm9tICcuL3lvdXItbWNwLXNlcnZlcic7XG4gKiBjb25zdCBhcHAgPSBjcmVhdGVIb25vQXBwKGNyZWF0ZU1jcFNlcnZlcik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUhvbm9BcHAgPSAoY3JlYXRlTWNwU2VydmVyOiAoKSA9PiBNY3BTZXJ2ZXIpID0+IHtcbiAgY29uc3QgYXBwID0gbmV3IEhvbm8oKTtcblxuICBhcHAucG9zdCgnL21jcCcsIGFzeW5jIChjKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZVJlcXVlc3QoY3JlYXRlTWNwU2VydmVyLCBjKTtcbiAgfSk7XG5cbiAgYXBwLmdldCgnL21jcCcsIGFzeW5jIChjKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZVJlcXVlc3QoY3JlYXRlTWNwU2VydmVyLCBjKTtcbiAgfSk7XG5cbiAgYXBwLnB1dCgnL21jcCcsIG1ldGhvZE5vdEFsbG93ZWRIYW5kbGVyKTtcbiAgYXBwLmRlbGV0ZSgnL21jcCcsIG1ldGhvZE5vdEFsbG93ZWRIYW5kbGVyKTtcbiAgYXBwLnBhdGNoKCcvbWNwJywgbWV0aG9kTm90QWxsb3dlZEhhbmRsZXIpO1xuICBhcHAub3B0aW9ucygnL21jcCcsIG1ldGhvZE5vdEFsbG93ZWRIYW5kbGVyKTtcblxuICByZXR1cm4gYXBwO1xufTtcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aws-lambda-mcp-server",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "A Hono wrapper for building an MCP (Model Context Protocol) Server that runs on AWS Lambda functions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
],
|
|
12
12
|
"private": false,
|
|
13
13
|
"sideEffects": false,
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"package.json",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
14
19
|
"homepage": "https://github.com/poad/aws-lambda-mcp-server#readme",
|
|
15
20
|
"repository": {
|
|
16
21
|
"type": "git",
|
|
@@ -23,31 +28,31 @@
|
|
|
23
28
|
}
|
|
24
29
|
},
|
|
25
30
|
"module": "./dist/index.js",
|
|
26
|
-
"types": "dist/index.d.ts",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
27
32
|
"main": "./dist/index.js",
|
|
28
33
|
"author": "poad",
|
|
29
34
|
"license": "ISC",
|
|
30
35
|
"devDependencies": {
|
|
31
36
|
"@eslint/compat": "^1.4.1",
|
|
32
|
-
"@eslint/js": "^9.39.
|
|
37
|
+
"@eslint/js": "^9.39.1",
|
|
33
38
|
"@stylistic/eslint-plugin": "^5.5.0",
|
|
34
|
-
"@types/node": "24.
|
|
35
|
-
"eslint": "^9.39.
|
|
39
|
+
"@types/node": "24.10.0",
|
|
40
|
+
"eslint": "^9.39.1",
|
|
36
41
|
"eslint-import-resolver-typescript": "^4.4.4",
|
|
37
42
|
"eslint-plugin-import": "^2.32.0",
|
|
38
43
|
"eslint-plugin-promise": "^7.2.1",
|
|
39
44
|
"jiti": "^2.6.1",
|
|
40
45
|
"tsx": "^4.20.6",
|
|
41
46
|
"typescript": "^5.9.3",
|
|
42
|
-
"typescript-eslint": "^8.46.
|
|
43
|
-
"vitest": "^4.0.
|
|
47
|
+
"typescript-eslint": "^8.46.3",
|
|
48
|
+
"vitest": "^4.0.7"
|
|
44
49
|
},
|
|
45
50
|
"dependencies": {
|
|
46
51
|
"@aws-lambda-powertools/logger": "^2.28.1",
|
|
47
52
|
"@hono/mcp": "^0.1.5",
|
|
48
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
53
|
+
"@modelcontextprotocol/sdk": "^1.21.0",
|
|
49
54
|
"hono": "^4.10.4",
|
|
50
|
-
"zod": "^
|
|
55
|
+
"zod": "^4.1.12"
|
|
51
56
|
},
|
|
52
57
|
"scripts": {
|
|
53
58
|
"build": "tsc",
|
|
@@ -55,5 +60,6 @@
|
|
|
55
60
|
"test": "vitest run --passWithNoTests",
|
|
56
61
|
"lint": "eslint .",
|
|
57
62
|
"lint-fix": "eslint . --fix"
|
|
58
|
-
}
|
|
63
|
+
},
|
|
64
|
+
"typings": "./dist/index.d.ts"
|
|
59
65
|
}
|
package/eslint.config.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { Config, defineConfig } from 'eslint/config';
|
|
2
|
-
import eslint from '@eslint/js';
|
|
3
|
-
import { configs, parser } from 'typescript-eslint';
|
|
4
|
-
import stylistic from '@stylistic/eslint-plugin';
|
|
5
|
-
import importPlugin from 'eslint-plugin-import';
|
|
6
|
-
// @ts-expect-error ignore type errors
|
|
7
|
-
import pluginPromise from 'eslint-plugin-promise';
|
|
8
|
-
|
|
9
|
-
import { includeIgnoreFile } from '@eslint/compat';
|
|
10
|
-
import path from 'node:path';
|
|
11
|
-
import { fileURLToPath } from 'node:url';
|
|
12
|
-
|
|
13
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
-
const __dirname = path.dirname(__filename);
|
|
15
|
-
const gitignorePath = path.resolve(__dirname, '.gitignore');
|
|
16
|
-
|
|
17
|
-
const eslintConfig: Config[] = defineConfig(
|
|
18
|
-
{
|
|
19
|
-
ignores: [
|
|
20
|
-
...(includeIgnoreFile(gitignorePath).ignores || []),
|
|
21
|
-
'**/*.d.ts',
|
|
22
|
-
'src/tsconfig.json',
|
|
23
|
-
'src/stories',
|
|
24
|
-
'**/*.css',
|
|
25
|
-
'node_modules/**/*',
|
|
26
|
-
'out',
|
|
27
|
-
'cdk.out',
|
|
28
|
-
'dist',
|
|
29
|
-
'app',
|
|
30
|
-
],
|
|
31
|
-
},
|
|
32
|
-
eslint.configs.recommended,
|
|
33
|
-
configs.strict,
|
|
34
|
-
configs.stylistic,
|
|
35
|
-
pluginPromise.configs['flat/recommended'],
|
|
36
|
-
{
|
|
37
|
-
files: ['**/*.ts'],
|
|
38
|
-
plugins: {
|
|
39
|
-
'@stylistic': stylistic,
|
|
40
|
-
},
|
|
41
|
-
languageOptions: {
|
|
42
|
-
ecmaVersion: 'latest',
|
|
43
|
-
sourceType: 'module',
|
|
44
|
-
parser,
|
|
45
|
-
parserOptions: {
|
|
46
|
-
tsconfigRootDir: __dirname,
|
|
47
|
-
project: ['./tsconfig-eslint.json'],
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
extends: [
|
|
51
|
-
importPlugin.flatConfigs.recommended,
|
|
52
|
-
importPlugin.flatConfigs.typescript,
|
|
53
|
-
],
|
|
54
|
-
settings: {
|
|
55
|
-
'import/resolver': {
|
|
56
|
-
// You will also need to install and configure the TypeScript resolver
|
|
57
|
-
// See also https://github.com/import-js/eslint-import-resolver-typescript#configuration
|
|
58
|
-
'typescript': true,
|
|
59
|
-
'node': true,
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
rules: {
|
|
63
|
-
'@stylistic/semi': ['error', 'always'],
|
|
64
|
-
'@stylistic/indent': ['error', 2],
|
|
65
|
-
'@stylistic/comma-dangle': ['error', 'always-multiline'],
|
|
66
|
-
'@stylistic/arrow-parens': ['error', 'always'],
|
|
67
|
-
'@stylistic/quotes': ['error', 'single'],
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
export default eslintConfig;
|
package/src/index.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@aws-lambda-powertools/logger';
|
|
2
|
-
import { StreamableHTTPTransport } from '@hono/mcp';
|
|
3
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
|
-
import { Context, Hono } from 'hono';
|
|
5
|
-
import { BlankEnv, BlankInput } from 'hono/types';
|
|
6
|
-
|
|
7
|
-
const logger = new Logger();
|
|
8
|
-
|
|
9
|
-
const methodNotAllowedHandler = async (
|
|
10
|
-
c: Context<BlankEnv, '/mcp', BlankInput>,
|
|
11
|
-
) => {
|
|
12
|
-
return c.json(
|
|
13
|
-
{
|
|
14
|
-
jsonrpc: '2.0',
|
|
15
|
-
error: {
|
|
16
|
-
code: -32000,
|
|
17
|
-
message: 'メソッドは許可されていません。',
|
|
18
|
-
},
|
|
19
|
-
id: null,
|
|
20
|
-
},
|
|
21
|
-
{ status: 405 },
|
|
22
|
-
);
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const handleError = (
|
|
26
|
-
c: Context<BlankEnv, '/mcp', BlankInput>,
|
|
27
|
-
reason: unknown,
|
|
28
|
-
logMessage: string,
|
|
29
|
-
) => {
|
|
30
|
-
const errorDetails = reason instanceof Error
|
|
31
|
-
? { message: reason.message, stack: reason.stack, name: reason.name }
|
|
32
|
-
: { reason };
|
|
33
|
-
logger.error(logMessage, errorDetails);
|
|
34
|
-
return c.json(
|
|
35
|
-
{
|
|
36
|
-
jsonrpc: '2.0',
|
|
37
|
-
error: {
|
|
38
|
-
code: -32603,
|
|
39
|
-
message: '内部サーバーエラー',
|
|
40
|
-
},
|
|
41
|
-
id: null,
|
|
42
|
-
},
|
|
43
|
-
{ status: 500 },
|
|
44
|
-
);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const closeResources = async (server: McpServer, transport: StreamableHTTPTransport) => {
|
|
48
|
-
// 両方のクローズを確実に実行(片方が失敗してももう片方を実行)
|
|
49
|
-
const closeResults = await Promise.allSettled([
|
|
50
|
-
transport.close(),
|
|
51
|
-
server.close(),
|
|
52
|
-
]);
|
|
53
|
-
|
|
54
|
-
// クローズエラーをログ出力
|
|
55
|
-
closeResults.forEach((result, index) => {
|
|
56
|
-
if (result.status === 'rejected') {
|
|
57
|
-
const resourceName = index === 0 ? 'transport' : 'server';
|
|
58
|
-
const error = result.reason;
|
|
59
|
-
const errorDetails = error instanceof Error
|
|
60
|
-
? { message: error.message, stack: error.stack }
|
|
61
|
-
: error;
|
|
62
|
-
logger.error(`Error closing ${resourceName}:`, { error: errorDetails });
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const handleRequest = async (server: McpServer, c: Context<BlankEnv, '/mcp', BlankInput>) => {
|
|
68
|
-
const transport = new StreamableHTTPTransport({
|
|
69
|
-
sessionIdGenerator: undefined, // セッションIDを生成しない(ステートレスモード)
|
|
70
|
-
enableJsonResponse: true,
|
|
71
|
-
});
|
|
72
|
-
try {
|
|
73
|
-
await server.connect(transport);
|
|
74
|
-
logger.trace('MCP リクエストを受信');
|
|
75
|
-
return await transport.handleRequest(c);
|
|
76
|
-
} catch (error) {
|
|
77
|
-
try {
|
|
78
|
-
await closeResources(server, transport);
|
|
79
|
-
} catch (closeError) {
|
|
80
|
-
const errorDetails = closeError instanceof Error
|
|
81
|
-
? { message: closeError.message, stack: closeError.stack }
|
|
82
|
-
: closeError;
|
|
83
|
-
logger.error('Transport close failed after connection error:', { closeError: errorDetails });
|
|
84
|
-
}
|
|
85
|
-
return handleError(c, error, 'MCP 接続中のエラー:');
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
export const createHonoApp = (server: McpServer) => {
|
|
91
|
-
const app = new Hono();
|
|
92
|
-
|
|
93
|
-
app.post('/mcp', async (c) => {
|
|
94
|
-
return await handleRequest(server, c);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
app.get('/mcp', async (c) => {
|
|
98
|
-
return await handleRequest(server, c);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
app.put('/mcp', methodNotAllowedHandler);
|
|
102
|
-
app.delete('/mcp', methodNotAllowedHandler);
|
|
103
|
-
app.patch('/mcp', methodNotAllowedHandler);
|
|
104
|
-
app.options('/mcp', methodNotAllowedHandler);
|
|
105
|
-
|
|
106
|
-
return app;
|
|
107
|
-
};
|
package/tsconfig-eslint.json
DELETED
package/tsconfig.json
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2024",
|
|
4
|
-
"module": "NodeNext",
|
|
5
|
-
"moduleResolution": "NodeNext",
|
|
6
|
-
"lib": [
|
|
7
|
-
"es2024"
|
|
8
|
-
],
|
|
9
|
-
"declaration": true,
|
|
10
|
-
"strict": true,
|
|
11
|
-
"noImplicitAny": true,
|
|
12
|
-
"strictNullChecks": true,
|
|
13
|
-
"noImplicitThis": true,
|
|
14
|
-
"alwaysStrict": true,
|
|
15
|
-
"noUnusedLocals": false,
|
|
16
|
-
"noUnusedParameters": false,
|
|
17
|
-
"noImplicitReturns": true,
|
|
18
|
-
"noFallthroughCasesInSwitch": false,
|
|
19
|
-
"inlineSourceMap": true,
|
|
20
|
-
"inlineSources": true,
|
|
21
|
-
"experimentalDecorators": true,
|
|
22
|
-
"strictPropertyInitialization": false,
|
|
23
|
-
"skipLibCheck": true,
|
|
24
|
-
"declarationMap": true,
|
|
25
|
-
"outDir": "dist",
|
|
26
|
-
"typeRoots": [
|
|
27
|
-
"./node_modules/@types"
|
|
28
|
-
],
|
|
29
|
-
"types": [
|
|
30
|
-
"node"
|
|
31
|
-
]
|
|
32
|
-
},
|
|
33
|
-
"exclude": [
|
|
34
|
-
"node_modules",
|
|
35
|
-
"*.config.ts",
|
|
36
|
-
"dist"
|
|
37
|
-
]
|
|
38
|
-
}
|