Claude-skill-registry-data mcp-async-skill
Generate Skills from HTTP MCP servers with async job patterns (submit/status/result). Use when converting MCP specifications (.mcp.json) into reusable Skills using mcp_tool_catalog.yaml, or when calling async MCP tools via JSON-RPC 2.0 with session-based polling.
git clone https://github.com/majiayu000/claude-skill-registry-data
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry-data "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/mcp-async-skill" ~/.claude/skills/majiayu000-claude-skill-registry-data-mcp-async-skill && rm -rf "$T"
data/mcp-async-skill/SKILL.mdMCP Async Skill Generator
Generate reusable Skills from HTTP MCP servers that use async job patterns.
When to Use
- Converting
into a packaged Skill (tool info is fetched from catalog).mcp.json - Calling async MCP tools: submit → poll status → get result → download
- Integrating image/video generation MCPs (fal.ai, Replicate, etc.)
File Upload (for image/audio/video inputs)
Many MCPs require URL inputs for media files. Use
fal_client to upload local files:
# Upload file and get URL (one-liner) python -c "import fal_client; url=fal_client.upload_file(r'/path/to/file.png'); print(f'URL: {url}')" # Examples for different platforms: # Windows python -c "import fal_client; url=fal_client.upload_file(r'C:\Users\name\image.png'); print(f'URL: {url}')" # Linux/Mac python -c "import fal_client; url=fal_client.upload_file('/home/user/image.png'); print(f'URL: {url}')" # Android (Termux) python -c "import fal_client; url=fal_client.upload_file('/storage/emulated/0/Download/image.png'); print(f'URL: {url}')"
The returned URL (e.g.,
https://v3b.fal.media/files/...) can be used in image_url, image_urls, audio_url, etc. parameters.
Supported formats: png, jpg, jpeg, gif, webp, mp3, wav, mp4, webm, etc.
Quick Start
Generate Skill from MCP Config (Recommended)
Tool information is automatically fetched from
mcp_tool_catalog.yaml:
python scripts/generate_skill.py \ --mcp-config /path/to/.mcp.json
Output:
.claude/skills/<skill-name>/SKILL.md
The server name in
.mcp.json is used to look up tools from the catalog.
Generate Skill with Legacy tools.info
If you have a local
tools.info file:
python scripts/generate_skill.py \ --mcp-config /path/to/.mcp.json \ --tools-info /path/to/tools.info \ --name my-mcp-skill
Specify Custom Output Directory
python scripts/generate_skill.py \ --mcp-config /path/to/.mcp.json \ --output /custom/path
Direct Async Tool Call
python scripts/mcp_async_call.py \ --endpoint "https://mcp.example.com/sse" \ --submit-tool "generate_image" \ --status-tool "check_status" \ --result-tool "get_result" \ --args '{"prompt": "a cat"}' \ --output ./output
Async Pattern Flow
1. SUBMIT → POST JSON-RPC → Get session_id 2. STATUS → Poll with session_id → Wait for "completed" 3. RESULT → Get download URL 4. DOWNLOAD → Save file locally
JSON-RPC 2.0 Format
All MCP calls use this structure:
{ "jsonrpc": "2.0", "id": "unique-id", "method": "tools/call", "params": { "name": "tool_name", "arguments": { "key": "value" } } }
Input File Formats
.mcp.json
The server
name must match a server id in the catalog:
{ "mcpServers": { "t2i-kamui-fal-flux-lora": { "type": "http", "url": "https://kamui-code.ai/t2i/fal/flux-lora", "headers": { "KAMUI-CODE-PASS": "your-pass" } } } }
Or direct format:
{ "name": "t2i-kamui-fal-flux-lora", "url": "https://kamui-code.ai/t2i/fal/flux-lora", "auth_header": "KAMUI-CODE-PASS", "auth_value": "your-pass" }
mcp_tool_catalog.yaml (Auto-fetched)
Tool information is fetched from:
https://raw.githubusercontent.com/Yumeno/kamuicode-config-manager/main/mcp_tool_catalog.yaml
The catalog contains 266+ servers with tool definitions:
servers: - id: t2i-kamui-fal-flux-lora status: online tools: - name: flux_lora_submit description: Submit Flux LoRA image generation request inputSchema: properties: prompt: description: Image prompt type: string required: - prompt type: object
tools.info (Legacy)
Optional, for backward compatibility:
[ { "name": "generate", "description": "Generate content", "inputSchema": { "type": "object", "properties": { "prompt": { "type": "string", "description": "Input prompt" } }, "required": ["prompt"] } } ]
Script Reference
scripts/mcp_async_call.py
scripts/mcp_async_call.pyMain async MCP caller with full flow automation.
Options:
: MCP server URL--endpoint, -e
: Tool name for job submission--submit-tool
: Tool name for status checking--status-tool
: Tool name for result retrieval--result-tool
: Submit arguments as JSON string--args, -a
: Load arguments from JSON file--args-file
: Output directory (default: ./output)--output, -o
: Seconds between polls (default: 2.0)--poll-interval
: Maximum poll attempts (default: 300)--max-polls
: Add custom header (format:--header
)Key:Value
: Load endpoint from .mcp.json--config, -c
scripts/generate_skill.py
scripts/generate_skill.pyGenerate complete Skill from MCP specifications.
Options:
: Path to .mcp.json (required)--mcp-config, -m
: Path to tools.info (optional, legacy mode)--tools-info, -t
: Output directory--output, -o
: Skill name (auto-detected if omitted)--name, -n
: Custom catalog URL (default: GitHub raw URL)--catalog-url
Requirements:
(for catalog fetching)pip install pyyaml requests
Generated Skill Structure
Skills are generated to
.claude/skills/<skill-name>/:
.claude/skills/ └── skill-name/ ├── SKILL.md # Usage documentation ├── scripts/ │ ├── mcp_async_call.py # Core async caller │ └── skill_name.py # Convenience wrapper └── references/ ├── mcp.json # Original MCP config └── tools.json # Original tool specs
Common Status Values
| Status | Meaning |
|---|---|
, | Job waiting |
, | In progress |
, , | Finished |
, | Failed |
Programmatic Usage
from scripts.mcp_async_call import run_async_mcp_job result = run_async_mcp_job( endpoint="https://mcp.example.com/sse", submit_tool="generate", submit_args={"prompt": "sunset over mountains"}, status_tool="status", result_tool="result", output_path="./output", poll_interval=2.0, max_polls=300, ) print(result["saved_path"]) # Path to downloaded file
Error Handling
The script handles:
- JSON-RPC errors in response
- Job failures (status: failed/error)
- Timeout after max polls
- Download failures
All errors raise exceptions with descriptive messages.