Review: groupme-mcp: MCP server for group management + messaging

review-305-2026-03-24 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Template Completeness

  • [x] Lineage -- present, references project-groupme-westside and dependency chain (Ticket 3 of 3)
  • [x] Repo -- present, forgejo_admin/groupme-mcp (to be created)
  • [x] User Story -- present, 4 stories mapped to GM-2 through GM-5
  • [x] Context -- present, explains MCP-over-SDK pattern and agent-only consumers
  • [x] File Targets -- present, 6 files in new repo structure
  • [x] Acceptance Criteria -- present, 5 criteria
  • [x] Test Expectations -- present, unit + integration + run command
  • [x] Constraints -- present, 4 constraints including uv and confirmation semantics
  • [x] Checklist -- present
  • [x] Related -- present, references project page and sibling tickets

File Targets

  • [x] New repo -- all file targets are in a repo that does not yet exist (groupme-mcp). Structure mirrors pal-e-docs-mcp pattern (src/package/server.py + tools/ subdirectory). Verified pal-e-docs-mcp has identical layout: server.py + tools/{notes,boards,blocks,etc}.py. Pattern is sound.
  • [x] pyproject.toml -- depends on groupme-sdk, which also does not exist yet. Consistent with dependency chain.
  • [x] tools/audit.py -- membership_audit tool references basketball-api DB schema (GroupMeMember table). This table does not exist yet -- it is part of issue #156 (basketball-api GroupMe data model), also in todo column.

Repo Placement

Issue filed on forgejo_admin/basketball-api (#157) but work creates a new repo forgejo_admin/groupme-mcp. This is acceptable -- the target repo does not exist yet, and basketball-api is the closest related repo. Once groupme-mcp is created, consider transferring the issue if Forgejo supports it.

Dependencies

  • groupme-sdk (issue #155, board item #303) -- in todo column. This ticket explicitly declares dependency. The SDK must be built and published to Forgejo PyPI before groupme-mcp can install it. BLOCKING dependency.
  • basketball-api GroupMe integration (issue #156, board item #304) -- in todo column. The membership_audit tool in this ticket cross-references the DB's GroupMeMember table, which is created by #156. BLOCKING dependency for the audit tool specifically.
  • GroupMe API token -- verified present at ~/secrets/groupme/credentials.env with GROUPME_ACCESS_TOKEN. Not blocked.
  • Claude settings config -- enabledMcpjsonServers list in ~/.claude/settings.json needs groupme-mcp entry. Requires corresponding mcpServers.json definition. Not blocked but not documented in the ticket.

Acceptance Criteria

  • [x] "Forgejo repo exists with CI pipeline" -- agent-executable, standard repo creation
  • [x] "MCP tools: create_group, list_groups, add_member, remove_member, list_members, send_message" -- testable with mocked SDK
  • [ ] "membership_audit tool: compare DB groupme_members vs live GroupMe API" -- ISSUE: requires GroupMeMember table from issue #156 which is not yet implemented. Cannot be built or tested until #156 lands. Either defer this tool or make the dependency explicit in acceptance criteria.
  • [x] "Configured in ~/.claude/settings.json as MCP server" -- feasible but needs mcpServers.json entry too (not just settings.json)
  • [x] "Betty Sue can run mcp__groupme__create_group from conversation" -- integration test, requires SDK published + MCP configured

Blast Radius

Low blast radius -- this is a new repo with no existing consumers. Downstream effects:
  • ~/.claude/settings.json modification affects all Claude sessions (shared config via claude-custom repo)
  • basketball-api will consume groupme-sdk (not groupme-mcp) for the contract-signing auto-invite hook
  • No other repos or services are affected

Recommendation

Two refinements needed before this ticket is READY:
  • Split or defer membership_audit -- The audit tool depends on basketball-api's GroupMeMember table (issue #156), which is a sibling ticket also in todo. Either: (a) Remove membership_audit from this ticket's scope and create a follow-up issue that depends on both #156 and #157, or (b) Add an explicit acceptance criterion noting that membership_audit is blocked by #156 and should be stubbed/skipped if #156 hasn't landed.
  • Enforce dependency ordering on board -- Both #155 (SDK) and #157 (MCP) are in the todo column. The MCP ticket cannot move to next_up until the SDK ticket (#155) moves to in_progress. Add a label like blocked-by:bball-155 to make this visible on the board.