cito-mcp 0.5.8 → 0.6.1
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.
- package/README.md +21 -21
- package/dist/client.js +8 -8
- package/dist/envelope.js +11 -11
- package/dist/index.js +2 -2
- package/dist/install.js +15 -15
- package/dist/instructions.js +10 -4
- package/dist/pacing.js +2 -2
- package/dist/scrub.js +87 -11
- package/dist/tools/combat.js +96 -96
- package/dist/tools/index.js +2 -0
- package/dist/tools/insight.js +48 -46
- package/dist/tools/leaderboard.js +6 -6
- package/dist/tools/live.js +45 -44
- package/dist/tools/match.js +90 -43
- package/dist/tools/meta.js +108 -73
- package/dist/tools/normalize.js +3 -2
- package/dist/tools/player.js +67 -28
- package/dist/tools/rankings.js +42 -9
- package/dist/tools/resolve.js +61 -61
- package/dist/tools/schedule.js +15 -14
- package/dist/tools/standings.js +66 -46
- package/dist/tools/team.js +91 -89
- package/dist/tools/tournaments.js +7 -9
- package/dist/tools/types.js +1 -1
- package/dist/tools/webhooks.js +377 -0
- package/package.json +51 -52
package/dist/tools/combat.js
CHANGED
|
@@ -82,7 +82,7 @@ function payload(res) {
|
|
|
82
82
|
const body = asRecord(res.data);
|
|
83
83
|
return body && 'data' in body ? body.data : res.data;
|
|
84
84
|
}
|
|
85
|
-
function
|
|
85
|
+
function responseNotes(res) {
|
|
86
86
|
const meta = asRecord(asRecord(res.data)?.meta);
|
|
87
87
|
const out = {};
|
|
88
88
|
if (typeof meta?.note === 'string')
|
|
@@ -114,7 +114,7 @@ function archiveGap(d, league, message, recover, calls = 0) {
|
|
|
114
114
|
source: d.source,
|
|
115
115
|
requestId: d.requestId,
|
|
116
116
|
tookMs: Date.now() - d.started,
|
|
117
|
-
|
|
117
|
+
apiCalls: calls,
|
|
118
118
|
retryable: false,
|
|
119
119
|
recover,
|
|
120
120
|
});
|
|
@@ -178,21 +178,21 @@ function begin(source) {
|
|
|
178
178
|
}
|
|
179
179
|
export const combatEvents = {
|
|
180
180
|
name: 'combat_events',
|
|
181
|
-
description: `RAF wrestling, BKFC bare-knuckle or MMA archive (Bellator, PRIDE, Strikeforce, WEC, DREAM, EliteXC, Affliction) events.
|
|
182
|
-
|
|
183
|
-
When to use:
|
|
184
|
-
- "When is the next RAF / BKFC card?", "recent BKFC results", "PRIDE results", "Bellator cards from 2015", schedule pages
|
|
185
|
-
- Getting an event slug for combat_card
|
|
186
|
-
|
|
187
|
-
Each event carries slug, name, date, local start time + timezone, venue/location, status and bout counts.
|
|
188
|
-
The MMA archives (bellator, pride, strikeforce, wec, dream, elitexc, affliction, and mma = all of them, each
|
|
189
|
-
event tagged with its real promotion) are closed: "when" defaults to "recent" (newest card first), and "upcoming"
|
|
190
|
-
returns an empty list with data.note instead of failing.
|
|
191
|
-
|
|
192
|
-
Prefer over: call_api /{league}/events.
|
|
193
|
-
Do not use when: you already have the event slug and want its bouts (combat_card).
|
|
194
|
-
|
|
195
|
-
Parallel-safe: yes.
|
|
181
|
+
description: `RAF wrestling, BKFC bare-knuckle or MMA archive (Bellator, PRIDE, Strikeforce, WEC, DREAM, EliteXC, Affliction) events.
|
|
182
|
+
|
|
183
|
+
When to use:
|
|
184
|
+
- "When is the next RAF / BKFC card?", "recent BKFC results", "PRIDE results", "Bellator cards from 2015", schedule pages
|
|
185
|
+
- Getting an event slug for combat_card
|
|
186
|
+
|
|
187
|
+
Each event carries slug, name, date, local start time + timezone, venue/location, status and bout counts.
|
|
188
|
+
The MMA archives (bellator, pride, strikeforce, wec, dream, elitexc, affliction, and mma = all of them, each
|
|
189
|
+
event tagged with its real promotion) are closed: "when" defaults to "recent" (newest card first), and "upcoming"
|
|
190
|
+
returns an empty list with data.note instead of failing.
|
|
191
|
+
|
|
192
|
+
Prefer over: call_api /{league}/events.
|
|
193
|
+
Do not use when: you already have the event slug and want its bouts (combat_card).
|
|
194
|
+
|
|
195
|
+
Parallel-safe: yes. API calls: 1.
|
|
196
196
|
Example: { "league": "bkfc", "when": "upcoming", "limit": 5 }`,
|
|
197
197
|
inputSchema: {
|
|
198
198
|
type: 'object',
|
|
@@ -228,7 +228,7 @@ Example: { "league": "bkfc", "when": "upcoming", "limit": 5 }`,
|
|
|
228
228
|
source: d.source,
|
|
229
229
|
requestId: d.requestId,
|
|
230
230
|
tookMs: Date.now() - d.started,
|
|
231
|
-
|
|
231
|
+
apiCalls: 0,
|
|
232
232
|
});
|
|
233
233
|
}
|
|
234
234
|
const res = await fetchJson(ctx, `/${league}/events/${when}`, { query: { limit } });
|
|
@@ -236,35 +236,35 @@ Example: { "league": "bkfc", "when": "upcoming", "limit": 5 }`,
|
|
|
236
236
|
return httpError(d, league, res, `${league} ${when} events`);
|
|
237
237
|
const events = extractRows(res.data).slice(0, limit);
|
|
238
238
|
return successEnvelope({
|
|
239
|
-
data: { league, leagueName: LEAGUE_NAMES[league], when, count: events.length, events, ...
|
|
239
|
+
data: { league, leagueName: LEAGUE_NAMES[league], when, count: events.length, events, ...responseNotes(res) },
|
|
240
240
|
game: league,
|
|
241
241
|
source: d.source,
|
|
242
242
|
requestId: d.requestId,
|
|
243
243
|
tookMs: Date.now() - d.started,
|
|
244
|
-
|
|
244
|
+
apiCalls: 1,
|
|
245
245
|
rateLimit: res.headers,
|
|
246
246
|
});
|
|
247
247
|
},
|
|
248
248
|
};
|
|
249
249
|
export const combatCard = {
|
|
250
250
|
name: 'combat_card',
|
|
251
|
-
description: `COMPOSITE fight card for one RAF, BKFC or MMA archive event: event identity + bouts in running order with results.
|
|
252
|
-
|
|
253
|
-
When to use:
|
|
254
|
-
- "RAF 14 card", "BKFC 95 results", "Bellator 142 card", "PRIDE 34", "who won the main event at the last BKFC?"
|
|
255
|
-
- Event pages and results pages
|
|
256
|
-
|
|
257
|
-
event accepts a slug (e.g. "raf13", "bkfc-95-newark", "bellator-142", "pride-34", "wec-48") or "next" / "last".
|
|
258
|
-
Bouts come main event first; each carries weight class, title stakes, both sides (athletes for RAF, red/blue fighters for BKFC with
|
|
259
|
-
punch totals, red/blue fighters for the MMA archives with UFC-format totals and ufcFighterSlug), and once finished
|
|
260
|
-
the winner and result (RAF: score, takedowns, method; BKFC/MMA archives: method, round, time).
|
|
261
|
-
MMA archives are closed: event defaults to "last" (the most recent card; for mma, across every promotion), and
|
|
262
|
-
"next" is a non-retryable NOT_IMPLEMENTED (there are no upcoming cards).
|
|
263
|
-
|
|
264
|
-
Prefer over: combat_events + call_api per bout.
|
|
265
|
-
Do not use when: you need one bout's period/round breakdown (combat_bout).
|
|
266
|
-
|
|
267
|
-
Parallel-safe: yes.
|
|
251
|
+
description: `COMPOSITE fight card for one RAF, BKFC or MMA archive event: event identity + bouts in running order with results.
|
|
252
|
+
|
|
253
|
+
When to use:
|
|
254
|
+
- "RAF 14 card", "BKFC 95 results", "Bellator 142 card", "PRIDE 34", "who won the main event at the last BKFC?"
|
|
255
|
+
- Event pages and results pages
|
|
256
|
+
|
|
257
|
+
event accepts a slug (e.g. "raf13", "bkfc-95-newark", "bellator-142", "pride-34", "wec-48") or "next" / "last".
|
|
258
|
+
Bouts come main event first; each carries weight class, title stakes, both sides (athletes for RAF, red/blue fighters for BKFC with
|
|
259
|
+
punch totals, red/blue fighters for the MMA archives with UFC-format totals and ufcFighterSlug), and once finished
|
|
260
|
+
the winner and result (RAF: score, takedowns, method; BKFC/MMA archives: method, round, time).
|
|
261
|
+
MMA archives are closed: event defaults to "last" (the most recent card; for mma, across every promotion), and
|
|
262
|
+
"next" is a non-retryable NOT_IMPLEMENTED (there are no upcoming cards).
|
|
263
|
+
|
|
264
|
+
Prefer over: combat_events + call_api per bout.
|
|
265
|
+
Do not use when: you need one bout's period/round breakdown (combat_bout).
|
|
266
|
+
|
|
267
|
+
Parallel-safe: yes. API calls: 2–3.
|
|
268
268
|
Example: { "league": "raf", "event": "last" }`,
|
|
269
269
|
inputSchema: {
|
|
270
270
|
type: 'object',
|
|
@@ -298,7 +298,7 @@ Example: { "league": "raf", "event": "last" }`,
|
|
|
298
298
|
return httpError(d, league, list, `${league} ${which} events`);
|
|
299
299
|
const first = asRecord(extractRows(list.data)[0]);
|
|
300
300
|
if (!first?.slug) {
|
|
301
|
-
const windowed = !!
|
|
301
|
+
const windowed = !!responseNotes(list).historyWindow;
|
|
302
302
|
return errorEnvelope({
|
|
303
303
|
code: 'NOT_FOUND',
|
|
304
304
|
message: windowed
|
|
@@ -308,8 +308,8 @@ Example: { "league": "raf", "event": "last" }`,
|
|
|
308
308
|
source: d.source,
|
|
309
309
|
requestId: d.requestId,
|
|
310
310
|
tookMs: Date.now() - d.started,
|
|
311
|
-
|
|
312
|
-
...(windowed ? { retryable: false, details: { historyWindow:
|
|
311
|
+
apiCalls: calls,
|
|
312
|
+
...(windowed ? { retryable: false, details: { historyWindow: responseNotes(list).historyWindow } } : {}),
|
|
313
313
|
});
|
|
314
314
|
}
|
|
315
315
|
slug = String(first.slug);
|
|
@@ -338,7 +338,7 @@ Example: { "league": "raf", "event": "last" }`,
|
|
|
338
338
|
source: d.source,
|
|
339
339
|
requestId: d.requestId,
|
|
340
340
|
tookMs: Date.now() - d.started,
|
|
341
|
-
|
|
341
|
+
apiCalls: calls,
|
|
342
342
|
rateLimit: bouts.headers ?? ev.headers,
|
|
343
343
|
partial,
|
|
344
344
|
truncated: rows.length > limit
|
|
@@ -349,22 +349,22 @@ Example: { "league": "raf", "event": "last" }`,
|
|
|
349
349
|
};
|
|
350
350
|
export const combatBout = {
|
|
351
351
|
name: 'combat_bout',
|
|
352
|
-
description: `One RAF, BKFC or MMA archive bout in full, with its scoring breakdown.
|
|
353
|
-
|
|
354
|
-
RAF: winner, method (decision / tech fall / pin / injury), final score, takedowns, and per-PERIOD scores.
|
|
355
|
-
BKFC: winner, method, round, time, and per-ROUND punch stats for red and blue (landed/thrown, head/body,
|
|
356
|
-
distance/clinch, knockdowns). BKFC round stats need the Starter plan; on Free they come back as a partial note.
|
|
357
|
-
MMA archives (Bellator, PRIDE, Strikeforce, WEC, DREAM, EliteXC, Affliction, mma): winner, method, round, time,
|
|
358
|
-
finish (position / submission), referee, judges' scores, each corner's whole-fight totals, and per-ROUND official
|
|
359
|
-
stats in UFC's format (significantStrikes "13 of 18", totalStrikes, takedowns, head/body/leg, distance/clinch/ground,
|
|
360
|
-
knockdowns, submissionAttempts, reversals, controlTime "1:42"). PRIDE's first round is 10 minutes. The archives are
|
|
361
|
-
older than the Free/Starter history window: on those plans rounds come back as a HISTORY_WINDOW_EXCEEDED partial
|
|
362
|
-
note while the result still returns.
|
|
363
|
-
|
|
364
|
-
Get boutId from combat_card or combat_athlete (e.g. "raf13--belal-muhammad--colby-covington", "bellator-5600").
|
|
365
|
-
MMA archive bout ids are "<promotion>-<fightId>"; a bare fight id resolves in any MMA archive league.
|
|
366
|
-
|
|
367
|
-
Parallel-safe: yes.
|
|
352
|
+
description: `One RAF, BKFC or MMA archive bout in full, with its scoring breakdown.
|
|
353
|
+
|
|
354
|
+
RAF: winner, method (decision / tech fall / pin / injury), final score, takedowns, and per-PERIOD scores.
|
|
355
|
+
BKFC: winner, method, round, time, and per-ROUND punch stats for red and blue (landed/thrown, head/body,
|
|
356
|
+
distance/clinch, knockdowns). BKFC round stats need the Starter plan; on Free they come back as a partial note.
|
|
357
|
+
MMA archives (Bellator, PRIDE, Strikeforce, WEC, DREAM, EliteXC, Affliction, mma): winner, method, round, time,
|
|
358
|
+
finish (position / submission), referee, judges' scores, each corner's whole-fight totals, and per-ROUND official
|
|
359
|
+
stats in UFC's format (significantStrikes "13 of 18", totalStrikes, takedowns, head/body/leg, distance/clinch/ground,
|
|
360
|
+
knockdowns, submissionAttempts, reversals, controlTime "1:42"). PRIDE's first round is 10 minutes. The archives are
|
|
361
|
+
older than the Free/Starter history window: on those plans rounds come back as a HISTORY_WINDOW_EXCEEDED partial
|
|
362
|
+
note while the result still returns.
|
|
363
|
+
|
|
364
|
+
Get boutId from combat_card or combat_athlete (e.g. "raf13--belal-muhammad--colby-covington", "bellator-5600").
|
|
365
|
+
MMA archive bout ids are "<promotion>-<fightId>"; a bare fight id resolves in any MMA archive league.
|
|
366
|
+
|
|
367
|
+
Parallel-safe: yes. API calls: 1–2.
|
|
368
368
|
Example: { "league": "bkfc", "boutId": "bkfc-fight-night-bethlehem--gregoris-cisneros--ryan-petersen" }`,
|
|
369
369
|
inputSchema: {
|
|
370
370
|
type: 'object',
|
|
@@ -414,7 +414,7 @@ Example: { "league": "bkfc", "boutId": "bkfc-fight-night-bethlehem--gregoris-cis
|
|
|
414
414
|
source: d.source,
|
|
415
415
|
requestId: d.requestId,
|
|
416
416
|
tookMs: Date.now() - d.started,
|
|
417
|
-
|
|
417
|
+
apiCalls: parts ? 2 : 1,
|
|
418
418
|
rateLimit: bout.headers,
|
|
419
419
|
partial,
|
|
420
420
|
});
|
|
@@ -422,24 +422,24 @@ Example: { "league": "bkfc", "boutId": "bkfc-fight-night-bethlehem--gregoris-cis
|
|
|
422
422
|
};
|
|
423
423
|
export const combatAthlete = {
|
|
424
424
|
name: 'combat_athlete',
|
|
425
|
-
description: `COMPOSITE RAF athlete / BKFC or MMA archive fighter page: profile + recent bouts + career stats.
|
|
426
|
-
|
|
427
|
-
When to use:
|
|
428
|
-
- "Kyle Snyder's RAF record", "Arlovski BKFC stats", "Tito Ortiz in Bellator", "Fedor's PRIDE record", athlete/fighter profile pages
|
|
429
|
-
|
|
430
|
-
athlete accepts a slug ("kyle-snyder") or a name ("Andrei Arlovski"); names are resolved through the league's
|
|
431
|
-
search, and several matches return AMBIGUOUS_ENTITY with candidates. Profile carries record, division, nickname,
|
|
432
|
-
country, official headshot (+ its credit — show it with the image). Career stats need the Starter plan; on Free
|
|
433
|
-
they come back as a partial note while profile and history still return.
|
|
434
|
-
MMA archives: profile is bio (DOB, height, reach, stance, hometown) + the record in that promotion's archive (not the
|
|
435
|
-
whole career); stats are career totals in UFC's format. league "mma" covers every archived promotion at once, and
|
|
436
|
-
data.recordByPromotion splits the record ({ pride: {...}, strikeforce: {...} }). A fighter we also hold a UFC record
|
|
437
|
-
for keeps the SAME slug as /ufc/fighters/{slug}: data.ufcFighterSlug is set then (a UFC slug is accepted here too).
|
|
438
|
-
Keep the records apart: archive fights never belong in a UFC answer.
|
|
439
|
-
|
|
440
|
-
Prefer over: call_api profile + history + stats separately.
|
|
441
|
-
|
|
442
|
-
Parallel-safe: yes.
|
|
425
|
+
description: `COMPOSITE RAF athlete / BKFC or MMA archive fighter page: profile + recent bouts + career stats.
|
|
426
|
+
|
|
427
|
+
When to use:
|
|
428
|
+
- "Kyle Snyder's RAF record", "Arlovski BKFC stats", "Tito Ortiz in Bellator", "Fedor's PRIDE record", athlete/fighter profile pages
|
|
429
|
+
|
|
430
|
+
athlete accepts a slug ("kyle-snyder") or a name ("Andrei Arlovski"); names are resolved through the league's
|
|
431
|
+
search, and several matches return AMBIGUOUS_ENTITY with candidates. Profile carries record, division, nickname,
|
|
432
|
+
country, official headshot (+ its credit — show it with the image). Career stats need the Starter plan; on Free
|
|
433
|
+
they come back as a partial note while profile and history still return.
|
|
434
|
+
MMA archives: profile is bio (DOB, height, reach, stance, hometown) + the record in that promotion's archive (not the
|
|
435
|
+
whole career); stats are career totals in UFC's format. league "mma" covers every archived promotion at once, and
|
|
436
|
+
data.recordByPromotion splits the record ({ pride: {...}, strikeforce: {...} }). A fighter we also hold a UFC record
|
|
437
|
+
for keeps the SAME slug as /ufc/fighters/{slug}: data.ufcFighterSlug is set then (a UFC slug is accepted here too).
|
|
438
|
+
Keep the records apart: archive fights never belong in a UFC answer.
|
|
439
|
+
|
|
440
|
+
Prefer over: call_api profile + history + stats separately.
|
|
441
|
+
|
|
442
|
+
Parallel-safe: yes. API calls: 2–4.
|
|
443
443
|
Example: { "league": "raf", "athlete": "Kyle Snyder", "historyLimit": 5 }`,
|
|
444
444
|
inputSchema: {
|
|
445
445
|
type: 'object',
|
|
@@ -502,7 +502,7 @@ Example: { "league": "raf", "athlete": "Kyle Snyder", "historyLimit": 5 }`,
|
|
|
502
502
|
source: d.source,
|
|
503
503
|
requestId: d.requestId,
|
|
504
504
|
tookMs: Date.now() - d.started,
|
|
505
|
-
|
|
505
|
+
apiCalls: 1 + (history ? 1 : 0) + (stats ? 1 : 0),
|
|
506
506
|
rateLimit: profile.headers,
|
|
507
507
|
partial,
|
|
508
508
|
});
|
|
@@ -510,13 +510,13 @@ Example: { "league": "raf", "athlete": "Kyle Snyder", "historyLimit": 5 }`,
|
|
|
510
510
|
};
|
|
511
511
|
export const combatH2h = {
|
|
512
512
|
name: 'combat_h2h',
|
|
513
|
-
description: `Head-to-head between two RAF athletes, two BKFC fighters or two MMA archive fighters: record and every meeting.
|
|
514
|
-
|
|
515
|
-
Accepts slugs or names for both sides (names resolve through the league's search). MMA archive meetings are only
|
|
516
|
-
the ones on that promotion's cards (league "mma": every archived promotion); UFC meetings are a UFC question
|
|
517
|
-
(head_to_head).
|
|
518
|
-
|
|
519
|
-
Parallel-safe: yes.
|
|
513
|
+
description: `Head-to-head between two RAF athletes, two BKFC fighters or two MMA archive fighters: record and every meeting.
|
|
514
|
+
|
|
515
|
+
Accepts slugs or names for both sides (names resolve through the league's search). MMA archive meetings are only
|
|
516
|
+
the ones on that promotion's cards (league "mma": every archived promotion); UFC meetings are a UFC question
|
|
517
|
+
(head_to_head).
|
|
518
|
+
|
|
519
|
+
Parallel-safe: yes. API calls: 1–3.
|
|
520
520
|
Example: { "league": "bkfc", "athleteA": "ryan-petersen", "athleteB": "gregoris-cisneros" }`,
|
|
521
521
|
inputSchema: {
|
|
522
522
|
type: 'object',
|
|
@@ -557,23 +557,23 @@ Example: { "league": "bkfc", "athleteA": "ryan-petersen", "athleteB": "gregoris-
|
|
|
557
557
|
source: d.source,
|
|
558
558
|
requestId: d.requestId,
|
|
559
559
|
tookMs: Date.now() - d.started,
|
|
560
|
-
|
|
560
|
+
apiCalls: 1,
|
|
561
561
|
rateLimit: res.headers,
|
|
562
562
|
});
|
|
563
563
|
},
|
|
564
564
|
};
|
|
565
565
|
export const combatRankings = {
|
|
566
566
|
name: 'combat_rankings',
|
|
567
|
-
description: `Champions and rankings: RAF title holders per division, BKFC official rankings + champions.
|
|
568
|
-
|
|
569
|
-
BKFC: omit division for every division's ranked list (champion, interim champion, ranked fighters), or pass one
|
|
570
|
-
(e.g. "heavyweight", "womens-flyweight"). RAF has no ranked lists; it returns every title and its holder, or one
|
|
571
|
-
division's detail when division is given (e.g. "men-heavyweight").
|
|
572
|
-
The MMA archives (bellator, pride, strikeforce, wec, dream, elitexc, affliction, mma) have no rankings: they return a
|
|
573
|
-
non-retryable NOT_IMPLEMENTED.
|
|
574
|
-
Never answer with UFC rankings instead.
|
|
575
|
-
|
|
576
|
-
Parallel-safe: yes.
|
|
567
|
+
description: `Champions and rankings: RAF title holders per division, BKFC official rankings + champions.
|
|
568
|
+
|
|
569
|
+
BKFC: omit division for every division's ranked list (champion, interim champion, ranked fighters), or pass one
|
|
570
|
+
(e.g. "heavyweight", "womens-flyweight"). RAF has no ranked lists; it returns every title and its holder, or one
|
|
571
|
+
division's detail when division is given (e.g. "men-heavyweight").
|
|
572
|
+
The MMA archives (bellator, pride, strikeforce, wec, dream, elitexc, affliction, mma) have no rankings: they return a
|
|
573
|
+
non-retryable NOT_IMPLEMENTED.
|
|
574
|
+
Never answer with UFC rankings instead.
|
|
575
|
+
|
|
576
|
+
Parallel-safe: yes. API calls: 1.
|
|
577
577
|
Example: { "league": "bkfc", "division": "heavyweight" }`,
|
|
578
578
|
inputSchema: {
|
|
579
579
|
type: 'object',
|
|
@@ -610,7 +610,7 @@ Example: { "league": "bkfc", "division": "heavyweight" }`,
|
|
|
610
610
|
source: d.source,
|
|
611
611
|
requestId: d.requestId,
|
|
612
612
|
tookMs: Date.now() - d.started,
|
|
613
|
-
|
|
613
|
+
apiCalls: 1,
|
|
614
614
|
rateLimit: res.headers,
|
|
615
615
|
});
|
|
616
616
|
},
|
package/dist/tools/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { cs2Tools } from './cs2.js';
|
|
|
12
12
|
import { tournamentTools } from './tournaments.js';
|
|
13
13
|
import { scheduleTools } from './schedule.js';
|
|
14
14
|
import { combatTools } from './combat.js';
|
|
15
|
+
import { webhookTools } from './webhooks.js';
|
|
15
16
|
export const allTools = [
|
|
16
17
|
...metaTools.filter((t) => t.name === 'list_capabilities' || t.name === 'api_health'),
|
|
17
18
|
...resolveTools,
|
|
@@ -27,6 +28,7 @@ export const allTools = [
|
|
|
27
28
|
...insightTools,
|
|
28
29
|
...cs2Tools,
|
|
29
30
|
...combatTools,
|
|
31
|
+
...webhookTools,
|
|
30
32
|
...metaTools.filter((t) => t.name === 'list_routes' || t.name === 'call_api'),
|
|
31
33
|
];
|
|
32
34
|
export function getTool(name) {
|