Repository navigation
Releases: semanticintent/semantic-chirp-intelligence-mcp
Release list
v4.10.4 — directory policy
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_picktold the model to use
draft_kitfirst;read_ice,set_opponent_rosterand achirp_draft_pickparameter pointed atset_roster
(hidden on the hosted endpoint);read_icenamed a schema file;get_streaming_recommendationsnamed
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
A seventh test through Claude, against 4.10.2. The new descriptions matched the tools; this fixes the leftovers.
Fixed
ice/get_roster_transaction_recommendationsfilled 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_streamsand goalie results inget_streaming_recommendationslist only the best goalie per club,
and the method says so. search_playersreturnedon_your_rosterwhile its schema offered no roster. It now takesroster_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_streamsdate examples
are 2026,team_needssays what it actually does, andmin_upside_scoreno longer claims a higher bar gives "more
genuine opportunities" — it returns fewer candidates.
v4.10.2 — tool descriptions
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_streamssaid 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 mentionsassume_rostered.search_playerspromised "available players (free agents)"; it searches every NHL player, ranked on last season.get_player_statssaid it needs a player ID; it has taken names since v4, and its parameter hint now says so.analyze_weekend_streamsdescribed ">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_opponentand
chirp_draft_picknow 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
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_recommendationsranked goalies their own way —
suggesting .877 and .883 goalies, two from one club (who split its starts), each with a negativepointsstanding in
for a rank. One sharedgoalieScore(expected starts, opposing attack, save %) now drivesanalyze_goalie_streams,
get_streaming_recommendationsandice;iceoffers at most one goalie per club, carries nopointsfor 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_streamslimits 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_pickmade 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_valueignoredenable_chirp: false. It now returns no chirp when asked not to.analyze_tradecalled a 4–3 category loss "a donation". A one-category margin now reads as the close call it is,
either way.draft_kitlisted a player among playoff schedule winners and decline risks without saying so; schedule winners
now carryalso_decline_risk: truewhen both apply.
v4.10.0 — assume_rostered
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_rosteredon 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 boardchirp_draft_pickuses) are treated as rostered for that call. Off by default. When applied,
the result carriesassume_rostered: { count, note }saying it is an assumption, not ownership data.
Fixed
- The two goalie tools disagreed.
get_streaming_recommendationswith G left out opponent attack strength, so it
led with a goalie facing two strong offences whileanalyze_goalie_streamsled with another. Both now use the same
score (expected starts, opposing attack, save %), and name the same goalie first. read_icestart, 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.icenamed 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_valuecould leave a favoured club out of both lists. Every favoured club is now inbest_schedules.draft_kitlisted a player as a target and indecline_riskat 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 ahold
call — it now says keep every slot filled. A goalie pick is "the Nth player on the board", not "best producer".
get_team_roster'sselected_positionsays LW/RW, not L/R. Weekend results omit an emptyfit_reason.
v4.9.3 — fourth review
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_picknever suggested a goalie, even withroster_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 orderdraft_kitandsearch_playersuse — 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_valuecould put a club it recommends targeting inworst_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_streamscalled 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_recommendationsignoredtarget_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_recommendationsranked goalies on club games alone, putting an .877 goalie near the top. Goalies
are now ordered onanalyze_goalie_streams' score — expected starts (club games × last season's start share) and
save % percentile — and the reasoning shows both.get_games_in_handlabelled advice inconsistently withice: behind is nowvolume_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_playerssaid "L" / "R"; it now says LW / RW like every other tool.read_iceended 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 correctnesschecksicewhen 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
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
icestill 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_handgave the advice backwards: ahead, it said to stream; behind, to protect. Ahead now says keep
every slot filled; behind says stream the busiest clubs. Theread_icegames-in-hand line follows.read_icecontradicted itself: it listed a player undersitwhile 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_recommendationsand 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 givenroster_text/opponent_textnow returnroster_not_matched,
naming each line and why (or the candidates, for an ambiguous one). draft_kitignored a smallmax_per_position: anything under 5 was raised to 5. It is now honoured.analyze_goalie_streamsignored 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_streamscould 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 asanalyze_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
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
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
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.