@with-thesis/mcp 0.1.5 → 0.1.6

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 CHANGED
@@ -46,6 +46,10 @@ Add this to your Cursor MCP config:
46
46
 
47
47
  ## Included Tools
48
48
 
49
+ - `get_sports`
50
+ - `get_teams`
51
+ - `get_team`
52
+ - `get_team_games`
49
53
  - `get_games`
50
54
  - `get_game`
51
55
  - `get_boxscore`
package/dist/index.js CHANGED
@@ -23140,7 +23140,7 @@ var SportSchema = _enum(["nba"]).default("nba");
23140
23140
  function registerBookmakerTools(server, api2) {
23141
23141
  server.registerTool("get_bookmakers", {
23142
23142
  title: "Get Bookmakers",
23143
- description: "List Thesis bookmakers with sharp, opener, and active filters.",
23143
+ description: "List bookmakers with sharp, opener, and active filters.",
23144
23144
  inputSchema: {
23145
23145
  sport: SportSchema.describe("Sport code. Only nba is currently supported."),
23146
23146
  sharp: boolean2().optional().describe("Filter to sharp bookmakers only."),
@@ -23170,7 +23170,7 @@ var SportSchema2 = _enum(["nba"]).default("nba");
23170
23170
  function registerBoxscoreTools(server, api2) {
23171
23171
  server.registerTool("get_boxscore", {
23172
23172
  title: "Get Box Score",
23173
- description: "Get the full team-level box score for a single Thesis game.",
23173
+ description: "Get the full team-level box score for a single game.",
23174
23174
  inputSchema: {
23175
23175
  sport: SportSchema2.describe("Sport code. Only nba is currently supported."),
23176
23176
  game_id: string2().describe("Game ID such as 20260308_1310_NBA_BOS_CLE.")
@@ -23197,7 +23197,7 @@ var PaginationOffsetSchema = number2().int().min(0).optional();
23197
23197
  function registerGameTools(server, api2) {
23198
23198
  server.registerTool("get_games", {
23199
23199
  title: "Get Games",
23200
- description: "Get Thesis games by date, date range, team, status, or season.",
23200
+ description: "List games by date, date range, team, status, or season.",
23201
23201
  inputSchema: {
23202
23202
  sport: SportSchema3.describe("Sport code. Only nba is currently supported."),
23203
23203
  date: string2().optional().describe("Game date in YYYY-MM-DD format."),
@@ -23232,7 +23232,7 @@ function registerGameTools(server, api2) {
23232
23232
  });
23233
23233
  server.registerTool("get_game", {
23234
23234
  title: "Get Game",
23235
- description: "Get a single Thesis game with scores, officials, and partial box score details.",
23235
+ description: "Get a single game with scores, officials, and partial box score details.",
23236
23236
  inputSchema: {
23237
23237
  sport: SportSchema3.describe("Sport code. Only nba is currently supported."),
23238
23238
  game_id: string2().describe("Game ID such as 20260308_1310_NBA_BOS_CLE.")
@@ -23259,10 +23259,10 @@ var PaginationOffsetSchema2 = number2().int().min(0).optional();
23259
23259
  function registerOddsTools(server, api2) {
23260
23260
  server.registerTool("get_odds", {
23261
23261
  title: "Get Odds",
23262
- description: "Get current Thesis odds snapshots by game, date, bookmaker, sharp books, opener books, or line type.",
23262
+ description: "Get current odds snapshots by game, date, bookmaker, sharp books, opener books, or line type.",
23263
23263
  inputSchema: {
23264
23264
  sport: SportSchema4.describe("Sport code. Only nba is currently supported."),
23265
- game_id: string2().optional().describe("Filter to a specific Thesis game ID."),
23265
+ game_id: string2().optional().describe("Filter to a specific game ID."),
23266
23266
  date: string2().optional().describe("Game date in YYYY-MM-DD format."),
23267
23267
  bookmaker: string2().optional().describe("Comma-separated bookmaker codes such as circa,dk."),
23268
23268
  sharp: boolean2().optional().describe("Filter to sharp bookmakers only."),
@@ -23294,7 +23294,7 @@ function registerOddsTools(server, api2) {
23294
23294
  });
23295
23295
  server.registerTool("get_line_movement", {
23296
23296
  title: "Get Line Movement",
23297
- description: "Get Thesis odds history and line movement for a single game.",
23297
+ description: "Get odds history and line movement for a single game.",
23298
23298
  inputSchema: {
23299
23299
  sport: SportSchema4.describe("Sport code. Only nba is currently supported."),
23300
23300
  game_id: string2().describe("Game ID such as 20260308_1310_NBA_BOS_CLE."),
@@ -23318,6 +23318,136 @@ function registerOddsTools(server, api2) {
23318
23318
  });
23319
23319
  }
23320
23320
 
23321
+ // src/tools/sports.ts
23322
+ function registerSportTools(server, api2) {
23323
+ server.registerTool("get_sports", {
23324
+ title: "Get Sports",
23325
+ description: "List supported sports, API-key access, and canonical endpoint templates.",
23326
+ inputSchema: {},
23327
+ annotations: {
23328
+ readOnlyHint: true,
23329
+ openWorldHint: true
23330
+ }
23331
+ }, async () => {
23332
+ try {
23333
+ const payload = await api2.get("/v1/sports");
23334
+ return successToolResult(payload);
23335
+ } catch (error2) {
23336
+ return errorToolResult(error2);
23337
+ }
23338
+ });
23339
+ }
23340
+
23341
+ // src/tools/teams.ts
23342
+ var SportSchema5 = _enum(["nba"]).default("nba");
23343
+ var GameStatusSchema2 = _enum(["scheduled", "live", "final"]);
23344
+ var PaginationLimitSchema3 = number2().int().min(1).max(100).optional();
23345
+ var PaginationOffsetSchema3 = number2().int().min(0).optional();
23346
+ function registerTeamTools(server, api2) {
23347
+ server.registerTool("get_teams", {
23348
+ title: "Get Teams",
23349
+ description: "List teams for a sport with optional active, conference, and search filters.",
23350
+ inputSchema: {
23351
+ sport: SportSchema5.describe("Sport code. Only nba is currently supported."),
23352
+ active: boolean2().optional().describe("Filter to active teams only when true, inactive only when false."),
23353
+ conference: string2().optional().describe("Optional conference filter such as Eastern or Western."),
23354
+ search: string2().optional().describe("Case-insensitive search across team code, city, and name."),
23355
+ include_assets: boolean2().optional().describe("Include team asset metadata such as logos when true."),
23356
+ limit: PaginationLimitSchema3.describe("Number of teams to return. Max 100."),
23357
+ offset: PaginationOffsetSchema3.describe("Pagination offset.")
23358
+ },
23359
+ annotations: {
23360
+ readOnlyHint: true,
23361
+ openWorldHint: true
23362
+ }
23363
+ }, async ({ sport, active, conference, search, include_assets, limit, offset }) => {
23364
+ try {
23365
+ const payload = await api2.get(`/v1/${sport}/teams`, {
23366
+ active,
23367
+ conference,
23368
+ search,
23369
+ include: include_assets ? "assets" : undefined,
23370
+ limit,
23371
+ offset
23372
+ });
23373
+ return successToolResult(payload);
23374
+ } catch (error2) {
23375
+ return errorToolResult(error2);
23376
+ }
23377
+ });
23378
+ server.registerTool("get_team", {
23379
+ title: "Get Team",
23380
+ description: "Get a single team by its canonical team code such as BOS or LAL.",
23381
+ inputSchema: {
23382
+ sport: SportSchema5.describe("Sport code. Only nba is currently supported."),
23383
+ team_code: string2().describe("Canonical team code such as BOS, LAL, or CLE."),
23384
+ include_assets: boolean2().optional().describe("Include team asset metadata such as logos when true.")
23385
+ },
23386
+ annotations: {
23387
+ readOnlyHint: true,
23388
+ openWorldHint: true
23389
+ }
23390
+ }, async ({ sport, team_code, include_assets }) => {
23391
+ try {
23392
+ const normalizedCode = team_code.trim().toUpperCase();
23393
+ const payload = await api2.get(`/v1/${sport}/teams/${normalizedCode}`, {
23394
+ include: include_assets ? "assets" : undefined
23395
+ });
23396
+ return successToolResult(payload);
23397
+ } catch (error2) {
23398
+ return errorToolResult(error2);
23399
+ }
23400
+ });
23401
+ server.registerTool("get_team_games", {
23402
+ title: "Get Team Games",
23403
+ description: "Get a normalized team-centric game log with requested-team scores, opponents, results, and optional box score data.",
23404
+ inputSchema: {
23405
+ sport: SportSchema5.describe("Sport code. Only nba is currently supported."),
23406
+ team_code: string2().describe("Canonical team code such as BOS, LAL, or CLE."),
23407
+ date: string2().optional().describe("Exact game date in YYYY-MM-DD format."),
23408
+ date_from: string2().optional().describe("Start date in YYYY-MM-DD format."),
23409
+ date_to: string2().optional().describe("End date in YYYY-MM-DD format."),
23410
+ status: GameStatusSchema2.optional().describe("scheduled, live, or final"),
23411
+ season: string2().optional().describe("Season string such as 2025-26."),
23412
+ include_boxscore: boolean2().optional().describe("Include the requested team box score row for each game when true."),
23413
+ limit: PaginationLimitSchema3.describe("Number of games to return. Max 100."),
23414
+ offset: PaginationOffsetSchema3.describe("Pagination offset.")
23415
+ },
23416
+ annotations: {
23417
+ readOnlyHint: true,
23418
+ openWorldHint: true
23419
+ }
23420
+ }, async ({
23421
+ sport,
23422
+ team_code,
23423
+ date: date5,
23424
+ date_from,
23425
+ date_to,
23426
+ status,
23427
+ season,
23428
+ include_boxscore,
23429
+ limit,
23430
+ offset
23431
+ }) => {
23432
+ try {
23433
+ const normalizedCode = team_code.trim().toUpperCase();
23434
+ const payload = await api2.get(`/v1/${sport}/teams/${normalizedCode}/games`, {
23435
+ date: date5,
23436
+ date_from,
23437
+ date_to,
23438
+ status,
23439
+ season,
23440
+ include: include_boxscore ? "boxscore" : undefined,
23441
+ limit,
23442
+ offset
23443
+ });
23444
+ return successToolResult(payload);
23445
+ } catch (error2) {
23446
+ return errorToolResult(error2);
23447
+ }
23448
+ });
23449
+ }
23450
+
23321
23451
  // src/server.ts
23322
23452
  function createThesisMcpServer(options) {
23323
23453
  const server = new McpServer({
@@ -23335,6 +23465,8 @@ function createThesisMcpServer(options) {
23335
23465
  registerBoxscoreTools(server, api2);
23336
23466
  registerOddsTools(server, api2);
23337
23467
  registerBookmakerTools(server, api2);
23468
+ registerSportTools(server, api2);
23469
+ registerTeamTools(server, api2);
23338
23470
  return server;
23339
23471
  }
23340
23472
 
package/dist/stdio.js CHANGED
@@ -20058,7 +20058,7 @@ var SportSchema = _enum(["nba"]).default("nba");
20058
20058
  function registerBookmakerTools(server, api2) {
20059
20059
  server.registerTool("get_bookmakers", {
20060
20060
  title: "Get Bookmakers",
20061
- description: "List Thesis bookmakers with sharp, opener, and active filters.",
20061
+ description: "List bookmakers with sharp, opener, and active filters.",
20062
20062
  inputSchema: {
20063
20063
  sport: SportSchema.describe("Sport code. Only nba is currently supported."),
20064
20064
  sharp: boolean2().optional().describe("Filter to sharp bookmakers only."),
@@ -20088,7 +20088,7 @@ var SportSchema2 = _enum(["nba"]).default("nba");
20088
20088
  function registerBoxscoreTools(server, api2) {
20089
20089
  server.registerTool("get_boxscore", {
20090
20090
  title: "Get Box Score",
20091
- description: "Get the full team-level box score for a single Thesis game.",
20091
+ description: "Get the full team-level box score for a single game.",
20092
20092
  inputSchema: {
20093
20093
  sport: SportSchema2.describe("Sport code. Only nba is currently supported."),
20094
20094
  game_id: string2().describe("Game ID such as 20260308_1310_NBA_BOS_CLE.")
@@ -20115,7 +20115,7 @@ var PaginationOffsetSchema = number2().int().min(0).optional();
20115
20115
  function registerGameTools(server, api2) {
20116
20116
  server.registerTool("get_games", {
20117
20117
  title: "Get Games",
20118
- description: "Get Thesis games by date, date range, team, status, or season.",
20118
+ description: "List games by date, date range, team, status, or season.",
20119
20119
  inputSchema: {
20120
20120
  sport: SportSchema3.describe("Sport code. Only nba is currently supported."),
20121
20121
  date: string2().optional().describe("Game date in YYYY-MM-DD format."),
@@ -20150,7 +20150,7 @@ function registerGameTools(server, api2) {
20150
20150
  });
20151
20151
  server.registerTool("get_game", {
20152
20152
  title: "Get Game",
20153
- description: "Get a single Thesis game with scores, officials, and partial box score details.",
20153
+ description: "Get a single game with scores, officials, and partial box score details.",
20154
20154
  inputSchema: {
20155
20155
  sport: SportSchema3.describe("Sport code. Only nba is currently supported."),
20156
20156
  game_id: string2().describe("Game ID such as 20260308_1310_NBA_BOS_CLE.")
@@ -20177,10 +20177,10 @@ var PaginationOffsetSchema2 = number2().int().min(0).optional();
20177
20177
  function registerOddsTools(server, api2) {
20178
20178
  server.registerTool("get_odds", {
20179
20179
  title: "Get Odds",
20180
- description: "Get current Thesis odds snapshots by game, date, bookmaker, sharp books, opener books, or line type.",
20180
+ description: "Get current odds snapshots by game, date, bookmaker, sharp books, opener books, or line type.",
20181
20181
  inputSchema: {
20182
20182
  sport: SportSchema4.describe("Sport code. Only nba is currently supported."),
20183
- game_id: string2().optional().describe("Filter to a specific Thesis game ID."),
20183
+ game_id: string2().optional().describe("Filter to a specific game ID."),
20184
20184
  date: string2().optional().describe("Game date in YYYY-MM-DD format."),
20185
20185
  bookmaker: string2().optional().describe("Comma-separated bookmaker codes such as circa,dk."),
20186
20186
  sharp: boolean2().optional().describe("Filter to sharp bookmakers only."),
@@ -20212,7 +20212,7 @@ function registerOddsTools(server, api2) {
20212
20212
  });
20213
20213
  server.registerTool("get_line_movement", {
20214
20214
  title: "Get Line Movement",
20215
- description: "Get Thesis odds history and line movement for a single game.",
20215
+ description: "Get odds history and line movement for a single game.",
20216
20216
  inputSchema: {
20217
20217
  sport: SportSchema4.describe("Sport code. Only nba is currently supported."),
20218
20218
  game_id: string2().describe("Game ID such as 20260308_1310_NBA_BOS_CLE."),
@@ -20236,6 +20236,136 @@ function registerOddsTools(server, api2) {
20236
20236
  });
20237
20237
  }
20238
20238
 
20239
+ // src/tools/sports.ts
20240
+ function registerSportTools(server, api2) {
20241
+ server.registerTool("get_sports", {
20242
+ title: "Get Sports",
20243
+ description: "List supported sports, API-key access, and canonical endpoint templates.",
20244
+ inputSchema: {},
20245
+ annotations: {
20246
+ readOnlyHint: true,
20247
+ openWorldHint: true
20248
+ }
20249
+ }, async () => {
20250
+ try {
20251
+ const payload = await api2.get("/v1/sports");
20252
+ return successToolResult(payload);
20253
+ } catch (error2) {
20254
+ return errorToolResult(error2);
20255
+ }
20256
+ });
20257
+ }
20258
+
20259
+ // src/tools/teams.ts
20260
+ var SportSchema5 = _enum(["nba"]).default("nba");
20261
+ var GameStatusSchema2 = _enum(["scheduled", "live", "final"]);
20262
+ var PaginationLimitSchema3 = number2().int().min(1).max(100).optional();
20263
+ var PaginationOffsetSchema3 = number2().int().min(0).optional();
20264
+ function registerTeamTools(server, api2) {
20265
+ server.registerTool("get_teams", {
20266
+ title: "Get Teams",
20267
+ description: "List teams for a sport with optional active, conference, and search filters.",
20268
+ inputSchema: {
20269
+ sport: SportSchema5.describe("Sport code. Only nba is currently supported."),
20270
+ active: boolean2().optional().describe("Filter to active teams only when true, inactive only when false."),
20271
+ conference: string2().optional().describe("Optional conference filter such as Eastern or Western."),
20272
+ search: string2().optional().describe("Case-insensitive search across team code, city, and name."),
20273
+ include_assets: boolean2().optional().describe("Include team asset metadata such as logos when true."),
20274
+ limit: PaginationLimitSchema3.describe("Number of teams to return. Max 100."),
20275
+ offset: PaginationOffsetSchema3.describe("Pagination offset.")
20276
+ },
20277
+ annotations: {
20278
+ readOnlyHint: true,
20279
+ openWorldHint: true
20280
+ }
20281
+ }, async ({ sport, active, conference, search, include_assets, limit, offset }) => {
20282
+ try {
20283
+ const payload = await api2.get(`/v1/${sport}/teams`, {
20284
+ active,
20285
+ conference,
20286
+ search,
20287
+ include: include_assets ? "assets" : undefined,
20288
+ limit,
20289
+ offset
20290
+ });
20291
+ return successToolResult(payload);
20292
+ } catch (error2) {
20293
+ return errorToolResult(error2);
20294
+ }
20295
+ });
20296
+ server.registerTool("get_team", {
20297
+ title: "Get Team",
20298
+ description: "Get a single team by its canonical team code such as BOS or LAL.",
20299
+ inputSchema: {
20300
+ sport: SportSchema5.describe("Sport code. Only nba is currently supported."),
20301
+ team_code: string2().describe("Canonical team code such as BOS, LAL, or CLE."),
20302
+ include_assets: boolean2().optional().describe("Include team asset metadata such as logos when true.")
20303
+ },
20304
+ annotations: {
20305
+ readOnlyHint: true,
20306
+ openWorldHint: true
20307
+ }
20308
+ }, async ({ sport, team_code, include_assets }) => {
20309
+ try {
20310
+ const normalizedCode = team_code.trim().toUpperCase();
20311
+ const payload = await api2.get(`/v1/${sport}/teams/${normalizedCode}`, {
20312
+ include: include_assets ? "assets" : undefined
20313
+ });
20314
+ return successToolResult(payload);
20315
+ } catch (error2) {
20316
+ return errorToolResult(error2);
20317
+ }
20318
+ });
20319
+ server.registerTool("get_team_games", {
20320
+ title: "Get Team Games",
20321
+ description: "Get a normalized team-centric game log with requested-team scores, opponents, results, and optional box score data.",
20322
+ inputSchema: {
20323
+ sport: SportSchema5.describe("Sport code. Only nba is currently supported."),
20324
+ team_code: string2().describe("Canonical team code such as BOS, LAL, or CLE."),
20325
+ date: string2().optional().describe("Exact game date in YYYY-MM-DD format."),
20326
+ date_from: string2().optional().describe("Start date in YYYY-MM-DD format."),
20327
+ date_to: string2().optional().describe("End date in YYYY-MM-DD format."),
20328
+ status: GameStatusSchema2.optional().describe("scheduled, live, or final"),
20329
+ season: string2().optional().describe("Season string such as 2025-26."),
20330
+ include_boxscore: boolean2().optional().describe("Include the requested team box score row for each game when true."),
20331
+ limit: PaginationLimitSchema3.describe("Number of games to return. Max 100."),
20332
+ offset: PaginationOffsetSchema3.describe("Pagination offset.")
20333
+ },
20334
+ annotations: {
20335
+ readOnlyHint: true,
20336
+ openWorldHint: true
20337
+ }
20338
+ }, async ({
20339
+ sport,
20340
+ team_code,
20341
+ date: date4,
20342
+ date_from,
20343
+ date_to,
20344
+ status,
20345
+ season,
20346
+ include_boxscore,
20347
+ limit,
20348
+ offset
20349
+ }) => {
20350
+ try {
20351
+ const normalizedCode = team_code.trim().toUpperCase();
20352
+ const payload = await api2.get(`/v1/${sport}/teams/${normalizedCode}/games`, {
20353
+ date: date4,
20354
+ date_from,
20355
+ date_to,
20356
+ status,
20357
+ season,
20358
+ include: include_boxscore ? "boxscore" : undefined,
20359
+ limit,
20360
+ offset
20361
+ });
20362
+ return successToolResult(payload);
20363
+ } catch (error2) {
20364
+ return errorToolResult(error2);
20365
+ }
20366
+ });
20367
+ }
20368
+
20239
20369
  // src/server.ts
20240
20370
  function createThesisMcpServer(options) {
20241
20371
  const server = new McpServer({
@@ -20253,6 +20383,8 @@ function createThesisMcpServer(options) {
20253
20383
  registerBoxscoreTools(server, api2);
20254
20384
  registerOddsTools(server, api2);
20255
20385
  registerBookmakerTools(server, api2);
20386
+ registerSportTools(server, api2);
20387
+ registerTeamTools(server, api2);
20256
20388
  return server;
20257
20389
  }
20258
20390
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@with-thesis/mcp",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "description": "thesis MCP server for API-key-based AI client access.",
6
6
  "homepage": "https://withthesis.dev",