@claudinho/mcp 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +74 -38
  2. package/dist/index.js +3904 -1109
  3. package/package.json +23 -10
package/README.md CHANGED
@@ -1,15 +1,18 @@
1
1
  # @claudinho/mcp ⚽
2
2
 
3
- **An MCP server for the 2026 men's football tournament.** Ask your agent about live
4
- scores, fixtures, group standings, and the prediction-market read — in Claude Code,
5
- Cursor, Codex, Claude Desktop, Windsurf, Zed, VS Code, or any MCP client (stdio).
6
- No API key, no signup — all 104 fixtures ship bundled; only live scores (and optional, read-only Polymarket signals) hit the network.
3
+ **An MCP server with live football scores, fixtures, standings and paste-ready match cards for
4
+ the competition you follow: the World Cup, the Premier League, LALIGA, the Champions League and
5
+ 11 more.** Ask your agent in Claude Code, Cursor, Codex, Claude Desktop, Windsurf, Zed, VS Code,
6
+ or any MCP client (stdio). No API key, no signup. The World Cup's 104 fixtures ship bundled; the
7
+ other competitions' schedules are read from the feed, and live scores (and the optional,
8
+ read-only Polymarket signals for the World Cup) hit the network. It ran the 2026 World Cup from
9
+ the opener to the final.
7
10
 
8
11
  <p align="center">
9
- <img src="https://raw.githubusercontent.com/arturogarrido/claudinho/main/.github/assets/mcp-aha.gif" alt="An AI coding agent mid-task: asked 'did Germany get through?', it calls the Claudinho MCP server and answers with the result — 🇩🇪 Germany 1(3)–1(4) Paraguay 🇵🇾, FT (Paraguay won the shootout)" width="760">
12
+ <img src="https://raw.githubusercontent.com/arturogarrido/claudinho/main/.github/assets/mcp-aha.gif" alt="An AI coding agent mid-task during the 2026 World Cup: asked 'did Germany get through?', it calls the Claudinho MCP server and answers with the result: 🇩🇪 Germany 1(3)–1(4) Paraguay 🇵🇾, FT (Paraguay won the shootout)" width="760">
10
13
  </p>
11
14
 
12
- > ⭐ Added via `npx` or your MCP config? **[Star the repo](https://github.com/arturogarrido/claudinho)** — a fan project runs on stars.
15
+ > ⭐ Added via `npx` or your MCP config? **[Star the repo](https://github.com/arturogarrido/claudinho)**: a fan project runs on stars.
13
16
 
14
17
  ## Install
15
18
 
@@ -18,26 +21,26 @@ No API key, no signup — all 104 fixtures ship bundled; only live scores (and o
18
21
  claude mcp add claudinho -- npx -y @claudinho/mcp
19
22
  ```
20
23
 
21
- **Cursor** — add to `~/.cursor/mcp.json` (global) or a project `.cursor/mcp.json`:
24
+ **Cursor**: add to `~/.cursor/mcp.json` (global) or a project `.cursor/mcp.json`:
22
25
  ```json
23
26
  { "mcpServers": { "claudinho": { "command": "npx", "args": ["-y", "@claudinho/mcp"] } } }
24
27
  ```
25
28
  > Bonus: `claudinho init-cursor-statusline` (from `@claudinho/cli`) also puts the live score
26
- > in your Cursor CLI statusline — or run `claudinho init cursor` to do both at once.
29
+ > in your Cursor CLI statusline, or run `claudinho init cursor` to do both at once.
27
30
 
28
31
  **Codex CLI**
29
32
  ```bash
30
33
  codex mcp add claudinho -- npx -y @claudinho/mcp
31
34
  ```
32
35
 
33
- **Claude Desktop / Windsurf / Zed / VS Code** — standard stdio config (same JSON as Cursor):
36
+ **Claude Desktop / Windsurf / Zed / VS Code**: standard stdio config (same JSON as Cursor):
34
37
  Claude Desktop: Settings → Developer → Edit Config, then restart. Codex config file:
35
38
  `~/.codex/config.toml` (`[mcp_servers.claudinho]`, `command = "npx"`, `args = ["-y", "@claudinho/mcp"]`).
36
39
 
37
- Then just ask your agent naturally — it picks the right tool and answers with live data:
40
+ Then just ask your agent naturally; it picks the right tool and answers with live data:
38
41
 
39
- > "What matches are on today?" · "Show me the live scores" · "What's Mexico's next game?"
40
- > "Group A standings" · "Show the knockout bracket" · "Make me a shareable card for today"
42
+ > "What matches are on today?" · "Show me the live scores" · "What's Arsenal's next game?"
43
+ > "Show the Premier League table" · "Show the World Cup bracket" · "Make me a shareable card for today"
41
44
 
42
45
  ## Tools
43
46
 
@@ -45,54 +48,87 @@ Then just ask your agent naturally — it picks the right tool and answers with
45
48
  |---|---|
46
49
  | `get_today` | fixtures for a date (default: today), grouped in the caller's `tz`, live scores overlaid |
47
50
  | `get_live` | matches in play right now |
48
- | `get_match` | a single match by id |
49
- | `get_standings` | live cumulative group table(s) — one group `A`–`L`, or all |
50
- | `get_bracket` | knockout bracket from the Round of 32 through the final — optional `stage` filter (`R32`, `R16`, `QF`, `SF`, `3P`, `F`) |
51
- | `get_next_fixture` | a team's next match (3-letter code, e.g. `MEX`) — live-resolves a confirmed knockout tie from the feed; group fixtures offline, fails back to the bundled schedule if the feed is down |
52
- | `get_market_signal` | read-only prediction-market signal for a match, a team's current-or-next fixture (in-play preferred while live), or a date — informational only |
53
- | `get_share_snippet` | a copy-pasteable plain-text card — for a match, a team's next fixture, a group's standings table (`group`), the knockout bracket (`bracket: true`, optional `knockoutStage`), a date, or live — hand the returned snippet to the user as-is |
54
- | `get_team` | resolve a nation name or code to its FIFA 3-letter code, flag, and group — fuzzy (`Mexico`, `mex`, `DR Congo`, `Türkiye`); call it first to turn a user's team name into the code the other tools need. Offline (no network) |
51
+ | `get_match` | a single match by id; in a club competition, looked for from yesterday to 14 days ahead (`window` names the days searched when it is not there) |
52
+ | `get_standings` | live cumulative standings: every table, or one by its key (a group letter, or `A1`, `A-B`, `LEAGUE`) |
53
+ | `get_bracket` | knockout bracket from the Round of 32 through the final, with an optional `stage` filter (`R32`, `R16`, `QF`, `SF`, `3P`, `F`); the Premier League and LALIGA, league seasons with no knockout tie of their own, answer `inapplicable`; the other competitions off the World Cup answer `unsupported` (not offered yet) |
54
+ | `get_next_fixture` | a team's next match, by name or code. A nation (`Mexico`, `MEX`): live-resolves a confirmed knockout tie from the feed, group fixtures offline, fails back to the bundled schedule if the feed is down; a club (`Arsenal`, `ARS`): its next match within 14 days, `candidates` when several teams match, `horizon` when it has none in that span. With no `team`: the server's `CLAUDINHO_TEAM`, else the team the user pinned (`claudinho follow <alias> --team <name>`) when the request is for its competition |
55
+ | `get_market_signal` | read-only prediction-market signal for a match, a team's current-or-next fixture (in-play preferred while live), or a date; informational only |
56
+ | `get_share_snippet` | a copy-pasteable plain-text card for a match, a team's next fixture, a group's standings table (`group`), the knockout bracket (`bracket: true`, optional `knockoutStage`), a date, or live; hand the returned snippet to the user as-is |
57
+ | `get_team` | the World Cup roster: resolve a nation name or code to its FIFA 3-letter code, flag, and group; fuzzy (`Mexico`, `mex`, `DR Congo`, `Türkiye`); handy for the code `get_market_signal` needs. It knows no clubs. Offline (no network) |
58
+ | `list_competitions` | the supported competitions: each one's alias (what `competition` takes), name, teams (nations or clubs), kind, and what it offers (scores, next, standings, bracket, markets: `offered`, `not-offered-yet`, `not-applicable`), plus `current`, the competition the request is for. Offline (no network) |
55
59
 
56
60
  Most tools are **read-only** (`readOnlyHint`) and accept optional `tz`, `lang`
57
- (`en`/`es`/`pt`/`fr`), and `flavor` (`off`/`subtle`/`full`); `get_team` is read-only
58
- **and** offline. Every response carries
61
+ (`en`/`es`/`pt`/`fr`), `flavor` (`off`/`subtle`/`full`), and `competition`: an alias
62
+ such as `premier-league` (from `list_competitions`) or an ESPN slug such as `eng.1`
63
+ (without it: the server's `CLAUDINHO_COMPETITION`, else the user's saved choice, the one
64
+ `claudinho follow <alias>` saves; an unknown value is a tool error listing the aliases).
65
+ With none of the three, every competition-answering tool answers, before it reads
66
+ anything, `noCompetition: true` and `competition: null` beside its empty shape, and a
67
+ sentence saying what to do (pass `competition`, or the user runs `claudinho follow
68
+ <alias>`); `list_competitions` answers `current: null`, and `get_team` answers as ever. Every competition-answering tool's text
69
+ starts with the competition it is for (`Premier League · from the request`; a share
70
+ card says it in its title instead) and its structured content carries it as
71
+ `competition`. `get_team` (the World Cup's roster, whatever the competition) and
72
+ `list_competitions` are read-only **and** offline. Every response carries
59
73
  human-readable text **and** structured content, validated against each tool's
60
- declared `outputSchema`.
61
-
62
- Resources: `standings://{group}`, `fixtures://{date}`. Prompts: `tournament_today`,
63
- and `my_team` (give it a 3-letter team code; combines next fixture, standings, and
64
- the prediction-market read).
74
+ declared `outputSchema`. When the provider's knockout answer was not whole,
75
+ `get_next_fixture`, `get_bracket` and the next/bracket share cards say so before
76
+ what was read and carry `partial` (`omitted`: the count of provider records left
77
+ out, when known); no fixture is then not "eliminated". `get_today`, `get_live`,
78
+ `get_match`, `get_market_signal` and their share cards carry `partial` for their own
79
+ reads too: an empty answer then means nothing was read, not that nothing exists, and a
80
+ World Cup day counts the fixtures shown from the bundled schedule without their live
81
+ state. In a club competition whose
82
+ edition has ended (and the next has not started), `get_today`, `get_live`,
83
+ `get_next_fixture` and `get_match` say so and carry `betweenEditions`. A club has no
84
+ `flag` (a nation's is generated from its name), and nothing is printed in its place; a
85
+ match's `stage` is the written one (`REGULAR` for a league's season, `LEAGUE` for a cup's
86
+ league phase, `PO` for play-offs), or `OTHER` with the provider's own words in `stageLabel`.
87
+
88
+ Resources: `standings://{group}` (its text starts with the competition it is for, like a tool's), `fixtures://{date}` (the bundled World Cup schedule, named first, whatever the competition). Prompts: `tournament_today`,
89
+ and `my_team` (the World Cup's: give it a nation's code or name; it asks the World Cup's
90
+ tools, `competition: "world-cup"`, for the next fixture with its date and state, the
91
+ standings, and the prediction-market read).
65
92
 
66
93
  ## Market signals
67
94
 
68
- Market signals are pre-match and in-play reads — finished matches never show one.
95
+ Market signals are pre-match and in-play reads: finished matches never show one.
69
96
  `get_today` / `get_match` include a short market line when a reliable market exists
70
97
  (slugs are auto-derived per fixture; matching fails closed). Their structured output
71
98
  includes `marketComplete`; the dedicated market tool uses `complete`. A false verdict
72
99
  means the optional read was unavailable or incomplete and is never described as "no signal."
73
100
  Share cards carry the same verdict and warning. **Read-only and
74
- informational only — not betting advice:** market-implied percentages with Polymarket
101
+ informational only, not betting advice:** market-implied percentages with Polymarket
75
102
  attribution, never links or trade calls. Disable with `CLAUDINHO_MARKETS=off`; set
76
103
  `CLAUDINHO_MARKETS_SOURCE=fake` in the server `env` for a network-free, clearly
77
104
  labeled synthetic preview.
78
105
 
79
106
  ## Commentary flair
80
107
 
81
- Match lines in the text end with a short, localized, genre-style exclamation
82
- (`— ¡GOOOOL!`) — generic energy, no real commentator quoted or impersonated, never
83
- in the structured JSON. Control with `CLAUDINHO_FLAVOR` (`off`|`subtle`|`full`,
84
- default `full`) in the server `env`, or per call via the `flavor` argument.
108
+ Match lines in the text end with a short, localized exclamation for the match's
109
+ moment (`— ¡GOOOOL!`): a few hundred lines in four languages, no real person named
110
+ or impersonated, none repeated within one list while the bank lasts, never in the
111
+ structured JSON. A team's own rally cry takes its place when one side has one
112
+ (Mexico's `¿Y si sí?`, Pumas' `¡Goya!`, Arsenal's `COYG!`): when both do, the team
113
+ saved with `claudinho follow --team` for that competition, else the home side's
114
+ (the server's `CLAUDINHO_TEAM` is the team-taking tools' default query, not the
115
+ cry's tiebreak). A row with a cry takes no line from the bank, a postponed or
116
+ cancelled match prints neither, and the `fixtures://` resource prints a phrase,
117
+ never a cry (it states no team kind). Control with `CLAUDINHO_FLAVOR`
118
+ (`off`|`subtle`|`full`, default `full`; `subtle` is goals, full time, draws and
119
+ the cries) in the server `env`, or per call via the `flavor` argument.
85
120
 
86
121
  ## How it works
87
122
 
88
- All 104 fixtures ship bundled in the package; only live state hits the network —
89
- live scores from **ESPN's** public scoreboard (swappable provider, attributed in
90
- output), market signals from Polymarket. Stdout carries only the MCP protocol;
123
+ The World Cup's 104 fixtures ship bundled in the package; the other competitions'
124
+ schedules are read from the feed, and live state always hits the network: live scores
125
+ from **ESPN's** public scoreboard (swappable provider, attributed in output), market
126
+ signals from Polymarket. Stdout carries only the MCP protocol;
91
127
  diagnostics go to stderr.
92
128
 
93
129
  ## Privacy Policy
94
130
 
95
- No personal data collected — no accounts, no telemetry, no analytics, no tracking, and no
131
+ No personal data collected: no accounts, no telemetry, no analytics, no tracking, and no
96
132
  Claudinho server. To show live scores, Claudinho makes read-only requests to public services
97
133
  (ESPN; Polymarket for informational-only market signals) with no account or personal data
98
134
  attached, though those services still receive standard request metadata (such as your IP
@@ -103,8 +139,8 @@ nothing to disk. Full policy: [PRIVACY.md](https://github.com/arturogarrido/clau
103
139
 
104
140
  MIT © 2026 Arturo Garrido · [source & issues](https://github.com/arturogarrido/claudinho)
105
141
 
106
- > **Not affiliated with, endorsed by, or connected to FIFA or Anthropic.** An independent,
107
- > open-source fan project showing factual match data with emoji flags only — no logos, crests,
142
+ > **Not affiliated with FIFA, any confederation, league or club, or Anthropic. Nor endorsed by or connected to any of them.** An independent,
143
+ > open-source fan project showing factual match data with emoji flags only: no logos, crests,
108
144
  > kits, broadcast footage, or player likenesses.
109
145
 
110
146
  ---