Skip to content

Commit 88d4b29

Browse files
committed
Bumps node modules
1 parent 9431e76 commit 88d4b29

6 files changed

Lines changed: 149 additions & 176 deletions

File tree

agents/agent-mastra/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"type": "module",
1616
"dependencies": {
1717
"@ai-sdk/amazon-bedrock": "^3.0.43",
18-
"@ai-sdk/azure": "^2.0.53",
18+
"@ai-sdk/azure": "^2.0.54",
1919
"@mastra/core": "^0.20.2",
2020
"@mastra/libsql": "^0.15.2",
2121
"@mastra/loggers": "^0.10.16",

mcp/servers/postgresql-http/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
"@types/node": "^22.18.11",
2727
"@types/pg": "^8.15.5",
2828
"@types/source-map-support": "^0.5.10",
29-
"@types/uuid": "^10.0.0",
29+
"@types/uuid": "^11",
3030
"@vitest/eslint-plugin": "^1.3.23",
31-
"dotenv": "^16.6.1",
31+
"dotenv": "^17",
3232
"eslint": "^9.38.0",
3333
"eslint-import-resolver-typescript": "^3.10.1",
3434
"eslint-plugin-import": "^2.32.0",
@@ -37,15 +37,15 @@
3737
"tsx": "^4.20.6",
3838
"typescript": "^5.9.3",
3939
"typescript-eslint": "^8.46.1",
40-
"vite": "^6.4.1",
40+
"vite": "^7",
4141
"vite-tsconfig-paths": "^5.1.4",
4242
"vitest": "^3.2.4"
4343
},
4444
"dependencies": {
4545
"@aws-lambda-powertools/logger": "^2.27.0",
46+
"@hono/mcp": "^0.1.4",
4647
"@hono/node-server": "^1.19.5",
4748
"@modelcontextprotocol/sdk": "^1.20.1",
48-
"@vercel/mcp-adapter": "^1.0.0",
4949
"hono": "^4.10.1",
5050
"pg": "^8.16.3",
5151
"zod": "^3.25.76"

mcp/servers/postgresql-http/src/app.ts

Lines changed: 78 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,94 @@
11
import { Logger } from '@aws-lambda-powertools/logger';
2-
import { handler } from './route';
3-
import { Hono } from 'hono';
2+
import { StreamableHTTPTransport } from '@hono/mcp';
3+
import { createMcpServer } from './route';
4+
import { Context, Hono } from 'hono';
5+
import { BlankEnv, BlankInput } from 'hono/types';
6+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
47

58
const logger = new Logger();
69

710
export const app = new Hono();
811

12+
const handleError = (
13+
c: Context<BlankEnv, '/mcp', BlankInput>,
14+
reason: unknown,
15+
logMessage: string,
16+
) => {
17+
const errorDetails = reason instanceof Error
18+
? { message: reason.message, stack: reason.stack, name: reason.name }
19+
: { reason };
20+
logger.error(logMessage, errorDetails);
21+
return c.json(
22+
{
23+
jsonrpc: '2.0',
24+
error: {
25+
code: -32603,
26+
message: '内部サーバーエラー',
27+
},
28+
id: null,
29+
},
30+
{ status: 500 },
31+
);
32+
};
33+
34+
const closeResources = async (server: McpServer, transport: StreamableHTTPTransport) => {
35+
// 両方のクローズを確実に実行(片方が失敗してももう片方を実行)
36+
const closeResults = await Promise.allSettled([
37+
transport.close(),
38+
server.close(),
39+
]);
40+
41+
// クローズエラーをログ出力
42+
closeResults.forEach((result, index) => {
43+
if (result.status === 'rejected') {
44+
const resourceName = index === 0 ? 'transport' : 'server';
45+
const error = result.reason;
46+
const errorDetails = error instanceof Error
47+
? { message: error.message, stack: error.stack }
48+
: error;
49+
logger.error(`Error closing ${resourceName}:`, { error: errorDetails });
50+
}
51+
});
52+
};
53+
54+
955
app.post('/mcp', async (c) => {
1056
// In stateless mode, create a new instance of transport and server for each request
1157
// to ensure complete isolation. A single instance would cause request ID collisions
1258
// when multiple clients connect concurrently.
1359

60+
const server = createMcpServer();
61+
const transport = new StreamableHTTPTransport({
62+
sessionIdGenerator: undefined, // セッションIDを生成しない(ステートレスモード)
63+
enableJsonResponse: true,
64+
});
65+
transport.onclose = async () => {
66+
await server.close();
67+
logger.trace('MCP transport closed');
68+
};
1469
try {
15-
return await handler(c.req.raw);
70+
await server.connect(transport);
71+
72+
try {
73+
logger.trace('MCP リクエストを受信');
74+
return await transport.handleRequest(c);
75+
} catch (error) {
76+
return handleError(c, error, 'MCP リクエスト処理中のエラー:');
77+
} finally {
78+
await closeResources(server, transport);
79+
}
1680
} catch (error) {
17-
console.error('Error handling MCP request:', error);
18-
return c.json(
19-
{
20-
jsonrpc: '2.0',
21-
error: {
22-
code: -32603,
23-
message: 'Internal server error',
24-
},
25-
id: null,
26-
},
27-
500,
28-
);
81+
// サーバー接続に失敗した場合、transportのみクローズ(serverは未接続のため)
82+
// この時点でserver(サーバー)は未接続と考えられる。未接続のサーバーに対してクローズ処理を実行すると予期しないエラーが発生する可能性があるため
83+
try {
84+
await transport.close();
85+
} catch (closeError) {
86+
const errorDetails = closeError instanceof Error
87+
? { message: closeError.message, stack: closeError.stack }
88+
: closeError;
89+
logger.error('Transport close failed after connection error:', { closeError: errorDetails });
90+
}
91+
return handleError(c, error, 'MCP 接続中のエラー:');
2992
}
3093
});
3194

mcp/servers/postgresql-http/src/route.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
import { createMcpHandler } from '@vercel/mcp-adapter';
1+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
22
import { pgMcp } from './pgMcp';
33

4-
export const handler = createMcpHandler((server) => {
4+
export const createMcpServer = () => {
5+
const server = new McpServer({
6+
name: 'postgresql',
7+
version: '1.0.0',
8+
});
59
const resouces = [pgMcp.resources.schema, pgMcp.resources.status];
610
resouces.forEach((resource) => {
711
server.resource(
@@ -73,9 +77,6 @@ export const handler = createMcpHandler((server) => {
7377
...resp,
7478
};
7579
});
76-
}, {
77-
serverInfo: {
78-
name: 'postgresql',
79-
version: '1.0.0',
80-
},
81-
});
80+
81+
return server;
82+
};

0 commit comments

Comments
 (0)