Connect AI assistants to Teamfight Tactics (TFT) data via MCP. 19 tools for player profiles, ranked stats, match history, live game, leaderboards, player comparison & AI placement coaching. Works in Claude Desktop, ChatGPT & any MCP client.
Billing fairness — error responses and compatibility stubs are no longer charged
Fixed
Error responses are never charged. Billing now fires only on successful tool responses (!result.isError); a typo'd Riot ID, a missing player, or any handler error no longer costs money. Previously every call was billed, success or error.
The two compatibility stubs are free.tft_get_champion_mastery and tft_get_match_timeline return a static "not available for TFT" message with no Riot API call — they are now in a FREE_TOOLS allowlist and never charged (previously $0.003 / $0.005 per call).
Changed
Standby port now prefers the documented ACTOR_WEB_SERVER_PORT, with APIFY_CONTAINER_PORT as legacy fallback
pay_per_event.json event descriptions updated: ladder/leaderboard/status/featured-games tools now listed under Data Retrieval; dead mastery/timeline mentions removed; player profile + live game listed under Match Data
README pricing section simplified: the live price table now lives on the Pricing tab (single source of truth) instead of being duplicated in the README; added the ACTOR_MAX_TOTAL_CHARGE_USD cost-cap note
Legal section rewritten for commercial use (Riot Games API ToS compliance, trademark notice) — replaces the "educational and personal use" wording
tft_get_match_history now supports start, startTime, endTime (pagination + date range)
Surfaces Riot's status.message + endpoint on unhandled HTTP errors for easier diagnosis
Notes
tft_get_featured_games degrades gracefully when the API key tier lacks spectator featured-games access (returns a clear message, not an error)
2026-06-05
Data layer rewired to the TFT API + zero-config built-in key
Fixed (major)
Re-pointed the entire data layer from the League of Legends API to the TFT API. Ranked now returns RANKED_TFT / Hyper Roll / Double Up; match details return placement, traits, starred units, items, augments and the Little Legend; summoner, status and live game use the TFT endpoints. Previously these returned League of Legends data.
tft_get_match_timeline and tft_get_champion_mastery now report "not available for TFT" (no such Riot endpoint) instead of hitting a LoL endpoint
Analysis tools (tft_analyze_performance, tft_get_improvement_tips, tft_analyze_champion) recomputed on TFT placement metrics (avg placement, top-4 / top-1 rate, most-played units & traits) and now accept a Riot ID directly
Changed
Built-in dedicated Riot API key — no user key, no setup, no 24-hour rotation (zero-config). Standby always uses the built-in key.
README realigned with the LoL MCP Server (zero-config Quick Start, sample output, API usage, cross-sell)
Data Dragon resolution switched to TFT assets (units, traits, augments, items, Little Legends, queues)
2026-05-19
Pay-per-event consolidation (5 events → 3)
Pricing simplification
Removed the tool-live ($0.008) and tool-compare ($0.025) events
tft_get_live_game now charges as tool-match ($0.005, price decrease)
tft_compare_players now charges as tool-analysis ($0.015, price decrease)
Final structure: tool-read $0.003 / tool-match $0.005 / tool-analysis $0.015
Why
Apify recommends 2–4 events; 5 made the pricing page noisy
live_game is fundamentally a match-data lookup; compare_players is an AI/analysis feature
Aligns the event taxonomy with the LoL sibling Actor
2026-03-31
Billing robustness
Fixed
Spending limit: the tool result is returned with a warning instead of being silently thrown
Charge on error: calls are billed even when the handler fails (the Riot API calls were already consumed)
Missing mapping: explicit throw if a tool has no billing mapping (instead of a silent fallback to tool-read)
Billing failures: log.error with a consecutive counter and an alert at 5 failures (BILLING_FAILURE)
Simplified
Removed dead code (SPENDING_LIMIT_RESPONSE, getToolPricing, getToolBillingEvent)
PRICING reduced to Record<BillingEvent, number> (removed the unused description field)
Unified billing flow in server.ts: a single chargeForTool call after the handler's try/catch
2026-03-26
PPE audit fixes
Spending limit: added SPENDING_LIMIT_RESPONSE handling in billing.ts / server.ts (returned when eventChargeLimitReached)
Content fix: replaced all League of Legends references with TFT across README, index.ts, schemas and package.json
Streamable HTTP only + Claude Desktop fix — migrated to the official Apify MCP pattern.
BREAKING CHANGE
SSE removed: the /sse and /messages endpoints no longer exist
Port: uses APIFY_CONTAINER_PORT instead of ACTOR_STANDBY_PORT
Changed
Stateless Streamable HTTP: a fresh server + transport per request (sessionIdGenerator: undefined), no session management
CORS: added the cors middleware with exposedHeaders: ['Mcp-Session-Id'] for Claude Desktop compatibility
GET /mcp and DELETE /mcp return 405 Method Not Allowed
Automatic cleanup: transport.close() and server.close() on res.on('close')
2026-02-11
Readiness probe fix
Apify readiness probe: / returns a plain 200 OK instead of creating an unnecessary MCP session
Finding: Apify's Standby proxy does not forward external requests to / (only the internal readiness probe hits it); the MCP connection URL must include /mcp
2026-02-10
Standby support & Console pages
Streamable HTTP: added the /mcp endpoint
Riot API key via the RIOT_API_KEY environment variable; graceful start without a key
Mode detection via APIFY_META_ORIGIN
Improved Input & Information page copy on the Apify Console, with detailed use cases
Categories set to AI, MCP_SERVERS, INTEGRATIONS; actor.json aligned with the Console