Skip to content

Commit b303c33

Browse files
authored
Merge pull request #28 from yamanoku/feat/mcp-sdk-v2
Update MCP TypeScript SDK to v2
2 parents 4be12fc + 41ab741 commit b303c33

6 files changed

Lines changed: 121 additions & 507 deletions

baseline-mcp-server.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
2+
import { assertEquals } from "@std/assert";
3+
import { createMCPServer } from "./baseline-mcp-server.ts";
4+
5+
Deno.test("MCPサーバーがツールと入力スキーマを公開する", async () => {
6+
const server = createMCPServer();
7+
const client = new Client({
8+
name: "baseline-mcp-server-test",
9+
version: "1.0.0",
10+
});
11+
const [clientTransport, serverTransport] = InMemoryTransport
12+
.createLinkedPair();
13+
14+
await server.connect(serverTransport);
15+
await client.connect(clientTransport);
16+
17+
try {
18+
const { tools } = await client.listTools();
19+
20+
assertEquals(
21+
tools.map(({ name }) => name),
22+
[
23+
"get_web_feature_baseline_status",
24+
"get_negated_browser_baseline_status",
25+
],
26+
);
27+
assertEquals(tools[0].inputSchema, {
28+
$schema: "https://json-schema.org/draft/2020-12/schema",
29+
type: "object",
30+
properties: {
31+
query: {
32+
description: "調べたい機能の名前",
33+
type: "array",
34+
items: { type: "string" },
35+
},
36+
},
37+
required: ["query"],
38+
});
39+
assertEquals(tools[1].inputSchema, {
40+
$schema: "https://json-schema.org/draft/2020-12/schema",
41+
type: "object",
42+
properties: {
43+
query: {
44+
description:
45+
"除外したいブラウザの名前(chrome, edge, firefox, safari)",
46+
type: "string",
47+
enum: ["chrome", "edge", "firefox", "safari"],
48+
},
49+
},
50+
required: ["query"],
51+
});
52+
} finally {
53+
await client.close();
54+
await server.close();
55+
}
56+
});

baseline-mcp-server.ts

Lines changed: 43 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,56 @@
11
// baseline-mcp-server.ts
2-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2+
import { McpServer } from "@modelcontextprotocol/server";
3+
import { serveStdio } from "@modelcontextprotocol/server/stdio";
44
import { z } from "zod";
55
import {
66
getNegatedBrowserBaselineStatusAsMCPContent,
77
getWebFeatureBaselineStatusAsMCPContent,
88
} from "./tools/index.ts";
9-
import { BROWSERS, type Browsers } from "./types.ts";
9+
import { BROWSERS } from "./types.ts";
1010
import DenoJSON from "./deno.json" with { type: "json" };
1111

12-
// MCPサーバーの初期化
13-
const server = new McpServer({
14-
name: "Baseline MCP Server",
15-
version: DenoJSON.version,
16-
capabilities: {
17-
tools: {},
18-
},
19-
});
12+
export function createMCPServer(): McpServer {
13+
const server = new McpServer({
14+
name: "Baseline MCP Server",
15+
version: DenoJSON.version,
16+
});
2017

21-
// 特定の機能のBaselineステータスを取得
22-
server.tool(
23-
"get_web_feature_baseline_status",
24-
"クエリを指定し、Web Platform Dashboardからfeatureの結果を取得します",
25-
{
26-
query: z.string().array().describe("調べたい機能の名前"),
27-
},
28-
async ({ query }: { query: string | string[] }) => {
29-
return await getWebFeatureBaselineStatusAsMCPContent(query);
30-
},
31-
);
18+
// 特定の機能のBaselineステータスを取得
19+
server.registerTool(
20+
"get_web_feature_baseline_status",
21+
{
22+
description:
23+
"クエリを指定し、Web Platform Dashboardからfeatureの結果を取得します",
24+
inputSchema: z.object({
25+
query: z.array(z.string()).describe("調べたい機能の名前"),
26+
}),
27+
},
28+
async ({ query }) => {
29+
return await getWebFeatureBaselineStatusAsMCPContent(query);
30+
},
31+
);
3232

33-
// 特定のブラウザを除外した機能を検索
34-
server.tool(
35-
"get_negated_browser_baseline_status",
36-
"特定のブラウザを除外して、Web Platform Dashboardからfeatureの結果を取得します",
37-
{
38-
query: z.enum(BROWSERS).describe(
39-
"除外したいブラウザの名前(chrome, edge, firefox, safari)",
40-
),
41-
},
42-
async ({ query }: { query: Browsers }) => {
43-
return await getNegatedBrowserBaselineStatusAsMCPContent(query);
44-
},
45-
);
33+
// 特定のブラウザを除外した機能を検索
34+
server.registerTool(
35+
"get_negated_browser_baseline_status",
36+
{
37+
description:
38+
"特定のブラウザを除外して、Web Platform Dashboardからfeatureの結果を取得します",
39+
inputSchema: z.object({
40+
query: z.enum(BROWSERS).describe(
41+
"除外したいブラウザの名前(chrome, edge, firefox, safari)",
42+
),
43+
}),
44+
},
45+
async ({ query }) => {
46+
return await getNegatedBrowserBaselineStatusAsMCPContent(query);
47+
},
48+
);
4649

47-
// 起動
48-
async function setMCPServer() {
49-
const transport = new StdioServerTransport();
50-
await server.connect(transport);
51-
console.error("Baseline MCP Server running on stdio");
50+
return server;
5251
}
5352

54-
setMCPServer().catch((error) => {
55-
console.error("Fatal error in setMCPServer():", error);
56-
Deno.exit(1);
57-
});
53+
if (import.meta.main) {
54+
serveStdio(createMCPServer);
55+
console.error("Baseline MCP Server running on stdio");
56+
}

deno.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
"fmt": "deno fmt"
1414
},
1515
"imports": {
16-
"@modelcontextprotocol/sdk": "npm:@modelcontextprotocol/sdk@^1.30.0",
17-
"@modelcontextprotocol/sdk/server/mcp.js": "npm:@modelcontextprotocol/sdk@^1.30.0/server/mcp.js",
18-
"@modelcontextprotocol/sdk/server/stdio.js": "npm:@modelcontextprotocol/sdk@^1.30.0/server/stdio.js",
16+
"@modelcontextprotocol/client": "npm:@modelcontextprotocol/client@^2.0.0",
17+
"@modelcontextprotocol/server": "npm:@modelcontextprotocol/server@^2.0.0",
18+
"@modelcontextprotocol/server/stdio": "npm:@modelcontextprotocol/server@^2.0.0/stdio",
1919
"@std/assert": "jsr:@std/assert@^1.0.19",
2020
"zod": "npm:zod@^4.4.3"
2121
},

0 commit comments

Comments
 (0)