# Changelog of Teamfight Tactics MCP Server: stats and coaching (`mrbridge/tft-mcp-server`) Actor

- **URL**: https://apify.com/mrbridge/tft-mcp-server/changelog.md
- **Full Actor documentation**: https://apify.com/mrbridge/tft-mcp-server.md

## TFT MCP Server — Changelog

**Standby URL:** `https://mrbridge--tft-mcp-server.apify.actor/mcp`

***

### 2026-06-11

**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 + llms.txt pricing wording: "only successful tool calls are charged"
- README pricing section simplified: the live price table now lives on the [Pricing tab](https://apify.com/mrbridge/tft-mcp-server/pricing?fpr=mrbridge) (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
- Feedback link now points to the public [Issues tab](https://apify.com/mrbridge/tft-mcp-server/issues?fpr=mrbridge)

### 2026-06-06

**Full TFT API coverage (13 → 19 tools)**

#### Added

- **Ladder / leaderboard tools**: `tft_get_league_top` (Challenger / Grandmaster / Master), `tft_get_league_entries` (tier + division), `tft_get_rated_ladder` (Hyper Roll), `tft_get_league_by_id`
- **Platform tools**: `tft_get_status` (maintenances / incidents), `tft_get_featured_games`
- `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

### 2026-03-20

**SEO & content**

- SEO-optimized headings, anti-friction messaging, cross-sell table

### 2026-02-12

**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
- Simplified setup instructions (Claude Desktop Connector)

### 2026-02-09

**v2.0 consolidation** — consolidated into a single v2.0 Actor with 13 TFT tools.

#### Architecture

- **13 MCP tools** in 5 categories
- **Data Dragon**: automatic name resolution (units, items, traits)
- **Intelligent LRU cache**: per-data-type TTL (30s to 7 days)
- **Rate limiter**: respects Riot API limits (20 req/s, 100 req/2min)
- Multi-language (English / French) and pay-per-event billing per tool type
- Cost optimization (Standby memory) and security hardening (removed an exposed token from source)

#### Tools

| Category | # | Tools |
|---|---|---|
| Account | 4 | `tft_get_account`, `tft_get_summoner`, `tft_get_ranked`, `tft_get_player_profile` |
| Match | 3 | `tft_get_match_history`, `tft_get_match_details`, `tft_get_match_timeline` |
| Mastery | 1 | `tft_get_champion_mastery` |
| Live Game | 1 | `tft_get_live_game` |
| Analysis | 4 | `tft_analyze_performance`, `tft_analyze_champion`, `tft_get_improvement_tips`, `tft_compare_players` |
