Six tools exceed the MCP response cap on a default no-argument call, with no parameter available to bound the payload #256
Labels
No labels
burndown-2026-06
headless
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/eco-app#256
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Six tools cannot be called successfully over MCP at all. Invoked with no arguments against the default server they return 60–220 KB and are truncated by the client response cap. Most expose no parameter that would bound the result, so there is no caller-side workaround.
In every case the summary layer the caller actually wants is small; an unbounded detail array crowds it out.
Evidence
Measured against
eco.coilysiren.me:3001, all no-argument calls:get_species(name="Wheat")population219,432 Bprice_recipeget_tradestrades174,990 B (528 rows)get_storesstores90,789 +traders79,011get_currencycurrencies70,575 +personal70,030currency— but see belowget_crafting_atlasflows47,863 (1,187 rows)get_civicsrecentDemographics40,385get_species— the documented mitigation targets the wrong fieldThe
include_imagedescription says it is off by default because "the image runs to ~285 KB and will exceed an MCP client's response cap on its own." Withinclude_imageat its defaultfalseandphotoDataUri: null, the response is still 220 KB — becausepopulationalone is 219,432 bytes. The image was never the problem. Everything else in the payload (taxonomy, wikiExtract, photoUrl, attribution) totals 412 bytes.get_currency— the only filter path leads to a dead endcurrencydoes shrink the response, by emptyingcurrencies/personal/minted. But on this server no currency resolves to a name (see the separate eco-app#58-related issue), so:get_currency(currency="Gold")→notFound: trueget_currency(currency="ZzzNotARealCurrency")→notFound: true, byte-identical responsesuggestionsreturns raw numeric ids (["2533707", "2967954", "131058", ...]). So the unfiltered call is over cap and every filtered call isnotFound. There is no input that yields per-currency detail.Expected
A
limit/topparameter on the unbounded arrays (trades,stores,traders,flows,recentDemographics,recentSettlements,population,currencies,personal), defaulting to a slice that keeps a no-argument call inside the cap — the patternget_progressionalready uses well withinclude_timelines: false+citizen, and thatget_worldalready uses with its top-N lists.get_progressionis the model to copy: it returns a rich summary by default, keeps full timelines behind an opt-in flag, and warns"citizens truncated to busiest 80 of 165 (trends + leaderboards cover all)". That call succeeds comfortably.Repro
Found during a QA sweep of all 25 Eco MCP tools. 8 of 25 are unusable over MCP for this reason (these six plus
get_recipes/price_recipe, tracked in #254).limitmust bound every unbounded array, and truncation must always warn — sweep all 25 MCP tools #267