npb-mcp-server 0.1.0

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.
Files changed (50) hide show
  1. package/README.md +301 -0
  2. package/dist/constants/teams.d.ts +14 -0
  3. package/dist/constants/teams.d.ts.map +1 -0
  4. package/dist/constants/teams.js +104 -0
  5. package/dist/constants/teams.js.map +1 -0
  6. package/dist/constants/teams.test.d.ts +2 -0
  7. package/dist/constants/teams.test.d.ts.map +1 -0
  8. package/dist/constants/teams.test.js +93 -0
  9. package/dist/constants/teams.test.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +268 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/scrapers/players.d.ts +14 -0
  15. package/dist/scrapers/players.d.ts.map +1 -0
  16. package/dist/scrapers/players.js +151 -0
  17. package/dist/scrapers/players.js.map +1 -0
  18. package/dist/tools/get-team-players.d.ts +13 -0
  19. package/dist/tools/get-team-players.d.ts.map +1 -0
  20. package/dist/tools/get-team-players.js +28 -0
  21. package/dist/tools/get-team-players.js.map +1 -0
  22. package/dist/tools/list-teams.d.ts +13 -0
  23. package/dist/tools/list-teams.d.ts.map +1 -0
  24. package/dist/tools/list-teams.js +22 -0
  25. package/dist/tools/list-teams.js.map +1 -0
  26. package/dist/tools/list-teams.test.d.ts +2 -0
  27. package/dist/tools/list-teams.test.d.ts.map +1 -0
  28. package/dist/tools/list-teams.test.js +46 -0
  29. package/dist/tools/list-teams.test.js.map +1 -0
  30. package/dist/tools/search-players.d.ts +16 -0
  31. package/dist/tools/search-players.d.ts.map +1 -0
  32. package/dist/tools/search-players.js +41 -0
  33. package/dist/tools/search-players.js.map +1 -0
  34. package/dist/types/npb.d.ts +51 -0
  35. package/dist/types/npb.d.ts.map +1 -0
  36. package/dist/types/npb.js +2 -0
  37. package/dist/types/npb.js.map +1 -0
  38. package/dist/utils/cache.d.ts +37 -0
  39. package/dist/utils/cache.d.ts.map +1 -0
  40. package/dist/utils/cache.js +75 -0
  41. package/dist/utils/cache.js.map +1 -0
  42. package/dist/utils/cache.test.d.ts +2 -0
  43. package/dist/utils/cache.test.d.ts.map +1 -0
  44. package/dist/utils/cache.test.js +62 -0
  45. package/dist/utils/cache.test.js.map +1 -0
  46. package/dist/utils/http.d.ts +9 -0
  47. package/dist/utils/http.d.ts.map +1 -0
  48. package/dist/utils/http.js +50 -0
  49. package/dist/utils/http.js.map +1 -0
  50. package/package.json +72 -0
package/dist/index.js ADDED
@@ -0,0 +1,268 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { ListToolsRequestSchema, CallToolRequestSchema, ErrorCode, McpError, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { Hono } from 'hono';
6
+ import { serve } from '@hono/node-server';
7
+ import { listTeams } from './tools/list-teams.js';
8
+ import { getTeamPlayersHandler } from './tools/get-team-players.js';
9
+ import { searchPlayers } from './tools/search-players.js';
10
+ /**
11
+ * NPB MCP Server
12
+ * 日本プロ野球(NPB)の選手情報を提供するMCPサーバー
13
+ */
14
+ class NPBServer {
15
+ server;
16
+ constructor() {
17
+ this.server = new Server({
18
+ name: 'npb-mcp-server',
19
+ version: '0.1.0',
20
+ }, {
21
+ capabilities: {
22
+ tools: {},
23
+ },
24
+ });
25
+ this.setupToolHandlers();
26
+ // エラーハンドリング
27
+ this.server.onerror = (error) => console.error('[MCP Error]', error);
28
+ process.on('SIGINT', async () => {
29
+ await this.server.close();
30
+ process.exit(0);
31
+ });
32
+ }
33
+ setupToolHandlers() {
34
+ // ツール一覧を返すハンドラー
35
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
36
+ tools: [
37
+ {
38
+ name: 'list_teams',
39
+ description: 'NPB全12球団の一覧を取得します。リーグでフィルタリング可能です。',
40
+ inputSchema: {
41
+ type: 'object',
42
+ properties: {
43
+ league: {
44
+ type: 'string',
45
+ enum: ['central', 'pacific'],
46
+ description: 'フィルタリングするリーグ(省略可)',
47
+ },
48
+ },
49
+ },
50
+ },
51
+ {
52
+ name: 'get_team_players',
53
+ description: '指定された球団の選手一覧を取得します。',
54
+ inputSchema: {
55
+ type: 'object',
56
+ properties: {
57
+ team_id: {
58
+ type: 'string',
59
+ description: '球団ID (例: g=ジャイアンツ, t=タイガース, db=ベイスターズ, c=カープ, s=スワローズ, d=ドラゴンズ, h=ホークス, f=ファイターズ, m=マリーンズ, e=イーグルス, bs=バファローズ, l=ライオンズ)',
60
+ },
61
+ },
62
+ required: ['team_id'],
63
+ },
64
+ },
65
+ {
66
+ name: 'search_players',
67
+ description: '選手名、ポジション、背番号などで選手を検索します。',
68
+ inputSchema: {
69
+ type: 'object',
70
+ properties: {
71
+ name: {
72
+ type: 'string',
73
+ description: '選手名(部分一致)',
74
+ },
75
+ team_id: {
76
+ type: 'string',
77
+ description: '球団IDでフィルタリング',
78
+ },
79
+ position: {
80
+ type: 'string',
81
+ enum: ['pitcher', 'catcher', 'infielder', 'outfielder'],
82
+ description: 'ポジションでフィルタリング',
83
+ },
84
+ number: {
85
+ type: 'string',
86
+ description: '背番号でフィルタリング',
87
+ },
88
+ },
89
+ },
90
+ },
91
+ ],
92
+ }));
93
+ // ツール実行ハンドラー
94
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
95
+ const { name, arguments: args } = request.params;
96
+ try {
97
+ switch (name) {
98
+ case 'list_teams':
99
+ return await listTeams(args || {});
100
+ case 'get_team_players':
101
+ if (!args || !args.team_id) {
102
+ throw new McpError(ErrorCode.InvalidParams, 'team_id is required');
103
+ }
104
+ return await getTeamPlayersHandler(args);
105
+ case 'search_players':
106
+ return await searchPlayers(args || {});
107
+ default:
108
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
109
+ }
110
+ }
111
+ catch (error) {
112
+ if (error instanceof McpError) {
113
+ throw error;
114
+ }
115
+ const errorMessage = error instanceof Error ? error.message : String(error);
116
+ throw new McpError(ErrorCode.InternalError, `Tool execution failed: ${errorMessage}`);
117
+ }
118
+ });
119
+ }
120
+ /**
121
+ * stdioモードで起動
122
+ */
123
+ async runStdio() {
124
+ const transport = new StdioServerTransport();
125
+ await this.server.connect(transport);
126
+ console.error('NPB MCP server running on stdio');
127
+ }
128
+ /**
129
+ * HTTPモードで起動(Hono)
130
+ */
131
+ async runHTTP(port = 3000) {
132
+ const app = new Hono();
133
+ // ヘルスチェックエンドポイント
134
+ app.get('/health', (c) => {
135
+ return c.json({ status: 'ok', name: 'npb-mcp-server', version: '0.1.0' });
136
+ });
137
+ // MCPエンドポイント(JSON-RPC over HTTP)
138
+ app.post('/mcp', async (c) => {
139
+ try {
140
+ const request = await c.req.json();
141
+ // リクエストのメソッドに応じて処理を分岐
142
+ if (request.method === 'tools/list') {
143
+ const tools = {
144
+ tools: [
145
+ {
146
+ name: 'list_teams',
147
+ description: 'NPB全12球団の一覧を取得します。リーグでフィルタリング可能です。',
148
+ inputSchema: {
149
+ type: 'object',
150
+ properties: {
151
+ league: {
152
+ type: 'string',
153
+ enum: ['central', 'pacific'],
154
+ description: 'フィルタリングするリーグ(省略可)',
155
+ },
156
+ },
157
+ },
158
+ },
159
+ {
160
+ name: 'get_team_players',
161
+ description: '指定された球団の選手一覧を取得します。',
162
+ inputSchema: {
163
+ type: 'object',
164
+ properties: {
165
+ team_id: {
166
+ type: 'string',
167
+ description: '球団ID',
168
+ },
169
+ },
170
+ required: ['team_id'],
171
+ },
172
+ },
173
+ {
174
+ name: 'search_players',
175
+ description: '選手名、ポジション、背番号などで選手を検索します。',
176
+ inputSchema: {
177
+ type: 'object',
178
+ properties: {
179
+ name: { type: 'string', description: '選手名(部分一致)' },
180
+ team_id: { type: 'string', description: '球団IDでフィルタリング' },
181
+ position: {
182
+ type: 'string',
183
+ enum: ['pitcher', 'catcher', 'infielder', 'outfielder'],
184
+ description: 'ポジションでフィルタリング',
185
+ },
186
+ number: { type: 'string', description: '背番号でフィルタリング' },
187
+ },
188
+ },
189
+ },
190
+ ],
191
+ };
192
+ return c.json({
193
+ jsonrpc: '2.0',
194
+ id: request.id,
195
+ result: tools,
196
+ });
197
+ }
198
+ else if (request.method === 'tools/call') {
199
+ const { name, arguments: args } = request.params;
200
+ let result;
201
+ switch (name) {
202
+ case 'list_teams':
203
+ result = await listTeams(args || {});
204
+ break;
205
+ case 'get_team_players':
206
+ if (!args || !args.team_id) {
207
+ throw new McpError(ErrorCode.InvalidParams, 'team_id is required');
208
+ }
209
+ result = await getTeamPlayersHandler(args);
210
+ break;
211
+ case 'search_players':
212
+ result = await searchPlayers(args || {});
213
+ break;
214
+ default:
215
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
216
+ }
217
+ return c.json({
218
+ jsonrpc: '2.0',
219
+ id: request.id,
220
+ result,
221
+ });
222
+ }
223
+ else {
224
+ return c.json({
225
+ jsonrpc: '2.0',
226
+ id: request.id,
227
+ error: {
228
+ code: ErrorCode.MethodNotFound,
229
+ message: `Unknown method: ${request.method}`,
230
+ },
231
+ }, 404);
232
+ }
233
+ }
234
+ catch (error) {
235
+ const errorMessage = error instanceof Error ? error.message : String(error);
236
+ const errorCode = error instanceof McpError ? error.code : ErrorCode.InternalError;
237
+ return c.json({
238
+ jsonrpc: '2.0',
239
+ id: (await c.req.json()).id,
240
+ error: {
241
+ code: errorCode,
242
+ message: errorMessage,
243
+ },
244
+ }, 500);
245
+ }
246
+ });
247
+ // サーバー起動
248
+ console.error(`NPB MCP server running on http://localhost:${port}`);
249
+ serve({
250
+ fetch: app.fetch,
251
+ port,
252
+ });
253
+ }
254
+ }
255
+ // メイン処理
256
+ async function main() {
257
+ const server = new NPBServer();
258
+ const transport = process.env.MCP_TRANSPORT || 'stdio';
259
+ if (transport === 'http') {
260
+ const port = parseInt(process.env.PORT || '3000', 10);
261
+ await server.runHTTP(port);
262
+ }
263
+ else {
264
+ await server.runStdio();
265
+ }
266
+ }
267
+ main().catch(console.error);
268
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Player, Team, TeamRoster } from '../types/npb.js';
2
+ /**
3
+ * HTMLから選手一覧をスクレイピング
4
+ */
5
+ export declare function scrapePlayersFromHTML(html: string, teamId: string): Player[];
6
+ /**
7
+ * 指定された球団の選手一覧を取得
8
+ */
9
+ export declare function getTeamPlayers(team: Team): Promise<TeamRoster>;
10
+ /**
11
+ * すべての球団の選手を取得
12
+ */
13
+ export declare function getAllPlayers(teams: Team[]): Promise<Map<string, TeamRoster>>;
14
+ //# sourceMappingURL=players.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"players.d.ts","sourceRoot":"","sources":["../../src/scrapers/players.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAkC,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA+E3F;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAqC5E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAuBpE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAenF"}
@@ -0,0 +1,151 @@
1
+ import * as cheerio from 'cheerio';
2
+ import { fetchHTML } from '../utils/http.js';
3
+ import { globalCache } from '../utils/cache.js';
4
+ /**
5
+ * ポジション名からPositionを判定
6
+ * @internal 現在は未使用だが、将来の拡張のために保持
7
+ */
8
+ function _parsePosition(positionText) {
9
+ if (positionText.includes('投手'))
10
+ return 'pitcher';
11
+ if (positionText.includes('捕手'))
12
+ return 'catcher';
13
+ if (positionText.includes('内野手'))
14
+ return 'infielder';
15
+ if (positionText.includes('外野手'))
16
+ return 'outfielder';
17
+ return 'pitcher'; // デフォルト
18
+ }
19
+ /**
20
+ * 投打の文字列からHandを判定
21
+ */
22
+ function parseHand(handText) {
23
+ const trimmed = handText.trim();
24
+ if (trimmed === '右')
25
+ return '右';
26
+ if (trimmed === '左')
27
+ return '左';
28
+ if (trimmed === '両')
29
+ return '両';
30
+ return '右'; // デフォルト
31
+ }
32
+ /**
33
+ * テーブル行から選手情報をパース
34
+ */
35
+ function parsePlayerRow($, row, position, category, teamId) {
36
+ const cells = $(row).find('td');
37
+ if (cells.length < 7) {
38
+ return null; // データが不完全
39
+ }
40
+ try {
41
+ const number = $(cells[0]).text().trim();
42
+ const name = $(cells[1]).text().trim();
43
+ const birthDate = $(cells[2]).text().trim();
44
+ const heightText = $(cells[3]).text().trim();
45
+ const weightText = $(cells[4]).text().trim();
46
+ const pitchingHand = parseHand($(cells[5]).text());
47
+ const battingHand = parseHand($(cells[6]).text());
48
+ const note = cells.length > 7 ? $(cells[7]).text().trim() : undefined;
49
+ const height = parseInt(heightText, 10);
50
+ const weight = parseInt(weightText, 10);
51
+ if (isNaN(height) || isNaN(weight)) {
52
+ return null;
53
+ }
54
+ return {
55
+ number,
56
+ name,
57
+ birthDate,
58
+ height,
59
+ weight,
60
+ pitchingHand,
61
+ battingHand,
62
+ position,
63
+ category,
64
+ note: note || undefined,
65
+ teamId,
66
+ };
67
+ }
68
+ catch (error) {
69
+ console.error('Error parsing player row:', error);
70
+ return null;
71
+ }
72
+ }
73
+ /**
74
+ * HTMLから選手一覧をスクレイピング
75
+ */
76
+ export function scrapePlayersFromHTML(html, teamId) {
77
+ const $ = cheerio.load(html);
78
+ const players = [];
79
+ // テーブルを探す(実際の構造に応じて調整が必要)
80
+ $('table').each((_, table) => {
81
+ const $table = $(table);
82
+ // テーブルのキャプションや見出しからポジションとカテゴリーを判定
83
+ const caption = $table.find('caption').text();
84
+ const previousHeading = $table.prevAll('h2, h3, h4').first().text();
85
+ const contextText = caption + previousHeading;
86
+ let position = 'pitcher';
87
+ let category = 'registered';
88
+ // ポジション判定
89
+ if (contextText.includes('投手'))
90
+ position = 'pitcher';
91
+ else if (contextText.includes('捕手'))
92
+ position = 'catcher';
93
+ else if (contextText.includes('内野手'))
94
+ position = 'infielder';
95
+ else if (contextText.includes('外野手'))
96
+ position = 'outfielder';
97
+ // カテゴリー判定
98
+ if (contextText.includes('育成')) {
99
+ category = 'development';
100
+ }
101
+ // テーブル内の各行を処理
102
+ $table.find('tbody tr').each((_, row) => {
103
+ const player = parsePlayerRow($, row, position, category, teamId);
104
+ if (player) {
105
+ players.push(player);
106
+ }
107
+ });
108
+ });
109
+ return players;
110
+ }
111
+ /**
112
+ * 指定された球団の選手一覧を取得
113
+ */
114
+ export async function getTeamPlayers(team) {
115
+ const cacheKey = `roster:${team.id}`;
116
+ // キャッシュをチェック
117
+ const cached = globalCache.get(cacheKey);
118
+ if (cached) {
119
+ return cached;
120
+ }
121
+ // HTMLを取得してスクレイピング
122
+ const html = await fetchHTML(team.rosterUrl);
123
+ const players = scrapePlayersFromHTML(html, team.id);
124
+ const roster = {
125
+ team,
126
+ players,
127
+ lastUpdated: new Date(),
128
+ };
129
+ // キャッシュに保存(1時間)
130
+ globalCache.set(cacheKey, roster, 3600000);
131
+ return roster;
132
+ }
133
+ /**
134
+ * すべての球団の選手を取得
135
+ */
136
+ export async function getAllPlayers(teams) {
137
+ const rosters = new Map();
138
+ // 並列で取得
139
+ const promises = teams.map(async (team) => {
140
+ try {
141
+ const roster = await getTeamPlayers(team);
142
+ rosters.set(team.id, roster);
143
+ }
144
+ catch (error) {
145
+ console.error(`Error fetching players for ${team.name}:`, error);
146
+ }
147
+ });
148
+ await Promise.all(promises);
149
+ return rosters;
150
+ }
151
+ //# sourceMappingURL=players.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"players.js","sourceRoot":"","sources":["../../src/scrapers/players.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * get_team_players ツールの実装
3
+ * 指定された球団の選手一覧を返す
4
+ */
5
+ export declare function getTeamPlayersHandler(args: {
6
+ team_id: string;
7
+ }): Promise<{
8
+ content: {
9
+ type: string;
10
+ text: string;
11
+ }[];
12
+ }>;
13
+ //# sourceMappingURL=get-team-players.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-team-players.d.ts","sourceRoot":"","sources":["../../src/tools/get-team-players.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;;;;;GA4BpE"}
@@ -0,0 +1,28 @@
1
+ import { getTeamById } from '../constants/teams.js';
2
+ import { getTeamPlayers } from '../scrapers/players.js';
3
+ /**
4
+ * get_team_players ツールの実装
5
+ * 指定された球団の選手一覧を返す
6
+ */
7
+ export async function getTeamPlayersHandler(args) {
8
+ const { team_id } = args;
9
+ const team = getTeamById(team_id);
10
+ if (!team) {
11
+ throw new Error(`Team not found: ${team_id}`);
12
+ }
13
+ const roster = await getTeamPlayers(team);
14
+ return {
15
+ content: [
16
+ {
17
+ type: 'text',
18
+ text: JSON.stringify({
19
+ team: roster.team,
20
+ playerCount: roster.players.length,
21
+ players: roster.players,
22
+ lastUpdated: roster.lastUpdated,
23
+ }, null, 2),
24
+ },
25
+ ],
26
+ };
27
+ }
28
+ //# sourceMappingURL=get-team-players.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-team-players.js","sourceRoot":"","sources":["../../src/tools/get-team-players.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAyB;IACnE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAEzB,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAE1C,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;oBAClC,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,WAAW,EAAE,MAAM,CAAC,WAAW;iBAChC,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * list_teams ツールの実装
3
+ * すべての球団一覧を返す
4
+ */
5
+ export declare function listTeams(args: {
6
+ league?: string;
7
+ }): Promise<{
8
+ content: {
9
+ type: string;
10
+ text: string;
11
+ }[];
12
+ }>;
13
+ //# sourceMappingURL=list-teams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-teams.d.ts","sourceRoot":"","sources":["../../src/tools/list-teams.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GAkBxD"}
@@ -0,0 +1,22 @@
1
+ import { TEAMS } from '../constants/teams.js';
2
+ /**
3
+ * list_teams ツールの実装
4
+ * すべての球団一覧を返す
5
+ */
6
+ export async function listTeams(args) {
7
+ const { league } = args;
8
+ let teams = TEAMS;
9
+ // リーグでフィルタリング
10
+ if (league === 'central' || league === 'pacific') {
11
+ teams = teams.filter((team) => team.league === league);
12
+ }
13
+ return {
14
+ content: [
15
+ {
16
+ type: 'text',
17
+ text: JSON.stringify(teams, null, 2),
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ //# sourceMappingURL=list-teams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-teams.js","sourceRoot":"","sources":["../../src/tools/list-teams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAyB;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,cAAc;IACd,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACjD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aACrC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list-teams.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-teams.test.d.ts","sourceRoot":"","sources":["../../src/tools/list-teams.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { listTeams } from './list-teams.js';
3
+ describe('listTeams', () => {
4
+ it('リーグ指定なしで全12球団を返す', async () => {
5
+ const result = await listTeams({});
6
+ expect(result).toHaveProperty('content');
7
+ expect(result.content).toHaveLength(1);
8
+ expect(result.content[0]).toHaveProperty('type', 'text');
9
+ const teams = JSON.parse(result.content[0].text);
10
+ expect(teams).toHaveLength(12);
11
+ });
12
+ it('セ・リーグを指定すると6球団を返す', async () => {
13
+ const result = await listTeams({ league: 'central' });
14
+ const teams = JSON.parse(result.content[0].text);
15
+ expect(teams).toHaveLength(6);
16
+ teams.forEach((team) => {
17
+ expect(team.league).toBe('central');
18
+ });
19
+ });
20
+ it('パ・リーグを指定すると6球団を返す', async () => {
21
+ const result = await listTeams({ league: 'pacific' });
22
+ const teams = JSON.parse(result.content[0].text);
23
+ expect(teams).toHaveLength(6);
24
+ teams.forEach((team) => {
25
+ expect(team.league).toBe('pacific');
26
+ });
27
+ });
28
+ it('各球団に必要なフィールドが含まれる', async () => {
29
+ const result = await listTeams({});
30
+ const teams = JSON.parse(result.content[0].text);
31
+ teams.forEach((team) => {
32
+ expect(team).toHaveProperty('id');
33
+ expect(team).toHaveProperty('name');
34
+ expect(team).toHaveProperty('fullName');
35
+ expect(team).toHaveProperty('league');
36
+ expect(team).toHaveProperty('rosterUrl');
37
+ });
38
+ });
39
+ it('不正なリーグ指定は無視される', async () => {
40
+ const result = await listTeams({ league: 'invalid' });
41
+ const teams = JSON.parse(result.content[0].text);
42
+ // 不正なリーグ指定は無視されて全球団が返される
43
+ expect(teams).toHaveLength(12);
44
+ });
45
+ });
46
+ //# sourceMappingURL=list-teams.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-teams.test.js","sourceRoot":"","sources":["../../src/tools/list-teams.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * search_players ツールの実装
3
+ * 選手名やその他の条件で選手を検索
4
+ */
5
+ export declare function searchPlayers(args: {
6
+ name?: string;
7
+ team_id?: string;
8
+ position?: string;
9
+ number?: string;
10
+ }): Promise<{
11
+ content: {
12
+ type: string;
13
+ text: string;
14
+ }[];
15
+ }>;
16
+ //# sourceMappingURL=search-players.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-players.d.ts","sourceRoot":"","sources":["../../src/tools/search-players.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;;;;;GA6CA"}