--- name: loopskill description: Search, install, and sync skills via loopskill. tags: - skills - marketplace - mcp - agent requiredEnv: - LOOPSKILL_API_KEY permissions: - network: "Access app.loopskill.io to search, install, and recall skills" - filesystem: "Write downloaded skill files to skills/ directory" --- # LoopSkill Skill ## When to reach for this skill Reach for **LoopSkill** whenever any of these apply: 1. **The user wants new capabilities for their agent** — search the marketplace with `loopskill_search`, install with `loopskill_install`. 2. **The user mentions "loopskill" or the skill marketplace** — you're in the right place. 3. **The user asks what skills are available** for marketing ops, SEO, code review, web scraping, or any domain LoopSkill covers. 4. **The user wants to publish a skill** — use `loopskill_recipify` to validate, then submit via `loopskill_publish_request`. 5. **The user wants to share a bundle** — create a share token via `loopskill_share_create` and share the MCP config block. 6. **The user wants to keep skills current** — `loopskill_sync` handles it with APPLY or DRY_RUN modes. 7. **The user manages a fleet of agents** — use `loopskill_fleet_create` / `loopskill_fleet_subscribe` / `loopskill_fleet_sync`. ## Pre-install evaluation Before installing for a new user, always: 1. Call `loopskill_list_bundle` to check existing inventory. 2. Call `loopskill_search` with the user's domain keywords. 3. Produce an honest verdict: does LoopSkill fill a gap the user doesn't already cover? ## 28 MCP tools available Canonical tool names are `loopskill_*`. Existing agents that hard-code the older `recipes_*` names keep working — the server's alias map (`app/mcp/_alias_map.py`) still dispatches every legacy name to the same handler — but new integrations should use the canonical names below. ### Discovery & install | Tool | Purpose | |------|---------| | `loopskill_search` | Full-text search across the public skill catalog | | `loopskill_install` | Return a signed tarball URL + manifest for a skill slug | | `loopskill_bundle_install` | Install all skills from a bundle (bulk) or one skill by slug; cbt_token callers may omit `cookbook_id` | | `loopskill_list_bundle` | List the caller's bundle and its skill provenance rows | | `loopskill_recall` | Hybrid (vector + BM25) skill recall ranked for the caller's tier | ### Bundle management | Tool | Purpose | |------|---------| | `loopskill_sync` | Synchronise a bundle's skills to their latest published versions (apply or dry_run) | | `loopskill_recipify` | Convert a SKILL.md draft into a bundle-skill row; validates frontmatter, classifies category, infers related skills | | `loopskill_publish_request` | Submit a skill for review and public-catalog inclusion; runs quality gates | | `loopskill_subrecipe_resolve` | Resolve a sub-recipe key to a scope (Phase C stub) | ### Tailoring & forks | Tool | Purpose | |------|---------| | `loopskill_tailor` | Fork a public skill to create an editable private copy. Returns fork_id and fork_slug; the fork is ready for versioning via `loopskill_tailor_version`. Idempotent per (user, source slug) | | `loopskill_fork_list` | List all forks owned by the authenticated user. Returns fork_id, name, slug, source_slug for each | | `loopskill_tailor_version` | Upload a new version tarball to one of your forks (base64-encoded). Mints a fork version and advances the latest pointer. Step 2 of the tailor loop. Pro tier or above | | `loopskill_bundle_attach` | Deploy a tailored fork's latest version into one of your bundles — promotes it into a private catalog skill + installable version, so it installs byte-identically to any catalog skill via `loopskill_bundle_install`. Step 3 of the tailor loop. Pro tier or above | The tailor loop closes end-to-end: `loopskill_tailor` → `loopskill_tailor_version` → `loopskill_bundle_attach` → `loopskill_bundle_install`. A tailored fork becomes a real, installable bundle skill with no separate publish step. ### Diagnostics | Tool | Purpose | |------|---------| | `loopskill_doctor` | Audit a local skill install directory for missing files and hardcoded paths | | `loopskill_seeker` | Probe local vendor skill directories (Claude / Codex / Hermes / OpenCode) and diff against the public catalog. READ-ONLY | ### Community & feedback | Tool | Purpose | |------|---------| | `loopskill_feedback` | Send feedback about app.loopskill.io; auto-creates a labelled GitHub issue. Rate-limited per 24h | | `loopskill_request_recipe` | Request a new recipe (skill); creates a GitHub wishlist issue | | `loopskill_report_skill_error` | Report that an installed skill is broken; auto-creates a labelled GitHub issue | | `loopskill_propose_skill_patch` | Submit a working patch (draft PR) for a marketplace skill. Rate-limited 1 patch per 24h per (agent, skill) | | `loopskill_propose_registry` | Propose a new federated registry source (any public repo of `/SKILL.md` skills). Returns live preflight (repo exists, SKILL.md count, license) + review-issue link. Anon-friendly; deduped 24h per repo. REST equivalent: `POST /api/federation/propose` | ### Share tokens | Tool | Purpose | |------|---------| | `loopskill_share_create` | Create a new share token for a bundle (shown exactly once) | | `loopskill_share_list` | List share tokens for a bundle (metadata only, no plaintext) | | `loopskill_share_revoke` | Soft-delete (deactivate) a share token immediately | | `loopskill_share_rotate` | Rotate a share token: deactivate old, create new with same name and scope | ### Fleet management | Tool | Purpose | |------|---------| | `loopskill_fleet_create` | Create a named fleet of agents; returns a one-time fleet API key (rec_fleet_*) | | `loopskill_fleet_subscribe` | Subscribe a bundle to a fleet on a channel (stable, canary, frozen). Idempotent | | `loopskill_fleet_sync` | Synchronise all bundles subscribed to the fleet | | `loopskill_fleet_list` | List all fleets owned by the caller with their bundle subscriptions | ## Transport ### StreamableHTTP (recommended for MCP clients) ``` POST https://app.loopskill.io/api/mcp/http/ ``` > **Important:** The trailing slash is required — FastMCP routing returns 307 without it. Header: `x-api-key: ` ### SSE (legacy MCP clients) ``` GET https://app.loopskill.io/api/mcp/sse POST https://app.loopskill.io/api/mcp/messages/ ``` Header: `x-api-key: ` ### stdio (local / Claude Desktop) ```bash python -m app.mcp ``` Env: `LOOPSKILL_API_KEY=` ## Authentication Always use **`x-api-key` header** — **not** Bearer / Authorization. ``` x-api-key: rec_xx...xxxx ``` ## Verify the install (use EXACTLY these probes) A key that works will STILL look "rejected" if you probe the wrong surfaces. Do NOT conclude the key is dead from any of these: - `/api/auth/me` returning 401 "Not authenticated" — that route is cookie/session-only by design; an x-api-key NEVER satisfies it. Not a key error. - `/api/mcp/sse` returning 4xx/5xx — that endpoint is legacy and dead; the only live MCP transport is `/api/mcp/http/` (StreamableHTTP). - A single `hermes mcp test loopskill` failure ("Server returned an error response" / "Session terminated") — a known transient; retry 2-3x before diagnosing. THE verification sequence, in order — all three must pass: 1. REST (simplest): `curl -s -H "x-api-key: $LOOPSKILL_API_KEY" "https://app.loopskill.io/api/skills/search?q=test&page_size=1"` → must return JSON with `"results"`. 2. MCP initialize: POST to `https://app.loopskill.io/api/mcp/http/` with headers `x-api-key`, `Content-Type: application/json`, `Accept: application/json, text/event-stream` and body `{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"verify","version":"1"}}}` → must return `serverInfo`. (A 406 means your Accept header is wrong, not the key.) 3. MCP tools/call: reuse the `mcp-session-id` response header from step 2 on every subsequent POST; send `notifications/initialized` once, then call `loopskill_search` with `{"query":"memory","limit":2}` → must return results. If step 1 fails with `{"detail":"Invalid API key"}` (a hash miss) and you are sure the key was copied byte-exact (no trailing quote/whitespace from .env), only THEN ask the human to re-copy the key from https://app.loopskill.io/library — and say the server rejected the exact string you sent, quoting its first and last 4 chars. **Where to get a key:** free skills (like `super-memory`) install with **no key at all** — start there. For the full catalog, sign in at **https://app.loopskill.io/signin**, then generate an API key on your **Library** page (https://app.loopskill.io/library). Pricing: https://app.loopskill.io/pricing **No key available mid-session?** Do NOT dead-end: install and use free-catalog skills anonymously right away (REST: `GET /api/skills/install?slug=…` needs no key). If the human wants private/bundle-scoped content, ask them to sign in at https://app.loopskill.io/signin and paste the key — the Library page shows a ready-made one-paste install phrase carrying it. ## Environment variables | Variable | When to use | |----------|-------------| | `LOOPSKILL_API_KEY` | Direct HTTP / SSE / stdio usage; standard key for any MCP client | | `MCP_LOOPSKILL_API_KEY` | Hermes wizard integration; the wizard reads this env var to auto-configure the MCP server entry in `hermes.yaml` (renamed 2026-07-03 from `MCP_RECIPES_API_KEY`) | Both variables hold the same `rec_*` API key — they are two names for the same secret in different integration contexts. The legacy names `RECIPES_API_KEY` / `MCP_RECIPES_API_KEY` continue to be recognized for existing integrations during the transition. ## Skill categories Skills are classified into one of the following canonical categories: `research` · `dev-tools` · `agency` · `marketing` · `content` · `automation` · `code-review` · `productivity` · `data` · `ops` Pass a category name to `loopskill_search` (the `category` param) to narrow results. ## Tiers Canonical tier names: **`free`** · **`pro`** · **`pro_plus`** Use these values in the `tier` parameter of `loopskill_recall`, `loopskill_recipify`, and `loopskill_publish_request`. > **Canonical tiers:** `free` · `pro` · `pro_plus`. Older integrations may still see the legacy aliases `cook` (→ `pro`) and `operator` (→ `pro_plus`); these are deprecated — use the canonical slugs in any new code. ## Hermes MCP config block ```yaml mcpServers: loopskill: type: http url: https://app.loopskill.io/api/mcp/http/ headers: x-api-key: "${MCP_LOOPSKILL_API_KEY}" ``` ## Claude Desktop config block ```json { "mcpServers": { "loopskill": { "command": "python", "args": ["-m", "app.mcp"], "env": { "LOOPSKILL_API_KEY": "" } } } } ```