fantasy-football-manager
Summary: This server manages fantasy-football league state and provides analysis, policy, and synthetic demo actions; it does not execute live ESPN transactions.
Read capabilities, current config, team roster, source freshness, and action history without changing state.
Load fictional demo scenarios or import validated league snapshots.
Replace manager configuration, including strategies, automation modes, and user limits, with revision checks.
Run draft simulations and recommendations, and start, stop, or read cached draft monitor results.
Optimize weekly lineups and rank waiver/free-agent candidates using projections, locks, budget, and limits.
Compare all teams by projected weekly power rankings.
Prepare synthetic proposals for draft picks, lineup changes, adds, drops, and waiver claims.
Execute approved synthetic demo proposals idempotently against demo state only.
Live HTTP season and browser draft actions are delegated to the ESPN companion servers.
Provides draft support through a legacy browser adapter that observes and controls ESPN draft pages in Chrome and other browsers for live draft pick submissions.
Supports an incremental PostgreSQL archive of per-team league state for durable historical record keeping.
Uses per-team SQLite state directories to persist league snapshots, configurations, proposals, and audit history.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fantasy-football-managerSimulate my fantasy draft and recommend a lineup for this week."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Fantasy Football Manager
ESPN fantasy football team management for Codex and other Model Context Protocol (MCP) clients. Season operations use authenticated HTTP without Chrome or Playwright. Connect your league, sync its roster, and calculate a legal weekly lineup from current projections. The same package provides a draft assistant with continuous Monte Carlo simulations and a server coordinator for multiple teams.
The manager MCP server provides 17 tools for analysis, policy, and league state. The ESPN MCP companion provides 16 tools for live observations, controlled transactions, and continuous operation. The portfolio MCP adds five tools for all configured teams, players, saved proposals, and lineup analysis. HTTP season actions include lineups, free-agent additions, waiver claims, drops, and IR moves. Draft support retains the existing browser adapter.
Version 0.4.0 preview: The reviewed v0.4.0 wheel is deployed privately and has completed a five-team HTTP observation sweep. An explicitly authorized coverage repair also confirmed two automatic HTTP actions: a free-agent add/drop and a subsequent lineup exchange. Version 0.3.3 assets retain their earlier behavior. See the release links below for the v0.4.0 preview. Read HTTP season acceptance for the current evidence and remaining live validation. Read Stable release readiness for scheduled acceptance checks, backup verification, and release gates.
This independent project requires your ESPN account. A protected session file supplies HTTP authentication. An optional Linux import reads only the two ESPN session cookies from an existing profile without starting a browser.
Try a fictional lineup
Run this demo with Python 3.11 or later and uv. It requires no ESPN account, Chrome session, or MCP client.
uvx --from fantasy-football-manager==0.4.0 fantasy-football-manager --demoThe command prints a fictional lineup report and exits without changing saved league state.
The verified demo returns status: "ok", live_actions: false, and a projected improvement of 5.50 points.
These values describe synthetic inputs, not a measured fantasy result.
Read the developer showcase for the design, verified trials, and contribution ideas.
Related MCP server: NFL MCP
Open the team dashboard
The source checkout includes Fieldroom, a local dashboard for multiple managed teams. Inspect rosters, source health, projections, action limits, and proposed changes in one workspace. Optional approval controls submit exact saved HTTP season proposals through the existing transaction service.
uv sync --locked
uv run fantasy-football-dashboard --demo --enable-actionsOpen http://127.0.0.1:8765/.
Demo approvals affect fictional in-memory records only. They make no ESPN requests.
The dashboard requires no Node.js runtime, ESPN account, or external UI service.
This dashboard is not included in the published v0.3.3 package.
Read the dashboard setup and API guide for actual team data and submission controls. Use the media UI integration prompt to connect an existing authenticated home-server interface. Football is the only implemented sport. The portfolio envelope leaves room for future adapters.
Start with a weekly lineup
HTTP roster reads have verified ownership and player locks across five team contexts. One authorized Week 1 repair verified automatic free-agent acquisition and a subsequent lineup exchange through the deployed candidate. Live waiver processing, IR moves, and scoring-week rollover remain Not Tested.
For the v0.4.0 source checkout:
uv sync --no-dev --extra session-importConfigure the protected session file with
FFM_ESPN_CREDENTIAL_FILE.Connect both MCP servers to the same per-team state directory.
Read the saved action modes with
get_manager_config.Call
espn_connectwith the league, team, season,phase="season",transport="http", and scoring week.Call
espn_syncto read current rosters, projections, locks, and pending transactions.Call
recommend_lineupto calculate a legal lineup.Read
espn_get_statusbefore enabling the required action modes.
The HTTP setup guide explains credential permissions, supported imports, and renewal requirements. No ESPN credential values are MCP tool arguments. HTTP mode does not start a browser.
The result includes the legal lineup and estimated projection change when the required inputs are complete. Missing projections or lock evidence can prevent a recommendation or submission. Selected-team lock evidence does not establish league-wide power rankings.
flowchart LR
Client[Codex or MCP client] --> Companion[ESPN MCP companion]
Companion --> HTTP[Authenticated HTTP season adapter]
HTTP --> ESPN[ESPN league]
Companion --> Draft[Optional browser draft adapter]
Draft --> ESPN
Companion --> Claim[Durable transaction claim]
Claim --> Verify[Observe and verify result]
Companion --> State[Per-team SQLite state]
Client --> Manager[Analysis and policy]
State --> Manager
State --> Archive[Incremental PostgreSQL archive]Read the ESPN workflow and tool reference for configuration and submission steps. Check the versioned compatibility matrix for supported layouts, regression fixtures, and live evidence.
Choose how actions run
Mode | Behavior |
Advisory | Calculate recommendations without submitting a live action. |
Review | Prepare an exact proposal. Submit it after explicit confirmation. |
Automatic | Submit supported actions within the saved per-action policy. No per-action confirmation is required. |
Disabled | Block the selected action. |
Use update_manager_config to replace the full config with its current revision.
Read that config before changing one action mode. Strategy preferences do not grant execution permission.
For lineup changes with approval, use review mode and confirm each exact proposal.
For season automation, connect through HTTP and configure the required action modes and limits.
Then call espn_start_automation. Set auto_rollover=true to follow ESPN's verified current transaction period.
An unresolved submission keeps its original week until reconciliation completes.
HTTP mode submits a complete legal lineup transaction. Legacy browser mode still verifies one exchange at a time.
Acquisitions respect protected players, allowed drops, roster capacity, pending commitments, and league limits.
A named coverage repair requires explicit saved authorization when its improvement cannot be calculated. Unknown projections remain null.
Each live submission receives a durable claim before the HTTP request or draft click.
The service verifies the resulting ESPN state. An uncertain result blocks another submission until reconciliation.
A pending_waiver result identifies a queued claim. Only observed ownership can confirm an acquisition.
Use espn_stop_automation to pause new actions for that league's data directory.
It does not undo an action already submitted.
Draft with continuous simulations
Install the browser extra for draft operations.
Connect with phase="draft", then call espn_sync to verify complete history and the current pick.
Set the requested draft strategy, action mode, and limits before calling espn_start_automation.
Automatic submissions require the correct team on the clock and verified disabled ESPN Autopick.
The draft engine accounts for snake order, roster caps, starter completion, and five strategy preferences. It recalculates after input changes and combines completed simulation batches for unchanged inputs. Its estimates use a two-pick horizon, projected player values, and simulated opponent choices. Availability estimates are conditional. They do not guarantee that a player survives to the next pick. More trials do not correct stale inputs or projection errors. The model does not report championship odds.
The fifth draft trial completed with 13 manager-confirmed picks, two direct host-browser picks, and one unattributed selection. An opponent selection without a season projection blocked history normalization. The operator stopped the worker and completed the final two turns. The host capture contains all 160 selections and matches the 132 picks previously stored by the server. Installed v0.3.1 execution methods remained unchanged. This run required operator recovery and does not verify unattended completion. Version 0.3.2 separates verified opponent identity from projected value. Its regression evidence is separate from this live run.
The earlier fourth draft trial verified all 160 league selections and 16 manager-confirmed picks.
It recorded zero ESPN Autopicks and zero host-browser DRAFT clicks.
Installed v0.3.1 execution methods were unchanged. A private launcher handled collection and lifecycle.
One browser-control error occurred before the first authorization. A later check recovered before submission. The run required no package patches, restart, or manual recovery. A live Ravens D/ST selection succeeded. The record does not establish which autocomplete branch ran.
The live draft trial completed a 16-player roster in a 10-team PPR snake draft. It recorded 13 manager-confirmed picks and 3 ESPN Autopicks. Startup failures and an autocomplete timeout caused platform fallback selections. The run required compatibility patches and manual recovery. It was not an unattended draft from start to finish. Its runtime used installed v0.2.1 dependencies with changing working-tree patches. Do not attribute that live result to an unchanged released wheel.
The third draft trial also finished with 13 manager-confirmed picks and three platform fallbacks. It exposed team-name whitespace and D/ST selector failures. Version 0.3.1 fixes both cases in isolated Chrome tests. The browser handoff missed the final two turns. This trial also required operator recovery.
Keep team management running
espn_start_automation runs inside the MCP process.
Use espn_start_standalone_worker for a local worker that continues after Codex closes while that computer remains available.
For operation without the client PC, install the season coordinator on a server. The HTTP coordinator uses a protected server session file and visits configured teams serially. It runs without the client PC, a Chrome process, or a display service. Each team keeps a separate SQLite database, policy, scoring week, and pending claims. A lease prevents simultaneous HTTP control of the same team through the same session directory. Health separates process activity, observation freshness, analysis readiness, and action readiness. The optional PostgreSQL archive exports bounded batches and commits checkpoints with the evidence. Private backups preserve the operational databases and configuration.
The deployed v0.4.0 coordinator's first sweep returned fresh HTTP observations for all five teams. Four teams had current analysis and required no lineup change. One team had incomplete tight-end coverage with an unknown projection. Health correctly reported degraded analysis. That initial sweep submitted no live transaction and preserved existing team policies.
The user then authorized an exact coverage repair with temporary action limits.
Two unchanged automatic engine steps confirmed a free-agent add/drop, then a lineup exchange, through authenticated HTTP.
Both actions received ESPN EXECUTED receipts and matching roster observations. The previous starter remained on the bench.
Other roster players, starter assignments, and pending transactions stayed unchanged. The original policy was restored after execution.
Read HTTP season acceptance for the deployment, package checks, and remaining live acceptance.
After the fifth draft, the v0.3.2 server verified fresh Week 1 observations, selected-team locks, and current lineup calculations for five exact team contexts. The verified handoff recorded zero new lineup authorizations and zero unresolved authorized claims. Those v0.3.2 observations did not verify live server lineup submission or an unattended season. Read server acceptance for restart, archive, and recovery evidence. All three additional draft trials are complete, with their failures and execution sources recorded separately. Five-team season outcomes and uninterrupted season operation remain unverified.
Install from PyPI
Version 0.4.0 adds HTTP season transactions, the portfolio MCP, and the Fieldroom dashboard.
The base HTTP installation needs no browser. Install the browser extra for live drafts.
Version 0.3.3 expands the descriptions, input schemas, and behavior annotations for all 30 MCP tools. Read the tool definition review for compatibility checks and external scoring status. Version 0.3.2 preserves verified opponent draft history when a season projection is missing. Version 0.3.1 fixed draft team-name whitespace and D/ST selectors. Version 0.3.0 introduced server season scheduling, durable evidence, and a PostgreSQL archive. Check the PyPI project and distribution status for available releases. The manager has an active MCP Registry record. Use Python 3.11 or later and uv. The published v0.3.3 browser workflow also requires installed Google Chrome.
uv tool install fantasy-football-manager==0.4.0
fantasy-football-manager --help
fantasy-football-espn --help
fantasy-football-portfolio --help
fantasy-football-dashboard --helpInstall from source
For development, run these commands from the repository checkout:
uv sync --locked --dev
uv tool install --force .
fantasy-football-manager --help
fantasy-football-espn --help
fantasy-football-portfolio --help
fantasy-football-dashboard --helpConnect the commands
Register both commands with Codex, or use the Codex plugin instructions:
codex mcp add fantasy-football-manager -- fantasy-football-manager
codex mcp add fantasy-football-espn -- fantasy-football-espnBoth commands must be on the MCP host's PATH. Restart the MCP connection after installation.
The plugin already registers both commands. Avoid duplicate direct registrations when using it.
The plugin contains workflow instructions and command registrations; it does not install the Python package.
Use the same FFM_DATA_DIR or --data-dir for both MCP servers that manage one league.
For v0.4.0 HTTP operation, configure FFM_ESPN_CREDENTIAL_FILE on the MCP host.
The base HTTP runtime requires neither Chrome nor Playwright.
For draft or legacy browser operation, install the browser extra and Google Chrome.
Use FFM_BROWSER_DATA_DIR to select a shared browser profile root across separate league databases.
Browser mode accepts an optional cdp_url for an explicit loopback browser debugging endpoint.
Keep profiles, credentials, databases, logs, and real league exports outside Git. Read the privacy notes.
Use the v0.4.0 release page for the versioned wheel, plugin ZIP, and checksums. The distribution acceptance record tracks verified GitHub, PyPI, and MCP Registry publication separately. Follow the release instructions for publisher setup. Earlier published assets remain unchanged.
Scope and validation
Area | Implemented scope | Limit |
Draft assistant | Snake drafts, roster legality, strategy preferences, continuous Monte Carlo estimates | No auction support. Two-pick planning horizon. |
Weekly analysis | Lineups, available-player comparisons, projected power rankings | Requires current projections, ownership, eligibility, and sufficient lock evidence. |
ESPN HTTP season actions | Complete lineups, acquisitions, required drops, IR moves | Fresh authenticated evidence and saved policy are required. |
ESPN draft actions | One verified pick per proposal | Requires the optional browser adapter. |
Server team manager | HTTP team visits, optional period rollover, readiness, incremental archive, backups | Session renewal and unresolved transactions can require operator input. |
Trade execution | Not implemented | Pending trades remain protected from conflicting automatic actions. |
The v0.4.0 local suite passed 1,048 tests with 22 skips. A separate PostgreSQL run passed 92 archive tests. A fresh base installation passed actual STDIO checks for 17 manager tools and 16 ESPN tools without Playwright. All 28 deployed Python files matched the reviewed wheel. Existing dependency versions and team policies remained unchanged. One authorized repair subsequently verified automatic HTTP add/drop and lineup execution in a single Week 1 context. Live waiver processing, IR moves, and scoring-week rollover remain Not Tested. Read HTTP season acceptance for the exact evidence boundary.
The v0.3.3 source passed 664 tests across the base and separate Chrome runs, including 17 isolated Chrome cases. Two remaining skips required PostgreSQL configuration and Windows symlink permissions. All seven v0.3.3 source CI jobs passed, including Windows, Ubuntu, Chrome, and PostgreSQL checks. These test counts are distinct from live account acceptance. Live draft execution of an installed v0.3.3 wheel remains Not Tested. See validation status, server acceptance, and the compatibility matrix.
For a synthetic demonstration, run uv run fantasy-football-manager --demo.
The CLI demo calculates an in-memory report. The manager's demo execution tools modify synthetic state only.
Use a separate state directory for demonstrations.
For development checks, run:
uv run pytest -q
uv run python scripts/validate_release.pyBrowser and PostgreSQL cases require their explicit test settings. Use the complete test commands. Release packaging waits for the requested commit's Windows, Ubuntu, Chrome, and PostgreSQL gates. See architecture, policy, and release instructions. The discovery measurement plan separates publication checks from observed discovery results. The repository's distribution check reports GitHub and Glama state after updates and each day. It records release gaps and unknown build evidence without publishing or requesting a rebuild.
The Codex catalog package uses validated root metadata and generated plugin files.
License: MIT. Copyright 2026 krmisystems.
Available Tools
17 toolsexecute_demo_actionADestructiveIdempotent
Execute an existing proposal against synthetic demo state only.
First call prepare_action, then obtain approval for that exact proposal when requires_confirmation is true. Execution rechecks snapshot and configuration revisions, freshness, automation modes, and action limits before changing state. Returns status='executed', scope, action, proposal_id, and the new revision, and records one audit event. Retrying a completed proposal returns its original result with idempotent_replay=true, without another state change or approval check. Unknown or changed proposals fail. Use the ESPN companion for live submissions.
| Name | Required | Description | Default |
|---|---|---|---|
| proposal_id | Yes | Exact proposal_id returned by prepare_action in this data directory. Reuse the same ID to retry an uncertain response. | |
| confirmation | No | Set true only after the user approves this exact proposal in review mode. Automatic mode does not require confirmation. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and idempotentHint, but the description adds specifics: rechecks snapshot/config revisions, freshness, automation modes, action limits; records one audit event; retries return original result with idempotent_replay=true without state change; unknown or changed proposals fail. No contradictions with annotations.
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 description is well-structured with clear sentence separation, front-loading the core purpose. It is slightly longer than minimal but every sentence adds important behavioral or usage context, so it earns its place.
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?
Given the output schema, annotations, and detailed description, everything an agent needs to know is covered: prerequisites, approval flow, idempotency, failure modes, and the synthetic demo scope. No significant gaps remain.
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 100% with descriptions for both parameters. The description adds value by explaining that proposal_id must be the exact one from prepare_action and that confirmation is only needed in review mode, beyond what the schema states. This justifies a score above the baseline of 3.
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 clearly states the tool's verb and resource: 'Execute an existing proposal' and scopes it to 'synthetic demo state only'. It also differentiates from siblings by referencing prepare_action and the ESPN companion for live submissions, so an agent can distinguish it from related 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?
It explicitly says to first call prepare_action and obtain approval when requires_confirmation is true. It also states when not to use it ('Use the ESPN companion for live submissions') and describes retry and failure conditions, giving clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_action_historyARead-onlyIdempotent
Read recent audit records from this data directory without changing state.
Returns history entries with id, at, event, and detail, ordered from newest to oldest. Records include snapshot imports, configuration changes, prepared proposals, and completed demo actions. An action_prepared event records preparation, not execution. Calculation evidence is separate from this audit history. Works before a snapshot is loaded.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum audit records to return, from 1 through 500. Results are ordered from newest to oldest. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds substantial context beyond that: it enumerates the event types recorded (snapshot imports, configuration changes, prepared proposals, completed demo actions), clarifies the semantic nuance of action_prepared events (preparation vs. execution), and notes that the tool works before a snapshot is loaded. This goes well beyond the annotations and meaningfully informs the agent about behavior and scope.
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 description is front-loaded with the purpose, then delivers the return format, event types, a nuance, and timing in a compact series of sentences. Every sentence earns its place; there is no redundancy or filler. It is efficient and well-structured.
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?
Given the tool has only one parameter, an output schema exists, and annotations cover safety, the description fills in all remaining gaps an agent needs: return field names, ordering, event semantics, and availability before snapshot load. Nothing essential is missing for correct invocation.
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 schema covers the sole parameter 'limit' fully, describing its range (1–500), default (50), and ordering behavior. The description does not add any additional meaning to the parameter beyond what the schema provides, so the baseline of 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?
The description opens with 'Read recent audit records from this data directory without changing state,' a specific verb and resource that clearly distinguishes it from sibling tools like prepare_action or execute_demo_action. It also specifies the return fields (id, at, event, detail) and ordering, leaving no ambiguity about what the tool does.
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?
While no alternative tool is named, the description provides clear context for when to use it: it works before a snapshot is loaded, and it explicitly separates calculation evidence from audit history ('Calculation evidence is separate from this audit history'), implying a when-not scenario. This gives an agent enough guidance to route correctly, though it stops short of naming a specific sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_capabilitiesARead-onlyIdempotent
Read this server's capabilities before selecting analysis or execution tools.
Returns supported actions, effective automation modes, pause state, snapshot presence, and state and configuration revisions. This server analyzes imported data and executes synthetic demo actions only. The response separately describes browser drafts and HTTP season actions through the ESPN companion. Its acceptance report distinguishes implemented actions from verified live execution. Works before a snapshot is loaded and does not change saved state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it states the server only executes synthetic demo actions (not real-world actions), that the response distinguishes implemented actions from verified live execution, and that the tool 'does not change saved state.' This is meaningful behavioral disclosure that helps an agent trust the tool and interpret its output correctly.
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 description is compact and front-loaded with the most important usage directive. Each sentence adds distinct information: when to use, what is returned, server scope, response structure, and side-effect guarantee. It is slightly repetitive in places (e.g., 'synthetic demo actions only' and 'distinguishes implemented actions from verified live execution' both touch on the demo nature), but overall it is efficient and well-structured.
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, read-only capability probe with an output schema present, the description is nearly complete. It covers when to call it, what it returns, the server's execution scope, and the no-side-effect guarantee. The only minor gap is that it doesn't explicitly describe the output schema structure, but the presence of an output schema means the description need not explain return values in detail. The mention of 'ESPN companion' and 'acceptance report' is slightly cryptic but not blocking.
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 has zero parameters, so there is no parameter semantics burden on the description. The schema coverage is 100% (vacuously, since there are no properties). The description instead explains what the response contains, which is the relevant semantic information for a no-arg capability probe. A baseline of 4 is appropriate for a zero-parameter tool.
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 opens with a clear directive: 'Read this server's capabilities before selecting analysis or execution tools.' It names the resource (server capabilities) and the specific verb (read), and it distinguishes the tool from siblings by stating it is a prerequisite step before choosing other tools. The subsequent sentences enumerate exactly what is returned (supported actions, automation modes, pause state, snapshot presence, revisions), which leaves no ambiguity about the tool's purpose.
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 first sentence explicitly states when to use this tool: 'before selecting analysis or execution tools.' It also clarifies the server's scope ('analyzes imported data and executes synthetic demo actions only'), which helps an agent understand what capabilities to expect and when this tool is relevant. The description also notes it 'Works before a snapshot is loaded,' giving a clear precondition. While it doesn't name a specific alternative tool, the context of sibling tools (e.g., get_source_status, get_manager_config) makes the usage context clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draft_recommendationsARead-onlyIdempotent
Read cached results and status from the local draft monitor without running a simulation.
Returns running, status, error, current, trial counters, and latest when the cached inputs remain usable. latest is null when revisions change, the snapshot becomes stale or incomplete, automation pauses, or no result exists. Completed trials include work across the monitor session, while current_state_trials counts only the current inputs. Use start_draft_monitor to produce these results or recommend_draft for an independent single batch. This tool does not fetch observations or append calculation evidence.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description adds meaningful behavior: latest is null under specific stale/paused/no-result conditions, trial counters have different scopes, and the tool does not fetch observations or append calculation evidence. This gives the agent a precise model of the tool's side effects and limitations.
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?
Every sentence contributes useful information: what it reads, what it returns, null semantics, counter scoping, alternatives, and exclusions. It is front-loaded with the core purpose and remains dense without becoming bloated.
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?
The description is complete for an agent to decide when and how to call this parameterless read tool. It explains stale results, counter semantics, alternatives, and explicitly states what it does not do; the output schema covers the return shape.
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 has zero parameters, so there is nothing for the description to clarify. The schema coverage is 100% and the parameterless nature is fully visible; no additional parameter semantics are needed.
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 opens with a specific verb and resource: 'Read cached results and status from the local draft monitor.' It also explicitly says it does not run a simulation, distinguishing it from simulation-producing tools like start_draft_monitor and recommend_draft.
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?
It clearly tells the agent when to use this tool versus alternatives: use start_draft_monitor to produce these cached results, or recommend_draft for an independent single batch. This is explicit routing guidance, not just implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_manager_configARead-onlyIdempotent
Read the full current configuration and its config_revision.
Returns strategies, automation presets and per-action modes, pause state, and user limits. Works before a snapshot is loaded and does not change saved state. Use this response as the starting configuration for update_manager_config to preserve existing settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, covering the safety profile. The description adds value by noting it works before a snapshot is loaded and does not change saved state, reinforcing the read-only nature and providing operational context beyond the annotations. It doesn't go deeper into performance or edge cases, but for a simple read tool this is sufficient.
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 description is four sentences with no fluff. The core purpose is front-loaded in the first sentence, followed by a list of returned content, a behavioral note, and a usage pointer. Every sentence earns its place and the structure is easy to scan.
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?
With an output schema present (as indicated by the context signal), the description need not detail the return structure. It covers the essential operational details: what it returns, when it can be used, and that it does not modify state. The explicit tie to update_manager_config provides the necessary workflow context. No missing information prevents an agent from calling 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?
There are zero parameters, so the baseline is 4. No parameter documentation is needed, and the description adds no irrelevant detail. It fully satisfies the parameter-semantics requirement by having no parameters to explain.
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 opens with a specific verb and resource ('Read the full current configuration and its config_revision'), then enumerates the returned content (strategies, automation presets, per-action modes, pause state, user limits). It clearly distinguishes itself from siblings like update_manager_config, which is a write operation, by emphasizing it reads and does not change state.
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 instructs to use this tool as the starting configuration for update_manager_config to preserve existing settings, and states it works before a snapshot is loaded. This gives clear when-to-use guidance and directly points to the complementary sibling, leaving no ambiguity about its role in a read-before-write workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_power_rankingsA
Compare every team's best legal weekly lineup by projected points.
Requires current season data, weekly inputs for every team, and verified locks with league scope. Returns rankings, source details, warnings, and input revisions with status='ok' or status='incomplete'. Incomplete team lineups produce null ranks, while missing league lock coverage produces an empty rankings list. These estimates describe one week and are not championship probabilities. Appends calculation evidence without changing rosters. Use recommend_lineup to analyze only the selected team.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
All four annotation hints are false, so the description carries the full burden of behavioral disclosure, and it delivers. It discloses the side effect ('Appends calculation evidence without changing rosters'), defines the status contract (status='ok' or status='incomplete'), and documents edge-case behavior (null ranks for incomplete lineups, empty list for missing lock coverage). This is substantial transparency beyond what the schema or annotations provide.
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?
Seven sentences is on the longer side, but every sentence earns its place: purpose, prerequisites, return format, two distinct edge cases, scope clarification, and side-effect disclosure plus sibling routing. The purpose is front-loaded in the first sentence, and the final sentence efficiently routes to recommend_lineup. Slightly dense, but 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 zero-parameter tool with an output schema, this description is complete. It covers purpose, prerequisites, return values (rankings, source details, warnings, input revisions), status semantics, edge cases, scope limitations, side effects, and the alternative tool. 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 has zero parameters and 100% schema coverage, so the baseline is 4. The description mentions the underlying data requirements ('weekly inputs for every team, verified locks') in prose, which orients the agent on what the tool needs at runtime even though no explicit parameters exist. No parameter documentation is necessary, and none is missing.
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 opens with a specific verb-resource pair: 'Compare every team's best legal weekly lineup by projected points.' It states scope (every team), what is compared (best legal weekly lineup), and the metric (projected points). It also distinguishes itself from the sibling recommend_lineup, which analyzes only the selected team, so an agent can tell them apart 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?
The description gives explicit prerequisites: 'Requires current season data, weekly inputs for every team, and verified locks with league scope.' It names the alternative explicitly: 'Use recommend_lineup to analyze only the selected team.' It also clarifies scope boundaries — these are one-week estimates, not championship probabilities — so an agent knows when not to over-interpret the result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_source_statusARead-onlyIdempotent
Check the freshness and completeness of the saved observation.
Requires an imported snapshot or loaded demo. Returns source fields, age_seconds, the phase-specific maximum_age_seconds, stale, and local draft monitor status. This tool reads saved data and does not refresh the source or run a simulation. Use the ESPN companion for fresh HTTP season observations or browser draft observations. Use import_league_snapshot for replacement data supplied by the caller.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, idempotentHint=true, and destructiveHint=false. The description adds important behavioral context beyond those: it only reads saved data, does not refresh the source or run a simulation, and requires an already-imported snapshot or demo. This is a meaningful addition that helps the agent reason about side effects and prerequisites.
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 description is made up of six short sentences that each carry distinct value: purpose, prerequisite, return fields, non-behavior (no refresh/simulation), and explicit alternative tools. It's well-structured and front-loaded, with no filler or repetition.
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?
Given the tool has zero parameters, an output schema, and detailed annotations, the description provides all remaining context needed for correct invocation: prerequisites, main behavior, and how to route alternatives. No required information about when or how to call it 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 has zero parameters and the schema covers all properties trivially (100% coverage). With no parameters to document, the description doesn't need to compensate for schema gaps, and it correctly adds no parameter explanation beyond stating the tool requires a snapshot or demo. Baseline of 4 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?
The description opens with a clear, specific verb and resource: 'Check the freshness and completeness of the saved observation.' It also distinguishes the tool from siblings by explicitly noting it does not refresh the source or run a simulation, and by pointing to alternative tools for fresh data and caller-supplied replacements. This leaves no ambiguity about what the tool does and what it doesn't.
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 provides a direct precondition: 'Requires an imported snapshot or loaded demo.' It also gives explicit alternative routing: 'Use the ESPN companion for fresh HTTP season observations or browser forecast observations' and 'Use import_league_snapshot for replacement data supplied by the caller.' This tells the agent exactly when to use this tool versus when to select a different one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_teamARead-onlyIdempotent
Read the selected team's roster from the saved snapshot.
Requires an imported snapshot or loaded demo. Returns the snapshot revision, league context, roster and reserve players, lineup, league rules, and budget when supplied. Use recommend_lineup to calculate a lineup or get_source_status to check observation freshness. This tool does not fetch new data or change saved state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description reinforces and extends this by stating 'Requires an imported snapshot or loaded demo' and 'This tool does not fetch new data or change saved state,' adding contextual prerequisites and confirming the non-mutating behavior. No contradictions with annotations.
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 description is three sentences, front-loaded with the core purpose, then prerequisites, return content, and usage guidance. Every sentence earns its place; there is zero redundancy or filler. It is a model of concise, effective writing.
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?
Given the tool has no parameters, an output schema (so return format is already defined), and strong annotations covering safety, the description fully covers prerequisites, behavioral constraints, and return content. Nothing an agent needs to invoke 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 has zero parameters, so the baseline is 4. The schema coverage is trivially 100%. The description adds no parameter details because there are none, but it appropriately lists the information returned, which is useful for the agent. No gap exists.
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 clearly states the verb 'Read' and the resource 'the selected team's roster from the saved snapshot.' It differentiates from siblings by explicitly noting it does not fetch new data or change saved state, and it names specific alternatives for other operations. The purpose is unambiguous.
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 explicitly mentions when to use this tool versus alternatives: 'Use recommend_lineup to calculate a lineup or get_source_status to check observation freshness.' It also clarifies the prerequisite of an imported snapshot or loaded demo, giving the agent clear context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_league_snapshotADestructive
Validate and save a complete league snapshot supplied by the caller.
Use the ESPN companion to fetch live observations or load_demo for fictional data. Replacement requires the current snapshot revision and preserves observation order and confirmed draft history. Pending browser submissions, HTTP submissions, and queued waivers retain their original context and rules until reconciliation resolves them. Changing the league, selected team, or season resets configuration to defaults. Records the import, increments the snapshot revision, and invalidates unexecuted proposals and monitor results. Returns status='imported', revision, config_revision, and config_reset, or an error without replacing state.
| Name | Required | Description | Default |
|---|---|---|---|
| snapshot | Yes | Complete league observation. Use fantasy://schema/snapshot for fields, defaults, and rules. This is replacement data, not a patch. | |
| expected_revision | No | Current snapshot revision from get_team or get_capabilities. Omit only for the first import into empty state. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive, and the description adds substantial behavioral detail: it preserves observation order and draft history, retains pending submissions until reconciliation, resets configuration on league/team/season changes, increments the revision, and invalidates proposals and monitor results. It also states the atomic failure mode: 'an error without replacing state.'
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?
Seven sentences, front-loaded with the tool's purpose, and every subsequent sentence covers a distinct behavioral or failure characteristic. There is no filler, repetition, or schema duplication.
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 complex, destructive mutation with nested inputs, the description covers preconditions, state invariants, side effects, config reset behavior, and error atomicity. An output schema exists, so return-value details are not a gap; the description even names the key response fields.
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 parameter details are already documented in the input schema. The main prose mentions 'current snapshot revision' as a precondition, matching expected_revision, but does not add new format, syntax, or usage information beyond the schema.
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 opens with a specific verb and resource: 'Validate and save a complete league snapshot supplied by the caller.' It distinguishes itself from sibling tools by naming the ESPN companion and load_demo for how data should be obtained, making the tool's role as the importer clear.
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?
It gives concrete usage context: use the ESPN companion for live observations or load_demo for fictional data, and use the current snapshot revision for replacement. It does not formally state 'do not use this for fetching live data', but the alternative paths and precondition are explicit enough for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_demoADestructive
Load a fictional scenario for local testing or demonstrations.
Use import_league_snapshot for your own data. Requires an empty data directory or existing synthetic state and preserves confirmed draft history checks. Stops the local draft monitor, replaces the snapshot, and resets configuration when the league changes. Records the import and returns status='imported', revision, config_revision, and config_reset. This tool does not connect to ESPN.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Fictional scenario to load: 'season' for weekly tools or 'draft' for draft simulations. | season |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true), the description reveals the exact destructive and side-effecting behaviors: 'Stops the local draft monitor, replaces the snapshot, and resets configuration when the league changes.' It also documents what the tool does not do ('This tool does not connect to ESPN') and what it returns ('status='imported', revision, config_revision, and config_reset'). This adds substantial transparency beyond what annotations already disclose.
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 description is front-loaded with the main purpose and then provides behavior, prerequisites, and return values in a compact five-sentence block. Every sentence adds useful context. Only minor improvements—like merging the prerequisite and behavior sentences—could trim it further, so it earns a 4.
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?
Together with the rich annotations, the description gives an agent what it needs: purpose, alternatives, prerequisites, concrete side effects, and return values. It also explicitly clarifies it's not an ESPN connection. A small gap remains around what happens if the data directory contains non-synthetic state or how the 'empty or existing synthetic state' is validated, but overall it's sufficiently complete for safe invocation.
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%, and the input schema already gives the full meaning of the 'mode' parameter ('season' for weekly tools, 'draft' for draft simulations). The description does not add additional parameter semantics beyond that; it only repeats the same concept implicitly. Baseline 3 is appropriate because the schema carries the semantic weight.
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 opens with a clear verb and object: 'Load a fictional scenario for local testing or demonstrations.' It also explicitly distinguishes its purpose from a sibling by saying 'Use import_league_snapshot for your own data.' This makes the tool's intent unmistakable and differentiates it from the surrounding 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?
The description tells the agent when to use this tool (local testing/demonstrations) and names the alternative for different data ('Use import_league_snapshot for your own data'). It also states an important prerequisite: 'Requires an empty data directory or existing synthetic state.' It lacks a comprehensive 'don't use when...' list, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_actionA
Validate a synthetic action and save a proposal without executing it.
Requires fresh, complete synthetic data, unpaused automation, and review or automatic mode for every action component. Checks action-specific player eligibility, locks, projections, roster rules, and user limits before saving the proposal. Returns proposal_id, normalized payload, mode, requires_confirmation, scope, and the bound snapshot and configuration revisions. Each call creates a new proposal and audit record. Use execute_demo_action with that exact proposal_id for execution. Use the ESPN companion for browser draft proposals or HTTP lineup, acquisition, drop, and IR proposals.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Synthetic action: draft_pick, set_lineup, waiver_claim, free_agent_add, or drop_player. Trades are unsupported. | |
| payload | Yes | Exact action data. Picks and drops use player_id. Lineups use a complete lineup slot-to-player map. Adds use player_id, optional drop_id, and bid (default 0). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse (all hints false), so the description carries the burden. It discloses that each call creates a new proposal and audit record (non-idempotent), which aligns with idempotentHint=false. It also explains validation checks and prerequisites, adding behavioral context beyond the annotations. It doesn't mention error handling or failure modes, but the core side effects are clearly stated.
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 description is front-loaded with the core purpose, then lists conditions, checks, returns, side effects, and alternatives. Each sentence adds information and there is minimal fluff. It is slightly longer than strictly necessary but well-organized and efficient.
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?
Given the tool's complexity (two parameters but a payload with three variants) and the presence of an output schema, the description covers prerequisites, validations, return contents, side effects, and usage alternatives. It doesn't explicitly address error scenarios or edge cases, but an agent has enough information to invoke it correctly and know what to expect.
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 schema already fully documents the action enum and each payload variant. The description adds context about validations and data requirements but doesn't add per-parameter semantics beyond what the schema provides. Baseline 3 is appropriate since the schema carries the heavy lifting.
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 ('Validate'), a resource ('synthetic action'), and an explicit non-goal ('without executing it'). It clearly distinguishes itself from siblings by naming execute_demo_action as the execution counterpart and the ESPN companion for browser/HTTP proposals, so an agent can immediately tell what this tool is and is not for.
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?
Provides explicit prerequisites ('fresh, complete synthetic data, unpaused automation, review or automatic mode'), names the execution alternative ('Use execute_demo_action with that exact proposal_id'), and states when to prefer a different tool ('Use the ESPN companion for browser draft proposals or HTTP...'). This leaves no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rank_waiver_candidatesA
Rank alternative single-player acquisitions using the saved weekly snapshot and user limits.
Requires current season data, verified locks, weekly projections, and known budget and pending commitments. Returns recommendations with add and optional drop IDs, lineup improvement, and maximum FAAB bids, plus revisions and input warnings. Status is ok, incomplete for missing inputs, or blocked when the weekly move limit is reached. Unrostered players are not verified free agents, and this tool does not estimate winning bids or submit claims. Appends calculation evidence. Use prepare_action only for synthetic acquisitions that pass action checks. Use the ESPN companion's espn_prepare_season_action for a live HTTP acquisition proposal.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of alternative single-player acquisitions to return, from 1 through 100. Candidates are not a combined claim plan. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as non-read-only and non-idempotent, and the description adds meaningful write behavior ('appends calculation evidence') and clear non-behaviors ('does not estimate winning bids, does not submit claims'). It also discloses statuses (ok, incomplete, blocked). Minor gap: it does not explain what side effect appending evidence has on subsequent calls, but the disclosure is otherwise strong.
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 description is dense but every sentence earns its place: purpose, prerequisites, outputs, statuses, exclusions, and alternatives. It is front-loaded with the main verb and resource, though the multi-sentence structure is slightly longer than strictly necessary.
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 complex tool with a rich output schema, the description covers what the tool does, what it needs, what it returns, status semantics, caveats, and when to use sibling tools. The agent can confidently decide whether to call it and how to interpret its results.
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 already covers the single 'limit' parameter completely (type, default, description), so there is little for the description to add. The tool description reinforces that results are 'alternative single-player acquisitions' which clarifies what the limit applies to, but this is only incremental.
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?
Description opens with a specific verb and resource: 'Rank alternative single-player acquisitions using the saved weekly snapshot and user limits.' It clearly scopes the tool to ranking/waiver suggestions and distinguishes it from execution-oriented siblings by noting it does not submit claims and directing live proposals to espn_prepare_season_action.
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 lists required inputs ('current season snapshot, verified locks, weekly projections, known budget and pending commitments'), output expectations, and error states ('incomplete for missing inputs'). It also tells the agent exactly when to prefer alternatives: 'Use prepare_action only for synthetic acquisitions that pass action checks' and espn_prepare_season_action for live ESPN acquisition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_draftA
Run one bounded draft simulation against the current imported draft snapshot.
Use start_draft_monitor for repeated batches or get_draft_recommendations to read that monitor's cached results. Requires draft data with consistent pick history and full-season projections for available and selected-team players. Returns estimated recommendations, trial counts, warnings, revisions, and status such as ready, stale_snapshot, incomplete_snapshot, or roster_complete. current checks revision and snapshot freshness after calculation, but does not grant action permission. Appends a calculation evidence record, including discarded work, without changing rosters or submitting picks.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Random seed for this batch. Reuse an integer with identical inputs to reproduce the simulation. This does not remove forecast uncertainty. | |
| trials | No | Simulation trials in this single batch. Use 1 through the configured limits.batch_trials, at most 500. More trials increase work and reduce sampling noise. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so the description carries the full burden of behavioral disclosure. It explicitly states side effects: 'Appends a calculation evidence record, including discarded work, without changing rosters or submitting picks.' It also mentions that 'current checks revision and snapshot freshness after calculation, but does not grant action permission.' This discloses non-mutating behavior and a persistent side effect, though it does not detail whether repeated calls are safe beyond not changing rosters, which is 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?
The description is compact at four sentences, with the main action front-loaded in the first sentence. It then covers alternatives, prerequisites, output/status, and side effects in a logical order. Each sentence adds meaningful information without fluff, though it is slightly longer than strictly necessary.
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?
Given the tool's complexity, the presence of an output schema means the description need not detail return values. It covers prerequisites, alternatives, side effects, and statuses (ready, stale_snapshot, incomplete_snapshot, roster_complete). It also notes that the tool does not grant action permission, which is crucial for agents. Nothing essential 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 100%, so the schema already documents both parameters. The description adds value beyond the schema by explaining seed reproducibility: 'Reuse an integer with identical inputs to reproduce the simulation. This does not remove forecast uncertainty.' It also clarifies trial limits: 'Use 1 through the configured limits.batch_trials, at most 500.' This enriches the agent's understanding of how to use the parameters.
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 clearly states the specific action: 'Run one bounded draft simulation against the current imported draft snapshot.' It also distinguishes from siblings by explicitly naming alternatives: 'Use start_draft_monitor for repeated batches or get_draft_recommendations to read that monitor's cached results.' This leaves no ambiguity about what the tool does and how it differs.
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 provides explicit when-to-use guidance: 'Run one bounded draft simulation' and when not to: 'Use start_draft_monitor for repeated batches or get_draft_recommendations to read that monitor's cached results.' It also lists prerequisites: 'Requires draft data with consistent pick history and full-season projections for available and selected-team players.' This is thorough and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_lineupA
Optimize the selected team's known weekly projections while preserving locked slots.
Uses the saved season snapshot, weekly projections, verified player locks, and configured source age limits. Returns status='ok' with a lineup and comparison details, or status='incomplete' with errors and missing-input details. Unknown unchanged scores can cancel from improvement while total projected points remain null. Comparison scope and coverage gaps describe those limits. Coverage suggestions do not authorize a repair.
Locked players remain in their current slots, including unavailable players whose games have locked. Appends calculation evidence without changing the lineup, and includes the input snapshot and configuration revisions. Use prepare_action for a synthetic proposal or the ESPN companion for live lineup changes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is rich with behavioral detail: status outcomes (ok/incomplete), the edge case where unknown unchanged scores cancel improvement, the non-authorization of repairs from coverage suggestions, locked-slot preservation, and the guarantee that it appends evidence without changing the current lineup. This goes well beyond the sparse annotations.
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 description is long but dense: every sentence carries a distinct constraint, behavior, or alternative. It is front-loaded with the main purpose, then branches into status details, edge cases, side-effect guarantees, and alternatives. A few phrases are jargon-heavy, but nothing is 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?
Covers purpose, input sources, output statuses, edge cases (unknown scores cancel improvement), guarantees (locked slots, no lineup change), limitations (coverage gaps, no repair authorization), and alternatives (prepare_action, ESPN companion). No critical context is missing for an agent to decide and invoke it.
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, so the baseline is 4. The description compensates by naming the conceptual inputs (saved snapshot, projections, locks, source age limits) and the status/error payload shape, which gives an agent enough context to invoke the tool without parameter docs.
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 opens with a specific verb and outcome: 'Optimize the selected team's known weekly projections while preserving locked slots.' This clearly states what the tool does and distinguishes it from a generic lineup generator. It also names alternatives (prepare_action, ESPN companion) so an agent can tell it apart from related tools without guessing.
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 clear context for when the tool is appropriate: optimizing projections while respecting locked slots.linkText It explicitly points to prepare_action for synthetic proposals and the ESPN companion for live changes. It does not explicitly say
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_draft_monitorA
Start background draft simulations and return the initial monitor status.
Requires a loaded draft snapshot and no active local draft monitor. Each batch uses the latest imported snapshot and appends calculation evidence, including discarded batches. The monitor waits while paused or while the snapshot is stale or incomplete, and clears obsolete cached results. Import new observations to maintain freshness. This tool neither reads a browser nor submits picks. Use get_draft_recommendations for results, stop_draft_monitor to stop, or recommend_draft for one synchronous calculation.
| Name | Required | Description | Default |
|---|---|---|---|
| trials | No | Trials per simulation batch, from 1 through 500 and no greater than limits.batch_trials. This is not a total trial budget. | |
| interval_seconds | No | Pause in seconds after each batch or waiting check, from 1 through 60. Batch duration adds to the interval. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false) say little, so the description carries the burden and delivers: it discloses the monitor waits while paused or stale/incomplete, clears obsolete cached results, appends calculation evidence including discarded batches, and explicitly states 'This tool neither reads a browser nor submits picks.' This is valuable behavioral context beyond the sparse annotations, though it could mention what happens on repeated invocation when a monitor already exists.
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, then prerequisites, then behavior, then alternatives. Each sentence earns its place and the flow is logical. Slightly long for a background-starter, but every clause adds routing or behavioral value, so nothing is wasted.
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?
With an output schema present, return values need no explanation. The description covers prerequisites, behavioral quirks (stale/paused/incomplete waits, cache clearing), non-interaction guarantees, and alternative tools. Nothing an agent needs to decide whether to call this tool and how to set it up 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 100%, so both parameters are already documented. The description adds behavioral nuance by explaining each batch uses the latest imported snapshot and that batch duration adds to the interval, but it doesn't significantly extend meaning beyond the schema's own parameter descriptions. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
Opens with a specific verb+resource: 'Start background draft simulations and return the initial monitor status.' This clearly distinguishes the tool from siblings such as recommend_draft (synchronous single calculation) and get_draft_recommendations (results retrieval). The description makes the tool's role unambiguous without needing to inspect schemas.
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 prerequisites ('Requires a loaded draft snapshot and no active local draft monitor') and names exact alternatives with their conditions ('Use get_draft_recommendations for results, stop_draft_monitor to stop, or recommend_draft for one synchronous calculation'). This is textbook routing guidance – an agent knows precisely when to invoke this tool versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_draft_monitorAIdempotent
Request shutdown of the local draft monitor and wait up to five seconds.
Returns monitor status and counters, with running=true and status='stopping' if the active batch still needs to finish. Use get_draft_recommendations to confirm running=false before starting another monitor. Repeated calls are safe when the monitor is already stopped. This tool does not stop the ESPN companion or change saved automation configuration.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint=true and destructiveHint=false, but the description adds valuable context: it waits up to five seconds, returns status and counters with a 'stopping' state if a batch is active, and clarifies it does not stop the ESPN companion or change saved configuration. No contradiction with annotations.
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 concise sentences with the primary action front-loaded. Each sentence adds essential information: the action, the return state, and the scope exclusions. No wasted words.
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?
Given no parameters and the presence of an output schema, the description fully covers what an agent needs: the behavior, the possible result, safety of repetition, and the next-step guidance. It is complete for a no-arg 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 has zero parameters, so the baseline is 4. The description correctly adds no parameter details since none exist; it focuses on behavior instead, which is appropriate.
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 states a specific action ('Request shutdown of the local draft monitor') with a clear resource and a time-bound behavior. It distinguishes from siblings like start_draft_monitor and get_draft_recommendations by naming the alternative for status confirmation, so an agent can easily differentiate.
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?
It explicitly advises using get_draft_recommendations to confirm running=false before starting another monitor, and notes that repeated calls are safe. This provides clear when-to-use and when-to-avoid guidance, plus a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_manager_configADestructive
Replace the saved configuration using its current configuration revision.
Read get_manager_config first to preserve settings that you do not intend to change. Omitted fields use model defaults rather than existing values, including when config is an empty object. Validates strategies and limits, records the change, and invalidates unexecuted proposals and monitor results. Returns status='updated' and the new config_revision, or a revision conflict without changing configuration. This tool does not execute actions or start a monitor.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Replacement configuration using fantasy://schema/config. Omitted fields reset to model defaults. Existing values are not merged. | |
| expected_revision | Yes | Current config_revision from get_manager_config. This is the configuration revision, not the snapshot revision. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations, disclosing that omitted fields reset to model defaults, that empty config is treated as all-defaults, that validation and recording occur, that unexecuted proposals and monitor results are invalidated, and that a revision conflict leaves configuration unchanged. This is rich behavioral context complementing destructiveHint=true.
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?
Every sentence earns its place: the core action, the prerequisite, the omission semantics, side effects, return behavior, and exclusions. The most important caveat is front-loaded, and there is 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?
Given the nested config schema, output schema, and destructive annotations, the description covers the full call contract: prerequisite read, omission behavior, validation/side effects, return status, conflict behavior, and what it does not do. Nothing critical 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 100% and the schema already describes expected_revision and config semantics. The tool description adds value by highlighting the 'read first to preserve settings' workflow and explicitly calling out the empty-object case, which reinforces and slightly extends the schema's 'existing values are not merged' warning.
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 opens with 'Replace the saved configuration using its current configuration revision' – a specific verb, resource, and mechanism. This clearly distinguishes the tool from read-only siblings like get_manager_config and from action-execution 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?
It explicitly instructs to read get_manager_config first to preserve settings, and states what the tool does not do ('does not execute actions or start a monitor'). It does not explicitly name the action-execution siblings (e.g., execute_demo_action), but the prerequisite and exclusions provide clear context.
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.
3 tool updates
v0.1.2- Changed
import_league_snapshot2 fields changed- added
Input schema / properties / snapshot / properties / players / items / properties / espnAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "acquisition_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Acquisition Status" + }, + "bye_verified": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Bye Verified" + }, + "droppable": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Droppable" + }, + "eligible_slots": { + "items": { + "type": "integer" + }, + "title": "Eligible Slots", + "type": "array" + }, + "injured": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Injured" + }, + "pending_transaction_ids": { + "items": { + "type": "string" + }, + "title": "Pending Transaction Ids", + "type": "array" + }, + "roster_locked": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Roster Locked" + }, + "trade_locked": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Trade Locked" + }, + "waiver_process_date": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Waiver Process Date" + } + }, + "title": "ESPNPlayerState", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / snapshot / properties / source / properties / httpAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "acquisition_limit": { + "anyOf": [ + { + "minimum": -1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Acquisition Limit" + }, + "acquisition_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Acquisition Type" + }, + "acquisitions_period": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Acquisitions Period" + }, + "acquisitions_season": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Acquisitions Season" + }, + "final_period": { + "maximum": 18, + "minimum": 1, + "title": "Final Period", + "type": "integer" + }, + "latest_period": { + "maximum": 18, + "minimum": 1, + "title": "Latest Period", + "type": "integer" + }, + "league_id": { + "title": "League Id", + "type": "string" + }, + "matchup_acquisition_limit": { + "anyOf": [ + { + "minimum": -1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Matchup Acquisition Limit" + }, + "minimum_bid": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Minimum Bid" + }, + "ownership_verified": { + "title": "Ownership Verified", + "type": "boolean" + }, + "pending_transactions": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Pending Transactions", + "type": "array" + }, + "pending_transactions_known": { + "default": false, + "title": "Pending Transactions Known", + "type": "boolean" + }, + "recent_transactions": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Recent Transactions", + "type": "array" + }, + "roster_url": { + "title": "Roster Url", + "type": "string" + }, + "season": { + "title": "Season", + "type": "integer" + }, + "team_id": { + "title": "Team Id", + "type": "string" + }, + "team_transaction_locked": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Team Transaction Locked" + }, + "transaction_period": { + "maximum": 18, + "minimum": 1, + "title": "Transaction Period", + "type": "integer" + }, + "uses_faab": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Uses Faab" + }, + "uses_undroppable_list": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Uses Undroppable List" + }, + "week": { + "title": "Week", + "type": "integer" + } + }, + "required": [ + "league_id", + "team_id", + "season", + "week", + "roster_url", + "ownership_verified", + "transaction_period", + "latest_period", + "final_period" + ], + "title": "ESPNHTTPObservation", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +}
- Changed
prepare_action1 field changed- changed
Input schema / properties / payload / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "Payload for draft_pick or drop_player.", - "properties": { - "player_id": { - "description": "Exact player ID from the saved snapshot.", - "title": "Player Id", - "type": "string" - } - }, - "required": [ - "player_id" - ], - "title": "PickPayload", - "type": "object" - }, - { - "additionalProperties": false, - "description": "Payload for set_lineup.", - "properties": { - "lineup": { - "additionalProperties": { - "type": "string" - }, - "description": "Every starter slot mapped to a unique active-roster player ID, using slot keys such as QB1, RB1, and FLEX1.", - "title": "Lineup", - "type": "object" - } - }, - "required": [ - "lineup" - ], - "title": "LineupPayload", - "type": "object" - }, - { - "additionalProperties": false, - "description": "Payload for waiver_claim or free_agent_add.", - "properties": { - "bid": { - "default": 0, - "description": "Nonnegative integer FAAB bid, subject to user budget limits. free_agent_add requires zero.", - "minimum": 0, - "title": "Bid", - "type": "integer" - }, - "drop_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional active-roster player ID to drop. A full roster requires an allowed drop.", - "title": "Drop Id" - }, - "player_id": { - "description": "Exact unrostered player ID to acquire from the saved snapshot.", - "title": "Player Id", - "type": "string" - } - }, - "required": [ - "player_id" - ], - "title": "AddPayload", - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "description": "Payload for draft_pick or drop_player.", + "properties": { + "player_id": { + "description": "Exact player ID from the saved snapshot.", + "title": "Player Id", + "type": "string" + } + }, + "required": [ + "player_id" + ], + "title": "PickPayload", + "type": "object" + }, + { + "additionalProperties": false, + "description": "Payload for set_lineup.", + "properties": { + "lineup": { + "additionalProperties": { + "type": "string" + }, + "description": "Every starter slot mapped to a unique active-roster player ID, using slot keys such as QB1, RB1, and FLEX1.", + "title": "Lineup", + "type": "object" + }, + "repair_player_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Repair Player Id" + } + }, + "required": [ + "lineup" + ], + "title": "LineupPayload", + "type": "object" + }, + { + "additionalProperties": false, + "description": "Payload for waiver_claim or free_agent_add.", + "properties": { + "bid": { + "default": 0, + "description": "Nonnegative integer FAAB bid, subject to user budget limits. free_agent_add requires zero.", + "minimum": 0, + "title": "Bid", + "type": "integer" + }, + "drop_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional active-roster player ID to drop. A full roster requires an allowed drop.", + "title": "Drop Id" + }, + "player_id": { + "description": "Exact unrostered player ID to acquire from the saved snapshot.", + "title": "Player Id", + "type": "string" + }, + "repair_player_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Repair Player Id" + } + }, + "required": [ + "player_id" + ], + "title": "AddPayload", + "type": "object" + } +]
- Changed
update_manager_config2 fields changed- added
Input schema / properties / config / properties / limits / properties / coverage_repair_add_idsAdded value: +{ + "items": { + "type": "string" + }, + "title": "Coverage Repair Add Ids", + "type": "array" +} - added
Input schema / properties / config / properties / limits / properties / coverage_repair_idsAdded value: +{ + "items": { + "type": "string" + }, + "title": "Coverage Repair Ids", + "type": "array" +}
9 tool updates
v0.1.1- Changed
execute_demo_action2 fields changed- added
Input schema / properties / confirmation / descriptionAdded value: +"Set true only after the user approves this exact proposal in review mode. Automatic mode does not require confirmation." - added
Input schema / properties / proposal_id / descriptionAdded value: +"Exact proposal_id returned by prepare_action in this data directory. Reuse the same ID to retry an uncertain response."
- Changed
get_action_history1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum audit records to return, from 1 through 500. Results are ordered from newest to oldest."
- Changed
import_league_snapshot6 fields changed- added
Input schema / properties / expected_revision / descriptionAdded value: +"Current snapshot revision from get_team or get_capabilities. Omit only for the first import into empty state." - changed
Input schema / properties / snapshot / additionalPropertiesPrevious value: -trueNew value: +false - added
Input schema / properties / snapshot / descriptionAdded value: +"Complete league observation. Use fantasy://schema/snapshot for fields, defaults, and rules. This is replacement data, not a patch." - added
Input schema / properties / snapshot / propertiesAdded value: +{ + "budget": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "balance": { + "minimum": 0, + "title": "Balance", + "type": "integer" + }, + "pending_amount": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Pending Amount" + }, + "pending_moves": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Pending Moves" + }, + "roster_moves_week": { + "default": 0, + "minimum": 0, + "title": "Roster Moves Week", + "type": "integer" + }, + "spent_season": { + "default": 0, + "minimum": 0, + "title": "Spent Season", + "type": "integer" + }, + "spent_week": { + "default": 0, + "minimum": 0, + "title": "Spent Week", + "type": "integer" + } + }, + "required": [ + "balance" + ], + "title": "Budget", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Selected team's current FAAB balance, spending, and pending commitments. Acquisitions require known budget and move counts." + }, + "league_id": { + "description": "Stable league identifier from the observation provider.", + "maxLength": 120, + "minLength": 1, + "title": "League Id", + "type": "string" + }, + "phase": { + "default": "season", + "description": "Use draft for pick analysis or season for weekly roster analysis.", + "enum": [ + "draft", + "season" + ], + "title": "Phase", + "type": "string" + }, + "picks": { + "description": "Complete ordered draft history, starting at pick 1 with no gaps. Draft rosters must match these picks.", + "items": { + "additionalProperties": false, + "properties": { + "pick_no": { + "maximum": 1280, + "minimum": 1, + "title": "Pick No", + "type": "integer" + }, + "player_id": { + "title": "Player Id", + "type": "string" + }, + "slot": { + "maximum": 32, + "minimum": 1, + "title": "Slot", + "type": "integer" + } + }, + "required": [ + "pick_no", + "player_id", + "slot" + ], + "title": "Pick", + "type": "object" + }, + "title": "Picks", + "type": "array" + }, + "players": { + "description": "Unique available and rostered player identities. Projections must already use the league's scoring system.", + "items": { + "additionalProperties": false, + "properties": { + "adp": { + "default": 999, + "exclusiveMinimum": 0, + "title": "Adp", + "type": "number" + }, + "availability": { + "default": "UNKNOWN", + "title": "Availability", + "type": "string" + }, + "bye": { + "anyOf": [ + { + "maximum": 18, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Bye" + }, + "eligible_positions": { + "items": { + "type": "string" + }, + "title": "Eligible Positions", + "type": "array" + }, + "id": { + "maxLength": 120, + "minLength": 1, + "title": "Id", + "type": "string" + }, + "locked": { + "default": false, + "title": "Locked", + "type": "boolean" + }, + "name": { + "maxLength": 160, + "minLength": 1, + "title": "Name", + "type": "string" + }, + "position": { + "enum": [ + "QB", + "RB", + "WR", + "TE", + "DST", + "K" + ], + "title": "Position", + "type": "string" + }, + "projection": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Full-season fantasy projection. Draft data requires a value except for verified opponent picks retained as identities.", + "title": "Projection" + }, + "team": { + "default": "", + "title": "Team", + "type": "string" + }, + "weekly_ceiling": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Weekly Ceiling" + }, + "weekly_floor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Weekly Floor" + }, + "weekly_projection": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Weekly Projection" + } + }, + "required": [ + "id", + "name", + "position" + ], + "title": "Player", + "type": "object" + }, + "maxItems": 10000, + "minItems": 1, + "title": "Players", + "type": "array" + }, + "rules": { + "additionalProperties": false, + "description": "League roster rules. Draft rounds equal starter slots plus bench slots. Injured reserve slots are separate.", + "properties": { + "bench": { + "default": 5, + "maximum": 30, + "minimum": 0, + "title": "Bench", + "type": "integer" + }, + "caps": { + "additionalProperties": { + "type": "integer" + }, + "title": "Caps", + "type": "object" + }, + "flex_eligible": { + "items": { + "type": "string" + }, + "title": "Flex Eligible", + "type": "array" + }, + "ir": { + "default": 2, + "maximum": 10, + "minimum": 0, + "title": "Ir", + "type": "integer" + }, + "rounds": { + "default": 14, + "maximum": 40, + "minimum": 1, + "title": "Rounds", + "type": "integer" + }, + "slot": { + "default": 1, + "maximum": 32, + "minimum": 1, + "title": "Slot", + "type": "integer" + }, + "snake": { + "default": true, + "title": "Snake", + "type": "boolean" + }, + "starters": { + "additionalProperties": { + "type": "integer" + }, + "title": "Starters", + "type": "object" + }, + "teams": { + "default": 14, + "maximum": 32, + "minimum": 2, + "title": "Teams", + "type": "integer" + } + }, + "title": "Rules", + "type": "object" + }, + "schema_version": { + "const": 1, + "default": 1, + "title": "Schema Version", + "type": "integer" + }, + "season": { + "description": "Season year for this league context.", + "maximum": 2100, + "minimum": 2020, + "title": "Season", + "type": "integer" + }, + "source": { + "additionalProperties": false, + "description": "Observation provenance and freshness. Timestamps require a UTC offset and must describe the actual observation.", + "properties": { + "browser": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "autopick_enabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Autopick Enabled" + }, + "current_pick": { + "anyOf": [ + { + "maximum": 1281, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Current Pick" + }, + "draft_complete": { + "default": false, + "title": "Draft Complete", + "type": "boolean" + }, + "league_id": { + "title": "League Id", + "type": "string" + }, + "page_url": { + "maxLength": 2048, + "title": "Page Url", + "type": "string" + }, + "team_id": { + "title": "Team Id", + "type": "string" + } + }, + "required": [ + "page_url", + "league_id", + "team_id" + ], + "title": "BrowserObservation", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null + }, + "complete": { + "default": true, + "description": "True only when the observation contains the complete required league context and draft history.", + "title": "Complete", + "type": "boolean" + }, + "locks_scope": { + "description": "Extent of verified player locks. ESPN browser observations without this field default to selected_team.", + "enum": [ + "league", + "selected_team" + ], + "title": "Locks Scope", + "type": "string" + }, + "locks_verified": { + "default": false, + "description": "True only when current player lock states have been verified for locks_scope.", + "title": "Locks Verified", + "type": "boolean" + }, + "notes": { + "items": { + "type": "string" + }, + "title": "Notes", + "type": "array" + }, + "observed_at": { + "description": "Timestamp when the source was observed, with a UTC offset.", + "format": "date-time", + "title": "Observed At", + "type": "string" + }, + "projections_observed_at": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Timestamp when projections were observed, with a UTC offset. Draft, lineup, and acquisition checks require a known fresh timestamp.", + "title": "Projections Observed At" + }, + "provider": { + "maxLength": 80, + "minLength": 1, + "title": "Provider", + "type": "string" + }, + "synthetic": { + "default": false, + "description": "True only for fictional observations. Demo actions also require provider='synthetic'.", + "title": "Synthetic", + "type": "boolean" + } + }, + "required": [ + "provider", + "observed_at" + ], + "title": "Source", + "type": "object" + }, + "team_id": { + "description": "Selected team's ID. Its draft slot must match rules.slot.", + "maxLength": 120, + "minLength": 1, + "title": "Team Id", + "type": "string" + }, + "teams": { + "description": "Every league team, with unique IDs and draft slots. Roster IDs must reference known players with unique ownership.", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "maxLength": 120, + "minLength": 1, + "title": "Id", + "type": "string" + }, + "lineup": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": "Lineup", + "type": "object" + }, + "name": { + "maxLength": 160, + "minLength": 1, + "title": "Name", + "type": "string" + }, + "reserve_ids": { + "items": { + "type": "string" + }, + "title": "Reserve Ids", + "type": "array" + }, + "roster_ids": { + "items": { + "type": "string" + }, + "title": "Roster Ids", + "type": "array" + }, + "slot": { + "maximum": 32, + "minimum": 1, + "title": "Slot", + "type": "integer" + } + }, + "required": [ + "id", + "name", + "slot" + ], + "title": "Team", + "type": "object" + }, + "maxItems": 32, + "minItems": 2, + "title": "Teams", + "type": "array" + }, + "week": { + "default": 1, + "description": "Scoring week used by weekly projections and season actions.", + "maximum": 18, + "minimum": 1, + "title": "Week", + "type": "integer" + } +} - added
Input schema / properties / snapshot / requiredAdded value: +[ + "league_id", + "team_id", + "season", + "source", + "rules", + "players", + "teams" +] - changed
Input schema / properties / snapshot / titlePrevious value: -"Snapshot"New value: +"LeagueSnapshot"
- Changed
load_demo2 fields changed- added
Input schema / properties / mode / descriptionAdded value: +"Fictional scenario to load: 'season' for weekly tools or 'draft' for draft simulations." - added
Input schema / properties / mode / enumAdded value: +[ + "season", + "draft" +]
- Changed
prepare_action7 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Synthetic action: draft_pick, set_lineup, waiver_claim, free_agent_add, or drop_player. Trades are unsupported." - added
Input schema / properties / action / enumAdded value: +[ + "draft_pick", + "set_lineup", + "waiver_claim", + "free_agent_add", + "drop_player" +] - removed
Input schema / properties / payload / additionalPropertiesRemoved value: -true - added
Input schema / properties / payload / anyOfAdded value: +[ + { + "additionalProperties": false, + "description": "Payload for draft_pick or drop_player.", + "properties": { + "player_id": { + "description": "Exact player ID from the saved snapshot.", + "title": "Player Id", + "type": "string" + } + }, + "required": [ + "player_id" + ], + "title": "PickPayload", + "type": "object" + }, + { + "additionalProperties": false, + "description": "Payload for set_lineup.", + "properties": { + "lineup": { + "additionalProperties": { + "type": "string" + }, + "description": "Every starter slot mapped to a unique active-roster player ID, using slot keys such as QB1, RB1, and FLEX1.", + "title": "Lineup", + "type": "object" + } + }, + "required": [ + "lineup" + ], + "title": "LineupPayload", + "type": "object" + }, + { + "additionalProperties": false, + "description": "Payload for waiver_claim or free_agent_add.", + "properties": { + "bid": { + "default": 0, + "description": "Nonnegative integer FAAB bid, subject to user budget limits. free_agent_add requires zero.", + "minimum": 0, + "title": "Bid", + "type": "integer" + }, + "drop_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional active-roster player ID to drop. A full roster requires an allowed drop.", + "title": "Drop Id" + }, + "player_id": { + "description": "Exact unrostered player ID to acquire from the saved snapshot.", + "title": "Player Id", + "type": "string" + } + }, + "required": [ + "player_id" + ], + "title": "AddPayload", + "type": "object" + } +] - added
Input schema / properties / payload / descriptionAdded value: +"Exact action data. Picks and drops use player_id. Lineups use a complete lineup slot-to-player map. Adds use player_id, optional drop_id, and bid (default 0)." - added
Input schema / properties / payload / examplesAdded value: +[ + { + "player_id": "demo-rb-001" + } +] - removed
Input schema / properties / payload / typeRemoved value: -"object"
- Changed
rank_waiver_candidates1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of alternative single-player acquisitions to return, from 1 through 100. Candidates are not a combined claim plan."
- Changed
recommend_draft2 fields changed- added
Input schema / properties / seed / descriptionAdded value: +"Random seed for this batch. Reuse an integer with identical inputs to reproduce the simulation. This does not remove forecast uncertainty." - added
Input schema / properties / trials / descriptionAdded value: +"Simulation trials in this single batch. Use 1 through the configured limits.batch_trials, at most 500. More trials increase work and reduce sampling noise."
- Changed
start_draft_monitor2 fields changed- added
Input schema / properties / interval_seconds / descriptionAdded value: +"Pause in seconds after each batch or waiting check, from 1 through 60. Batch duration adds to the interval." - added
Input schema / properties / trials / descriptionAdded value: +"Trials per simulation batch, from 1 through 500 and no greater than limits.batch_trials. This is not a total trial budget."
- Changed
update_manager_config5 fields changed- changed
Input schema / properties / config / additionalPropertiesPrevious value: -trueNew value: +false - added
Input schema / properties / config / descriptionAdded value: +"Replacement configuration using fantasy://schema/config. Omitted fields reset to model defaults. Existing values are not merged." - added
Input schema / properties / config / propertiesAdded value: +{ + "automation": { + "additionalProperties": false, + "description": "Preset, pause state, and action modes. Only custom uses the per-action map, which must include every supported action.", + "properties": { + "actions": { + "additionalProperties": { + "enum": [ + "disabled", + "advisory", + "review", + "automatic" + ], + "type": "string" + }, + "title": "Actions", + "type": "object" + }, + "paused": { + "default": false, + "title": "Paused", + "type": "boolean" + }, + "preset": { + "default": "advisory", + "enum": [ + "advisory", + "review", + "bounded_automation", + "custom" + ], + "title": "Preset", + "type": "string" + } + }, + "title": "Automation", + "type": "object" + }, + "limits": { + "additionalProperties": false, + "description": "User limits on freshness, simulation batches, roster moves, protected players, drops, and FAAB spending.", + "properties": { + "allowed_drop_ids": { + "items": { + "type": "string" + }, + "title": "Allowed Drop Ids", + "type": "array" + }, + "batch_trials": { + "default": 40, + "maximum": 500, + "minimum": 1, + "title": "Batch Trials", + "type": "integer" + }, + "drop_mode": { + "default": "listed_only", + "enum": [ + "listed_only", + "any_unprotected" + ], + "title": "Drop Mode", + "type": "string" + }, + "faab_per_claim": { + "default": 10, + "minimum": 0, + "title": "Faab Per Claim", + "type": "integer" + }, + "faab_per_season": { + "default": 70, + "minimum": 0, + "title": "Faab Per Season", + "type": "integer" + }, + "faab_per_week": { + "default": 20, + "minimum": 0, + "title": "Faab Per Week", + "type": "integer" + }, + "faab_reserve": { + "default": 30, + "minimum": 0, + "title": "Faab Reserve", + "type": "integer" + }, + "max_adp_reach": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Max Adp Reach" + }, + "max_draft_age_seconds": { + "default": 15, + "maximum": 300, + "minimum": 1, + "title": "Max Draft Age Seconds", + "type": "integer" + }, + "max_projection_age_seconds": { + "default": 3600, + "maximum": 604800, + "minimum": 1, + "title": "Max Projection Age Seconds", + "type": "integer" + }, + "max_season_age_seconds": { + "default": 300, + "maximum": 86400, + "minimum": 1, + "title": "Max Season Age Seconds", + "type": "integer" + }, + "max_weekly_moves": { + "default": 3, + "maximum": 100, + "minimum": 0, + "title": "Max Weekly Moves", + "type": "integer" + }, + "min_lineup_improvement": { + "default": 1.5, + "minimum": 0, + "title": "Min Lineup Improvement", + "type": "number" + }, + "protected_ids": { + "items": { + "type": "string" + }, + "title": "Protected Ids", + "type": "array" + } + }, + "title": "Limits", + "type": "object" + }, + "schema_version": { + "const": 1, + "default": 1, + "title": "Schema Version", + "type": "integer" + }, + "strategy": { + "additionalProperties": false, + "description": "Draft, season, and waiver objectives. Strategy preferences never override user limits.", + "properties": { + "draft": { + "default": "balanced_value", + "enum": [ + "balanced_value", + "rb_priority", + "wr_priority", + "hero_rb", + "zero_rb" + ], + "title": "Draft", + "type": "string" + }, + "season": { + "default": "projected_points", + "enum": [ + "projected_points", + "floor", + "upside" + ], + "title": "Season", + "type": "string" + }, + "waiver": { + "default": "immediate_starter", + "enum": [ + "immediate_starter", + "bench_upside", + "conserve_faab" + ], + "title": "Waiver", + "type": "string" + } + }, + "title": "Strategy", + "type": "object" + } +} - changed
Input schema / properties / config / titlePrevious value: -"Config"New value: +"ManagerConfig" - added
Input schema / properties / expected_revision / descriptionAdded value: +"Current config_revision from get_manager_config. This is the configuration revision, not the snapshot revision."
17 tool updates
v0.1.0- First observed
execute_demo_action - First observed
get_action_history - First observed
get_capabilities - First observed
get_draft_recommendations - First observed
get_manager_config - First observed
get_power_rankings - First observed
get_source_status - First observed
get_team - First observed
import_league_snapshot - First observed
load_demo - First observed
prepare_action - First observed
rank_waiver_candidates - First observed
recommend_draft - First observed
recommend_lineup - First observed
start_draft_monitor - First observed
stop_draft_monitor - First observed
update_manager_config
TDQS
Scored across 17 tools
Each tool has a clearly distinct role: analysis (get_power_rankings, recommend_lineup, rank_waiver_candidates, get_team), draft management (recommend_draft, start_draft_monitor, get_draft_recommendations, stop_draft_monitor), action execution (prepare_action, execute_demo_action), configuration (get_manager_config, update_manager_config), data loading (load_demo, import_league_snapshot), and monitoring/status (get_capabilities, get_source_status, get_action_history). No two tools appear to overlap in purpose.
All tool names follow the same verb_noun pattern using snake_case (e.g., get_power_rankings, update_manager_config, start_draft_monitor). There are no mixed conventions or vague verbs; every name clearly conveys the action and subject.
With 17 tools, the server sits in the 16-25 range which is considered heavy. While each tool serves a distinct purpose and the domain is complex, the count is above the typical well-scoped range of 3-15, making it slightly unwieldy but still manageable.
The toolset covers the core workflows: importing/loading data, configuration, analysis (power rankings, lineup, waivers), drafting (both single-shot and monitoring), action preparation/execution, and history/status. Minor gaps exist such as no explicit tool for managing roster changes outside of the demo action flow, but for the stated purpose of analysis and synthetic actions, the surface is reasonably complete.
Maintenance
Related MCP Connectors
Read-only fantasy analysis for ESPN, Yahoo, and Sleeper leagues via MCP
SportsDataIO MCP — wraps SportsDataIO's Big-Six sports data API (sportsdata.io)
MCP tools for FIFA World Cup 2026 football, Formula 1, and IPL cricket — sims, strategy, fantasy.
Sports Game Odds MCP — wraps the Sports Game Odds API (sportsgameodds.com)
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides read-only access to Sleeper fantasy football leagues, enabling team snapshots, available players, matchups, trade context, and league history through standardized MCP tools.MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that turns real NFL & fantasy data into a decisive edge, offering 70+ tools for draft assistance, start/sit recommendations, trade analysis, playoff odds, and more, with live league integration.MIT
- AlicenseAqualityBmaintenanceEnables natural-language querying of a local DuckDB warehouse of NFL play-by-play data, converting questions into SQL and returning results.19MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for NFL fantasy football retrieval, providing access to NFL stats and Sleeper league data through retrieval-oriented tools.-