# MCP Skill Gen

> Generate standalone skills from MCP servers. Use when users want to create a reusable skill for an MCP service. Triggers on "create skill for MCP", "generate MCP skill", "make skill from MCP server".

- Skill: `vaayne/mcp-skill-gen` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add vaayne/mcp-skill-gen`
- Raw SKILL.md: https://api.skillmd.com/api/skills/vaayne/mcp-skill-gen/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: vaayne (https://skillmd.com/u/vaayne)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/vaayne/mcp-skill-gen

---


# MCP Skill Generator

Generate reusable skills from any MCP server using `mh` CLI.

## Prerequisites

- `mh` CLI must be installed. If not available, install with:
  ```bash
  curl -fsSL https://raw.githubusercontent.com/vaayne/mcphub/main/scripts/install.sh | sh
  ```

## Workflow

### 1. Gather Input

| Parameter | Required | Default             | Example                        |
| --------- | -------- | ------------------- | ------------------------------ |
| URL       | No       | -                   | `https://mcp.exa.ai`           |
| Config    | No       | -                   | `./mcp.json`                   |
| Transport | No       | `http`              | `http` or `sse`                |
| Name      | No       | from URL or config  | `exa-search`                   |
| Output    | No       | `./<name>/SKILL.md` | `./skills/exa-search/SKILL.md` |

Notes:

- `--url/-u` and `--config/-c` are mutually exclusive
- Config mode uses the tool names returned by `mh list`, with JS-style name mapping and collision checks

### 2. Discover Tools

URL mode:

```bash
mh list -u <url> -t <transport>
```

Stdio mode:

```bash
mh list --stdio -- cmd args ...
```

Config mode:

```bash
mh list -c <config>
```

### 3. Generate Skill

Read `references/skill-template.md`, fill placeholders: `{skill-name}`, `{description}`, `{Title}`, `{url}`, `{transport}`, `{tool-count}`, `{tools-list}`, `{usage-block}`, `{notes-block}`.

Usage blocks:

URL mode:

```
List tools: `mh list -u {url} -t {transport}`
Get tool details: `mh inspect -u {url} -t {transport} <tool-name>`
Invoke tool: `mh invoke -u {url} -t {transport} <tool-name> '{"param": "value"}'`
```

Config mode (use local config file name):

```
List tools: `mh list -c {config-file}`
Get tool details: `mh inspect -c {config-file} <tool-name>`
Invoke tool: `mh invoke -c {config-file} <tool-name> '{"param": "value"}'`
```

Notes blocks:

URL mode:

```
- Run `inspect` before invoking unfamiliar tools to get full parameter schema
- Timeout: 30s default, use `--timeout <seconds>` to adjust
```

Config mode:

```
- Run `inspect` before invoking unfamiliar tools to get full parameter schema
- Timeout: 30s default, use `--timeout <seconds>` to adjust
```

### 4. Write Output

Save to output path, create directories if needed.

If input is a config file, copy it into the generated skill folder as `config.json` and set `{config-file}` in the usage block to `./config.json`, relative to the generated `SKILL.md` location.

## Naming Guidelines

**Name**: Focus on capability, not source. Pattern: `{source}-{capability}` (kebab-case, 2-3 words)

| URL                               | Tools                           | Good              | Bad       |
| --------------------------------- | ------------------------------- | ----------------- | --------- |
| `https://mcp.exa.ai`              | webSearchExa, getCodeContextExa | `mcp-exa-search`  | `exa`     |
| `https://api.example.com/weather` | getWeather, getForecast         | `mcp-weather-api` | `weather` |

**Description**: `{Action + capability}. Use when {conditions}. Triggers on "{phrase1}", "{phrase2}".`

- Start with action verb (Search, Fetch, Get, Create, Analyze)
- Include 3-5 trigger phrases, mention service name, keep under 200 chars

## Error Handling

| Error              | Action                                          |
| ------------------ | ----------------------------------------------- |
| Connection timeout | Verify URL, check network, increase `--timeout` |
| No tools returned  | Server may require auth or have no tools        |
| Transport mismatch | Try `http` first, fall back to `sse`            |

