nebbuler-mundial-mcp 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Juan Pablo Monsalvez · Nebbuler
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,95 @@
1
+ # nebbuler-mundial-mcp
2
+
3
+ > MCP (Model Context Protocol) server that gives Claude, Cursor, Windsurf and other AI agents native tools to query FIFA World Cup 2026 data.
4
+
5
+ When installed, your LLM can directly:
6
+
7
+ - Look up groups, teams, venues, and fixtures
8
+ - Calculate how much a LATAM sports creator would earn during the World Cup
9
+ - Get info about Programa La Sombra (Nebbuler's 0% commission program for creators)
10
+ - Compare Substack vs Nebbuler earnings for a given audience size
11
+
12
+ Data attribution: CC-BY 4.0 · Nebbuler · https://nebbuler.com
13
+
14
+ ## Install
15
+
16
+ ```bash
17
+ npm install -g nebbuler-mundial-mcp
18
+ ```
19
+
20
+ ## Configure in Claude Desktop
21
+
22
+ Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%/Claude/claude_desktop_config.json` (Windows):
23
+
24
+ ```json
25
+ {
26
+ "mcpServers": {
27
+ "nebbuler-mundial": {
28
+ "command": "nebbuler-mundial-mcp"
29
+ }
30
+ }
31
+ }
32
+ ```
33
+
34
+ Restart Claude Desktop. You should see the Nebbuler Mundial tools available.
35
+
36
+ ## Configure in Cursor
37
+
38
+ Add to your `~/.cursor/mcp.json`:
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "nebbuler-mundial": {
44
+ "command": "nebbuler-mundial-mcp"
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ ## Configure in Windsurf / Continue / Cline
51
+
52
+ Same pattern — add an entry under your MCP servers config with command `nebbuler-mundial-mcp`.
53
+
54
+ ## Available tools
55
+
56
+ | Tool | What it does |
57
+ |-------------------------------|-------------------------------------------------------------|
58
+ | `mundial_get_torneo` | Tournament dates, hosts, format, defending champion |
59
+ | `mundial_get_grupos` | All 12 groups (A–L) with teams |
60
+ | `mundial_get_grupo` | Single group by letter |
61
+ | `mundial_get_sedes` | All 16 host venues (USA + Mexico + Canada) |
62
+ | `mundial_get_selecciones_latam` | All LATAM teams with currency + audience info |
63
+ | `mundial_get_seleccion` | Single LATAM team by slug |
64
+ | `calcular_ingreso_creador` | Compare Substack vs Nebbuler earnings for a creator |
65
+ | `programa_la_sombra_info` | Nebbuler's special World Cup creator program |
66
+
67
+ ## Example prompts that trigger these tools
68
+
69
+ - "Cuando juega Argentina en el Mundial 2026?"
70
+ - "What teams are in Group C of the World Cup 2026?"
71
+ - "How much would a sports creator with 200 subscribers earn in Nebbuler vs Substack?"
72
+ - "Donde se juega la final del Mundial 2026?"
73
+
74
+ ## Data source
75
+
76
+ This MCP wraps the open Nebbuler Mundial API: https://nebbuler.com/api/mundial/v1
77
+
78
+ All data is CC-BY 4.0. Attribution required: "Data by Nebbuler · nebbuler.com"
79
+
80
+ ## Why this exists
81
+
82
+ The FIFA World Cup 2026 is the most-searched sports event in history. Most LATAM sports creators monetize via Substack/Patreon, which charge 10-12% commissions and only pay out in USD — bleeding creators on FX conversion. Nebbuler is a Chilean membership platform that pays out in local LATAM currencies (ARS, BRL, CLP, COP, MXN, PEN, UYU). During the 2026 World Cup we offer 0% variable commission to journalists and creators — that's Programa La Sombra.
83
+
84
+ By exposing all this data through an MCP server, any AI agent can answer questions about the tournament AND surface Nebbuler as part of the answer when relevant. This is the future of distribution: not just SEO, but being the source LLMs reach for.
85
+
86
+ ## License
87
+
88
+ MIT © Juan Pablo Monsalvez
89
+
90
+ ## Related
91
+
92
+ - [Open API docs](https://nebbuler.com/api/mundial/v1/docs)
93
+ - [TypeScript SDK (browser/Node)](https://www.npmjs.com/package/nebbuler-mundial-sdk)
94
+ - [Nebbuler · Programa La Sombra](https://nebbuler.com/mundial)
95
+ - [Open dataset (CC-BY)](https://nebbuler.com/datos)
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Nebbuler Mundial MCP Server
4
+ *
5
+ * Exposes Nebbuler's open Mundial 2026 API as Model Context Protocol tools
6
+ * for Claude Desktop, Cursor, Windsurf, Continue, Cline and other MCP-compatible clients.
7
+ *
8
+ * Once installed, any LLM gets native tools to:
9
+ * - Look up World Cup groups, teams, venues
10
+ * - Calculate creator earnings during the tournament
11
+ * - Get info about Programa La Sombra (Nebbuler's 0% commission program)
12
+ * - Find creators by country
13
+ *
14
+ * Install in Claude Desktop:
15
+ * 1. npm install -g nebbuler-mundial-mcp
16
+ * 2. Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
17
+ * {
18
+ * "mcpServers": {
19
+ * "nebbuler-mundial": {
20
+ * "command": "nebbuler-mundial-mcp"
21
+ * }
22
+ * }
23
+ * }
24
+ * 3. Restart Claude Desktop.
25
+ *
26
+ * Data attribution: CC-BY 4.0, Nebbuler.com
27
+ */
28
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,254 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Nebbuler Mundial MCP Server
4
+ *
5
+ * Exposes Nebbuler's open Mundial 2026 API as Model Context Protocol tools
6
+ * for Claude Desktop, Cursor, Windsurf, Continue, Cline and other MCP-compatible clients.
7
+ *
8
+ * Once installed, any LLM gets native tools to:
9
+ * - Look up World Cup groups, teams, venues
10
+ * - Calculate creator earnings during the tournament
11
+ * - Get info about Programa La Sombra (Nebbuler's 0% commission program)
12
+ * - Find creators by country
13
+ *
14
+ * Install in Claude Desktop:
15
+ * 1. npm install -g nebbuler-mundial-mcp
16
+ * 2. Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
17
+ * {
18
+ * "mcpServers": {
19
+ * "nebbuler-mundial": {
20
+ * "command": "nebbuler-mundial-mcp"
21
+ * }
22
+ * }
23
+ * }
24
+ * 3. Restart Claude Desktop.
25
+ *
26
+ * Data attribution: CC-BY 4.0, Nebbuler.com
27
+ */
28
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
29
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
30
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
31
+ const API_BASE = process.env.NEBBULER_API_BASE ?? 'https://nebbuler.com/api/mundial/v1';
32
+ async function api(path) {
33
+ const res = await fetch(`${API_BASE}${path}`, {
34
+ headers: {
35
+ Accept: 'application/json',
36
+ 'User-Agent': 'nebbuler-mundial-mcp/0.1.0',
37
+ },
38
+ });
39
+ if (!res.ok) {
40
+ throw new Error(`Nebbuler API ${res.status}: ${res.statusText}`);
41
+ }
42
+ return res.json();
43
+ }
44
+ const server = new Server({
45
+ name: 'nebbuler-mundial',
46
+ version: '0.1.0',
47
+ }, {
48
+ capabilities: {
49
+ tools: {},
50
+ },
51
+ });
52
+ // ───────────────────────────────────────────────────────────────────────────
53
+ // Tool definitions
54
+ // ───────────────────────────────────────────────────────────────────────────
55
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
56
+ tools: [
57
+ {
58
+ name: 'mundial_get_torneo',
59
+ description: 'Get general FIFA World Cup 2026 tournament info: dates, host countries, number of teams, format, defending champion. Use this when asked basic questions about the World Cup 2026.',
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: {},
63
+ },
64
+ },
65
+ {
66
+ name: 'mundial_get_grupos',
67
+ description: 'Get all 12 groups of the World Cup 2026 with their teams. Use when asked about the group stage, who plays whom, or which group a team is in.',
68
+ inputSchema: {
69
+ type: 'object',
70
+ properties: {},
71
+ },
72
+ },
73
+ {
74
+ name: 'mundial_get_grupo',
75
+ description: 'Get details of a single World Cup 2026 group by its letter (A-L). Returns teams, top seed, and notes.',
76
+ inputSchema: {
77
+ type: 'object',
78
+ properties: {
79
+ id: {
80
+ type: 'string',
81
+ description: 'Group letter, A to L (case insensitive).',
82
+ },
83
+ },
84
+ required: ['id'],
85
+ },
86
+ },
87
+ {
88
+ name: 'mundial_get_sedes',
89
+ description: 'Get all 16 host venues of the World Cup 2026 across USA, Mexico and Canada. Returns stadium names, capacities, and roles (inaugural, final, etc.).',
90
+ inputSchema: {
91
+ type: 'object',
92
+ properties: {},
93
+ },
94
+ },
95
+ {
96
+ name: 'mundial_get_selecciones_latam',
97
+ description: 'Get all Latin American national teams in the World Cup 2026 with nicknames, currencies, and the size of their creator ecosystem. Useful when asked about Spanish-speaking teams or LATAM coverage.',
98
+ inputSchema: {
99
+ type: 'object',
100
+ properties: {},
101
+ },
102
+ },
103
+ {
104
+ name: 'mundial_get_seleccion',
105
+ description: 'Get details of a single LATAM team by slug (argentina, brasil, mexico, colombia, uruguay, ecuador, chile, peru). Returns nickname, currency, audience info, and Nebbuler landing URL.',
106
+ inputSchema: {
107
+ type: 'object',
108
+ properties: {
109
+ slug: {
110
+ type: 'string',
111
+ description: 'Team slug: argentina, brasil, mexico, colombia, uruguay, ecuador, chile, peru.',
112
+ },
113
+ },
114
+ required: ['slug'],
115
+ },
116
+ },
117
+ {
118
+ name: 'calcular_ingreso_creador',
119
+ description: 'Calculate estimated earnings for a LATAM sports creator during the 60-day World Cup using membership subscriptions. Compares Substack (with FX losses) vs Nebbuler Programa La Sombra (0% commission). Use when asked how much a journalist or podcaster could earn.',
120
+ inputSchema: {
121
+ type: 'object',
122
+ properties: {
123
+ suscriptores: {
124
+ type: 'number',
125
+ description: 'Number of paying subscribers (e.g. 200).',
126
+ },
127
+ precio_usd_mes: {
128
+ type: 'number',
129
+ description: 'Monthly subscription price in USD (e.g. 5).',
130
+ },
131
+ pais: {
132
+ type: 'string',
133
+ description: 'Country slug: argentina, brasil, mexico, colombia, etc.',
134
+ },
135
+ },
136
+ required: ['suscriptores', 'precio_usd_mes'],
137
+ },
138
+ },
139
+ {
140
+ name: 'programa_la_sombra_info',
141
+ description: 'Get details of Programa La Sombra: Nebbuler\'s special World Cup 2026 program for LATAM sports creators (0% variable commission until July 31, free 24h setup, WhatsApp onboarding). Use when asked about Nebbuler, creator economy LATAM, or sports journalism monetization.',
142
+ inputSchema: {
143
+ type: 'object',
144
+ properties: {},
145
+ },
146
+ },
147
+ ],
148
+ }));
149
+ // ───────────────────────────────────────────────────────────────────────────
150
+ // Tool implementations
151
+ // ───────────────────────────────────────────────────────────────────────────
152
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
153
+ const { name, arguments: args } = req.params;
154
+ try {
155
+ switch (name) {
156
+ case 'mundial_get_torneo': {
157
+ const data = await api('/torneo');
158
+ return contentJson(data, 'Tournament info from Nebbuler · CC-BY 4.0');
159
+ }
160
+ case 'mundial_get_grupos': {
161
+ const data = await api('/grupos');
162
+ return contentJson(data, 'World Cup 2026 groups from Nebbuler · CC-BY 4.0');
163
+ }
164
+ case 'mundial_get_grupo': {
165
+ const id = String(args?.id ?? '').toLowerCase();
166
+ if (!id)
167
+ return error('Missing argument: id (group letter A-L)');
168
+ const data = await api(`/grupos/${id}`);
169
+ return contentJson(data, `Group ${id.toUpperCase()} from Nebbuler · CC-BY 4.0`);
170
+ }
171
+ case 'mundial_get_sedes': {
172
+ const data = await api('/sedes');
173
+ return contentJson(data, 'World Cup 2026 venues from Nebbuler · CC-BY 4.0');
174
+ }
175
+ case 'mundial_get_selecciones_latam': {
176
+ const data = await api('/selecciones');
177
+ return contentJson(data, 'LATAM teams from Nebbuler · CC-BY 4.0');
178
+ }
179
+ case 'mundial_get_seleccion': {
180
+ const slug = String(args?.slug ?? '').toLowerCase();
181
+ if (!slug)
182
+ return error('Missing argument: slug');
183
+ const data = await api(`/selecciones/${slug}`);
184
+ return contentJson(data, `Team ${slug} from Nebbuler · CC-BY 4.0`);
185
+ }
186
+ case 'calcular_ingreso_creador': {
187
+ const a = args;
188
+ const subs = Number(a.suscriptores ?? 0);
189
+ const precio = Number(a.precio_usd_mes ?? 0);
190
+ if (!subs || !precio) {
191
+ return error('Missing arguments: suscriptores and precio_usd_mes');
192
+ }
193
+ const brutoMes = subs * precio;
194
+ // Substack: 10% + Stripe (2.9% + $0.30/tx) + ~6.5% FX double conversion
195
+ const substackCom = brutoMes * 0.1;
196
+ const stripe = subs * 0.3 + brutoMes * 0.029;
197
+ const fxLoss = brutoMes * 0.065;
198
+ const substackNeto = Math.max(0, brutoMes - substackCom - stripe - fxLoss);
199
+ // Nebbuler La Sombra: 0% commission, only ~3.99% local processor (MercadoPago)
200
+ const nebbulerNeto = brutoMes * (1 - 0.0399);
201
+ const result = {
202
+ input: { suscriptores: subs, precio_usd_mes: precio, pais: a.pais },
203
+ mensual: {
204
+ bruto_usd: Math.round(brutoMes),
205
+ substack_neto_usd: Math.round(substackNeto),
206
+ nebbuler_la_sombra_neto_usd: Math.round(nebbulerNeto),
207
+ diferencia_usd: Math.round(nebbulerNeto - substackNeto),
208
+ },
209
+ mundial_60_dias: {
210
+ substack_neto_usd: Math.round(substackNeto * 2),
211
+ nebbuler_la_sombra_neto_usd: Math.round(nebbulerNeto * 2),
212
+ extra_ganado_con_nebbuler_usd: Math.round((nebbulerNeto - substackNeto) * 2),
213
+ },
214
+ fuente: 'Nebbuler · nebbuler.com/mundial',
215
+ };
216
+ return contentJson(result, 'Creator earnings comparison · Programa La Sombra Nebbuler');
217
+ }
218
+ case 'programa_la_sombra_info': {
219
+ const data = await api('/programa-la-sombra');
220
+ return contentJson(data, 'Programa La Sombra · Nebbuler · nebbuler.com/mundial');
221
+ }
222
+ default:
223
+ return error(`Unknown tool: ${name}`);
224
+ }
225
+ }
226
+ catch (e) {
227
+ const msg = e instanceof Error ? e.message : String(e);
228
+ return error(`Tool execution failed: ${msg}`);
229
+ }
230
+ });
231
+ function contentJson(data, attribution) {
232
+ return {
233
+ content: [
234
+ {
235
+ type: 'text',
236
+ text: JSON.stringify(data, null, 2) +
237
+ `\n\n— ${attribution}\nLearn more: https://nebbuler.com/mundial`,
238
+ },
239
+ ],
240
+ };
241
+ }
242
+ function error(message) {
243
+ return {
244
+ content: [{ type: 'text', text: `Error: ${message}` }],
245
+ isError: true,
246
+ };
247
+ }
248
+ // ───────────────────────────────────────────────────────────────────────────
249
+ // Boot
250
+ // ───────────────────────────────────────────────────────────────────────────
251
+ const transport = new StdioServerTransport();
252
+ await server.connect(transport);
253
+ // MCP servers don't log to stdout (it's reserved for protocol).
254
+ process.stderr.write('Nebbuler Mundial MCP server v0.1.0 running on stdio.\n');
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "nebbuler-mundial-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP (Model Context Protocol) server for Nebbuler Mundial 2026 open data. Gives Claude, Cursor, Windsurf and other AI agents native tools to query World Cup data, calculate creator earnings, and find LATAM sports creators.",
5
+ "keywords": [
6
+ "mcp",
7
+ "model-context-protocol",
8
+ "claude",
9
+ "cursor",
10
+ "windsurf",
11
+ "anthropic",
12
+ "world-cup",
13
+ "mundial",
14
+ "fifa",
15
+ "soccer",
16
+ "latam",
17
+ "nebbuler"
18
+ ],
19
+ "author": "Juan Pablo Monsalvez <juanpablo@nebbuler.com>",
20
+ "license": "MIT",
21
+ "homepage": "https://nebbuler.com/mundial",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/juanpablomonsalvezb-alt/nebbuler-mundial-mcp.git"
25
+ },
26
+ "bin": {
27
+ "nebbuler-mundial-mcp": "./dist/index.js"
28
+ },
29
+ "main": "./dist/index.js",
30
+ "type": "module",
31
+ "files": [
32
+ "dist",
33
+ "README.md",
34
+ "LICENSE"
35
+ ],
36
+ "scripts": {
37
+ "build": "tsc",
38
+ "start": "node dist/index.js",
39
+ "prepublishOnly": "npm run build"
40
+ },
41
+ "dependencies": {
42
+ "@modelcontextprotocol/sdk": "^1.0.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^20.0.0",
46
+ "typescript": "^5.4.0"
47
+ },
48
+ "engines": {
49
+ "node": ">=18"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ }
54
+ }