PCMStack MCP demonstrates solid tool design with consistent naming (verb_noun pattern), comprehensive descriptions (avg 180 chars), and well-structured schemas. All 12 tools have explicit input schemas with typed parameters and descriptions. However, output schemas are not formally documented in the code, and error handling lacks recovery guidance. Tool composition is excellent, each tool has a single responsibility and outputs chain well (e.g., search_cyclist returns IDs for use in update_cyclist_ratings). Parameter descriptions are detailed and include constraints (e.g., 'default 100, max 1000 rows'). No security issues detected, no credentials in parameters, read-only tools properly marked. Main gaps: missing output schema documentation and limited error recovery hints.
Generate a Pro Cycling Manager startlist XML document from a list of teams and their cyclist rosters. Looks up the race in the `.cdb` database by `IDrace` to derive the output file name from `STA_race.gene_sz_filename` (e.g. `c0_almeria.xml`). Returns both the file name and the XML as text. The XML is a `<startlist>` root containing `<team id="N">` elements, each with self-closing `<cyclist id="N" />` children. Team and cyclist IDs map to the PCM `DYN_team.IDteam` and `DYN_cyclist.IDcyclist` columns and can be looked up with `pcm_search_cyclist` or `pcm_query_database`. The number of cyclists per team is free.
Get the active human player and their team from a Pro Cycling Manager `.cdb` database. Joins GAM_user (game_i_active = 1) with DYN_team, STA_division (current and next), and STA_country to return the player login plus team details (name, division name, country name, evaluation and manager).
Inspect a single table inside a Pro Cycling Manager `.cdb` database by name. Returns the table's columns (name, SQL type, NOT NULL and primary key flags) and its row count. Use `pcm_list_tables` first to discover available table names.
List the roster of a team in a Pro Cycling Manager `.cdb` database. Defaults to the active human player's team (GAM_user.game_i_active = 1) when `teamId` is omitted. Joins DYN_cyclist with its active DYN_contract_cyclist and STA_type_rider, and for each cyclist returns name, country, age, rider type, overall ability (note globale), contract end year, wage, market value and all per-terrain ability ratings (plain, mountain, medium mountain, downhilling, cobble, time trial, prologue, sprint, acceleration, endurance, resistance, recuperation, hill, baroudeur). Ordered by overall ability, highest first.
Output schemas not formally documented. Tools return structured data (CdbFile, cyclist objects, XML) but no JSON Schema definitions visible in code. LLMs cannot plan downstream calls without knowing response field names and types.
Error handling lacks recovery guidance. Tools throw generic errors (e.g., 'Database file not found', 'Invalid status') without suggesting next steps. LLMs cannot self-correct or know whether to retry, ask user, or abandon.
pcm_update_cyclist_ratings 'ratings' parameter is untyped object. Description says 'Map of rating field names to new values' but does not enumerate valid field names (plain, sprint, etc.) or value ranges. LLMs may pass invalid fields.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2025-06-18+ | v2 |
Discover the player's own Pro Cycling Manager saves on this machine by scanning the `Pro Cycling Manager <year>/Cloud` folders under %APPDATA%, across every installed edition (Windows only). Returns each save's absolute path, file name, last modified date and size (newest first). A save is stored as a `.cdb` database, so its path is what the other tools take as `databasePath` — use `pcm_validate_database` instead to point at any other `.cdb` (official release, community update).
List every table in a Pro Cycling Manager `.cdb` database via DB_STRUCTURE (table id + name), plus the total table count. Use `pcm_get_table_schema` next to inspect a table's columns.
Run a read-only SQL query against any table in a Pro Cycling Manager `.cdb` database. Only a single SELECT (or WITH … SELECT) statement is allowed; write/DDL statements are rejected and the database is never modified. Results are capped (default 100, max 1000 rows). Use `pcm_list_tables` to discover table names and `pcm_get_table_schema` to inspect their columns.
Search for a cyclist in a Pro Cycling Manager `.cdb` database by first name and/or last name (case-insensitive partial match). Returns up to 10 matching cyclists with all their ratings and their country name; `truncated` is true when more matches exist beyond the 10 returned.
Search for a team in a Pro Cycling Manager `.cdb` database by name (case-insensitive partial match against both the full name and the short name). Returns up to 10 matching teams with their division name, country name, evaluation and general manager; `truncated` is true when more matches exist beyond the 10 returned.
Update one or more per-terrain ability ratings for a cyclist in a Pro Cycling Manager `.cdb` database. Accepts a cyclist ID and a map of rating field names to new values (e.g. `{ plain: 75, sprint: 82 }`). Only the provided ratings are updated; others are left unchanged. The source database is never modified; the edited database is serialized to a new `.cdb` file at `outputPath`. Fails if `outputPath` already exists, so no existing file is overwritten.
Run a write SQL statement (INSERT, UPDATE, DELETE, or WITH … INSERT/UPDATE/DELETE) against a Pro Cycling Manager `.cdb` database. Only a single statement is allowed; read queries and DDL are rejected. The source database is never modified; the edited database is serialized to a new `.cdb` file at `outputPath`. Fails if `outputPath` already exists, so no existing file is overwritten.
Validate that a path points to an existing Pro Cycling Manager `.cdb` database file and return its metadata (name, last modified date, file size). Performs no caching and mutates no state.
pcm_generate_startlist_xml 'teams' parameter schema is incomplete. Array items reference 'id' and 'cyclists' but no type info visible. Should be explicit: {type: 'object', properties: {id: {type: 'number'}, cyclists: {type: 'array', items: {type: 'number'}}}}.
No dry-run or confirmation pattern for destructive tools (pcm_update_database, pcm_update_cyclist_ratings). Agents can accidentally overwrite databases. Consider adding a 'confirm' parameter or separate 'preview' tool.