Skip to content

Skill Feedback: nimblebrain-contributor + build-mcpb (Stripe server build) #3

@JoeCardoso13

Description

@JoeCardoso13

Session Summary

Built a complete Stripe MCP server (mcp-stripe) using the nimblebrain-contributor skill for onboarding/contribution workflow and the build-mcpb skill for server implementation. Final outcome: working server with 14 tools across 7 Stripe resources, 27 passing tests, published to JoeCardoso13/mcp-stripe.

Platform: WSL2 (Ubuntu) on Windows, Python 3.13, FastMCP 2.14+


nimblebrain-contributor Feedback

Step 1 — Environment Setup ⚠️ Friction

ty>=0.1.0 does not exist. The install table and pyproject.toml template pin ty>=0.1.0, but the latest release on PyPI is 0.0.17. uv sync --dev fails:

× No solution found when resolving dependencies:
╰─▶ Because only ty<=0.0.17 is available and mcp-stripe:dev depends on
    ty>=0.1.0, we can conclude that mcp-stripe:dev's requirements are
    unsatisfiable.

Suggested fix: Change constraint to "ty>=0.0.17" (or just "ty") in the template pyproject.toml and the install table.

Steps 2–3 — CLAUDE.md & Architecture ✅ Worked

No issues. Clear and well-structured.

Step 4 — Pick Work ⚠️ Friction

--label "integration" fails when label doesn't exist on the repo:

gh issue create ... --label "integration"
→ could not add label: 'integration' not found

Suggested fix: Either pre-create the label in the HQ repo, or remove --label from the skill instructions and let maintainers triage.

Step 5 — Get Started ❌ Broke

gh repo create --template fails for non-org-members:

gh repo create NimbleBrainInc/mcp-stripe \
  --template NimbleBrainInc/mcp-server-template --public --clone
→ GraphQL: JoeCardoso13 does not have the correct permissions to execute
  `CloneTemplateRepository`

Creating under personal account (JoeCardoso13/mcp-stripe) worked for the repo creation, but the bundled --clone step still failed (see below).

Suggested fix: The skill should guide a fork-based workflow for external contributors: create under personal namespace, then open a PR back to the org.

gh repo clone fails due to missing git-remote-https on WSL:

gh repo clone JoeCardoso13/mcp-stripe
→ git: 'remote-https' is not a git command. See 'git --help'.
  failed to run git: exit status 128

Plain git clone https://... worked as a fallback. This is a WSL-specific git packaging issue, but the skill could note the fallback.


build-mcpb Feedback

Phase 1 — Discover ✅ Worked

API analysis phase worked smoothly.

Phase 2 — Scaffold ⚠️ Friction

Skill assumes scaffolding from scratch, but the template repo already has a directory structure. Could clarify the "rename/adapt existing template" path vs. creating from scratch.

Phase 3 — Implement ⚠️ Friction

Template api_client.py assumes JSON request bodies (Content-Type: application/json, json=data in aiohttp). Stripe uses application/x-www-form-urlencoded for all POST requests. We had to deviate from the template pattern.

Suggested fix: Add a note in the skill that API body encoding varies by provider, and the template's JSON default should be adapted when the target API uses form-encoded, XML, GraphQL, etc.

Phase 4 — Verify ❌ Broke (two issues)

1. ty>=0.1.0 in pyproject.toml template — same issue as nimblebrain-contributor Step 1 above.

2. FastMCP 2.14+ wraps @mcp.tool() as FunctionTool objects — the test template pattern of importing and calling tool functions directly breaks:

from mcp_stripe.server import list_customers
result = await list_customers(limit=10)
→ TypeError: 'FunctionTool' object is not callable

The decorated names are FunctionTool instances, not the original async functions. Tests must either:

  • Call .fn on the tool object: await list_customers.fn(limit=10)
  • Test the underlying client methods directly (what we did)

Suggested fix: Update the test template to account for FastMCP 2.x wrapping behavior. Recommend testing client logic directly rather than calling tool-decorated functions.

Phase 5 — Validate ❌ Broke

mcpb build and mpak-scanner are not available locally:

npx mcpb --version
→ npm error 404 Not Found - GET https://registry.npmjs.org/mcpb - Not found

mpak scanner scan
→ error: unknown command 'scanner'

These tools only exist in CI (via NimbleBrainInc/mcpb-pack@v2 GitHub Action).

Suggested fix: Clarify in the skill that Phase 5 packaging validation happens in CI. Provide the local alternative for runtime validation: programmatic tools/list check via the MCP tool manager.

Phase 6–7 — Document & Ship ✅ Worked

No issues with documentation or PR preparation.

Makefile Template ⚠️ Friction (cross-cutting)

sed -i '' is macOS/BSD syntax — breaks on GNU/Linux:

# Template has:
@sed -i '' 's/^version = .*/version = "$(VERSION)"/' pyproject.toml
# GNU sed treats '' as a filename → sed: can't read : No such file or directory

Suggested fix: Use sed -i (no empty string) for GNU, or detect OS:

SED_INPLACE := $(shell if sed --version 2>/dev/null | grep -q GNU; then echo "sed -i"; else echo "sed -i ''"; fi)

Summary Table

Area Item Status
contributor Step 1 ty>=0.1.0 version ⚠️ Friction
contributor Step 4 --label "integration" ⚠️ Friction
contributor Step 5 --template for non-members ❌ Broke
contributor Step 5 git-remote-https on WSL ⚠️ Friction
build-mcpb Phase 2 Scaffold vs. existing template ⚠️ Friction
build-mcpb Phase 3 JSON vs form-encoded bodies ⚠️ Friction
build-mcpb Phase 4 ty>=0.1.0 constraint ❌ Broke
build-mcpb Phase 4 FastMCP FunctionTool wrapping ❌ Broke
build-mcpb Phase 5 mcpb/mpak-scanner local availability ❌ Broke
build-mcpb Makefile sed -i '' on Linux ⚠️ Friction

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions