Skip to main content
Glama
krmisystems

fantasy-football-manager

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 --demo

The 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.

Fictional demo: current projected points 124.53, suggested projected points 130.03, estimated increase 5.50 points. No live action.

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-actions

Open 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-import
  1. Configure the protected session file with FFM_ESPN_CREDENTIAL_FILE.

  2. Connect both MCP servers to the same per-team state directory.

  3. Read the saved action modes with get_manager_config.

  4. Call espn_connect with the league, team, season, phase="season", transport="http", and scoring week.

  5. Call espn_sync to read current rosters, projections, locks, and pending transactions.

  6. Call recommend_lineup to calculate a legal lineup.

  7. Read espn_get_status before 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 --help

Install 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 --help

Connect 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-espn

Both 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.py

Browser 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 tools
execute_demo_actionA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYesExact proposal_id returned by prepare_action in this data directory. Reuse the same ID to retry an uncertain response.
confirmationNoSet true only after the user approves this exact proposal in review mode. Automatic mode does not require confirmation.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_historyA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum audit records to return, from 1 through 500. Results are ordered from newest to oldest.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_capabilitiesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_recommendationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_configA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_statusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_teamA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_snapshotA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
snapshotYesComplete league observation. Use fantasy://schema/snapshot for fields, defaults, and rules. This is replacement data, not a patch.
expected_revisionNoCurrent snapshot revision from get_team or get_capabilities. Omit only for the first import into empty state.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_demoA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoFictional scenario to load: 'season' for weekly tools or 'draft' for draft simulations.season

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesSynthetic action: draft_pick, set_lineup, waiver_claim, free_agent_add, or drop_player. Trades are unsupported.
payloadYesExact 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of alternative single-player acquisitions to return, from 1 through 100. Candidates are not a combined claim plan.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNoRandom seed for this batch. Reuse an integer with identical inputs to reproduce the simulation. This does not remove forecast uncertainty.
trialsNoSimulation 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
trialsNoTrials per simulation batch, from 1 through 500 and no greater than limits.batch_trials. This is not a total trial budget.
interval_secondsNoPause in seconds after each batch or waiting check, from 1 through 60. Batch duration adds to the interval.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_monitorA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_configA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesReplacement configuration using fantasy://schema/config. Omitted fields reset to model defaults. Existing values are not merged.
expected_revisionYesCurrent config_revision from get_manager_config. This is the configuration revision, not the snapshot revision.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 3 tool updatesv0.1.2
    • Changedimport_league_snapshot2 fields changed
      • addedInput schema / properties / snapshot / properties / players / items / properties / espn
        Added 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
        +}
      • addedInput schema / properties / snapshot / properties / source / properties / http
        Added 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
        +}
    • Changedprepare_action1 field changed
      • changedInput schema / properties / payload / anyOf
        Previous 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"
        +  }
        +]
    • Changedupdate_manager_config2 fields changed
      • addedInput schema / properties / config / properties / limits / properties / coverage_repair_add_ids
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Coverage Repair Add Ids",
        +  "type": "array"
        +}
      • addedInput schema / properties / config / properties / limits / properties / coverage_repair_ids
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Coverage Repair Ids",
        +  "type": "array"
        +}
  2. 9 tool updatesv0.1.1
    • Changedexecute_demo_action2 fields changed
      • addedInput schema / properties / confirmation / description
        Added value: +"Set true only after the user approves this exact proposal in review mode. Automatic mode does not require confirmation."
      • addedInput schema / properties / proposal_id / description
        Added value: +"Exact proposal_id returned by prepare_action in this data directory. Reuse the same ID to retry an uncertain response."
    • Changedget_action_history1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum audit records to return, from 1 through 500. Results are ordered from newest to oldest."
    • Changedimport_league_snapshot6 fields changed
      • addedInput schema / properties / expected_revision / description
        Added value: +"Current snapshot revision from get_team or get_capabilities. Omit only for the first import into empty state."
      • changedInput schema / properties / snapshot / additionalProperties
        Previous value: -trueNew value: +false
      • addedInput schema / properties / snapshot / description
        Added value: +"Complete league observation. Use fantasy://schema/snapshot for fields, defaults, and rules. This is replacement data, not a patch."
      • addedInput schema / properties / snapshot / properties
        Added 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"
        +  }
        +}
      • addedInput schema / properties / snapshot / required
        Added value: +[
        +  "league_id",
        +  "team_id",
        +  "season",
        +  "source",
        +  "rules",
        +  "players",
        +  "teams"
        +]
      • changedInput schema / properties / snapshot / title
        Previous value: -"Snapshot"New value: +"LeagueSnapshot"
    • Changedload_demo2 fields changed
      • addedInput schema / properties / mode / description
        Added value: +"Fictional scenario to load: 'season' for weekly tools or 'draft' for draft simulations."
      • addedInput schema / properties / mode / enum
        Added value: +[
        +  "season",
        +  "draft"
        +]
    • Changedprepare_action7 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Synthetic action: draft_pick, set_lineup, waiver_claim, free_agent_add, or drop_player. Trades are unsupported."
      • addedInput schema / properties / action / enum
        Added value: +[
        +  "draft_pick",
        +  "set_lineup",
        +  "waiver_claim",
        +  "free_agent_add",
        +  "drop_player"
        +]
      • removedInput schema / properties / payload / additionalProperties
        Removed value: -true
      • addedInput schema / properties / payload / anyOf
        Added 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"
        +  }
        +]
      • addedInput schema / properties / payload / description
        Added 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)."
      • addedInput schema / properties / payload / examples
        Added value: +[
        +  {
        +    "player_id": "demo-rb-001"
        +  }
        +]
      • removedInput schema / properties / payload / type
        Removed value: -"object"
    • Changedrank_waiver_candidates1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of alternative single-player acquisitions to return, from 1 through 100. Candidates are not a combined claim plan."
    • Changedrecommend_draft2 fields changed
      • addedInput schema / properties / seed / description
        Added value: +"Random seed for this batch. Reuse an integer with identical inputs to reproduce the simulation. This does not remove forecast uncertainty."
      • addedInput schema / properties / trials / description
        Added 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."
    • Changedstart_draft_monitor2 fields changed
      • addedInput schema / properties / interval_seconds / description
        Added value: +"Pause in seconds after each batch or waiting check, from 1 through 60. Batch duration adds to the interval."
      • addedInput schema / properties / trials / description
        Added value: +"Trials per simulation batch, from 1 through 500 and no greater than limits.batch_trials. This is not a total trial budget."
    • Changedupdate_manager_config5 fields changed
      • changedInput schema / properties / config / additionalProperties
        Previous value: -trueNew value: +false
      • addedInput schema / properties / config / description
        Added value: +"Replacement configuration using fantasy://schema/config. Omitted fields reset to model defaults. Existing values are not merged."
      • addedInput schema / properties / config / properties
        Added 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"
        +  }
        +}
      • changedInput schema / properties / config / title
        Previous value: -"Config"New value: +"ManagerConfig"
      • addedInput schema / properties / expected_revision / description
        Added value: +"Current config_revision from get_manager_config. This is the configuration revision, not the snapshot revision."
  3. 17 tool updatesv0.1.0
    • First observedexecute_demo_action
    • First observedget_action_history
    • First observedget_capabilities
    • First observedget_draft_recommendations
    • First observedget_manager_config
    • First observedget_power_rankings
    • First observedget_source_status
    • First observedget_team
    • First observedimport_league_snapshot
    • First observedload_demo
    • First observedprepare_action
    • First observedrank_waiver_candidates
    • First observedrecommend_draft
    • First observedrecommend_lineup
    • First observedstart_draft_monitor
    • First observedstop_draft_monitor
    • First observedupdate_manager_config

TDQS

A4.4/5.0

Scored across 17 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides read-only access to Sleeper fantasy football leagues, enabling team snapshots, available players, matchups, trade context, and league history through standardized MCP tools.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP 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
  • A
    license
    A
    quality
    B
    maintenance
    Enables natural-language querying of a local DuckDB warehouse of NFL play-by-play data, converting questions into SQL and returning results.
    19
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server for NFL fantasy football retrieval, providing access to NFL stats and Sleeper league data through retrieval-oriented tools.
    -