@claudinho/mcp 0.8.5 → 0.8.6

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 (2) hide show
  1. package/dist/index.js +21 -11
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -302,8 +302,8 @@ var ES = {
302
302
  "bracket.invalidStage": "La fase debe ser una de: R32, R16, QF, SF, 3P, F",
303
303
  "bracket.unknownStage": 'Fase desconocida "{stage}". Usa R32, R16, QF, SF, 3P o F.',
304
304
  "bracket.slot.groupWinner": "Ganador del grupo {group}",
305
- "bracket.slot.groupSecond": "2.\xBA del grupo {group}",
306
- "bracket.slot.third": "3.\xBA ({groups})",
305
+ "bracket.slot.groupSecond": "2\xBA del grupo {group}",
306
+ "bracket.slot.third": "3\xBA ({groups})",
307
307
  "bracket.slot.winner": "Ganador {stage} {n}",
308
308
  "bracket.slot.loser": "Perdedor {stage} {n}",
309
309
  "bracket.slot.tbd": "Por definir",
@@ -3094,17 +3094,24 @@ function participant(team, status) {
3094
3094
  function tbd(label) {
3095
3095
  return { label, flag: "\u{1F3F3}\uFE0F", status: "tbd" };
3096
3096
  }
3097
+ function confirmedLiveParticipant(team) {
3098
+ if (!team || team.flag === "\u{1F3F3}\uFE0F") return void 0;
3099
+ return participant(team, "confirmed");
3100
+ }
3097
3101
  function winnerLabel(ctx, stage, index) {
3098
3102
  return t(ctx.lang, "bracket.slot.winner", {
3099
3103
  stage: stageLabelI18n(ctx.lang, stage),
3100
3104
  n: String(index)
3101
3105
  });
3102
3106
  }
3103
- function resolveSlot(ref, ctx) {
3107
+ function resolveSlot(ref, ctx, liveTeam) {
3108
+ const liveParticipant = confirmedLiveParticipant(liveTeam);
3104
3109
  switch (ref.kind) {
3105
3110
  case "seed":
3111
+ if (liveParticipant) return liveParticipant;
3106
3112
  return tbd(ref.label);
3107
3113
  case "group": {
3114
+ if (liveParticipant) return liveParticipant;
3108
3115
  if (!ctx.standingsDegraded && hasGroupStarted(ref.group, ctx.tables)) {
3109
3116
  const team = teamFromStandings(ref.group, ref.position, ctx.tables);
3110
3117
  if (team) {
@@ -3116,6 +3123,7 @@ function resolveSlot(ref, ctx) {
3116
3123
  return tbd(label);
3117
3124
  }
3118
3125
  case "third":
3126
+ if (liveParticipant) return liveParticipant;
3119
3127
  return tbd(t(ctx.lang, "bracket.slot.third", { groups: ref.groups.join("/") }));
3120
3128
  case "winner": {
3121
3129
  const node = ctx.nodesByKey.get(matchKey(ref.stage, ref.index));
@@ -3124,6 +3132,7 @@ function resolveSlot(ref, ctx) {
3124
3132
  const winner = resolveWinner(match);
3125
3133
  if (winner) return participant(winner, "confirmed");
3126
3134
  }
3135
+ if (liveParticipant) return liveParticipant;
3127
3136
  return tbd(winnerLabel(ctx, ref.stage, ref.index));
3128
3137
  }
3129
3138
  case "loser": {
@@ -3133,6 +3142,7 @@ function resolveSlot(ref, ctx) {
3133
3142
  const loser = resolveLoser(match);
3134
3143
  if (loser) return participant(loser, "confirmed");
3135
3144
  }
3145
+ if (liveParticipant) return liveParticipant;
3136
3146
  return tbd(
3137
3147
  t(ctx.lang, "bracket.slot.loser", {
3138
3148
  stage: stageLabelI18n(ctx.lang, ref.stage),
@@ -3170,8 +3180,8 @@ function buildBracketView(topology, matches, tables, standingsDegraded, liveDegr
3170
3180
  stage: node.stage,
3171
3181
  index: node.index,
3172
3182
  kickoff: match.kickoff,
3173
- home: resolveSlot(node.home, ctx),
3174
- away: resolveSlot(node.away, ctx),
3183
+ home: resolveSlot(node.home, ctx, match.home),
3184
+ away: resolveSlot(node.away, ctx, match.away),
3175
3185
  match
3176
3186
  };
3177
3187
  });
@@ -4665,7 +4675,7 @@ ${matchList(todays, "No matches scheduled.", opts)}`;
4665
4675
  if (degraded) text += "\n\n(Live scores unavailable \u2014 showing the bundled schedule.)";
4666
4676
  const marketSignals = await reliableMarketData(args, todays);
4667
4677
  return {
4668
- text: withDisclaimer(text, source),
4678
+ text: withDisclaimer(text, source, args.lang),
4669
4679
  data: {
4670
4680
  date,
4671
4681
  degraded,
@@ -4683,7 +4693,7 @@ async function toolGetLive(args = {}) {
4683
4693
  const text = degraded ? "Live scores unavailable right now \u2014 could not reach the data provider." : `Live now:
4684
4694
  ${matchList(matches, "No matches in play right now.", opts)}`;
4685
4695
  return {
4686
- text: withDisclaimer(text, source),
4696
+ text: withDisclaimer(text, source, args.lang),
4687
4697
  data: { degraded, source: source ?? null, count: matches.length, matches }
4688
4698
  };
4689
4699
  }
@@ -4704,7 +4714,7 @@ async function toolGetMatch(args) {
4704
4714
  ${marketBlock(marketSignal, match).join("\n")}` : base;
4705
4715
  if (degraded) text += "\n\n(Live state unavailable \u2014 showing the scheduled fixture.)";
4706
4716
  return {
4707
- text: withDisclaimer(text, liveSource),
4717
+ text: withDisclaimer(text, liveSource, args.lang),
4708
4718
  data: {
4709
4719
  degraded,
4710
4720
  source: liveSource ?? null,
@@ -4720,14 +4730,14 @@ async function toolGetStandings(args) {
4720
4730
  const g = args.group?.toUpperCase();
4721
4731
  const msg = g ? `No group "${g}". Groups are A\u2013L.` : "No standings available.";
4722
4732
  return {
4723
- text: withDisclaimer(degraded ? `${msg} (Live standings unavailable.)` : msg, source),
4733
+ text: withDisclaimer(degraded ? `${msg} (Live standings unavailable.)` : msg, source, args.lang),
4724
4734
  data: { degraded, source: source ?? null, tables: args.group ? null : [] }
4725
4735
  };
4726
4736
  }
4727
4737
  let text = shaped.map((t2) => standingsTable(t2.group, t2.standings)).join("\n\n");
4728
4738
  if (degraded) text += "\n\n(Live standings unavailable \u2014 showing the group roster.)";
4729
4739
  return {
4730
- text: withDisclaimer(text, source),
4740
+ text: withDisclaimer(text, source, args.lang),
4731
4741
  data: { degraded, source: source ?? null, tables: args.group ? shaped[0] ?? null : shaped }
4732
4742
  };
4733
4743
  }
@@ -5046,7 +5056,7 @@ async function toolGetShareSnippet(args) {
5046
5056
 
5047
5057
  // src/server.ts
5048
5058
  var SERVER_NAME = "claudinho";
5049
- var SERVER_VERSION = "0.8.5";
5059
+ var SERVER_VERSION = "0.8.6";
5050
5060
  var VOICE = asFlavorLevel(process.env.CLAUDINHO_FLAVOR) === "off" ? "" : `
5051
5061
  Voice: when relaying scores, narrate with lively, regionally-appropriate football-commentary energy in the user's language. Each match line may end with a short exclamation ("\u2014 \xA1GOOOOL!") \u2014 use it as a tone cue. Keep every fact exact; never invent details and never impersonate or name a real commentator.`;
5052
5062
  var INSTRUCTIONS = `Claudinho serves live scores, fixtures, and group standings for the 2026 men's football tournament.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudinho/mcp",
3
- "version": "0.8.5",
3
+ "version": "0.8.6",
4
4
  "mcpName": "io.github.arturogarrido/claudinho",
5
5
  "description": "MCP server for the 2026 men's football tournament — live scores, fixtures, standings, read-only prediction-market signals, and paste-ready match cards. Works with Claude Code, Cursor, Codex, Windsurf, Zed. Not affiliated with FIFA or Anthropic.",
6
6
  "type": "module",
@@ -57,7 +57,7 @@
57
57
  "tsup": "^8.0.0",
58
58
  "typescript": "^5.7.0",
59
59
  "vitest": "^4.1.9",
60
- "@claudinho/core": "0.8.5"
60
+ "@claudinho/core": "0.8.6"
61
61
  },
62
62
  "scripts": {
63
63
  "build": "tsup",