Skip to main content
Glama

Comunio MCP

CI codecov MCP Registry License: MIT

An MCP (Model Context Protocol) server for Comunio, the online football fantasy manager.

It gives an AI assistant access to your league — squad, market, offers, standings, transfers — and lets it act on your behalf: bid, sell, set the lineup. One line, client ↔ MCP ↔ Comunio, and this is the middle segment.

Status: in daily use against a real account. Nineteen tools: reading the squad, market, offers, standings and transfers, and acting on the market, bids and lineup. It talks to Comunio's unofficial API, which can change without notice — see docs/comunio-api.md for what is mapped and what is not.

How it works

Tools come in two kinds, and the name tells you which:

Kind

Naming

What it does

Read

get_squad, get_market, get_offers

Query only. Never changes anything. Always safe.

Write

place_bid, accept_offer, set_lineup

Changes your team or spends your money.

Two properties fall out of that:

There is no AI model inside this server, and no strategy either. It translates: it makes Comunio's API callable and its answers legible — unpicking slot numbers, the five different ways one endpoint writes "no data", a ranking field that is 0 for every row. Which player to buy is left to the assistant you are already talking to. No API key, no GPU, no inference cost.

Your client asks before it acts. Every mutating tool declares itself as one, so your MCP client knows to stop and ask you first. The server does not second-guess a move once you have agreed to it, and it reports what Comunio actually answered rather than assuming it worked.

Related MCP server: espn-fantasy-mcp

Requirements

  • Docker.

  • A Comunio account. There is no API key and no sign-up — the server logs in as you.

Nothing else needs to be installed on the host.

Quick start

The image is published, so there is nothing to clone and nothing to build. Put your credentials in a file only you can read, rather than in a command your shell will remember:

install -m 600 /dev/null ~/.comunio.env
$EDITOR ~/.comunio.env      # COMUNIO_USERNAME=you
                            # COMUNIO_PASSWORD=...

claude mcp add comunio -- docker run -i --rm \
  --env-file "$HOME/.comunio.env" \
  ghcr.io/josetorronteras/comunio-mcp

Then ask your assistant how your team is doing — get_account is the quickest proof that the credentials work.

For Claude Desktop, for the uvx route that skips Docker entirely, and for what each variable does, see docs/setup.md.

Documentation

  • Setup — running the image and connecting it to an MCP client

  • Tools — what each tool returns and what it touches

  • Development — layout, dev commands, SDK gotchas

  • Architecture — design decisions and the reasoning behind them

  • Comunio API — authentication, the link index and what is still unmapped

  • MCP protocol notes — the parts of MCP 2026-07-28 that shape this project

  • Changelog — what changed in each release

Contributing

Issues and pull requests are welcome. CONTRIBUTING.md covers the setup, what belongs in the server and what does not, and the rules that are not negotiable — no credentials, no tokens and no real account data in a commit. Vulnerabilities go through SECURITY.md rather than a public issue.

Versioning

Releases follow semantic versioning, and what it covers is the MCP surface: tool names, their input schemas, and the fields their responses carry. Renaming a tool, dropping a parameter or removing a field from a response is a major version. Adding a tool, an optional parameter or a field is a minor one.

What it cannot cover is Comunio. This talks to an unofficial API that can change or break without notice, and no version number here can promise otherwise. When it does change, the fix ships as a patch or a minor — the tools stay the same shape.

License

MIT.

Disclaimer

Unofficial project, not affiliated with Comunio. Use it with your own account and at your own risk.

Available Tools

19 tools
accept_offerAccept an offer and sell the playerA
Destructive

Accept an offer for one of the manager's players, selling them.

This cannot be undone. Unlike a bid, which queues until the transfer round and can be withdrawn, an acceptance takes effect the moment it is made. The player leaves the squad and there is nothing to reverse it with.

Get the user's explicit agreement first, and tell them two things before asking: who is being sold, and how the price compares to what the player is worth. get_offers reports that as premium and premium_pct — a negative value means the offer is below the player's market value, which is common and easy to miss.

Ids come from get_offers; only offers whose direction is incoming can be accepted. The player and the price are taken from the offer itself, never passed in, so what is accepted is exactly what was offered.

Check ok and message in the result. Comunio can report overall success while rejecting the acceptance itself.

Inputs: offer_id (required). Returns: What happened when an offer for one of the manager's players was accepted. The…

change_bidChange a bidA

Change the amount of a bid the manager has already placed.

This changes what the manager has committed. Confirm the new amount with the user before calling it, and say what the old one was.

Ids come from get_offers; only offers whose direction is outgoing can be changed. The player is taken from the offer itself rather than passed in, so a change cannot end up pointing at a different player.

Like a new bid, the change waits for the next transfer round and can still be pulled with withdraw_bid until then.

Refused before anything is sent if the id is unknown or if it belongs to an offer for one of the manager's players. The new amount is not checked against credit: Comunio enforces that itself and answers per item, so read ok and message.

Check ok and message in the result rather than assuming success.

Inputs: price (required), offer_id (required). Returns: What actually happened to a bid. Read from the **per-item** status inside the r…

change_listing_priceChange an asking priceA
Idempotent

Change what the manager is asking for a player they already have listed on the market.

This changes the manager's team. Confirm the player and the new price with the user before calling it. The player must already be listed — use list_player_on_market first if they are not; this tool cannot put anyone up for sale.

This sets the manager's own asking price. It has nothing to do with the recommended_price that get_market and get_player report, which is Comunio's suggestion and cannot be changed.

Comunio answers with a bare true here rather than any detail, so ok is all there is to go on.

Inputs: price (required), player_id (required). Returns: What came back from changing a listed player's asking price. This endpoint answ…

get_accountAccount and league rulesA
Read-only

Get the manager's current budget, squad totals and formation, plus the league rules that decide which moves are legal.

Start here. budget bounds any bid, tactic and team_count_linedup say what the lineup looks like now, and the rules cover bidding mechanics (notably second_highest_offers), sale limits and bans.

Read-only: fetches current state and changes nothing.

Inputs: no named parameters. Returns: Everything the index endpoint tells us that is worth knowing. A snapshot in tim…

get_marketTransfer marketA
Read-only

Get every player currently up for sale, with prices, price trend and who is selling.

closes_at is when the current round of transfers is processed — bids have to be in before it. Per listing, from_computer marks players Comunio is selling itself rather than a rival, is_mine marks the manager's own listings, which are not buyable, and trend shows which way the price is moving.

Compare quoted_price against recommended_price to judge an asking price, and check get_account for the budget that bounds any bid.

Read-only: fetches current state and changes nothing.

Inputs: no named parameters. Returns: summary, listings, closes_at, daily_transfers_processed

get_newsLeague newsA
Read-only

Get the league news feed, newest first: what has happened in this community.

Announcements from Comunio and from the community admin, members joining, the league being reset, lineups being changed, and transfer rounds settling. Use it to answer "what has been going on" or to find out why something changed — a reset, a rule change or a new member explains a lot that the squad and market do not.

Each entry has a type. The ones seen so far are SYSTEM_ADMINISTRATION (Comunio's own announcements, such as when a matchday starts), COMMUNITY_ADMINISTRATION (the admin resetting or reconfiguring the league), MEMBER_ADMINISTRATION (someone joining), LINEUP_CHANGED and TRANSACTION_TRANSFER. It is an open set, so treat an unfamiliar one as news rather than an error.

On administration entries the whole announcement is in title and text is null. Read title first and treat it as content, not as a label.

For transfer entries this gives only how many moves there were. Use get_transfers for the players, the prices and who was on each side — it parses the same entries properly.

types filters to the kinds asked for, matched case-insensitively; leave it out to get everything. limit caps how many entries come back, one page by default, and a larger value costs one extra request per page.

Read-only: fetches the feed and changes nothing.

Inputs: limit, types. Returns: entries, summary, has_more

get_offersOpen offersA
Read-only

Get every open transfer offer, and the manager's spending power.

credit is what can actually be spent and is not the same as the budget in get_account: the league's credit factor lets it exceed cash in hand. Use this number when sizing a bid.

Each offer says which way it goes — incoming when somebody wants one of the manager's players, outgoing when the manager is bidding — and how the price compares to the player's market value, via premium and premium_pct. A negative premium is an offer below what the player is worth.

Read-only: fetches current state and changes nothing. Accepting, declining or withdrawing an offer is not possible through this tool.

Inputs: no named parameters. Returns: credit, offers, summary, has_more

get_playerPlayer detailA
Read-only

Get everything Comunio knows about one player. Ids come from get_squad, get_market or get_offers.

Beyond the price and availability the squad already gives: season-by-season history going back years, the record of goals, cards and man-of-the-match awards, averages including a recent-form window, the next three fixtures, what the current owner paid, and the buyout_clause — what taking the player from their owner without consent would cost.

status_meaning spells out the status code, and available is true only when the player can actually be counted on.

Read-only: fetches current state and changes nothing.

Inputs: player_id (required). Returns: club, name, owner, price, +17 more

get_squadSquadA
Read-only

Get every player in a squad, with availability, scoring, prices and lineup state. Defaults to the signed-in manager's own squad.

Pass manager_id to inspect a rival's squad instead — the ids come from get_standings. Rival squads are fully visible: prices, injuries and depth. What is not visible is recommended_price, which Comunio only gives for your own players.

Per player: position and club; status with status_info naming an injury; points, last_points and average_points; quoted_price and recommended_price; whether they are linedup or a substitute; whether they are on_market; and next_match with its kick-off time.

summary counts what lineup rules are checked against, tactic is the formation set, and is_mine says whose squad came back.

Read-only: fetches current state and changes nothing.

Inputs: manager_id. Returns: owner, tactic, is_mine, players, +2 more

get_standingsLeague tableA
Read-only

Get the league table: every manager with their points, squad value and whether their budget is in the red.

Rows come best first, with rank filled in and is_me marking the signed-in manager, and manager_id can be used to look up a rival's squad.

period picks which table. total is the season standings. live is the one to ask for while a matchday is being played: only it fills live_points and players_possibly_scoring, and only it reports negative_budget correctly — under total that flag reads false for everyone, including managers who are actually in the red and will therefore score nothing this matchday.

Read-only: fetches current state and changes nothing.

Inputs: period. Returns: rows, period

get_transfersCompleted transfersA
Read-only

Get transfers that have already completed, newest first, with what was actually paid.

This is settled prices rather than quotes: what players really went for in this league. Use it to calibrate a bid, since the market only says what a player is listed at. Each transfer also carries quoted_price, what the player was valued at, so paying over or under the odds is visible without another call.

from_computer means bought from Comunio, to_computer sold back to it, and involves_me marks the signed-in manager's own deals. offered_at is when the bid went in and settled_at when it went through. summary totals each kind and the money that changed hands.

limit caps how many transfers come back and defaults to 20, which is a default rather than a maximum: this endpoint returns as many as it is asked for. Raise it to look further back — a larger value costs one extra request only when there is more history than one page holds.

Read-only: fetches history and changes nothing.

Inputs: limit. Returns: summary, has_more, transfers

get_watchlistWatchlistA
Read-only

Get the players the manager is keeping an eye on.

A shortlist, not a commitment: watching a player does nothing to the squad or the budget. Use get_market to see which of them are actually for sale.

Read-only: fetches current state and changes nothing.

Inputs: no named parameters. Returns: total, players, unowned

list_player_on_marketPut a player up for saleA

Put one of the manager's own players up for sale at the given asking price.

This changes the manager's team. Confirm the player and the price with the user before calling it. Ids come from get_squad; get_player gives Comunio's suggested price for comparison.

Listing is reversible — the player can be taken back off the market — but any offers received in the meantime are real.

Check placed and rejected in the result rather than assuming it worked: Comunio can refuse an individual player while reporting overall success.

Inputs: price (required), player_id (required). Returns: What actually happened when players were put on the market. `addplayer` is a ba…

place_bidPlace a bidA

Bid for a player on the market.

This commits the manager's money. Confirm the player and the amount with the user before calling it, and say what they would have left.

The bid does not take effect straight away: it waits for the next transfer round, which get_market reports as closes_at. Until then it can be changed with change_bid or pulled with withdraw_bid.

Sizing the bid: compare against credit from get_offers, not budget from get_account — the league's credit factor makes them different numbers. Comunio's credit does not subtract bids already outstanding, so check credit_committed in the result for what is already promised. What players actually sell for is in get_transfers; quoted_price is only an asking price.

The amount is not checked against credit here. Comunio enforces its own limit and answers "Credit exceeded", so a bid it would accept is never refused by this tool. Refused before anything is sent only if the player is not on the market or is one of the manager's own listings.

Check ok and message in the result. Comunio can report overall success while rejecting the bid itself.

Inputs: price (required), player_id (required). Returns: What actually happened to a bid. Read from the **per-item** status inside the r…

set_lineupSet the lineupA
Idempotent

Set the manager's formation and starting eleven.

This replaces the current lineup. Confirm the formation and the players with the user before calling it.

tactic is one of: 442, 343, 352, 433, 451 — read as defenders, midfielders, strikers. Players are given by position and ids come from get_squad; the slot numbers Comunio wants are worked out here.

A partial lineup is allowed. Comunio deducts four points for every empty slot, and the result says how many were left and what that costs.

Players who are injured or suspended can still be fielded — Comunio permits it — so they are not refused, but the result lists them under unavailable. Check status in get_squad before choosing.

A player can likewise be put in a slot they do not normally play. That is Comunio's call to accept or refuse, not this tool's: the result lists them under out_of_position, and ok says what Comunio decided.

Refused before anything is sent if the formation is not one Comunio accepts, if there are more players than the formation has room for (the extras would be dropped in silence), if a player is not in the squad, or if one appears twice.

The lineup can be set again until the matchday starts.

Inputs: tactic (required), keeper, strikers, defenders, +1 more. Returns: What the lineup was set to. Comunio answers with nothing but a status, so every…

unlist_player_from_marketTake a player off the marketA

Take one of the manager's own players back off the market, so it is no longer for sale.

This changes the manager's team. Confirm which player with the user before calling it. Ids come from get_market, where the manager's own listings are the ones marked is_mine.

Any offers already received for that player are not cancelled by this — check get_offers.

Comunio reports no per-player detail here, only an overall status, so unlisted is what was asked for rather than what was confirmed. Call get_market if it matters.

Inputs: player_id (required). Returns: What came back from taking players off the market. Unlike listing, this endpoin…

unwatch_playerStop watching a playerA
Idempotent

Remove a player from the manager's watchlist.

Harmless: it changes nothing about the squad, the budget or any offer. Ids come from get_watchlist.

Inputs: player_id (required). Returns: ok, watching, player_id

watch_playerWatch a playerA
Idempotent

Add a player to the manager's watchlist.

Harmless: it commits nothing and spends nothing, it only marks the player as one to keep an eye on. Ids come from get_market, get_squad or get_standings.

Inputs: player_id (required). Returns: ok, watching, player_id

withdraw_bidWithdraw a bidA

Withdraw a bid the manager has placed, so it is no longer in the running.

This changes what the manager has committed to. Confirm which bid with the user before calling it. Ids come from get_offers; only offers whose direction is outgoing can be withdrawn.

Refuses outright if the id belongs to an offer for one of the manager's players rather than a bid they made. Comunio uses the same request for both, so telling them apart is done here rather than left to chance.

A withdrawn bid cannot be restored, but a new one can be placed while the market is still open.

Inputs: offer_id (required). Returns: What came back from withdrawing one of the manager's own bids.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.5/5.0

    Scored across 19 tools

    Disambiguation5/5

    Each tool name clearly maps to a distinct action or query (e.g., get_squad vs get_standings vs get_market; place_bid vs change_bid vs withdraw_bid). The descriptions further clarify edge cases like the difference between `get_offers` (bids) and `get_transfers` (completed transfers). There's no ambiguity between tools.

    Naming Consistency5/5

    Naming follows a consistent snake_case pattern: get_* for read operations and verb_noun for mutations (place_bid, withdraw_bid, set_lineup). The verb-object ordering is uniform across all tools, making the API predictable and easy to navigate.

    Tool Count4/5

    At 18–19 tools, the surface is broad but each tool maps to a distinct, legitimate fantasy-manager action (view squad, bid, list, lineup, news). The count is on the high side but every tool earns its place; nothing feels redundant.

    Completeness4/5

    Core read/write coverage is strong: every state (account, squad, market, offers, transfers, standings, news, watchlist) has a reader and every user action (bid, list, price, lineup, accept, watch) has a mutator. Minor gaps: watchlist can be added to but not removed, and there is no way to decline an incoming offer.

    Maintenance

    ActivityMaintained
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI models to manage and query fantasy sports leagues through the Sleeper API, supporting tasks like player lookups, league activity, and draft management.
      135 npm
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables AI clients to read and write ESPN fantasy sports leagues using your own session cookies, including managing rosters, lineups, waiver claims, and free agent adds without a browser.
      17
      1
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Provides AI assistants with commissioner-focused tools for fantasy sports leagues, enabling league overviews, standings, transactions, recaps, and manager activity across providers like Yahoo Fantasy.
      1
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      Enables AI agents to access Sleeper fantasy football league data, rosters, matchups, projections, waivers, trends, and league chat, with read-only safety and optional authorized chat posting.
      26
      MIT