vex-mcp-server
Version:
MCP server for VEX Robotics Competition data using RobotEvents API
94 lines • 4.18 kB
JavaScript
/**
* Team-related request handlers for MCP tools
*/
import * as robotevents from "robotevents";
import { createTextResponse, createErrorResponse } from "../utils/response-formatter.js";
import { RobotEventsAPIClient } from "../utils/api-client.js";
export class TeamHandlers {
/**
* Handles search-teams tool requests
*/
static async handleSearchTeams(args) {
try {
// Build search parameters using correct TeamSearchOptions
const searchParams = {};
if (args.number) {
searchParams.number = args.number;
}
if (args.event) {
searchParams.event = args.event;
}
if (args.country) {
searchParams.country = args.country;
}
if (args.program) {
searchParams.program = args.program;
}
if (args.grade) {
searchParams.grade = args.grade;
}
if (args.registered !== undefined) {
searchParams.registered = args.registered;
}
let teams = await robotevents.teams.search(searchParams);
// Client-side filtering for parameters not supported by API
if (args.team_name) {
const nameFilter = args.team_name.toLowerCase();
teams = teams.filter((team) => team.team_name?.toLowerCase().includes(nameFilter));
}
if (args.organization) {
const orgFilter = args.organization.toLowerCase();
teams = teams.filter((team) => team.organization?.toLowerCase().includes(orgFilter));
}
const responseText = `Found ${teams.length} teams:\n\n` +
teams.map((team) => `**${team.number}** - ${team.team_name}\n` +
`Organization: ${team.organization}\n` +
`Location: ${team.location?.city || 'N/A'}, ${team.location?.region || 'N/A'}, ${team.location?.country || 'N/A'}\n` +
`Program: ${team.program?.name || 'N/A'}\n` +
`Grade: ${team.grade || 'N/A'}\n` +
`Registered: ${team.registered ? 'Yes' : 'No'}\n`).join('\n');
return createTextResponse(responseText);
}
catch (error) {
return createErrorResponse(error, "searching teams");
}
}
/**
* Handles get-team-info tool requests
*/
static async handleGetTeamInfo(args) {
try {
let team;
if (args.team_id) {
team = await RobotEventsAPIClient.getTeam(args.team_id);
if (!team) {
throw new Error(`Team with ID ${args.team_id} not found`);
}
}
else if (args.team_number) {
const searchResult = await robotevents.teams.search({ number: [args.team_number] });
if (searchResult.length === 0) {
throw new Error(`Team ${args.team_number} not found`);
}
team = searchResult[0];
}
else {
throw new Error("Either team_id or team_number must be provided");
}
const responseText = `**Team ${team.number}** - ${team.team_name}\n` +
`${team.robot_name ? `Robot Name: ${team.robot_name}\n` : ''}` +
`Organization: ${team.organization || 'N/A'}\n` +
`Program: ${team.program?.name || 'N/A'} (${team.program?.code || 'N/A'})\n` +
`Grade: ${team.grade || 'N/A'}\n` +
`Location: ${[team.location?.city, team.location?.region, team.location?.country].filter(Boolean).join(', ') || 'N/A'}\n` +
`${team.location?.venue ? `Venue: ${team.location.venue}\n` : ''}` +
`Registered: ${team.registered ? 'Yes' : 'No'}\n` +
`Team ID: ${team.id}`;
return createTextResponse(responseText);
}
catch (error) {
return createErrorResponse(error, "retrieving team information");
}
}
}
//# sourceMappingURL=team-handlers.js.map