feat: publishing manifests for MCP registry, Claude Code, and Gemini CLI#284
Conversation
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)
|
Awesome. I love it. Particularly the one-sweep to upgrade and standardize all servers. Thanks man. I also liked the publishing as packages cleanup. |
Summary
io.github.iowarp/{name}-mcp.claude-plugin/marketplace.jsonat repo root + per-server.claude-plugin/plugin.jsonand.mcp.json(install viaclaude mcp add clio-{name} -- uvx clio-kit {name})gemini-extension.jsonbundles all 16 servers (install viagemini extensions install)claude_desktop_config.jsonreference file at repo rootvalidate-server-jsonjob in quality_control.yml,publish-to-mcp-registryandpublish-to-smitheryjobs in publish.ymlscripts/generate_server_json.py— single script generates all manifests from live FastMCP metadatascripts/readme_filler.py— adds Claude Code section, fixes Gemini section (was using nonexistent--mcpflag).gitignoreupdated to allow publishing JSON filesFiles added/modified (57 total)
Test plan
ruff checkandruff format --checkpass on all modified scriptsvalidate-server-jsonCI logic tested locally on compression and hdf5Manual steps needed after merge
SMITHERY_TOKENGitHub secret for Smithery publishingpublish.ymlworkflow