|
|
import { z } from "zod"; |
|
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; |
|
|
import { safeToolHandler } from "./base"; |
|
|
import * as service from "../../atcoder/service"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function register(mcp: McpServer): void { |
|
|
|
|
|
mcp.tool( |
|
|
"atcoder_get_rating", |
|
|
"Fetches an AtCoder user's rating, rank, max rating, country, birth year, avatar, and complete rating history.", |
|
|
{ username: z.string().describe("The AtCoder username") }, |
|
|
safeToolHandler(({ username }) => service.getUserRating(username)) |
|
|
); |
|
|
|
|
|
|
|
|
mcp.tool( |
|
|
"atcoder_get_history", |
|
|
"Fetches the complete contest participation history for an AtCoder user with performance and rating changes.", |
|
|
{ username: z.string().describe("The AtCoder username") }, |
|
|
safeToolHandler(({ username }) => service.getUserHistory(username)) |
|
|
); |
|
|
|
|
|
|
|
|
mcp.tool( |
|
|
"atcoder_get_contest_standings", |
|
|
"Fetches the standings/leaderboard for a specific AtCoder contest showing all participants' scores and rankings.", |
|
|
{ |
|
|
contestId: z.string().describe("The AtCoder contest ID (e.g., 'abc300')"), |
|
|
extended: z.boolean().optional().default(false).describe("Include extended statistics (default: false)") |
|
|
}, |
|
|
safeToolHandler(({ contestId, extended }) => service.getContestStandings(contestId, extended)) |
|
|
); |
|
|
|
|
|
|
|
|
mcp.tool( |
|
|
"atcoder_get_contest_results", |
|
|
"Fetches the final results and rating changes for all participants in a specific AtCoder contest.", |
|
|
{ contestId: z.string().describe("The AtCoder contest ID (e.g., 'abc300')") }, |
|
|
safeToolHandler(({ contestId }) => service.getContestResults(contestId)) |
|
|
); |
|
|
|
|
|
|
|
|
mcp.tool( |
|
|
"atcoder_get_virtual_standings", |
|
|
"Fetches the virtual contest standings for an AtCoder contest, showing ghost participants.", |
|
|
{ |
|
|
contestId: z.string().describe("The AtCoder contest ID (e.g., 'abc300')"), |
|
|
showGhost: z.boolean().optional().default(true).describe("Include ghost participants (default: true)") |
|
|
}, |
|
|
safeToolHandler(({ contestId, showGhost }) => service.getVirtualStandings(contestId, showGhost)) |
|
|
); |
|
|
} |
|
|
|