Skip to content

Commit 19ff1b3

Browse files
authored
Migrate to MCP v2 (#232)
* Migrate to MCP v2 * ワークフロージョブ名の誤りを修正 * 細かい修正
1 parent 52c38d7 commit 19ff1b3

12 files changed

Lines changed: 104 additions & 785 deletions

File tree

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
<!-- markdownlint-disable MD041 -->
2+
<!-- markdownlint-disable MD033 -->
23

34
## 概要
45

5-
概要を記述
6+
概要を簡潔に記述
67

78
## 変更点
89

10+
変更内容を簡潔に記述。
11+
12+
<details>
13+
<summary>修正ファイル一覧</summary>
14+
915
| 追加・変更・削除したファイル (リポジトリルートからの相対パス) | 変更内容 | 事由 |
1016
| --------------------------------------------------- | ------- | --- |
1117
| 変更したファイルのリポジトリルートからの相対パス | どんな変更を行なったのか? | 何故、変更が必要だったのか? |
1218

19+
</details>
20+
1321
## 関連Issue
1422

1523
- あれば記述(なければセクションを削除)
@@ -18,7 +26,7 @@
1826

1927
- [ ] (Typescriptの場合) `pnpm audit --fix` で脆弱性を修正済みか?
2028
- [ ] (Typescriptの場合) `pnpm lint-fix` でコードスタイルは修正済みか?
21-
- [ ] (Markdownの場合)`npx -y markdownlint-cli2@latest . --fix` で Markdown の lint は修正済みか?
29+
- [ ] (Markdownの場合)`pnx markdownlint-cli2@latest . --fix` で Markdown の lint は修正済みか?
2230

2331
## 特記事項
2432

.github/workflows/create-release-pr.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ jobs:
3333
run: |
3434
git config user.name "github-actions[bot]"
3535
git config user.email "github-actions[bot]@users.noreply.github.com"
36-
36+
3737
- name: Install pnpm
3838
uses: pnpm/setup@5d160c5bc68a09337ad0d5654e237e03253b5879 # v1.0.0
39-
39+
4040
# No need to install dependencies - npm version works without them
4141
- name: Version bump
4242
id: version

.github/workflows/deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ jobs:
3939
- name: Lint
4040
run: pnpm run --if-present --recursive --parallel lint
4141

42-
deploy-bexample:
42+
deploy-example:
4343
# 同時実行すると CREATE_IN_PROGRESS や UPDATE_IN_PROGRESS 状態で cdk deploy を行う可能性があるため抑止する
4444
concurrency:
4545
group: "cloudformation-aws-lambda-mcp-server-example"

example/lambda/index.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Logger } from '@aws-lambda-powertools/logger';
2-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp';
2+
import { McpServer } from '@modelcontextprotocol/server';
33
import { handle } from 'hono/aws-lambda';
44
import { z } from 'zod';
55
import { createHonoApp } from 'aws-lambda-mcp-server';
@@ -10,13 +10,14 @@ const createMcpServer = () => {
1010
const server = new McpServer({
1111
name: 'hello-server',
1212
version: '1.0.0',
13-
});
13+
},
14+
);
1415

1516
server.registerTool(
1617
'say_hello',
1718
{
1819
description: 'Greets the user with a friendly message.',
19-
inputSchema: { who: z.string() },
20+
inputSchema: z.object({ who: z.string() }),
2021
},
2122
async ({ who }: { who: string }) => ({
2223
content: [{
@@ -27,7 +28,9 @@ const createMcpServer = () => {
2728
);
2829
return server;
2930
};
30-
const app = createHonoApp(createMcpServer);
31+
const app = createHonoApp(createMcpServer, {
32+
host: '0.0.0.0',
33+
});
3134

3235
// Lambda handler
3336
export const handler = handle(app);

example/lib/example-stack.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export class ExampleStack extends cdk.Stack {
1919
],
2020
});
2121

22-
2322
const mcpServerFunctionName = `${projectName}-mcp-server-example`;
2423
const mcpServerLogGroup = new cdk.aws_logs.LogGroup(this, 'McpServerFunctionLogGroup', {
2524
logGroupName: `/aws/lambda/${mcpServerFunctionName}`,
@@ -40,7 +39,7 @@ export class ExampleStack extends cdk.Stack {
4039
bundling: {
4140
// No externalModules since we want to bundle everything
4241
nodeModules: [
43-
'@modelcontextprotocol/sdk',
42+
'@modelcontextprotocol/server',
4443
'hono',
4544
'zod',
4645
],
@@ -52,7 +51,7 @@ export class ExampleStack extends cdk.Stack {
5251
sourceMap: true, // ソースマップを有効化(デバッグ用)
5352
keepNames: true,
5453
format: cdk.aws_lambda_nodejs.OutputFormat.ESM,
55-
target: 'node22', // Target Node.js 22.x
54+
target: 'node24', // Target Node.js 24.x
5655
banner: 'import { createRequire } from \'module\';const require = createRequire(import.meta.url);',
5756
},
5857
});
@@ -66,7 +65,7 @@ export class ExampleStack extends cdk.Stack {
6665
allowMethods: cdk.aws_apigateway.Cors.ALL_METHODS,
6766
},
6867
deployOptions: {
69-
stageName: 'v1',
68+
stageName: 'v2',
7069
},
7170
endpointTypes: [cdk.aws_apigateway.EndpointType.REGIONAL],
7271
});

example/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
},
1818
"devDependencies": {
1919
"@eslint/js": "10.0.1",
20-
"@hono/mcp": "0.3.1",
2120
"@hono/node-server": "2.0.11",
2221
"@stylistic/eslint-plugin": "5.10.0",
2322
"@types/aws-lambda": "8.10.162",
@@ -37,7 +36,7 @@
3736
},
3837
"dependencies": {
3938
"@aws-lambda-powertools/logger": "2.34.0",
40-
"@modelcontextprotocol/sdk": "1.30.0",
39+
"@modelcontextprotocol/server": "2.0.0",
4140
"aws-cdk-lib": "2.261.0",
4241
"aws-lambda-mcp-server": "workspace:*",
4342
"constructs": "10.7.1",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"devEngines": {
2222
"packageManager": {
2323
"name": "pnpm",
24-
"version": "^11.17.0",
24+
"version": "^11.19.0",
2525
"onFail": "download"
2626
}
2727
},

package/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ npm install aws-lambda-mcp-server
2020
TypeScriptでの利用例です。
2121

2222
```typescript
23-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
23+
import { McpServer } from '@modelcontextprotocol/server';
2424
import { createHonoApp } from 'aws-lambda-mcp-server';
2525
import { handle } from 'hono/aws-lambda';
2626
import { z } from 'zod';

package/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,15 @@
5858
},
5959
"dependencies": {
6060
"@aws-lambda-powertools/logger": "2.34.0",
61-
"@hono/mcp": "0.3.1",
62-
"@modelcontextprotocol/sdk": "1.30.0",
61+
"@modelcontextprotocol/core": "^2.0.0",
62+
"@modelcontextprotocol/hono": "^2.0.0",
63+
"@modelcontextprotocol/server": "2.0.0",
6364
"hono": "4.12.31",
6465
"zod": "4.4.3"
6566
},
6667
"peerDependencies": {
6768
"@aws-lambda-powertools/logger": "^2.34.0",
68-
"@hono/mcp": "^0.3.1",
69-
"@modelcontextprotocol/sdk": "^1.30.0",
69+
"@modelcontextprotocol/server": "^2.0.0",
7070
"hono": "^4.12.31",
7171
"zod": "^3.25 || ^4.0"
7272
}

package/src/index.ts

Lines changed: 17 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
*/
1111

1212
import { 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';
1616
import { BlankEnv, BlankInput } from 'hono/types';
1717

1818
/**
@@ -22,31 +22,14 @@ import { BlankEnv, BlankInput } from 'hono/types';
2222
*/
2323
const 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
*/
127110
const 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

Comments
 (0)