Releases: ghul0/club-mcp
Release list
v0.0.3 — pnpm-aware SBOM, CHANGELOG populated
Patch release. No runtime behaviour changes vs v0.0.2 — same 13 tools, same Zod schemas, same upstream calls. Publishes a fresh tarball pair only so the release workflow run is fully green end-to-end.
What changed
release.ymlSBOM step switched to@cyclonedx/cdxgen --type pnpm. The previous tool (@cyclonedx/cyclonedx-npm) shells out tonpm ls, which doesn't understand pnpm workspace symlinks and exited 254 on the v0.0.2 run. cdxgen has native pnpm support. SBOM artifact is now attached to this run as expected.FETCH_LICENSE=trueso license metadata is included..gitignore:.playwright-mcp/added so browser-automation scratch never lands in commits.CHANGELOG.mdpopulated with full v0.0.1 / v0.0.2 / v0.0.3 entries.
Install
npx -y @hhc-mcp/stdio@0.0.3Same Claude Desktop config snippet as v0.0.2 — just bump the version pin.
Supply chain
- Sigstore provenance via npm OIDC:
- SBOM (CycloneDX, pnpm-aware) attached as
sbomartifact on the release.yml run.
PR: #81 · Merge commit: 1470f5d
v0.0.2 — contract drift cleanup
First fully contract-compliant release of @hhc-mcp/core and @hhc-mcp/stdio. v0.0.1 was tagged but never reached npm (auth gap). v0.0.2 is the first version on the registry, with all 13 tools matching docs/read-only-tools.md.
Install
npx -y @hhc-mcp/stdio@0.0.2Add to Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%/Claude/claude_desktop_config.json on Windows):
{
"mcpServers": {
"hhc": {
"command": "npx",
"args": ["-y", "@hhc-mcp/stdio@0.0.2"],
"env": {
"HHC_BASE_URL": "https://your-fluent-site.example",
"HHC_USER": "your-wp-username",
"HHC_APP_PASS": "xxxx xxxx xxxx xxxx xxxx xxxx"
}
}
}
}What's in the box
13 read-only tools backed only by upstream GETs:
club_search_members, club_get_profile, club_get_my_profile, club_list_spaces, club_list_courses, club_get_feed, club_get_feed_comments, club_get_user_comments, club_get_recent_posts, club_get_recent_comments, club_get_since_summary, club_get_unread_notifications, club_search_content.
Contract conformance (vs v0.0.1)
v0.0.1 was tagged but did not publish; on review it drifted from docs/read-only-tools.md in 19 distinct ways. v0.0.2 resolves all of them across 4 review waves (PR #77).
Inputs (wave 1) — 6 tools were accepting params but silently ignoring them: get_user_comments.since, get_recent_posts.space + missing feed_base_url=feeds and order_by_type=new_activity, search_content.since, list_spaces.{include_members,member_limit}, list_courses.include_sections, get_my_profile.include_private_fields. All now wired through to upstream.
Output field naming (wave 2) — schemas leaked upstream names. Renamed per docs: message→message_text, message_rendered→message_html, short_description→short_description_text/_html (profile), cover_photo added, nested post.{id,title,permalink} and space.{slug,title} on comments, pagination.{current_page,has_more} on get_user_comments, unread_count on notifications.
Output shapes (wave 2) — get_since_summary now returns {new_posts[],new_comments[],edited_comments[],counts,scan_metadata} instead of {since,posts,comments}. search_content returns {results[].{kind,score?,matched_field,member?,post?,comment?},counts,scan_metadata}. edited_comments[] carry edit_reason.
Output sanitization (wave 2) — validateOutput in stdio now returns parsed.data so Zod .strip() is a real final sanitizer. include_private_fields semantics moved from core schema to stdio transport: schema accepts email always; stdio handler redacts unless the caller opts in.
Correctness (waves 3-4) — search_content now paginates /feeds up to scan_feed_limit (was: single page max 100), uses search=&search_in[]=post_content&per_page=100 for post search, applies a global limit cap across combined results (members → posts → comments), filters members by since on last_activity, carries the source Feed through comment hits so post/space context is preserved when include_posts=false. get_user_comments filters by since page-by-page (was: filter after limit truncation), uses ProfileCommentsResponseSchema to backfill author from envelope-level xprofile, sets pagination.has_more=true when client-side limit truncates a page with remaining items. get_recent_posts removed unsafe early-stop (created_at is non-monotonic under new_activity sort). get_since_summary.scan_metadata is plumbed from getRecentComments (was: hardcoded scanned_feeds:0).
Validation (wave 1) — query is now trimmed and rejects control characters per docs common rule.
Hard caps (wave 1) — search_content enforces a 2000-scanned-comment cap.
Tests
492 tests passing on merge (423 core + 69 stdio). Coverage gate deferred to v0.1.0.
Supply chain
- Both packages signed with Sigstore (npm provenance via OIDC). View attestation on the npm package page:
workspace:*correctly rewritten bypnpm publish:@hhc-mcp/stdio@0.0.2depends on a concrete@hhc-mcp/core@0.0.2.
Known issues
- SBOM step in release.yml failed (
@cyclonedx/cyclonedx-npmusesnpm ls, which doesn't understand pnpm workspace symlinks). Will be fixed in v0.0.3. Packages were published before SBOM ran, so the failure does not affect what is on the registry.
Full review history
PR #77 went through four review waves (operator-led, all REQUEST_CHANGES). Commits on the branch: c96a275 (wave 1), d50e8ae, 2500738 (wave 2), 1c3ce74 (wave 3), 5309436 (wave 4). Squash-merged as 7666312.