Skip to content

feat: publishing manifests for MCP registry, Claude Code, and Gemini CLI#284

Merged
JaimeCernuda merged 9 commits into
mainfrom
fastmcp3.0
Feb 20, 2026
Merged

feat: publishing manifests for MCP registry, Claude Code, and Gemini CLI#284
JaimeCernuda merged 9 commits into
mainfrom
fastmcp3.0

Conversation

@JaimeCernuda
Copy link
Copy Markdown
Collaborator

Summary

  • server.json (MCP registry) — 16 manifests with live-extracted tool/resource/prompt metadata, named io.github.iowarp/{name}-mcp
  • Claude Code plugin marketplace.claude-plugin/marketplace.json at repo root + per-server .claude-plugin/plugin.json and .mcp.json (install via claude mcp add clio-{name} -- uvx clio-kit {name})
  • Gemini CLI extensiongemini-extension.json bundles all 16 servers (install via gemini extensions install)
  • Claude Desktop configclaude_desktop_config.json reference file at repo root
  • CIvalidate-server-json job in quality_control.yml, publish-to-mcp-registry and publish-to-smithery jobs in publish.yml
  • scripts/generate_server_json.py — single script generates all manifests from live FastMCP metadata
  • scripts/readme_filler.py — adds Claude Code section, fixes Gemini section (was using nonexistent --mcp flag)
  • Gitignore fixes — pandas/parquet .gitignore updated to allow publishing JSON files

Files added/modified (57 total)

Category Count
server.json (MCP registry) 16
.claude-plugin/plugin.json 16
.mcp.json (Claude Code) 16
Repo-root manifests 3 (marketplace.json, gemini-extension.json, claude_desktop_config.json)
Scripts 2 (generate_server_json.py new, readme_filler.py updated)
CI workflows 2 (publish.yml, quality_control.yml)
Gitignore fixes 2 (pandas, parquet)

Test plan

  • ruff check and ruff format --check pass on all modified scripts
  • All 52 generated JSON files validate (well-formed, required fields present)
  • validate-server-json CI logic tested locally on compression and hdf5
  • Existing test suites pass (compression: 33, parquet: 245, node-hardware: 121+)
  • CI workflows run on GitHub (publish jobs only trigger on tag push)
  • Manual: verify Claude Code marketplace install works

Manual steps needed after merge

  1. Create SMITHERY_TOKEN GitHub secret for Smithery publishing
  2. Update PyPI trusted publisher to use publish.yml workflow

JaimeCernuda and others added 9 commits February 18, 2026 09:45
Phase 1 - CI/CD fixes and bug squashing:
- Fix .codecov.yml paths (agent-toolkit -> clio-kit) and add missing flags
- Remove continue-on-error from quality_control.yml for ruff/test/security
- Delete redundant test-mcps.yml workflow
- Fix docs-and-website.yml branch target (dev -> main)
- Fix pandas: add missing hypothesis_testing import
- Fix jarvis: remove dead mcp.run(transport="sse") call
- Fix compression: add decompress_file tool

Phase 2 - Structural standardization:
- Standardize all FastMCP() names to kebab-case matching directory
- Convert 12 flat-layout servers to proper src/{name}_mcp/ packages
- Standardize build backend to hatchling across all servers
- Standardize transport to stdio/http with argparse + env var fallback

Phase 3 - FastMCP 3.0 upgrade (all 16 servers):
- Bump fastmcp dependency to >=3.0.0rc2
- Add instructions= to all FastMCP() constructors
- Add annotations= (readOnlyHint, destructiveHint, idempotentHint) to all tools
- Add tags= to all tools for categorization
- Replace ad-hoc error dicts with raise ToolError() from fastmcp.exceptions
- Add @mcp.resource() (at least 1 per server)
- Add @mcp.prompt() with Message from fastmcp.prompts (at least 1 per server)
- Trim verbose tool descriptions to 1-2 sentences
- Use Annotated[type, Field(description=...)] for parameter docs
- Add list_page_size=10 for servers with 10+ tools
- Update all tests for v3 API (no more FunctionTool/.fn() patterns)
4A: Replace AST-based doc generation with FastMCP 3.0 metadata extraction
- New scripts/extract_mcp_metadata.py imports servers via async API
- generate_docs.py uses subprocess per-server instead of AST parsing
- readme_filler.py rewritten to use real tool/resource/prompt metadata
- Includes annotations, tags, and resource templates in extracted data

4B: Consolidate Python version test matrix
- Merge 4 separate jobs (test, python-3-10, python-3-11, python-3-12)
  into single matrix job with python-version: ["3.10", "3.11", "3.12"]
- Coverage upload only on 3.12
- continue-on-error only for 3.10 and 3.11

4C: Add FastMCP validation CI job
- New validate-fastmcp job in quality_control.yml
- scripts/validate_fastmcp.py checks: instructions, annotations,
  tags, resources (static + templates), and prompts per server

4D: Create reusable composite action for MCP setup
- .github/actions/setup-mcp/action.yml handles uv + Python + deps
- Used by ruff, mypy, test, security, and validate-fastmcp jobs
- parquet: add ToolError wrapper for handler error responses
- paraview: add list_page_size=10 for catalog pagination (28 tools)
- node-hardware: replace old isError/content/_meta dict with clean return
- node-hardware: update test to match new health_check return format
- Update FastMCP version references (0.2.0 -> 3.0.0rc2)
- Add FastMCP 3.0 server pattern with annotations, tags, ToolError, resources, prompts
- Add key imports reference
- Update "Adding a New MCP Server" with all required FastMCP 3.0 features
- Update CI/CD section with validate-fastmcp job and composite action
- Add new files to Important Files Reference
- Add paraview to server list (was missing)
…data

Updated tool counts, descriptions, and metadata from FastMCP 3.0 async API.
All 16 servers now reflected with correct tool/resource/prompt counts.
…ini CLI

Add server.json (MCP registry), .claude-plugin/plugin.json and .mcp.json
(Claude Code marketplace), gemini-extension.json (Gemini CLI extension),
and claude_desktop_config.json (Claude Desktop reference config) for all
16 MCP servers.

- New generate_server_json.py script extracts live FastMCP metadata and
  produces all manifest files in one pass
- Update publish.yml with MCP registry (mcp-publisher) and Smithery jobs
- Update quality_control.yml with server.json validation job
- Update readme_filler.py with correct Gemini CLI and Claude Code sections
- Fix pandas/parquet .gitignore to allow publishing JSON files
- Remove unused imports (F401): asyncio, sys, os, ToolError across
  arxiv, chronolog, node-hardware, parallel-sort, plot, slurm
- Apply ruff format to all server and test files
- Add S104 to ndp ruff ignore (intentional 0.0.0.0 binding for HTTP)
@akougkas
Copy link
Copy Markdown
Contributor

Awesome. I love it. Particularly the one-sweep to upgrade and standardize all servers. Thanks man. I also liked the publishing as packages cleanup.
here are some minor cleanups my agent suggested.
Issue: No uv cache in CI
Severity: Low
Detail: 60+ parallel jobs all install fresh. actions/cache for uv would cut CI time ~30-50%
────────────────────────────────────────
Issue: Dev version format
Severity: Low
Detail: Uses RUN_NUMBER which isn't monotonic across retries — could create duplicates on
TestPyPI
────────────────────────────────────────
Issue: 60s subprocess timeout
Severity: Low
Detail: generate_server_json.py extraction timeout could fail on slow CI runners
────────────────────────────────────────
Issue: MyPy advisory-only
Severity: Low
Detail: continue-on-error: true means type errors accumulate silently
────────────────────────────────────────
Issue: HDF5 docstring
Severity: Trivial
Detail: Still references "FastMCP 2.0 patterns" but code is 3.0

@JaimeCernuda JaimeCernuda merged commit f06d199 into main Feb 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants