npb-mcp-server 0.1.0 → 0.2.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 (41) hide show
  1. package/README.md +62 -0
  2. package/dist/index.js +40 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/scrapers/playerDetails.d.ts +7 -0
  5. package/dist/scrapers/playerDetails.d.ts.map +1 -0
  6. package/dist/scrapers/playerDetails.js +460 -0
  7. package/dist/scrapers/playerDetails.js.map +1 -0
  8. package/dist/scrapers/playerDetails.test.d.ts +2 -0
  9. package/dist/scrapers/playerDetails.test.d.ts.map +1 -0
  10. package/dist/scrapers/playerDetails.test.js +549 -0
  11. package/dist/scrapers/playerDetails.test.js.map +1 -0
  12. package/dist/scrapers/players.d.ts.map +1 -1
  13. package/dist/scrapers/players.js +123 -20
  14. package/dist/scrapers/players.js.map +1 -1
  15. package/dist/scrapers/players.test.d.ts +2 -0
  16. package/dist/scrapers/players.test.d.ts.map +1 -0
  17. package/dist/scrapers/players.test.js +385 -0
  18. package/dist/scrapers/players.test.js.map +1 -0
  19. package/dist/tools/get-player-details.d.ts +13 -0
  20. package/dist/tools/get-player-details.d.ts.map +1 -0
  21. package/dist/tools/get-player-details.js +28 -0
  22. package/dist/tools/get-player-details.js.map +1 -0
  23. package/dist/tools/get-player-details.test.d.ts +2 -0
  24. package/dist/tools/get-player-details.test.d.ts.map +1 -0
  25. package/dist/tools/get-player-details.test.js +201 -0
  26. package/dist/tools/get-player-details.test.js.map +1 -0
  27. package/dist/tools/search-players.d.ts +1 -0
  28. package/dist/tools/search-players.d.ts.map +1 -1
  29. package/dist/tools/search-players.js +29 -2
  30. package/dist/tools/search-players.js.map +1 -1
  31. package/dist/types/npb.d.ts +113 -0
  32. package/dist/types/npb.d.ts.map +1 -1
  33. package/dist/utils/nameNormalizer.d.ts +21 -0
  34. package/dist/utils/nameNormalizer.d.ts.map +1 -0
  35. package/dist/utils/nameNormalizer.js +46 -0
  36. package/dist/utils/nameNormalizer.js.map +1 -0
  37. package/dist/utils/nameNormalizer.test.d.ts +2 -0
  38. package/dist/utils/nameNormalizer.test.d.ts.map +1 -0
  39. package/dist/utils/nameNormalizer.test.js +82 -0
  40. package/dist/utils/nameNormalizer.test.js.map +1 -0
  41. package/package.json +1 -1
@@ -51,6 +51,19 @@ function parsePlayerRow($, row, position, category, teamId) {
51
51
  if (isNaN(height) || isNaN(weight)) {
52
52
  return null;
53
53
  }
54
+ // 選手IDを抽出(リンクが存在する場合)
55
+ let playerId;
56
+ const link = $(cells[1]).find('a');
57
+ if (link.length > 0) {
58
+ const href = link.attr('href');
59
+ if (href) {
60
+ // /bis/players/12345678.html のようなパターンから選手IDを抽出
61
+ const match = href.match(/\/bis\/players\/(\d{8})\.html/);
62
+ if (match) {
63
+ playerId = match[1];
64
+ }
65
+ }
66
+ }
54
67
  return {
55
68
  number,
56
69
  name,
@@ -63,6 +76,7 @@ function parsePlayerRow($, row, position, category, teamId) {
63
76
  category,
64
77
  note: note || undefined,
65
78
  teamId,
79
+ playerId,
66
80
  };
67
81
  }
68
82
  catch (error) {
@@ -76,31 +90,120 @@ function parsePlayerRow($, row, position, category, teamId) {
76
90
  export function scrapePlayersFromHTML(html, teamId) {
77
91
  const $ = cheerio.load(html);
78
92
  const players = [];
79
- // テーブルを探す(実際の構造に応じて調整が必要)
80
- $('table').each((_, table) => {
93
+ // テーブルを探す(rosterlisttblクラスのテーブルを優先)
94
+ $('table.rosterlisttbl, table').each((_, table) => {
81
95
  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';
96
+ // カテゴリー判定: まず前の見出しを探す
87
97
  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('育成')) {
98
+ const previousHeading = $table.prevAll('h2, h3, h4').first().text();
99
+ if (previousHeading.includes('育成')) {
99
100
  category = 'development';
100
101
  }
102
+ else if (previousHeading.includes('支配下')) {
103
+ category = 'registered';
104
+ }
105
+ else {
106
+ // 前の見出しが見つからない場合、親要素内の見出しを探す
107
+ let parent = $table.parent();
108
+ let foundHeading = false;
109
+ // 最大5階層まで遡って見出しを探す
110
+ for (let i = 0; i < 5 && parent.length > 0 && !foundHeading; i++) {
111
+ // テーブルの前にある見出しを探す
112
+ const headingsBeforeTable = parent.find('h3').filter((_, h) => {
113
+ const $h = $(h);
114
+ const headingText = $h.text().trim();
115
+ // 見出しがテーブルの前にあるかチェック
116
+ const headingIndex = $h.index();
117
+ const tableIndex = $table.index();
118
+ return ((headingText.includes('育成') || headingText.includes('支配下')) &&
119
+ headingIndex < tableIndex);
120
+ });
121
+ if (headingsBeforeTable.length > 0) {
122
+ const headingText = $(headingsBeforeTable.first()).text().trim();
123
+ if (headingText.includes('育成')) {
124
+ category = 'development';
125
+ foundHeading = true;
126
+ }
127
+ else if (headingText.includes('支配下')) {
128
+ category = 'registered';
129
+ foundHeading = true;
130
+ }
131
+ }
132
+ parent = parent.parent();
133
+ }
134
+ // 見出しが見つからない場合、背番号のパターンで判定(3桁の背番号は育成選手の可能性が高い)
135
+ if (!foundHeading) {
136
+ const firstDataRow = $table
137
+ .find('tr')
138
+ .filter((_, row) => {
139
+ const cells = $(row).find('td');
140
+ if (cells.length >= 2) {
141
+ const number = $(cells[0]).text().trim();
142
+ return /^\d{3}$/.test(number); // 3桁の数字
143
+ }
144
+ return false;
145
+ })
146
+ .first();
147
+ if (firstDataRow.length > 0) {
148
+ category = 'development';
149
+ }
150
+ }
151
+ }
152
+ let currentPosition = 'pitcher';
101
153
  // テーブル内の各行を処理
102
- $table.find('tbody tr').each((_, row) => {
103
- const player = parsePlayerRow($, row, position, category, teamId);
154
+ $table.find('tbody tr, tr').each((_, row) => {
155
+ const $row = $(row);
156
+ const cells = $row.find('td, th');
157
+ // セル数が少ない行(ヘッダー行や区切り行)をスキップ
158
+ if (cells.length < 7) {
159
+ // ただし、ポジションヘッダー行の可能性がある場合はチェック
160
+ const rowText = $row.text();
161
+ if (rowText.includes('投手')) {
162
+ currentPosition = 'pitcher';
163
+ return;
164
+ }
165
+ else if (rowText.includes('捕手')) {
166
+ currentPosition = 'catcher';
167
+ return;
168
+ }
169
+ else if (rowText.includes('内野手')) {
170
+ currentPosition = 'infielder';
171
+ return;
172
+ }
173
+ else if (rowText.includes('外野手')) {
174
+ currentPosition = 'outfielder';
175
+ return;
176
+ }
177
+ return;
178
+ }
179
+ // ポジションヘッダー行のチェック(「No. | 投手」のような行)
180
+ const firstCellText = $(cells[0]).text().trim();
181
+ const secondCellText = $(cells[1]).text().trim();
182
+ // ヘッダー行のパターン: 「No.」で始まり、2番目のセルにポジション名がある
183
+ if (firstCellText === 'No.' || firstCellText.includes('No.')) {
184
+ if (secondCellText.includes('投手')) {
185
+ currentPosition = 'pitcher';
186
+ return;
187
+ }
188
+ else if (secondCellText.includes('捕手')) {
189
+ currentPosition = 'catcher';
190
+ return;
191
+ }
192
+ else if (secondCellText.includes('内野手')) {
193
+ currentPosition = 'infielder';
194
+ return;
195
+ }
196
+ else if (secondCellText.includes('外野手')) {
197
+ currentPosition = 'outfielder';
198
+ return;
199
+ }
200
+ // 監督などの行はスキップ
201
+ if (secondCellText.includes('監督') || secondCellText.includes('コーチ')) {
202
+ return;
203
+ }
204
+ }
205
+ // 選手データ行をパース
206
+ const player = parsePlayerRow($, row, currentPosition, category, teamId);
104
207
  if (player) {
105
208
  players.push(player);
106
209
  }
@@ -1 +1 @@
1
- {"version":3,"file":"players.js","sourceRoot":"","sources":["../../src/scrapers/players.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"players.js","sourceRoot":"","sources":["../../src/scrapers/players.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=players.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"players.test.d.ts","sourceRoot":"","sources":["../../src/scrapers/players.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,385 @@
1
+ /* eslint-disable no-irregular-whitespace */
2
+ import { describe, it, expect } from 'vitest';
3
+ import { scrapePlayersFromHTML } from './players.js';
4
+ // 横浜DeNAベイスターズのような実際のHTML構造を模したモックHTML
5
+ const mockRosterHTML = `
6
+ <!DOCTYPE html>
7
+ <html>
8
+ <head>
9
+ <title>横浜DeNAベイスターズ 選手一覧</title>
10
+ </head>
11
+ <body>
12
+ <h1>横浜DeNAベイスターズ</h1>
13
+ <h2>2025年度 選手一覧</h2>
14
+
15
+ <h3>■ 支配下選手</h3>
16
+ <table class="rosterlisttbl">
17
+ <tr>
18
+ <td>No.</td>
19
+ <td>監督</td>
20
+ <td>生年月日</td>
21
+ <td></td>
22
+ <td>備考</td>
23
+ </tr>
24
+ <tr>
25
+ <td>81</td>
26
+ <td>三浦 大輔</td>
27
+ <td>1973.12.25</td>
28
+ <td></td>
29
+ <td></td>
30
+ </tr>
31
+ <tr>
32
+ <td>No.</td>
33
+ <td>投手</td>
34
+ <td>生年月日</td>
35
+ <td>身長</td>
36
+ <td>体重</td>
37
+ <td>投</td>
38
+ <td>打</td>
39
+ <td>備考</td>
40
+ </tr>
41
+ <tr>
42
+ <td>11</td>
43
+ <td><a href="/bis/players/51155136.html">東 克樹</a></td>
44
+ <td>1995.11.29</td>
45
+ <td>170</td>
46
+ <td>80</td>
47
+ <td>左</td>
48
+ <td>左</td>
49
+ <td></td>
50
+ </tr>
51
+ <tr>
52
+ <td>12</td>
53
+ <td><a href="/bis/players/51234567.html">竹田 祐</a></td>
54
+ <td>1999.07.05</td>
55
+ <td>184</td>
56
+ <td>96</td>
57
+ <td>右</td>
58
+ <td>右</td>
59
+ <td></td>
60
+ </tr>
61
+ <tr>
62
+ <td>No.</td>
63
+ <td>捕手</td>
64
+ <td>生年月日</td>
65
+ <td>身長</td>
66
+ <td>体重</td>
67
+ <td>投</td>
68
+ <td>打</td>
69
+ <td>備考</td>
70
+ </tr>
71
+ <tr>
72
+ <td>2</td>
73
+ <td><a href="/bis/players/52345678.html">戸柱 恭孝</a></td>
74
+ <td>1989.10.20</td>
75
+ <td>178</td>
76
+ <td>88</td>
77
+ <td>右</td>
78
+ <td>右</td>
79
+ <td></td>
80
+ </tr>
81
+ <tr>
82
+ <td>27</td>
83
+ <td><a href="/bis/players/53456789.html">嶺井 博希</a></td>
84
+ <td>1990.05.12</td>
85
+ <td>175</td>
86
+ <td>82</td>
87
+ <td>右</td>
88
+ <td>右</td>
89
+ <td></td>
90
+ </tr>
91
+ <tr>
92
+ <td>No.</td>
93
+ <td>内野手</td>
94
+ <td>生年月日</td>
95
+ <td>身長</td>
96
+ <td>体重</td>
97
+ <td>投</td>
98
+ <td>打</td>
99
+ <td>備考</td>
100
+ </tr>
101
+ <tr>
102
+ <td>6</td>
103
+ <td><a href="/bis/players/54567890.html">牧 秀悟</a></td>
104
+ <td>1994.11.20</td>
105
+ <td>180</td>
106
+ <td>88</td>
107
+ <td>右</td>
108
+ <td>右</td>
109
+ <td></td>
110
+ </tr>
111
+ <tr>
112
+ <td>25</td>
113
+ <td><a href="/bis/players/55678901.html">大和</a></td>
114
+ <td>1992.03.15</td>
115
+ <td>175</td>
116
+ <td>75</td>
117
+ <td>右</td>
118
+ <td>左</td>
119
+ <td></td>
120
+ </tr>
121
+ <tr>
122
+ <td>No.</td>
123
+ <td>外野手</td>
124
+ <td>生年月日</td>
125
+ <td>身長</td>
126
+ <td>体重</td>
127
+ <td>投</td>
128
+ <td>打</td>
129
+ <td>備考</td>
130
+ </tr>
131
+ <tr>
132
+ <td>7</td>
133
+ <td><a href="/bis/players/56789012.html">佐野 恵太</a></td>
134
+ <td>1994.02.06</td>
135
+ <td>180</td>
136
+ <td>88</td>
137
+ <td>右</td>
138
+ <td>左</td>
139
+ <td></td>
140
+ </tr>
141
+ <tr>
142
+ <td>8</td>
143
+ <td><a href="/bis/players/57890123.html">桑原 将志</a></td>
144
+ <td>1993.05.18</td>
145
+ <td>178</td>
146
+ <td>85</td>
147
+ <td>右</td>
148
+ <td>右</td>
149
+ <td></td>
150
+ </tr>
151
+ </table>
152
+
153
+ <h3>■ 育成選手</h3>
154
+ <table class="rosterlisttbl">
155
+ <tr>
156
+ <td>No.</td>
157
+ <td>投手</td>
158
+ <td>生年月日</td>
159
+ <td>身長</td>
160
+ <td>体重</td>
161
+ <td>投</td>
162
+ <td>打</td>
163
+ <td>備考</td>
164
+ </tr>
165
+ <tr>
166
+ <td>043</td>
167
+ <td><a href="/bis/players/58901234.html">深沢 鳳介</a></td>
168
+ <td>2003.11.05</td>
169
+ <td>177</td>
170
+ <td>80</td>
171
+ <td>右</td>
172
+ <td>右</td>
173
+ <td></td>
174
+ </tr>
175
+ <tr>
176
+ <td>No.</td>
177
+ <td>内野手</td>
178
+ <td>生年月日</td>
179
+ <td>身長</td>
180
+ <td>体重</td>
181
+ <td>投</td>
182
+ <td>打</td>
183
+ <td>備考</td>
184
+ </tr>
185
+ <tr>
186
+ <td>101</td>
187
+ <td><a href="/bis/players/59012345.html">草野 陽斗</a></td>
188
+ <td>2004.06.07</td>
189
+ <td>175</td>
190
+ <td>87</td>
191
+ <td>右</td>
192
+ <td>右</td>
193
+ <td></td>
194
+ </tr>
195
+ </table>
196
+
197
+ <!-- 見出しとテーブルが直接の兄弟でない場合のテスト -->
198
+ <div>
199
+ <h3>■ 育成選手(別構造)</h3>
200
+ <div>
201
+ <table class="rosterlisttbl">
202
+ <tr>
203
+ <td>No.</td>
204
+ <td>外野手</td>
205
+ <td>生年月日</td>
206
+ <td>身長</td>
207
+ <td>体重</td>
208
+ <td>投</td>
209
+ <td>打</td>
210
+ <td>備考</td>
211
+ </tr>
212
+ <tr>
213
+ <td>201</td>
214
+ <td><a href="/bis/players/60123456.html">テスト 育成外野手</a></td>
215
+ <td>2005.01.01</td>
216
+ <td>180</td>
217
+ <td>75</td>
218
+ <td>右</td>
219
+ <td>左</td>
220
+ <td></td>
221
+ </tr>
222
+ </table>
223
+ </div>
224
+ </div>
225
+ </body>
226
+ </html>
227
+ `;
228
+ describe('scrapePlayersFromHTML', () => {
229
+ describe('ポジション別の選手抽出', () => {
230
+ it('投手を正しく抽出する', () => {
231
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
232
+ const pitchers = players.filter((p) => p.position === 'pitcher');
233
+ expect(pitchers.length).toBeGreaterThan(0);
234
+ expect(pitchers[0].name).toBe('東 克樹');
235
+ expect(pitchers[0].position).toBe('pitcher');
236
+ expect(pitchers[0].number).toBe('11');
237
+ });
238
+ it('捕手を正しく抽出する', () => {
239
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
240
+ const catchers = players.filter((p) => p.position === 'catcher');
241
+ expect(catchers.length).toBe(2);
242
+ expect(catchers[0].name).toBe('戸柱 恭孝');
243
+ expect(catchers[0].position).toBe('catcher');
244
+ expect(catchers[1].name).toBe('嶺井 博希');
245
+ });
246
+ it('内野手を正しく抽出する', () => {
247
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
248
+ const infielders = players.filter((p) => p.position === 'infielder');
249
+ expect(infielders.length).toBeGreaterThan(0);
250
+ expect(infielders[0].name).toBe('牧 秀悟');
251
+ expect(infielders[0].position).toBe('infielder');
252
+ });
253
+ it('外野手を正しく抽出する', () => {
254
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
255
+ const outfielders = players.filter((p) => p.position === 'outfielder');
256
+ expect(outfielders.length).toBeGreaterThanOrEqual(2);
257
+ expect(outfielders[0].name).toBe('佐野 恵太');
258
+ expect(outfielders[0].position).toBe('outfielder');
259
+ expect(outfielders[1].name).toBe('桑原 将志');
260
+ });
261
+ });
262
+ describe('1つのテーブル内の複数ポジション処理', () => {
263
+ it('1つのテーブル内でポジションが切り替わる場合に正しく処理する', () => {
264
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
265
+ // 支配下登録テーブルには投手、捕手、内野手、外野手が含まれている
266
+ const registeredPlayers = players.filter((p) => p.category === 'registered');
267
+ const pitchers = registeredPlayers.filter((p) => p.position === 'pitcher');
268
+ const catchers = registeredPlayers.filter((p) => p.position === 'catcher');
269
+ const infielders = registeredPlayers.filter((p) => p.position === 'infielder');
270
+ const outfielders = registeredPlayers.filter((p) => p.position === 'outfielder');
271
+ expect(pitchers.length).toBe(2); // 東、竹田
272
+ expect(catchers.length).toBe(2); // 戸柱、嶺井
273
+ expect(infielders.length).toBe(2); // 牧、大和
274
+ expect(outfielders.length).toBe(2); // 佐野、桑原
275
+ });
276
+ });
277
+ describe('カテゴリー判定', () => {
278
+ it('支配下登録選手を正しく判定する', () => {
279
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
280
+ const registeredPlayers = players.filter((p) => p.category === 'registered');
281
+ expect(registeredPlayers.length).toBeGreaterThan(0);
282
+ expect(registeredPlayers[0].category).toBe('registered');
283
+ expect(registeredPlayers[0].name).toBe('東 克樹');
284
+ });
285
+ it('育成選手を正しく判定する', () => {
286
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
287
+ const developmentPlayers = players.filter((p) => p.category === 'development');
288
+ expect(developmentPlayers.length).toBeGreaterThanOrEqual(2);
289
+ expect(developmentPlayers[0].category).toBe('development');
290
+ expect(developmentPlayers[0].name).toBe('深沢 鳳介');
291
+ });
292
+ it('見出しとテーブルが直接の兄弟でない場合でも育成選手を正しく判定する', () => {
293
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
294
+ const developmentPlayers = players.filter((p) => p.category === 'development');
295
+ // 育成選手が複数いることを確認
296
+ expect(developmentPlayers.length).toBeGreaterThanOrEqual(2);
297
+ // 背番号が3桁の育成選手が含まれていることを確認
298
+ const threeDigitNumberPlayers = developmentPlayers.filter((p) => /^\d{3}$/.test(p.number));
299
+ expect(threeDigitNumberPlayers.length).toBeGreaterThan(0);
300
+ });
301
+ });
302
+ describe('選手情報の抽出', () => {
303
+ it('選手IDを正しく抽出する', () => {
304
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
305
+ const player = players.find((p) => p.name === '東 克樹');
306
+ expect(player).toBeDefined();
307
+ expect(player?.playerId).toBe('51155136');
308
+ });
309
+ it('選手の基本情報を正しく抽出する', () => {
310
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
311
+ const player = players.find((p) => p.name === '東 克樹');
312
+ expect(player).toBeDefined();
313
+ expect(player?.number).toBe('11');
314
+ expect(player?.birthDate).toBe('1995.11.29');
315
+ expect(player?.height).toBe(170);
316
+ expect(player?.weight).toBe(80);
317
+ expect(player?.pitchingHand).toBe('左');
318
+ expect(player?.battingHand).toBe('左');
319
+ expect(player?.teamId).toBe('db');
320
+ });
321
+ it('投打の情報を正しく抽出する', () => {
322
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
323
+ const player = players.find((p) => p.name === '大和');
324
+ expect(player).toBeDefined();
325
+ expect(player?.pitchingHand).toBe('右');
326
+ expect(player?.battingHand).toBe('左');
327
+ });
328
+ });
329
+ describe('スキップ処理', () => {
330
+ it('監督の行をスキップする', () => {
331
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
332
+ const manager = players.find((p) => p.name === '三浦 大輔');
333
+ expect(manager).toBeUndefined();
334
+ });
335
+ it('ヘッダー行をスキップする', () => {
336
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
337
+ // ヘッダー行は選手として抽出されない
338
+ const headerRow = players.find((p) => p.name === 'No.');
339
+ expect(headerRow).toBeUndefined();
340
+ });
341
+ });
342
+ describe('ポジションヘッダー行の検出', () => {
343
+ it('「No. | 投手」のようなヘッダー行を検出してポジションを切り替える', () => {
344
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
345
+ // 投手ヘッダー行の後に投手が続く
346
+ const pitcherIndex = players.findIndex((p) => p.name === '東 克樹');
347
+ expect(players[pitcherIndex].position).toBe('pitcher');
348
+ // 捕手ヘッダー行の後に捕手が続く
349
+ const catcherIndex = players.findIndex((p) => p.name === '戸柱 恭孝');
350
+ expect(players[catcherIndex].position).toBe('catcher');
351
+ });
352
+ });
353
+ describe('全体の統計', () => {
354
+ it('全ての選手を正しく抽出する', () => {
355
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
356
+ // 支配下登録: 投手2 + 捕手2 + 内野手2 + 外野手2 = 8名
357
+ // 育成: 投手1 + 内野手1 + 外野手1 = 3名以上
358
+ // 合計: 11名以上
359
+ expect(players.length).toBeGreaterThanOrEqual(11);
360
+ });
361
+ it('ポジション別の人数が正しい', () => {
362
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
363
+ const positionCount = {
364
+ pitcher: players.filter((p) => p.position === 'pitcher').length,
365
+ catcher: players.filter((p) => p.position === 'catcher').length,
366
+ infielder: players.filter((p) => p.position === 'infielder').length,
367
+ outfielder: players.filter((p) => p.position === 'outfielder').length,
368
+ };
369
+ expect(positionCount.pitcher).toBeGreaterThanOrEqual(3); // 支配下2 + 育成1以上
370
+ expect(positionCount.catcher).toBe(2);
371
+ expect(positionCount.infielder).toBeGreaterThanOrEqual(3); // 支配下2 + 育成1以上
372
+ expect(positionCount.outfielder).toBeGreaterThanOrEqual(2); // 支配下2 + 育成1以上
373
+ });
374
+ it('育成選手と支配下登録選手の人数が正しい', () => {
375
+ const players = scrapePlayersFromHTML(mockRosterHTML, 'db');
376
+ const registeredPlayers = players.filter((p) => p.category === 'registered');
377
+ const developmentPlayers = players.filter((p) => p.category === 'development');
378
+ // 支配下登録: 投手2 + 捕手2 + 内野手2 + 外野手2 = 8名
379
+ expect(registeredPlayers.length).toBe(8);
380
+ // 育成選手: 投手1 + 内野手1 + 外野手1 = 3名以上
381
+ expect(developmentPlayers.length).toBeGreaterThanOrEqual(3);
382
+ });
383
+ });
384
+ });
385
+ //# sourceMappingURL=players.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"players.test.js","sourceRoot":"","sources":["../../src/scrapers/players.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * get_player_details ツールの実装
3
+ * 指定された選手IDの詳細情報を返す
4
+ */
5
+ export declare function getPlayerDetailsHandler(args: {
6
+ player_id: string;
7
+ }): Promise<{
8
+ content: {
9
+ type: string;
10
+ text: string;
11
+ }[];
12
+ }>;
13
+ //# sourceMappingURL=get-player-details.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-player-details.d.ts","sourceRoot":"","sources":["../../src/tools/get-player-details.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE;;;;;GAuBxE"}
@@ -0,0 +1,28 @@
1
+ import { getPlayerDetails } from '../scrapers/playerDetails.js';
2
+ /**
3
+ * get_player_details ツールの実装
4
+ * 指定された選手IDの詳細情報を返す
5
+ */
6
+ export async function getPlayerDetailsHandler(args) {
7
+ const { player_id } = args;
8
+ // 選手IDの形式チェック(8桁の数字)
9
+ if (!player_id.match(/^\d{8}$/)) {
10
+ throw new Error(`Invalid player ID format: ${player_id}. Expected 8 digits.`);
11
+ }
12
+ try {
13
+ const details = await getPlayerDetails(player_id);
14
+ return {
15
+ content: [
16
+ {
17
+ type: 'text',
18
+ text: JSON.stringify(details, null, 2),
19
+ },
20
+ ],
21
+ };
22
+ }
23
+ catch (error) {
24
+ const errorMessage = error instanceof Error ? error.message : String(error);
25
+ throw new Error(`Failed to fetch player details for ID ${player_id}: ${errorMessage}`);
26
+ }
27
+ }
28
+ //# sourceMappingURL=get-player-details.js.map