CopaLibre MCP
OfficialCopaLibre
Self-hosted tournament management for clubs, leagues, federations, and competitive communities.
CopaLibre runs the full lifecycle of a real competition — registrations, seeding, fixtures, live results, standings, corrections, and public coverage — as one system you deploy and own. No mandatory hosted account, no vendor lock-in: results and audit history stay on infrastructure you control, under a network-copyleft license that keeps improvements to publicly-run modified versions available to their users.
Built with NestJS + Fastify on PostgreSQL (Kysely), Astro + React for the web surfaces, and a
declarative rules engine (@sebasoft/neuron-js) for
discipline logic — shipped as a single multi-role Docker image driven by the copalibre CLI.
Get Started
curl -fsSL https://github.com/SebaSOFT/copalibre/releases/latest/download/install.sh | bash
export PATH="$HOME/.copalibre/bin:$PATH"
mkdir my-league && cd my-league && copalibre init
# edit .env — configure identity/email and replace development credentials
# also set GARAGE_RPC_SECRET using openssl rand -hex 32
copalibre doctor && copalibre start
copalibre create-admin --organization-alias my-league --organization-name "My League" --email admin@example.comFull walkthrough, remote management, TLS, and the contributor checkout: see Full walkthrough below.
Full walkthrough
curl -fsSL https://github.com/SebaSOFT/copalibre/releases/latest/download/install.sh | bash
export PATH="$HOME/.copalibre/bin:$PATH"
mkdir my-league && cd my-league
copalibre init # writes a full installation (compose file, .env, marker) into the cwd
# edit .env: PostgreSQL password, COPALIBRE_BOOTSTRAP_TOKEN, OIDC JWKS/issuer/audience,
# browser client ID, one email provider, and GARAGE_RPC_SECRET (openssl rand -hex 32)
copalibre doctor # validates configuration before anything starts
copalibre start # docker compose up --detach --wait
copalibre create-admin --organization-alias my-league --organization-name "My League" --email admin@example.comcopalibre is a standalone binary — no Node.js install required, nothing else to run first.
init doesn't have to run in the directory you installed the binary into — cd into any
directory first (a separate data/config directory, a second installation) and run it there;
doctor/start/migrate/upgrade-check auto-detect that directory afterward from the marker
init writes, the same way .git marks a checkout. copalibre init --module-dev additionally
sets up a modules-dev/ bind mount for developing a discipline/tournament-profile module against
a running instance — see docs/MODULES.md.
Managing an installation from a machine with no database access — including installing or
upgrading the CLI after Docker is already running — works the same way: generate a personal access
token from the control panel's preferences screen, then copalibre login --api-url https://api.example. statistics-rebuild and module add/list/remove/verify then run over an
authenticated HTTP connection.
Day-two operations run through the same binary: backup/restore a compressed,
retention-managed data packet, preflight to check host prerequisites, and upgrade/upgrade-check
to verify module compatibility and coordinate automated self-hosted upgrades non-destructively
(copalibre start applies pending migrations automatically once you do). copalibre mcp runs a local stdio MCP
server so an AI agent can drive the same operations — see docs/MCP.md. The full
command reference, generated from the CLI's own metadata and checked at build time against every
shipped command, lives at /help/cli/commands/ on a running instance.
Prefer Kubernetes over Docker Compose? A Helm chart (deploy/helm/copalibre/)
covers that path too — see /help/self-hosting/'s Option B on a running instance for the
helm install walkthrough and autoscaling caveats.
docker-compose.yml does not terminate TLS by design — put Caddy or NGINX at the edge (example
configs in deploy/proxy/) and verify it with
copalibre doctor --check-proxy --proxy-url https://events.example/events/proxy-check.
Contributor / module-author checkout
Building CopaLibre itself, or authoring a module against its own source, needs a full checkout —
install Node.js 24 and Corepack as well as Git, Docker and Docker Compose v2. The checkout's
./copalibre wrapper installs dependencies and compiles the CLI on the host. Run it from a separate
installation directory:
git clone https://github.com/SebaSOFT/copalibre.git
cd copalibre
mkdir my-league && cd my-league
../copalibre init
../copalibre doctor
../copalibre start
../copalibre create-admin --organization-alias my-league --organization-name "My League" --email admin@example.cominit writes into the current directory, same as the downloaded binary — running it from the
checkout root itself would collide with the checkout's own docker-compose.yml. The generated
.env selects published images matching the CLI version. To run unpublished source changes, build
both images from the checkout root first (docker build --target runtime -t copalibre:local . and
docker build --target web -t copalibre-web:local .), then set COPALIBRE_IMAGE=copalibre:local and
COPALIBRE_WEB_IMAGE=copalibre-web:local in the installation's .env before starting it.
See AGENTS.md for the full contributor guide.
Full walkthrough, backup/restore, and persistent-data details: docs/self-hosting.md.
Related MCP server: Scoring Engine MCP Server
Features
Tournament authoring & registration — discipline configuration, per-event rule authoring, ruleset versioning, registration review, check-in, and zone/group tournament structures with cross-group promotion.
Seeding & bracket builder — lock/randomize seeds, inspect the exact bracket the fixture engine generated (single/double elimination, round-robin, league, bracket-groups, gauntlet, swiss, custom DAG brackets, and multi-round FFA brackets).
Match scheduling — assign venue, time, and officials to a stage's fixtures from a calendar view; venues and officials managed as their own control-panel resources.
Multi-match series — declare a stage's crosses as a best-of/aggregate series instead of a single match, with each game scheduled in its own slot, series-aware result correction, and standings accounted at the series or match grain per organizer choice.
Explainable standings — every ranking exposes the tiebreak comparator that decided it, rendered from the same trace the rules engine produced — never a hidden calculation.
Live match console — real-time event recording, idempotent commands, clock/timer control, and audited result correction instead of silent overwrites.
Offline-resilient by design — every console action writes ahead to a durable client-side queue before it's ever sent, so a dropped connection at the pitch never loses a recorded event, a clock adjustment, or a finalization. The queue survives a hard refresh and drains automatically the moment connectivity returns, replaying each action through the same validation a live one goes through — no separate reconciliation logic, no silently lost work.
Public leaderboards, match reports, and player careers — tournament-wide statistic tables, per-match event timelines and rosters, and a player's cross-tournament history, reusing the same standings/statistics engine driving the control panel.
Matches view — a filterable card list of a tournament's matches (venue, clock, latest event, zone/series context), on the public site as a one-line tiebreak summary and, for an authorized organizer, the full standings comparator trace behind it.
Roles & permissions — organization-scoped RBAC, server-enforced independent of the UI.
Audit trail — every mutation, refused attempt, and sensitive read is recorded centrally against a declared action vocabulary and reviewable from its own control-panel screen.
Data ownership — reviewed CSV import/export keyed by stable aliases, not raw IDs, plus a one-document JSON export of a tournament's full configuration (never results or personal data).
Public coverage — schedules, live outcomes, brackets, and standings, separate from operator controls.
Platform administration — an installation-wide super-admin console creates organizations, inspects live platform health/diagnostics (database latency, transactional outbox status, SSE telemetry, object storage), and installs, verifies, and removes modules; organization admins see their own storage usage.
Club administration & self-service — club representatives manage member directories, affiliations, and submit match rosters for organizer review.
Visual identity & foreground isolation — browser-local neural foreground cutout and chamfered cropping for emblems and participant photos with zero third-party data transmission.
Self-hosted deployment — one Docker image runs every process role; the
copalibreCLI handles init, health checks (doctor), start, admin bootstrap, data diagnostics/repair, and verified backup/restore.
Disciplines and formats
A competition is two independently versioned, attributed JSON documents — never code — so adding
a sport is a data submission, not a patch: a discipline (segments, events, statistics, scoring,
available formats) and a tournament profile (stages, formats, points, tiebreak order). Author
either by hand, through a guided control-panel wizard, or programmatically via an AI agent talking
to copalibre mcp's discipline-authoring contract. See docs/MODULES.md.
Seeded today: football, tennis, and battle-royale. Supported duel formats:
single-elimination, double-elimination (with bracket reset), round-robin (single-leg and
home/away), league, bracket-groups (GSL 4-player dual tournament), gauntlet (stepladder
ascending bracket), swiss (Dutch pairing system), and custom-bracket (declarative DAG).
Supported placement formats: free-for-all, heats, ffa-bracket, ffa-bracket-groups, and
ffa-league (multi-division). Supported tiebreak scopes: overall, head-to-head, and
match-losses, evaluated alongside Strength-of-Schedule metrics (Buchholz, Median-Buchholz,
Sonneborn-Berger), progressive cumulative scores, and audited forfeit handling.
Development
Yarn 4 workspaces monorepo. Applications live in apps/ (api, web, events, worker,
scheduler, migrate, doctor, copalibre CLI); framework-free domain and infrastructure code
lives in packages/ (domain, rules, persistence, tournament-engine, contracts,
design-tokens, routing, realtime, auth, module-catalogue).
yarn install --immutable
yarn typecheck
yarn lint
yarn test
yarn test:integration # requires PostgreSQL via DATABASE_URL
yarn test:e2eSee AGENTS.md for the full contributor guide (conventions, testing strategy,
authentication contract). Every change is planned and tracked as an OpenSpec proposal in
openspec/ before implementation — read the active change before editing.
Documentation
docs/self-hosting.md— deployment, persistent data, backup/restoredocs/deployment/kamal.md— deploying the same container images to plain managed VMs over SSH with Kamal, an alternative to the Kubernetes/Compose pathdocs/deployment/enterprise-kubernetes.md— HA, autoscaling, and the evidence gate behind an "enterprise-ready" claimdocs/deployment/community-modules.md— publishing and installing community discipline/profile modulesdocs/MCP.md—copalibre mcp, its tool set, and how an AI agent connectsdocs/MODULES.md— discipline and tournament-profile authoringdocs/AUTH.md— JWT/OIDC authentication contractdocs/security/dependency-remediation.md— patched dependency advisories and release closure trackingdocs/DEPENDENCY-SECURITY-INCIDENTS.md— incident register contract and maintainer evidence workflowdocs/TESTING.md— testing conventionsdocs/DEMO-DATA.md— loading a realistic demo tournament into a development stack withcopalibre dev demodocs/SCREEN-STORY-REVIEW.md— operator Storybook coverage, fixture boundaries, responsive review evidence, and deferred UX gapsdocs/reviews/owned-control-coverage.md— recursive React story coverage, selected/chrome surfaces, and TV background reviewdocs/i18n-glossary.md— domain-term glossary and content-accuracy review workflow for translated interface stringsdocs/BROADCAST-TV.md— the/tv/kiosk/overlay surface and device-token pairingdocs/reviews/— design system and operational surface review evidencedocs/deployment/reverse-proxy/— Caddy and NGINX examplesCHANGELOG.md— release history, generated from commit history/help/and/help/api-reference/on a running instance — operator help and the interactive, fully static OpenAPI reference (no live-API or internet dependency)
Roadmap
openspec/changes/ is gitignored — every proposal, active or archived, lives only in a local
checkout, never in this file. Enumerating specific proposals here is what went stale last time: every
item this section listed turned out to already be implemented and archived. Run openspec list in a
checkout to see what is actually active right now.
Every change is planned as an OpenSpec proposal before implementation — see
openspec/specs/ for the accepted, currently-implemented capability baseline, which
is committed and is the durable record of what has shipped.
Contributing
Issues and discussions are open for questions, bug reports, and proposals. Read
AGENTS.md first — it covers the monorepo conventions, the OpenSpec workflow, and
what a pull request needs (tests, contract regeneration, coverage) before review.
License
CopaLibre is licensed under the GNU Affero General Public License v3.0.
If you modify CopaLibre and offer the modified version for use over a network, AGPL-3.0 requires that users of that modified version can receive its corresponding source code. Read the full license text before distributing or deploying modified versions.
Available Tools
15 toolscopalibre_backupA
Creates a compressed backup packet of the database (pg_dump via the database-tools Compose service) under backups/, pruning older packets beyond the retention count. Use it before a risky operation or as part of a backup routine. Runs the same steps copalibre backup uses, including its Kubernetes-mode refusal; needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Path within backups/; omit for a timestamped name | |
| retain | No | Most recent packets to keep; defaults to 5 | |
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the destructive pruning of older packets beyond the retention count, the Kubernetes-mode refusal, and explicitly that no API token is needed. It stops short of describing failure behavior (e.g. disk-space or pg_dump errors) or how success is reported, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause and three sentences stay tight with no filler. The packing of mechanism, pruning, CLI equivalence, k8s refusal and token behavior into single clauses is dense but each clause carries real information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema mutation tool this covers purpose, timing, destructive side effect, auth, and environment constraint well. The remaining holes are the undocumented dry_run parameter and any indication of what a successful run returns or where the packet path is reported.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% – file and retain are documented in the schema, but dry_run has no description anywhere. The description contextualizes two of the three params ('under backups/' for file, 'pruning older packets beyond the retention count' for retain) but never mentions the dry-run capability, which an agent would need to discover a non-destructive preview mode.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (creates a compressed backup packet of the database), the underlying mechanism (pg_dump via the database-tools Compose service), and the destination (backups/). This is unambiguous and, unlike the sibling tools which are all doctor/module/schema utilities, leaves no doubt about what it produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to reach for it: 'before a risky operation or as part of a backup routine.' It also identifies the equivalent CLI path (copalibre backup) and a hard constraint (Kubernetes-mode refusal), which functions as a when-not condition. No true alternative tool exists among the siblings, so the lack of a named alternative is not a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_descriptor_schemaA
Returns the discipline descriptor's machine-readable JSON Schema — byte-identical to what copalibre_descriptor_validate and installation both check against — together with a field-by-field explanation of what each declaration governs during a competition, not just its shape. Use this first when authoring a new discipline module, before writing any JSON. Needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries full burden, and it does well: it discloses the output is byte-identical to what validation and installation enforce (a meaningful consistency guarantee) and that no API token is required (auth requirement). It does not state read-only/non-mutating behavior or caching, but 'Returns' plus the zero-param schema make that clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the return value, then the routing instruction, then the auth note. Every sentence carries distinct information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, read-only schema introspection tool with no output schema, the description covers what is returned (JSON Schema plus field-level explanation), when to call it, and the auth situation. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to add or explain. No misleading parameter claims are made.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the discipline descriptor's machine-readable JSON Schema') plus the added payload ('field-by-field explanation of what each declaration governs'). It also distinguishes itself from siblings by naming copalibre_descriptor_validate and positioning itself against copalibre_profile_schema's domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing guidance: 'Use this first when authoring a new discipline module, before writing any JSON.' That tells the agent when to pick this over writing JSON blind, and the mention of descriptor_validate implies the validation counterpart. It stops short of naming the profile_schema sibling as the alternative for profile authoring.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_descriptor_validateA
Validates a candidate discipline descriptor document by calling the same validator the installation path applies — shape and cross-field checks alike (a best-of series span must be odd; a resolution class and a resolution script are mutually exclusive; and more). A descriptor this tool accepts is exactly one installation will accept; it never authors a descriptor, only judges one already drafted. Use it after copalibre_descriptor_schema, iteratively, before copalibre_module_scaffold/_validate_local. Needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
| descriptor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the burden, and it does disclose real behavioral traits: it runs 'the same validator the installation path applies', so acceptance here equals installation acceptance, and it needs no API token. It stops short of describing the output/failure shape or how errors are reported, which is the remaining gap for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by differentiation, usage ordering, and a token note. The parenthetical example list is slightly dense but each clause adds selection value; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter validator with a generic object schema and no output schema, the description supplies the needed workflow position, equivalence to install-time validation, and no-auth note. It could better state what a validation result looks like, but an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter is an undetailed nested object, so the description is the only source of meaning. It characterizes the parameter as a candidate descriptor and enumerates example cross-field constraints (odd best-of series span, resolution class vs. resolution script exclusivity), which conveys the semantic shape the input must satisfy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Validates a candidate discipline descriptor document') and immediately distinguishes itself from siblings: it 'never authors a descriptor, only judges one already drafted', contrasting with copalibre_descriptor_schema. An agent can tell what it does and what it does not do without any other context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing and named alternatives: 'Use it after copalibre_descriptor_schema, iteratively, before copalibre_module_scaffold/_validate_local.' The iteration guidance and position in the workflow leave nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_doctorA
Checks whether this CopaLibre installation is correctly configured: required secrets, database reachability, JWKS content, object storage, and persistent-path writability. Use it before starting an installation, or to diagnose why one is failing. Runs the same checks as copalibre doctor; needs no API token — it inspects local configuration and connects directly to the database, not through apps/api.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavioral traits: no API token required, it inspects local configuration, and it connects directly to the database rather than through apps/api. It leaves open whether the writability check mutates anything and does not describe what a failing run returns, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: what it checks, when to run it, and how it operates. The check list is front-loaded in the first sentence and every clause adds information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complexity is low and the enumerated check categories effectively stand in for output content. With no output schema, however, the description never says what a result or failure report looks like, which is the one remaining gap for a diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is no parameter semantics to add or omit. The description correctly signals that all behavior is environment-derived rather than argument-driven.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (checks) and resource (this CopaLibre installation's configuration) and then enumerates exactly what is verified: secrets, database reachability, JWKS, object storage, and path writability. No sibling among the module_*/descriptor_*/profile_* tools performs installation health diagnosis, so an agent can route to it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives two usage contexts: before starting an installation, and diagnosing an installation that is failing. That is clear positive guidance, but there is no explicit when-not or named alternative tool, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_module_addA
Installs a discipline or tournament-profile module — at its latest version, or one satisfying an optional semver range — from the curated module repository or another allow-listed source. Use it to add a module an installation needs before creating a tournament with it. Runs the same direct-database install copalibre module add uses; needs no API token — it installs directly into the local database and object storage, not through apps/api.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | Yes | ||
| range | No | Semver range; omit for the latest version | |
| source | No | Alternate repository URL; must be allow-listed | |
| allow_unsatisfied_capabilities | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose non-obvious behavior: it runs the same direct-database install as the CLI, needs no API token, and writes to the local database and object storage rather than apps/api. It still omits idempotency, failure behavior, and permission requirements, so it falls short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and resource, followed by version/source qualification and then the runtime context. Three dense sentences with no filler, each adding distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations exist, so the description must stand alone; it covers what gets installed, from where, and the direct-DB/no-token install path. It leaves gaps around re-run safety and the effect of allow_unsatisfied_capabilities, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: range and source are documented in the schema and reinforced by the description (latest by default, source must be allow-listed). However, required alias and the boolean allow_unsatisfied_capabilities are unexplained in both places, and the latter sounds consequential; the description does not compensate for that gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (installs) and resource (discipline or tournament-profile module), plus scope qualifiers: latest version or a semver range. It clearly occupies a different niche from siblings like copalibre_module_list, copalibre_module_remove, and copalibre_module_verify.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete trigger: use it to add a module an installation needs before creating a tournament with it. There are no explicit exclusions (e.g., when to prefer submit/scaffold), but the use context is clear enough to route an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_module_listA
Lists every installed discipline and tournament-profile module (alias, version, kind, source, attribution). Use it to see what a given installation can run before creating a tournament, or to check whether a module you expect is actually installed. Needs no API token — reads directly from the database, not through apps/api.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers useful non-obvious context: it requires no API token and reads directly from the database rather than through apps/api. It does not explicitly state read-only/no-side-effects or any result-size limits, but the disclosed data path is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose first, then when to use it, then the auth/data-source caveat. Every sentence adds information and none is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, no-annotation, no-output-schema tool this is nearly sufficient — it names the returned fields and the data source. It could be slightly richer about result shape or ordering, but nothing essential for calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists every installed discipline and tournament-profile module') and even enumerates the returned fields (alias, version, kind, source, attribution). It is clearly distinct from add/remove/verify siblings in intent, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete situations for use: checking what an installation can run before creating a tournament, and confirming an expected module is installed. No when-not-to-use or named alternative is provided, so it falls short of the 5 bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_module_removeA
Removes every installed version of a discipline or tournament-profile module by alias, refusing (and removing nothing) if any started tournament still references it. Use it to uninstall a module no longer needed. Runs the same direct-database removal copalibre module remove uses; needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the all-versions scope, the atomic refusal ('removing nothing') tied to a concrete precondition, that it writes directly to the database, and that no API token is needed. It does not state irreversibility, required permissions, or response shape, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences that front-load the destructive action and its guard condition before the usage hint. Minor redundancy between 'Use it to uninstall a module no longer needed' and the opening removal statement, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool with no annotations and no output schema, the definition covers behavior, precondition, backend mechanism, and auth requirements. The remaining gaps are alias value format and what the caller gets back on success, which are modest but real.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required parameter at 0% schema description coverage, so the description must compensate. 'By alias' identifies the key and its role, but never defines the alias format (path vs. name, discipline vs. profile disambiguation) or validation rules, leaving the agent to guess what a valid value looks like.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('removes') plus resource ('discipline or tournament-profile module') plus scope ('every installed version ... by alias'). An agent can immediately distinguish this from siblings like copalibre_module_add, copalibre_module_verify, or copalibre_module_list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to uninstall a module no longer needed' gives clear context for invocation, and the refusal precondition ('if any started tournament still references it') tells the agent when the call will fail. It stops short of naming an alternative tool or describing recovery paths, but the when-to-use is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_module_scaffoldA
Generates a structurally-valid discipline or tournament-profile module package — seeded from one of CopaLibre's own already-valid catalogue documents, not a blind guess at the schema — as a tagged local Git repository ready to edit, validate, and submit. Use this first when authoring a new module: it gives real, valid example content (segments, events, statistics for a discipline; stages, points, tiebreak for a profile) to change into the real sport or format, not a blank document. Needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| name | No | ||
| alias | Yes | ||
| author | No | ||
| licence | No | ||
| source_url | No | ||
| output_directory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that no API token is required, that the output is a tagged local Git repository (a filesystem side effect), and that content is seeded from valid catalogue documents rather than guessed. It omits overwrite behavior when output_directory or alias already exists, which is the main remaining gap for a generator tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, and the two sentences stay on task with no filler. It is somewhat dense with parenthetical asides (segments/events/statistics, stages/points/tiebreak), which adds length but earns most of it by clarifying the seeded output.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description is the only source of behavioral context, and it covers the artifact and auth well. However, for a 7-parameter generator it should explain at least how alias and output_directory affect the created repository, which it entirely omits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, so the description must compensate and largely does not. It explains the content differences between the two 'kind' enum values (discipline vs tournament-profile), but name, alias, author, licence, source_url, and output_directory are never mentioned, leaving most parameters undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact ('Generates a structurally-valid discipline or tournament-profile module package ... as a tagged local Git repository'), and the seeding mechanism (from CopaLibre's own catalogue documents) clearly separates it from siblings like copalibre_module_add or copalibre_module_list. An agent can identify the tool from the first sentence alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this first when authoring a new module' gives an explicit ordering cue in the authoring workflow, and 'ready to edit, validate, and submit' outlines the downstream stages. It stops short of naming the specific sibling tools (e.g. copalibre_module_validate_local, copalibre_module_submit) that follow, so alternatives are implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_module_submitA
Forks copalibre-modules, copies a local module package onto a new branch, pushes it, and opens a pull request. Use it once a scaffolded module has been edited and passes copalibre_module_validate_local — this is the last step, handing the module to a human reviewer; it never merges anything itself. Needs no API token, but does need gh authenticated with permission to fork the target repository.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| base_branch | No | ||
| upstream_repository | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and meets it: it discloses the side effects (fork, branch creation, push, PR open), the hard limit (never merges), the auth model (no API token required), and the external prerequisite (`gh` authenticated with fork permission). This is exactly the operational context an agent needs before invoking an irreversible remote action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, then the usage condition, then the auth requirements. No filler and no repetition of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so nothing is owed on return values, and the description fully covers behavior, sequencing, and auth. The only meaningful gap is the undocumented parameters, which is the sole reason this is not a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters (path, base_branch, upstream_repository), so the description must compensate and largely does not. It gestures at the concepts — local module package, new branch, target repository — but never maps them to parameter names, formats, or defaults, leaving all three effectively undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific multi-step verb chain (forks, copies, pushes, opens a pull request) on a named resource (copalibre-modules), and explicitly frames its position in the workflow relative to copalibre_module_scaffold and copalibre_module_validate_local. An agent can distinguish this from the other module_* siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('once a scaffolded module has been edited and passes copalibre_module_validate_local') and an explicit boundary ('this is the last step, handing the module to a human reviewer; it never merges anything itself'). The when-to-use and when-not-to-use are both stated rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_module_validate_localA
Validates a local module package directory (manifest.json + artifact.json) without fetching or installing anything — the exact same check copalibre module add/module verify apply. Use it after editing a scaffolded module, before trying to install it locally or submit it. Needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden and does well: it discloses that nothing is fetched or installed, that no API token is required, and that the check is identical to the one baked into copalibre module add/verify. That establishes a side-effect-free, offline, unauthenticated operation. It stops short of describing failure output or what is reported when validation fails, and no output schema exists to cover that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose front-loaded, then usage. Every clause earns its place: scope, non-fetching behavior, equivalence to existing commands, and the auth-free property. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-annotation, no-output-schema validation tool, the description covers what is checked, when to run it, and that it has no network or auth side effects. The main residual gap is what the tool reports on success/failure, which is not documented anywhere given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'path' parameter is completely undocumented in the schema, so the description must compensate. It does add real meaning by specifying that the path is a local module package directory expected to contain manifest.json and artifact.json, which is more than the bare 'string' type conveys. It does not clarify relative vs absolute paths or the error when the directory is malformed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validates) and a precisely scoped resource (a LOCAL module package directory containing manifest.json + artifact.json), and immediately marks it as distinct from the remote install/verify siblings by saying it fetches and installs nothing. An agent can distinguish it from copalibre_module_verify and copalibre_descriptor_validate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing: 'Use it after editing a scaffolded module, before trying to install it locally or submit it,' which effectively routes the agent relative to module_add/module_verify/module_submit. It also equates the check to what those two commands apply, so the agent knows when it is redundant. No explicit negative case (e.g., what to use for remote packages) is stated, keeping it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_module_verifyA
Re-validates every installed module's stored document and assets against the running CopaLibre core version, reporting PASS/FAIL per module with failure details. Use it to check installation integrity, especially after an upgrade. Runs the same direct-database checks copalibre module verify uses; needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does meaningful work: it discloses the authentication posture ('needs no API token'), the execution mechanism (direct-database checks, not API calls), and the reporting behavior (per-module PASS/FAIL with failure detail). It never states explicitly that nothing is mutated, though 're-validates' and 'check' strongly imply a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core action front-loaded, followed by the situational cue and then the implementation/auth footnote. Each sentence adds distinct information and none is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema verification tool with no annotations, the description covers purpose, when to use it, output semantics, and auth requirements. It leaves open whether a FAIL result is reported in-band only or also raises an error, and says nothing about cost/latency when many modules are installed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which sets the baseline at 4, and there is nothing parameter-related for the description to clarify or compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise verb plus resource and scope: 'Re-validates every installed module's stored document and assets against the running CopaLibre core version,' and even states the output shape (PASS/FAIL per module with failure details). It does not, however, explicitly contrast itself with the nearby sibling copalibre_module_validate_local, which an agent could plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to check installation integrity, especially after an upgrade' gives a clear triggering context, and the mention of running the same checks as `copalibre module verify` anchors it to a known workflow. No when-not conditions or named alternatives (e.g. copalibre_doctor) are offered, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_profile_schemaA
Returns the tournament profile's machine-readable JSON Schema — byte-identical to what copalibre_profile_validate and installation both check against — together with a field-by-field explanation of what each declaration governs during a competition, not just its shape. Use this first when authoring a new tournament-profile module, before writing any JSON. Needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the no-token auth requirement and, more valuably, that the returned schema is byte-identical to what validation and installation check against — a consistency guarantee an agent cannot infer from the schema. It does not describe response size or whether the field explanations are inline or a separate section, but for a read-only tool the safety profile is adequately clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the return value and then the usage trigger; nothing is repeated from the title or the schema. The 'not just its shape' clause earns its place by telling the agent the output is richer than a bare schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must characterize what comes back, and it does: the JSON Schema plus field-by-field semantics, plus the auth posture. For a zero-parameter read tool this is enough for an agent to call it correctly without opening anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is empty with zero parameters, so the baseline is 4 and there is no parameter behavior the description could or should add. It correctly omits per-argument detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (returns the tournament profile's JSON Schema) and pins down the deliverable precisely: the schema plus a field-by-field explanation of what each declaration governs. It also implicitly distinguishes itself from copalibre_profile_validate by naming that sibling as a consumer of the same artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the trigger — 'Use this first when authoring a new tournament-profile module, before writing any JSON' — which is exactly the decision point an agent needs. It stops short of naming when not to use it or pointing at the neighboring copalibre_descriptor_schema for descriptor work, so no exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_profile_validateA
Validates a candidate tournament-profile document by calling the same validator the installation path applies. A profile this tool accepts is exactly one installation will accept; it never authors a profile, only judges one already drafted. Use it after copalibre_profile_schema, iteratively, before copalibre_module_scaffold/_validate_local. Needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the tool calls the same validator as the installation path, so acceptance is exactly installation acceptance, and that it never authors profiles and requires no auth token. It doesn't cover how failures are surfaced, but the core behavioral contract is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and immediately followed by the distinguishing constraint and the workflow position. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a validator with no output schema and no annotations, the description establishes what is validated against and where it sits in the pipeline, which is what an agent needs to invoke it. The main gap is how the pass/fail result or errors are returned, which is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter is an opaque nested object with no documented structure. The description compensates only indirectly by pointing at copalibre_profile_schema as the producer of a valid profile, but adds no internal shape or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Validates a candidate tournament-profile document') and clarifies the scope precisely: it judges an existing draft rather than authoring one. This distinguishes it cleanly from siblings like copalibre_profile_schema and the module scaffold/submit tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly places the tool in the workflow: use after copalibre_profile_schema, iteratively, and before copalibre_module_scaffold/_validate_local. It also notes it needs no API token, removing a common invocation blocker.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_statistics_rebuildA
Recomputes every folded statistic total from source match facts, for an organization or one tournament within it — idempotent, safe to re-run. Use it after a data backfill, a statistics-engine fix, or to repair drift. Runs the same direct-database recompute copalibre statistics-rebuild uses; needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
| tournament_alias | No | Scope to one tournament; omit for all | |
| organization_alias | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does substantial work: it declares the operation idempotent and safe to re-run, discloses that it writes directly against the database rather than the API, and confirms no API token is required. It omits runtime cost, locking/blocking behavior, and required permissions, which is why it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what it does, then when to use it, then the implementation/safety note. Every clause carries distinct information with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-annotation, no-output-schema repair operation, the description covers purpose, scope, triggers, safety, and auth requirements. Minor gaps remain — success/failure reporting, permissions, and expected duration — but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: tournament_alias is already documented ('omit for all') in the schema, while organization_alias has no schema description. The description clarifies the relationship between the two (one tournament *within* an organization) but never explains what form an organization_alias takes, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Recomputes every folded statistic total from source match facts') plus the exact scope options (organization or one tournament within it). No sibling tool touches statistics, and the description names both the domain object and the source of truth, so the agent can distinguish it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger conditions: after a data backfill, a statistics-engine fix, or to repair drift. It does not state when NOT to use it or name an alternative maintenance tool, but the sibling list contains no overlapping tool, so the routing guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copalibre_upgrade_checkA
Checks, before upgrading, whether every installed module would still satisfy its declared CopaLibre-version compatibility range under a target version, and lists database migrations that would run. Use it as a pre-flight gate before switching an installation to a new CopaLibre version — it reports incompatibilities without applying any migration or altering any installed data. Needs no API token.
| Name | Required | Description | Default |
|---|---|---|---|
| target_version | Yes | CopaLibre semver to check |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load, and it does: it declares the operation is non-mutating ('without applying any migration or altering any installed data') and notes 'Needs no API token', both valuable safety/auth facts. It still omits how results are surfaced (format, exit semantics), leaving a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and each subsequent sentence (non-mutation guarantee, no-token note) earns its place. The opening sentence is dense with a mid-sentence clause, which slightly hurts scannability but the content is not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema check tool, the description covers intent, precondition, side-effect profile, and the two categories of results (incompatibilities and pending migrations). Only the exact result structure is unspecified, which is acceptable given there is no output schema to lean on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single parameter target_version is already documented as 'CopaLibre semver to check'. The description refers to 'a target version' but adds no format or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (checks) and resource (installed modules against a target CopaLibre version) and adds the secondary output (database migrations that would run). This is clearly distinguishable from siblings like copalibre_doctor or copalibre_module_validate, which check other things.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames usage as a 'pre-flight gate before switching an installation to a new CopaLibre version', which tells the agent the triggering condition. It does not name a sibling alternative or state exclusions, so it stops short of the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v0.1.0- First observed
copalibre_backup - First observed
copalibre_descriptor_schema - First observed
copalibre_descriptor_validate - First observed
copalibre_doctor - First observed
copalibre_module_add - First observed
copalibre_module_list - First observed
copalibre_module_remove - First observed
copalibre_module_scaffold - First observed
copalibre_module_submit - First observed
copalibre_module_validate_local - First observed
copalibre_module_verify - First observed
copalibre_profile_schema - First observed
copalibre_profile_validate - First observed
copalibre_statistics_rebuild - First observed
copalibre_upgrade_check
TDQS
Scored across 15 tools
Each tool targets a clearly distinct operation: diagnostics, listing, adding/removing/verifying modules, validating descriptors/profiles, schema retrieval, scaffolding, submitting, backup, and statistics rebuild. Overlaps like descriptor_validate vs module_validate_local or upgrade_check vs module_verify are well-separated by descriptions and names.
All tools share the copalibre_ prefix and snake_case, with a mostly predictable domain_action pattern (module_list, module_add, descriptor_validate, etc.). Minor deviations like the single-word copalibre_doctor and copalibre_backup, and noun_noun schema tools, slightly reduce consistency but remain readable.
With 15 tools, the set is well-scoped for a CLI-like administration surface covering module lifecycle, validation, diagnostics, backup, and statistics. Each tool earns its place and the count sits comfortably within the ideal 3–15 range.
The surface covers core administrative and module-authoring workflows: scaffolding, local validation, installation, removal, verification, submission, schema/validation for descriptors and profiles, upgrade pre-flight, backup, and statistics rebuild. Minor gaps exist (e.g., no explicit restore or backup-listing tool, no direct module update beyond add with version range), but agents can work around them.
Maintenance
Related MCP Connectors
Manage racing sessions, telemetry, tracks, vehicles, teams, and licensed cloud features.
Run hackathons end to end: events, teams, submissions, judging and winners.
Public league standings, schedules and brackets; start a league or bracket with no account.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides access to the Start.gg GraphQL API for querying tournament information, event standings, and player statistics. It also enables bracket management tasks like retrieving match sets and reporting winners through natural language.1Apache 2.0
- FlicenseBqualityDmaintenanceProvides programmatic access to all Scoring Engine API functionality for managing Red/White/Blue team cybersecurity competitions, including scoreboard, overview, team management, service management, injects, notifications, and admin tools.53-
- AlicenseNot gradedqualityBmaintenanceAccess football (soccer) data including competitions, matches, standings, and team details via the Football-Data.org API.24 npm2MIT
- AlicenseNot gradedqualityBmaintenanceEnables CTF players to list challenges, retrieve challenge details, view the scoreboard, and submit flags.Apache 2.0