FTC Data over MCP
Robolyst answers over the Model Context Protocol, so an assistant or a script can ask for a team, an event, a bracket or a metric in one call. There are two servers: the FIRST Tech Challenge archive, which needs no account, and a team's own workspace, which needs OAuth.
Public archive · https://robolyst.org/mcp/ftc
Team workspace · https://robolyst.org/mcp
There is no REST API. The paths under /api serve this
site's own pages, are disallowed in robots.txt and carry no compatibility promise.
Connecting one
The URL is the whole configuration. Both servers speak MCP over HTTP with no session handshake, so any client that accepts a remote server address can use them: paste the address in, and the tool list arrives on the first call.
The archive server is open. No account, no token, no rate-limit key. It also answers cross-origin, which is what lets a browser-based client reach it.
The team server walks an OAuth flow. A client discovers the authorization server from the address, registers itself, and sends you here to sign in and approve the connection. From then on every call runs as your member account, with the permissions your role already has in the app, and the team needs AI Access switched on in its module settings.
A tool that changes something is named create_, update_, log_, request_ or draft_. Every one of those writes is recorded in
an audit log the team can read, reads are not, and a locked team refuses writes outright.
Public archive server
https://robolyst.org/mcp/ftc · Most tools
take an event code; use search or search_events to find one. A season argument
defaults to the current season and is named by its starting year.
| Tool | Takes | Returns |
|---|---|---|
list_seasons | no arguments | Every season on record, with its game name and its team, event and match totals. |
search | query, limit? | Matching teams, events and locations. The first call to make when all you have is a name. |
find_location | query | Coordinates for a place name, from the geocoded places already in the archive. |
get_team | team | Name, location, rookie year, career win-loss record, and the seasons they registered for or played. |
get_team_season | team, season? | Every event they played that season, their matches, their metrics and their advancement points. |
get_team_matches | team, season? | Every match a team has played, newest event first. Omit the season for a whole career. |
get_team_awards | team | Every award a team has won, across every season. |
compare_teams | teams (up to 24), season? | Metrics side by side plus season averages. This is the alliance-selection call. |
search_events | query?, stateProv?, season?, limit? | Events in a season, with championship divisions collapsed under their parent. |
get_event | code, season? | Dates, location, event type, divisions if it has any, and the teams attending. |
get_event_rankings | code, season? | Qualification standings with ranking points and the computed metrics for each team. |
get_event_matches | code, season?, team? | Every match at an event, optionally only the ones a given team played. |
get_event_awards | code, season? | Every award handed out at the event, with the winning team. |
get_event_advancement | code, season? | Advancement points as FIRST publishes them, the four components, who advanced and to what. 2025-26 onward. |
get_playoff_bracket | code, season? | The double-elimination bracket: every series, what fed into it, and who won. |
season_leaderboard | season?, limit? | The best teams of a season by average OPRc. Two events are needed to appear once a season is far enough along. |
season_high_scores | season?, limit? | The highest penalty-free alliance scores of one season, or the record from every season. |
award_catalog | no arguments | Every award FIRST has issued, folded across seasons, with what it is for and how often it has been won. |
award_winners | slug, season?, limit? | Who has won one particular award, newest first. |
teams_nearby | lat, lon, radiusKm?, limit? | Teams within a radius of a point, up to 500 km out. |
region_teams | stateProv, season? | Every team registered in a state or province. |
explain_metric | metric? | What a metric means, how it is computed, and the mistake people make reading it. Omit the argument to list them all. |
Team workspace server
https://robolyst.org/mcp · Scoped to the
one team the signed-in member belongs to. Money is in whole cents. Call whoami first when a tool refuses: it says which
permissions and features the account actually has.
| Tool | Takes | Returns |
|---|---|---|
whoami | no arguments | The connected account, its team, its role, and exactly which permissions and features it has. |
list_roster | no arguments | Everyone on the team with their role, so a name can be resolved before work is assigned. |
list_tasks | status?, open?, mine?, dueBefore?, limit? | The team board, filtered. |
get_task | id | One task in full, with what it depends on and what depends on it. |
list_schedule | from?, to?, limit? | Meetings, competitions, outreach and scrimmages. Defaults to the next 30 days. |
list_checklists | limit? | Checklist templates the team owns, and open runs with their unchecked counts. |
search_documentation | query?, season?, subsystem?, limit? | Engineering notebook entries as flattened text. |
get_documentation_entry | id | One notebook entry in full, as plain text. |
list_announcements | limit? | Team announcements, newest first. |
finance_summary | season? | Each budget category with what was allocated, spent and left. Cents throughout. |
list_orders | status?, mine?, season?, limit? | Part and order requests. This answers "did we order it yet". |
list_expenses | season?, mine?, limit? | Logged spending for a season, newest first. |
create_task writes | title, plus optional description, status, dates and assignees | The task it created. Assigned to nobody unless asked. |
update_task_status writes | id, status | The task on its new status. |
log_expense writes | description, amountCents, vendor?, category?, spentAt? | The expense. Receipt rules, approval thresholds and member limits are enforced, and the call fails when one is broken. |
request_order writes | title, items, neededBy?, priority?, notes? | The request. Required links, budget categories, allowed vendors and needed-by dates are all enforced. |
draft_announcement writes | title, body, pinned? | An unpublished draft. Nothing is ever sent from here. |
What the archive numbers exclude
- Scores are penalty-free. A foul an alliance commits is awarded to its opponent, so a raw final overstates what the alliance earned.
- OPR-style metrics are fit per event, over that event's qualification matches only. They are meaningful relative to the teams who were there, and a value from one event does not transfer to another.
- Remote events are excluded from every metric. That format pits one team against an empty alliance, so a contribution cannot be solved.
- Advancement points exist from the 2025-26 season on, because that is when FIRST started publishing them.
Everything else a model can read
- /llms.txt · what this site is, its URL patterns and its data caveats, in one file.
- Glossary · every term these tools return, defined in a sentence or two.
- Scouting metrics · the formula behind each computed number, and how the predictions score.
- FTC reference · the URL shape of every record the archive holds.
- /sitemap.xml · the sitemap index.