Skip to content

Releases: ghul0/club-mcp

v0.0.3 — pnpm-aware SBOM, CHANGELOG populated

Choose a tag to compare

@ghul0 ghul0 released this 16 May 12:55

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.yml SBOM step switched to @cyclonedx/cdxgen --type pnpm. The previous tool (@cyclonedx/cyclonedx-npm) shells out to npm 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=true so license metadata is included.
  • .gitignore: .playwright-mcp/ added so browser-automation scratch never lands in commits.
  • CHANGELOG.md populated with full v0.0.1 / v0.0.2 / v0.0.3 entries.

Install

npx -y @hhc-mcp/stdio@0.0.3

Same Claude Desktop config snippet as v0.0.2 — just bump the version pin.

Supply chain

PR: #81 · Merge commit: 1470f5d

v0.0.2 — contract drift cleanup

Choose a tag to compare

@ghul0 ghul0 released this 16 May 12:41

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.2

Add 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: messagemessage_text, message_renderedmessage_html, short_descriptionshort_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

Known issues

  • SBOM step in release.yml failed (@cyclonedx/cyclonedx-npm uses npm 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.