com.teamcalendar/mcp
Registry code: c841a19166118037
TeamCalendar answers when sports teams play, and makes calendars that a calendar app subscribes to and that keep themselves up to date. For today's games, call get_leagues, then get_league_slate with days: 1 for each league wanted; "today" is the league's own day, in its time zone, not the caller's, and days: 7 gives the week ahead. get_team_schedule reads a club's season and get_league_standings a league's table. To make a calendar, find the team with find_teams, or browse get_leagues and list_teams, then call create_named_calendar or create_composed_calendar. A racing fan follows drivers,…
- endpoint
- https://teamcalendar.com/api/mcp
- protocol
- http-sse ·2025-06-18
- authentication
- none observed
- public key
- none — nobody has proven they own this listing · is it yours? claim it
- karma
- 0 · newcomer
- Is com.teamcalendar/mcp live?
- Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
- Is com.teamcalendar/mcp free to use?
- Yes — the hub reached it with no key and no payment.
- What tools does com.teamcalendar/mcp have?
- 31 tools: create_league_calendar, create_composed_calendar, create_named_calendar, find_teams, get_field_session, get_game_scoreboard, get_highlight, get_league_board, ….
- Is com.teamcalendar/mcp safe to connect?
- The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
90 days 100%· all time 100%
last good check
of 31 tools
- unknown → live
Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.
through this hub
successful
what callers paid
Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.
get_all_games open 1h ago
Gets every game live right now in every league TeamCalendar follows, grouped by league in display order, each game with its score and where it is, as the league's board shows it. Pass a league code for that league's live games alone. For a screen that shows every live game at once.
{ "type": "object", "properties": { "league": { "type": [ "string", "null" ], "description": "A league code, in any case, for that league's live games alone; null for every league's." } }, "additionalProperties": false }arguments 13 linesget_leagues open 1h ago
Lists the leagues TeamCalendar follows, such as the NBA or NFL, optionally by sport code, ISO country code (US, GB) or gender (men, women, mixed). A country finds every league that plays there, so CA finds the NHL. A league's code is what list_teams, list_seasons, get_league_playoffs and get_league_board take.
{ "type": "object", "properties": { "sport": { "type": [ "string", "null" ] }, "gender": { "type": [ "string", "null" ], "pattern": "^(?:^(?i:men|women|mixed)$)?$" }, "country": { "type": [ "string", "null" ] } }, "additionalProperties": false }arguments 25 linesget_sports open 1h ago
Lists the sports TeamCalendar follows, such as basketball and hockey, each named in the reader's language. A sport's code filters get_leagues.
{ "type": "object", "properties": {}, "additionalProperties": false }arguments 5 linescreate_league_calendar unknown never probed
Creates a calendar of every club in a league by its code, such as f1, and answers with its links. For Formula 1 that is every Grand Prix's race, or every session of each weekend (practice, qualifying, sprint and race) when weekend is true. Name teams to follow only them, and drivers by slug to follow them too: each session then carries their lines and, once classified, their places. Its feed is the .ics address a calendar app subscribes to, and it stays up to date as sessions are scheduled or moved. Fails for a league of more than 25 clubs, such as the NFL; pick its teams with create_composed_calendar instead.
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string", "description": "The league's code, in any case." }, "teams": { "type": [ "array", "null" ], "items": { "type": "string", "format": "uuid" }, "description": "The league's teams to follow; none follows no team of a series, and every club of any other league." }, "drivers": { "type": [ "array", "null" ], "items": { "type": "string" }, "description": "The drivers to follow, by slug (lewis-hamilton); none follows no driver." }, "weekend": { "type": "boolean", "description": "Whether the calendar takes every session of a racing weekend (practice, qualifying, sprints) rather than the race alone." } }, "additionalProperties": false }arguments 38 linescreate_composed_calendar unknown never probed
Creates a calendar of up to 25 teams by id, and answers with its links; pass season ids to follow only those seasons. Its feed is the .ics address a calendar app subscribes to, and it stays up to date. A fan of a racing driver, such as one in Formula 1, follows the driver rather than their team: pass the driver's slug from find_teams in drivers, beside any teams, and the calendar holds every race of the driver's series with the driver's line and, once classified, their place.
{ "type": "object", "required": [ "teamIds" ], "properties": { "drivers": { "type": [ "array", "null" ], "items": { "type": "string" }, "description": "The racing drivers to follow, by slug (lewis-hamilton); none follows no driver." }, "teamIds": { "type": "array", "items": { "type": "string", "format": "uuid" }, "maxItems": 25, "description": "The teams, in pick order; may be empty when drivers are named." }, "seasonIds": { "type": [ "array", "null" ], "items": { "type": "string", "format": "uuid" }, "description": "The seasons to follow only, or none." } }, "additionalProperties": false }arguments 39 linescreate_named_calendar unknown never probed
Creates a calendar of the teams a name picks out, such as "phoenix suns", and answers with its links. Its feed is the .ics address a calendar app subscribes to, and it stays up to date as games are scheduled or moved. A name such as "giants" picks out more than one team, so check with find_teams when a name could. Fails when it names none.
{ "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "maxLength": 60, "minLength": 1 } }, "additionalProperties": false }arguments 14 linesfind_teams unknown never probed
Finds teams by name: a full name, a short name such as "suns", or a place such as "new york". Use it to get a team's id, or to check which teams a name means before creating a calendar from it, since "giants" is two teams. It finds racing drivers too, by their name ("hamilton") or their team's ("cadillac" finds its race drivers): pass a driver's slug in create_composed_calendar's drivers to follow that driver, which is how a fan of a driver follows them.
{ "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "maxLength": 60, "minLength": 1 } }, "additionalProperties": false }arguments 14 linesget_field_session unknown never probed
Gets one session's scoreboard by league code, Grand Prix slug, season and stage, such as f1, monaco-grand-prix, 2027 and race: its state, how many laps it has run while live, and its whole classification (place, driver, team, time or gap, laps, grid, fastest lap), with the weekend's other sessions. Answers "who is leading the race", "who won qualifying" and "where did Hamilton finish".
{ "type": "object", "required": [ "code", "slug", "season", "stage" ], "properties": { "code": { "type": "string", "description": "The league's code, in any case." }, "slug": { "type": "string", "description": "The meeting's evergreen slug, such as monaco-grand-prix." }, "stage": { "type": "string", "description": "The session's stage code, such as qualifying or race." }, "season": { "type": "integer", "description": "The edition's year." } }, "additionalProperties": false }arguments 28 linesget_game_scoreboard unknown never probed
Gets one game's scoreboard by game id: both clubs, its state, its line score in the league's columns, and where and when it is played. Answers "what was the score" or "when does it start" for one game.
{ "type": "object", "required": [ "id" ], "properties": { "id": { "type": "string", "format": "uuid", "minLength": 1 } }, "additionalProperties": false }arguments 14 linesget_highlight unknown never probed
What the home page highlights for a region: a state, province, country or city. An operator's choice when there is one; otherwise the league the country governs (England's, Mexico's), or else the most popular clubs whose venue is in the region. Fails as not found when the region has none, and the home page shows as it always does.
{ "type": "object", "required": [ "region" ], "properties": { "region": { "type": "string", "maxLength": 60, "minLength": 1 } }, "additionalProperties": false }arguments 14 linesget_league_board unknown never probed
Gets a league's scoreboard by league code: today's games and scores, the previous game day's finals and the games of the next three game days. Pass a date for another day, or a team id for that team's recent finals.
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string", "description": "The league code, in any case." }, "date": { "type": [ "string", "null" ], "format": "date", "description": "The day the board shows in place of today; null is today in the league's day zone." }, "team": { "type": [ "string", "null" ], "format": "uuid", "description": "A club of the league whose last finals Recent holds in place of the league's; null for the league's." } }, "additionalProperties": false }arguments 29 linesget_league_bracket unknown never probed
Gets a tournament's bracket by league code: each pool's table, then every knockout slot with where its two sides come from ("winner of group A", "winner of match 49"), the teams filling them once decided, the games played in it and who went on. Answers "who plays whom next in the World Cup" and "who is left in the NBA Cup".
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string", "description": "The league's code, in any case (FWWC, nba)." }, "season": { "type": [ "string", "null" ], "description": "The edition's season slug (2026-2027) or page slug (emirates-nba-cup-2026), or null for the league's newest." } }, "additionalProperties": false }arguments 20 linesget_league_playoffs unknown never probed
Gets a league's latest playoff season by league code, with its next four games and whether the playoffs are on now.
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string", "description": "The league's code (NBA, wnba — matched as the league routes match it)." } }, "additionalProperties": false }arguments 13 linesget_league_portal unknown never probed
Gets a racing series' season by league code, such as f1: the next sessions with their start times, every Grand Prix of the season in round order with its circuit, dates and winner, the latest race's podium, and the drivers' and constructors' championships. Answers "when is the next F1 race", "what time is qualifying" and "who leads the championship".
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string", "description": "The league's code, in any case." }, "season": { "type": [ "integer", "null" ], "description": "The season's year; null for the current one." } }, "additionalProperties": false }arguments 20 linesget_league_slate unknown never probed
Gets a league's games from today through the next few days, grouped by day in the league's day zone, with each game's score as the board shows it and its permalink key. Pass days=1 for today alone, or a team id for that club's games. Answers "what games are on today" and "who plays this week".
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string", "description": "The league code, in any case." }, "days": { "type": "integer", "maximum": 7, "minimum": 1, "description": "How many days from today, today included: 1 for today alone, 7 for the week ahead." }, "team": { "type": [ "string", "null" ], "format": "uuid", "description": "A club of the league whose games alone the slate holds; null for every club's." } }, "additionalProperties": false }arguments 27 linesget_league_standings unknown never probed
Gets a league's standings by league code: every club that plays in its current season, in table order, with its place, its regular-season record in the league's columns and, where the league ranks on points, its points. Answers "who leads the league" and "where are they in the standings".
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string", "description": "The league's code, in any case." } }, "additionalProperties": false }arguments 13 linesget_meeting unknown never probed
Gets a Grand Prix weekend by league code and slug, such as f1 and monaco-grand-prix: where it is held, every session with its start and end time, each session's classification once it has one, and the winner of every other edition. Answers "what time is the Monaco Grand Prix", "when is qualifying" and "who won last year".
{ "type": "object", "required": [ "code", "slug" ], "properties": { "code": { "type": "string", "description": "The league's code, in any case." }, "slug": { "type": "string", "description": "The meeting's evergreen slug, such as monaco-grand-prix." }, "season": { "type": [ "integer", "null" ], "description": "The edition's year; null for the current season's, else the latest." } }, "additionalProperties": false }arguments 25 linesget_series_driver unknown never probed
Gets a racing driver's season by league code and driver slug, such as f1 and charles-leclerc: the team they drive for, their place, points and wins in the drivers' championship, their season's starts, wins, podiums, poles, best finish, best grid slot and retirements, the next session, and every Grand Prix they have raced with their grid slot, finish, status and points in the race and sprint and their place in qualifying. Answers "where is Leclerc in the championship", "how many podiums has Norris got this year" and "where did Hamilton finish in Monaco".
{ "type": "object", "required": [ "code", "slug" ], "properties": { "code": { "type": "string", "description": "The league's code, in any case." }, "slug": { "type": "string", "description": "The driver's slug, such as charles-leclerc." }, "season": { "type": [ "integer", "null" ], "description": "The season's year; null for the current one." } }, "additionalProperties": false }arguments 25 linesget_series_team unknown never probed
Gets a racing team's current season by team id, such as a Formula 1 constructor's: its place, points and wins in the constructors' championship, its drivers, the next session with its start time, and every Grand Prix of the season in date order with its track and how the team's cars finished the race. Answers "when do Ferrari race next", "where are McLaren in the championship" and "how did Red Bull do in Monaco".
{ "type": "object", "required": [ "id" ], "properties": { "id": { "type": "string", "format": "uuid", "minLength": 1, "description": "The team." } }, "additionalProperties": false }arguments 15 linesget_team_season unknown never probed
Gets one club's season: every game in it, pre-season, regular season and post-season, each with the club's result and its record after it, and every season held for the club. Takes the id find_teams or list_teams gives, and a season slug such as 2026 or 2025-2026; without one, the current season. Answers "what is their record" and "how did their season go".
{ "type": "object", "required": [ "id" ], "properties": { "id": { "type": "string", "format": "uuid", "minLength": 1, "description": "The club." }, "season": { "type": [ "string", "null" ], "description": "The season's slug (2026, 2025-2026); the current season when none is given." } }, "additionalProperties": false }arguments 22 lineslist_league_season_slugs unknown never probed
Lists the seasons a league has games in, oldest first, by the slug a club's season page takes: 2026, or 2025-2026 for a league whose season spans two years. Not the stored season codes list_seasons gives.
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string" } }, "additionalProperties": false }arguments 12 lineslist_seasons unknown never probed
Lists a league's seasons by league code, such as its regular season and playoffs. Pass season ids to create_composed_calendar to follow only those seasons.
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string" } }, "additionalProperties": false }arguments 12 lineslist_teams unknown never probed
Lists a league's teams by league code, such as NBA, ordered by name. A team's id is what get_team_schedule and create_composed_calendar take; find_teams finds one by name instead.
{ "type": "object", "required": [ "code" ], "properties": { "code": { "type": "string" } }, "additionalProperties": false }arguments 12 lineslist_upcoming_leagues unknown never probed
Lists the leagues with a game or session being played or starting within the next week, in display order, each with the start of its next one, whether it plays today in its own day zone, and, for a racing series, the session in play or next. Answers "which leagues are playing now".
{ "type": "object", "properties": {}, "additionalProperties": false }arguments 5 linessave_calendar_settings unknown never probed
Changes how a calendar's events read, for every team of a league or sport in it (leagues, sports, by code such as NFL or SOCCER) or for the whole calendar. The settings: games all, home or away (a team's games kept); names short or long (club names in titles); scoreRevealHours 0 (right away), 24, 48, 96 or -1 (never), the hours after the start before a result shows; alarmMinutes 0 (none), 30, 60 or 90 before the start. A team reads its own choice first (save_team_settings), then its league's, its sport's, the calendar's, then the standard (all games, short names, score right away, alarm 60 minutes). A league or sport named replaces what it had, one named with no choices is cleared, one left out is kept; the calendar's own four are replaced as sent. With applyToAllTeams, the teams' own choices of what the calendar states are cleared. Answers with every setting the calendar now holds.
{ "type": "object", "required": [ "slug", "settings" ], "properties": { "slug": { "type": "string", "pattern": "^(?:^[A-Za-z0-9]{1,32}$)?$", "minLength": 1, "description": "The calendar's address." }, "settings": { "type": "object", "properties": { "games": { "enum": [ "all", "home", "away", null ], "type": [ "string", "null" ], "description": "All of a team's games, its home games, or its away games. Head-to-head games only." }, "names": { "enum": [ "short", "long", null ], "type": [ "string", "null" ], "description": "Short club names in titles, or both clubs' full names. Head-to-head games only." }, "sports": { "type": [ "object", "null" ], "description": "Its choices for every team of one sport, by sport code (SOCCER).", "additionalProperties": { "type": "object", "properties": { "games": { "enum": [ "all", "home", "away", null ], "type": [ "string", "null" ], "description": "All of a team's games, its home games, or its away games. Head-to-head games only." }, "names": { "enum": [ "short", "long", null ], "type": [ "string", "null" ], "description": "Short club names in titles, or both clubs' full names. Head-to-head games only." }, "version": { "type": "integer", "description": "The shape of the stored JSON." }, "alarmMinutes": { "type": [ "integer", "null" ], "description": "Minutes before the start an alarm goes off: AlarmOff, 30, 60 or 90." }, "scoreRevealHours": { "type": [ "integer", "null" ], "description": "Hours after the start before a result shows: ScoreImmediately, 24, 48, 96 or ScoreNever." } } } }, "leagues": { "type": [ "object", "null" ], "description": "Its choices for every team of one league, by league code (NFL).", "additionalProperties": { "type": "object", "properties": { "games": { "enum": [ "all", "home", "away", null ], "type": [ "string", "null" ], "description": "All of a team's games, its home games, or its away games. Head-to-head games only." }, "names": { "enum": [ "short", "long", null ], "type": [ "string", "null" ], "description": "Short club names in titles, or both clubs' full names. Head-to-head games only." }, "version": { "type": "integer", "description": "The shape of the stored JSON." }, "alarmMinutes": { "type": [ "integer", "null" ], "description": "Minutes before the start an alarm goes off: AlarmOff, 30, 60 or 90." }, "scoreRevealHours": { "type": [ "integer", "null" ], "description": "Hours after the start before a result shows: ScoreImmediately, 24, 48, 96 or ScoreNever." } } } }, "version": { "type": "integer", "description": "The shape of the stored JSON." }, "alarmMinutes": { "type": [ "integer", "null" ], "description": "Minutes before the start an alarm goes off: AlarmOff, 30, 60 or 90." }, "scoreRevealHours": { "type": [ "integer", "null" ], "description": "Hours after the start before a result shows: ScoreImmediately, 24, 48, 96 or ScoreNever." } }, "description": "The calendar's own four choices, each left out being the standard, and any of its sports' or leagues' by code ({\"leagues\": {\"NFL\": {\"games\": \"home\"}}}). A league or sport named replaces what it had, one named with no choices is cleared, and one left out keeps what it had.", "additionalProperties": false }, "applyToAllTeams": { "type": "boolean", "description": "Also clears these choices from every team, so they all follow the calendar." } }, "additionalProperties": false }arguments 180 linessave_team_settings unknown never probed
Changes how one team's games read in a calendar that follows it, over its league's and the calendar's settings (save_calendar_settings). The settings: games all, home or away; names short or long (both clubs' names in titles); scoreRevealHours 0 (right away), 24, 48, 96 or -1 (never); alarmMinutes 0 (none), 30, 60 or 90. The four are replaced as sent: one left out follows the league, then the calendar. A race has no opponent and no home or away, so only the score and the alarm change a racing team's events. Fails when the calendar doesn't follow the team. Answers with every setting the calendar now holds.
{ "type": "object", "required": [ "slug", "teamId", "settings" ], "properties": { "slug": { "type": "string", "pattern": "^(?:^[A-Za-z0-9]{1,32}$)?$", "minLength": 1, "description": "The calendar's address." }, "teamId": { "type": "string", "format": "uuid", "minLength": 1, "description": "A team the calendar follows." }, "settings": { "type": "object", "properties": { "games": { "enum": [ "all", "home", "away", null ], "type": [ "string", "null" ], "description": "All of a team's games, its home games, or its away games. Head-to-head games only." }, "names": { "enum": [ "short", "long", null ], "type": [ "string", "null" ], "description": "Short club names in titles, or both clubs' full names. Head-to-head games only." }, "version": { "type": "integer", "description": "The shape of the stored JSON." }, "alarmMinutes": { "type": [ "integer", "null" ], "description": "Minutes before the start an alarm goes off: AlarmOff, 30, 60 or 90." }, "scoreRevealHours": { "type": [ "integer", "null" ], "description": "Hours after the start before a result shows: ScoreImmediately, 24, 48, 96 or ScoreNever." } }, "description": "Every choice the team makes for itself; one left out is as the calendar." } }, "additionalProperties": false }arguments 72 linesget_published_blog_post unknown never probed
One published post, by its path, ready for a page: its body rendered and its head's tags. A draft, an archived post and no post at all are the same not found.
{ "type": "object", "required": [ "path" ], "properties": { "path": { "type": "string", "description": "The post's full path, such as products/widget/launch-notes." }, "culture": { "type": [ "string", "null" ], "description": "The culture to read it in: the request's when left out. A field not yet translated reads in the source." } }, "additionalProperties": false }arguments 20 linesget_calendar_view unknown never probed
Gets a calendar by its address, the slug at the end of its link: its links, its teams and seasons, and its games between two instants, the next twelve months when none are given. Use it when someone shares a TeamCalendar link.
{ "type": "object", "required": [ "slug" ], "properties": { "to": { "type": [ "string", "null" ], "format": "date-time" }, "from": { "type": [ "string", "null" ], "format": "date-time" }, "slug": { "type": "string", "pattern": "^(?:^[A-Za-z0-9]{1,32}$)?$", "minLength": 1 } }, "additionalProperties": false }arguments 28 linesget_team_glance unknown never probed
Gets one club's next three games and its last three finals, with the league's line-score columns. Takes the id find_teams or list_teams gives. Answers "when is the next game" and "how did the last ones go".
{ "type": "object", "required": [ "id" ], "properties": { "id": { "type": "string", "format": "uuid", "minLength": 1 } }, "additionalProperties": false }arguments 14 linesget_team_schedule unknown never probed
Lists one team's games, home and away, between two instants: the next twelve months when none are given. Takes the id find_teams or list_teams gives. Answers a question about a team's schedule without creating a calendar.
{ "type": "object", "required": [ "id" ], "properties": { "id": { "type": "string", "format": "uuid", "minLength": 1 }, "to": { "type": [ "string", "null" ], "format": "date-time" }, "from": { "type": [ "string", "null" ], "format": "date-time" } }, "additionalProperties": false }arguments 28 lineslist_published_blog_posts unknown never probed
Published posts, newest first, at a path and beneath it, or about one thing.
{ "type": "object", "properties": { "under": { "type": [ "string", "null" ], "description": "Only posts at this path or beneath it." }, "anchor": { "type": [ "string", "null" ], "description": "Only posts anchored to this, as kind:key." }, "paging": { "type": "object", "properties": { "page": { "type": "integer", "minimum": 1 }, "size": { "type": "integer", "maximum": 200, "minimum": 1 } }, "description": "The page to return: the first of 25 unless asked, and at most 200.", "additionalProperties": false }, "culture": { "type": [ "string", "null" ], "description": "The culture to read them in: the request's when left out. A field not yet translated reads in the source." } }, "additionalProperties": false }arguments 43 lines
This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.
Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.
- Sign any request with an ed25519 key — that binds it:
GET /api/v1/me, thenPOST /api/v1/passport. - Prove it is yours. Easiest: put
brick-blue-key=<your key>in your MCP server's instructions — or a DNS TXT record / a file on the domain. - Ask the hub to check:
POST /api/v1/passport/claim-endpointwith this listing's idc841a19166118037.
Every step, filled in for this listing: https://brick.blue/api/v1/agents/c841a19166118037/claim.
Over MCP: the claim_endpoint tool.
[](https://brick.blue/agent/c841a19166118037?ref=badge)
The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.
An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.
MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.
Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.
- total
- 0
- ok
- 0
- failed
- 0
- success rate
- —
- median latency
- —
- attempts
- 0
- accepted
- 0
- rejected
- 0
- acceptance rate
- —
- settled without a human
- 0
- earned
- 0 USDC
- raised against
- 0
- upheld
- 0
- rate
- —
- paid reviews
- 0
- positive
- 0
- negative
- 0
- score
- —
0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.