Skip to content

Releases: semanticintent/semantic-chirp-intelligence-mcp

v4.10.4 — directory policy

Choose a tag to compare

@semanticintent semanticintent released this 26 Sep 01:28
b8b539d

Fixed

  • Tool descriptions no longer refer to other tools or files. The Claude directory requires descriptions with no
    instructions about other tools and no external instruction sources. chirp_draft_pick told the model to use
    draft_kit first; read_ice, set_opponent_roster and a chirp_draft_pick parameter pointed at set_roster
    (hidden on the hosted endpoint); read_ice named a schema file; get_streaming_recommendations named
    analyze_goalie_streams. Each now describes only itself. A test fails if any description names another tool or
    carries invisible or control characters.

v4.10.3 — seventh review

Choose a tag to compare

@semanticintent semanticintent released this 26 Sep 01:24
916e4e1

A seventh test through Claude, against 4.10.2. The new descriptions matched the tools; this fixes the leftovers.

Fixed

  • ice / get_roster_transaction_recommendations filled a pickup list from one club — four PHI skaters. Pickups
    are now capped across the whole list at two skaters and one goalie per club, as streaming already was.
  • Goalie lists named two goalies from one club, whose expected starts then added up to more than the club's games.
    analyze_goalie_streams and goalie results in get_streaming_recommendations list only the best goalie per club,
    and the method says so.
  • search_players returned on_your_roster while its schema offered no roster. It now takes roster_text (the
    server already honoured it), and the note says how to mark your players.
  • Candidate lines for ambiguous names said COL L; they say LW / RW everywhere now, from one shared helper.
  • Schema text: get_player_stats' example is an unambiguous "Cale Makar"; analyze_weekend_streams date examples
    are 2026, team_needs says what it actually does, and min_upside_score no longer claims a higher bar gives "more
    genuine opportunities" — it returns fewer candidates.

v4.10.2 — tool descriptions

Choose a tag to compare

@semanticintent semanticintent released this 26 Sep 01:18
561558e

The descriptions are what a client — and the Claude directory — shows for each tool. Several had drifted from what the
tools do. No behaviour changes.

Fixed

  • analyze_goalie_streams said goalies are "ranked by games in the window"; they are ranked on the stated stream score
    (expected starts, opposing attack, save %). It now says so, and mentions assume_rostered.
  • search_players promised "available players (free agents)"; it searches every NHL player, ranked on last season.
  • get_player_stats said it needs a player ID; it has taken names since v4, and its parameter hint now says so.
  • analyze_weekend_streams described ">2 week upside" and a "binary decision tree"; it now states what genuine,
    monitor and desperation actually mean.
  • get_streaming_recommendations, get_games_in_hand, compare_matchup, optimize_lineup, chirp_opponent and
    chirp_draft_pick now describe what they compute — the goalie score, hold vs. stream, the games-this-week term,
    the actual lineup checks, the idle / light / IR groups, and the need weight that grows over the first three rounds.

v4.10.1 — sixth review

Choose a tag to compare

@semanticintent semanticintent released this 26 Sep 01:13
7f1aada

A sixth test of every hosted tool through Claude, against 4.10.0. assume_rostered worked on all six tools and every
4.10.0 fix held; this fixes the goalie and draft-need findings.

Fixed

  • Three tools, three goalie orders. ice / get_roster_transaction_recommendations ranked goalies their own way —
    suggesting .877 and .883 goalies, two from one club (who split its starts), each with a negative points standing in
    for a rank. One shared goalieScore (expected starts, opposing attack, save %) now drives analyze_goalie_streams,
    get_streaming_recommendations and ice; ice offers at most one goalie per club, carries no points for goalies,
    and its reasons give expected starts and the stream score.
  • Tiny samples topped the save % scale. A goalie with five games was ranked at the 100th save % percentile. The
    percentile now applies only to goalies with 20+ games, as the method already said; others count as 50.
  • analyze_goalie_streams limits said candidates are "every goalie not on the roster you pasted" even with
    assume_rostered; they now say which top of the board was left out.
  • A stated need beat elite players at the top of the draft. At pick 3 with a G need, chirp_draft_pick made a
    goalie CRITICAL over Kucherov. The need weight now fades in over the first three rounds (full from pick 36), and a
    player flagged REACH is listed after every non-reach and never above LOW.
  • schedule_value ignored enable_chirp: false. It now returns no chirp when asked not to.
  • analyze_trade called a 4–3 category loss "a donation". A one-category margin now reads as the close call it is,
    either way.
  • draft_kit listed a player among playoff schedule winners and decline risks without saying so; schedule winners
    now carry also_decline_risk: true when both apply.

v4.10.0 — assume_rostered

Choose a tag to compare

@semanticintent semanticintent released this 26 Sep 01:00
0052a12

A fifth test of every hosted tool through Claude, against 4.9.3. Every 4.9.3 fix held and nothing blocked submission;
this adds the option the reviews kept pointing at and clears what was left.

Added

  • assume_rostered on the pickup tools (ice, get_roster_transaction_recommendations,
    get_streaming_recommendations, analyze_weekend_streams, analyze_goalie_streams, analyze_breakout_players).
    League ownership is private, so without it these tools suggest stars who are certainly taken. Pass a number — e.g.
    150 for a 12-team league — and the top N on the draft board (skaters by last season's points, a goalie every sixth
    slot; the same board chirp_draft_pick uses) are treated as rostered for that call. Off by default. When applied,
    the result carries assume_rostered: { count, note } saying it is an assumption, not ownership data.

Fixed

  • The two goalie tools disagreed. get_streaming_recommendations with G left out opponent attack strength, so it
    led with a goalie facing two strong offences while analyze_goalie_streams led with another. Both now use the same
    score (expected starts, opposing attack, save %), and name the same goalie first.
  • read_ice start, sit and bench calls ignored production. They ranked on games alone: a 0.28 P/gm depth winger
    was "enough to start" and a 1.1-projected star with one game was the soft spot. Calls now rank on projected points
    (points per game × games). A start needs two or more games, a projection at least the lineup median, and no bench
    player projecting more; the sit and "your bench has…" take compare projections, and say them.
  • ice named G as a weak position and suggested no goalie — its pickup pool held skaters only. Goalies, in the
    shared goalie order, are now offered when G is weak or asked for.
  • schedule_value could leave a favoured club out of both lists. Every favoured club is now in best_schedules.
  • draft_kit listed a player as a target and in decline_risk at once. Targets now exclude decline risks.
  • Wording: get_games_in_hand's ahead-case chirp said "Time to capitalize… and improve your game" next to a hold
    call — it now says keep every slot filled. A goalie pick is "the Nth player on the board", not "best producer".
    get_team_roster's selected_position says LW/RW, not L/R. Weekend results omit an empty fit_reason.

v4.9.3 — fourth review

Choose a tag to compare

@semanticintent semanticintent released this 26 Sep 00:50
d15099e

A fourth test of every hosted tool through Claude, against 4.9.2. All ten 4.9.2 fixes held; this fixes what it found
next.

Fixed

  • chirp_draft_pick never suggested a goalie, even with roster_needs: ["G"]. Its board was one list sorted on
    points for skaters and wins for goalies, so no goalie reached the candidates. The board is now skaters by points with
    goalies — in the shared goalie order draft_kit and search_players use — one every six slots (about two goalies to
    ten or twelve skaters), and a goalie's slot is described as "on the board", not "best producer".
  • schedule_value could put a club it recommends targeting in worst_schedules, and its chirp called that club
    "the one you draft around". Favoured clubs never appear among the worst; when every club asked about is favoured the
    chirp says so. "1 weeks" is now "1 week".
  • analyze_weekend_streams called 142 of 200 players "genuine" after 4.9.2's rescale, including one-game weekends,
    with "Genuine: Speculative opportunity" as the reason and a fixed placeholder as the drop. Genuine now needs two or
    more games in the window, a real role and real production (each 50+ of 100) at low risk; desperation is a small role
    or little production. Reasons are the facts (games, minutes, shots, power-play goals). A drop is named only from the
    roster you pasted, and only a player producing under 70% of the candidate's rate. The chirp no longer calls streams
    "season savers" and says the best of them are probably rostered.
  • get_roster_transaction_recommendations ignored target_positions (asked for RW, returned a C and a D) and its
    own weak positions. Its weak-position fixes read a list empty since v4; both paths now draw from one pool of players
    on neither roster, filtered to the positions you asked for, else your weak ones.
  • get_streaming_recommendations ranked goalies on club games alone, putting an .877 goalie near the top. Goalies
    are now ordered on analyze_goalie_streams' score — expected starts (club games × last season's start share) and
    save % percentile — and the reasoning shows both.
  • get_games_in_hand labelled advice inconsistently with ice: behind is now volume_play (add games), ahead is
    hold (keep what you have).
  • Pasted standings with a header row ("Team W-L-T") no longer turn the header into a team, and rows pasted without
    numbers are ranked in the order given.
  • search_players said "L" / "R"; it now says LW / RW like every other tool.
  • read_ice ended every light week with "That's the whole problem.", including players it tells you to start. That
    line is now only for a player it sits.

Changed

  • npm run correctness checks ice when behind by pasting a one-player roster against the five-player test roster,
    instead of skipping it before the season.

v4.9.2 — third review

Choose a tag to compare

@semanticintent semanticintent released this 26 Sep 00:39
e815b21

A third test of every hosted tool through Claude, against 4.9.1. The 4.9.1 fixes to ice's sign, schedule_value and
the fallback chirp held; this fixes what it found next — including one thing 4.9.1 claimed and did not do.

Fixed

  • ice still named nobody when you were behind. 4.9.1 said it now names real volume candidates; in practice it
    didn't, because it only considered players whose clubs play three or more games, and a short window rarely has any.
    It now takes the clubs with the most games in the window, whatever that number is, and names their best producers —
    and the chirp leads with the edge and the names ("Close it with volume: …"). When you are ahead it says to keep a full
    lineup rather than suggesting pickups.
  • get_games_in_hand gave the advice backwards: ahead, it said to stream; behind, to protect. Ahead now says keep
    every slot filled; behind says stream the busiest clubs. The read_ice games-in-hand line follows.
  • read_ice contradicted itself: it listed a player under sit while its own take said "Nobody on the bench beats
    him, so live with it." A sit call is now made only when a bench player has the better schedule; otherwise the soft
    spot is named in the take and nobody is sat.
  • Broken chirp sentences in get_games_in_hand, get_streaming_recommendations and others: a personality phrase
    spliced onto a fragment ("Elite players the schedule advantage situation.", "The data shows 5 streaming
    opportunities on the wire."). Every fallback is now a whole sentence. get_games_in_hand's tone-specific lines never
    fired at all — they checked for 'you' / 'opponent' and the tool sends a number — and now do. "On the wire" and
    "better than what you've got" are gone: league ownership is unknown.
  • Pasted names that matched nobody vanished. A misspelt or ambiguous line was dropped and the analysis ran on a
    shorter roster without saying so. Tools given roster_text / opponent_text now return roster_not_matched,
    naming each line and why (or the candidates, for an ambiguous one).
  • draft_kit ignored a small max_per_position: anything under 5 was raised to 5. It is now honoured.
  • analyze_goalie_streams ignored how well a goalie stops the puck: a .880 goalie with a busy week outranked a
    .920 one with the same week. The stream score now includes last season's save % as a percentile of the league's
    starters (55% expected starts, 25% opposition, 20% save %), and the method says so.
  • analyze_weekend_streams could never find a "genuine" play, and crashed without a roster. Its upside score mixed
    points per game ×10 with raw minutes, topping out near 25 against a bar of 55–60. Production and usage are now each
    scored 0–100 on the same scales as analyze_breakout_players (goalies on save % and share of starts); players with
    no games in the window are left out; the custom chirp now actually reaches the output, including a plain message when
    the window has no games.

Known limitation

  • Pickup suggestions (ice, streaming, weekend streams) can name stars who are certainly rostered in your league.
    League ownership is private; these are candidates to check, and the output says so.

v4.9.1 — second review

Choose a tag to compare

@semanticintent semanticintent released this 26 Sep 00:24
3d3509d

A second test of every hosted tool through Claude. The important fix: ice reported a games advantage as a deficit — a +6 edge read as games_disadvantage: 6. It now reports a signed schedule_edge with a plain-English reading, and names real volume candidates when you are genuinely behind.

Also: schedule_value recommendations now follow each club's verdict and best/worst no longer overlap; the spliced template chirp is gone; one shared goalie ranking across tools; at most two streaming candidates per club; goalie-only draft kits stay goalie-only; dates follow the NHL's Eastern calendar. See CHANGELOG.

Eight new correctness tests, each failing against 4.9.0; npm run correctness passes all 12 live checks.

v4.9.0 — correctness pass

Choose a tag to compare

@semanticintent semanticintent released this 26 Sep 00:09
16986e8

A test of every hosted tool through Claude read the answers rather than checking that they arrived, and found output that was untrue — invented line and power-play roles presented as findings, 31- and 33-year-old "breakouts", goalies ranked on a points scale, unknown ownership printed as "undefined%", an ignored position filter, a double-counting opponent scout, and standings that could never work on the hosted endpoint. All fixed; see CHANGELOG.

Adds tests/correctness.test.ts, which asserts on content and fails 13 of 14 against the previous release, and npm run correctness for a live endpoint — which now passes against the hosted connector.

v4.8.2 — the connector's icon

Choose a tag to compare

@semanticintent semanticintent released this 25 Sep 23:15
ce8a01b

Claude and its connector directory take a connector's icon from the server's own URL. chirp-mcp.semanticintent.dev answered every icon path with a 404, so the connector would have shown a generic placeholder throughout Claude. The helmeted cormorant is now served at /favicon.ico, /favicon.png, /icon.png and /apple-touch-icon.png, and the root declares it for fetchers that read HTML.