/archestra-mcp-catalog-entry
Use when adding a new MCP server to the public MCP catalog (mcp-catalog/data) or preparing/reviewing a catalog-entry PR. Derives the entry name from the server URL, live-probes remote servers to fill in tools/transport/auth, fetches and encodes the icon, and validates the
$ npx -y skills add archestra-ai/archestra --skill archestra-mcp-catalog-entry --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/archestra-mcp-catalog-entry
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when adding a new MCP server to the public MCP catalog (mcp-catalog/data) or preparing/reviewing a catalog-entry PR. Derives the entry name from the server URL, live-probes remote servers to fill in tools/transport/auth, fetches and encodes the icon, and validates the
SKILL.md
archestra-mcp-catalog-entry.SKILL.mdname: archestra-mcp-catalog-entry
description: Use when adding a new MCP server to the public MCP catalog (mcp-catalog/data) or preparing/reviewing a catalog-entry PR. Derives the entry name from the server URL, live-probes remote servers to fill in tools/transport/auth, fetches and encodes the icon, and validates the manifest against the catalog schema before opening the PR.
Add an MCP server to the Archestra MCP Catalog
The catalog is two files under `mcp-catalog/data/` (see `mcp-catalog/README.md`):
- `mcp-servers.json` — the master URL list. An entry only appears in the catalog if its URL is here.
- `mcp-evaluations/<name>.json` — one manifest per server.
Entries are maintained by hand — there is no scraping/evaluation pipeline. Your job is to machine-fill everything that CAN be derived (name, tools, transport, icon, defaults) so the human only supplies judgment calls (description quality, category, keywords).
1. Derive the entry name from the URL (do not guess)
The website derives the name from the URL; the filename and the manifest's `name` field must match it exactly:
- **GitHub** `https://github.com/<owner>/<repo>` → `<owner>__<repo>` (lowercased).
Monorepo path `…/tree/<branch>/<p1>/<p2>` → `<owner>__<repo>__<p1>__<p2>`.
- **Remote** endpoint → take the hostname, strip a leading `www.`/`mcp.`/`api.` (only those
three), take everything before the first remaining dot, append `__remote-mcp`.
- `https://mcp.linear.app/mcp` → `linear__remote-mcp`
- `https://agenttools.wolfram.com/mcp` → `agenttools__remote-mcp` (NOT `wolfram__remote-mcp` — only `www./mcp./api.` are stripped)
2. Live-probe remote servers (machine-fill, don't transcribe docs)
For `server.type: "remote"`, verify the endpoint and extract facts directly:
# initialize — confirms the endpoint is live, speaks streamable HTTP, and whether auth is required
curl -sS -m 20 -X POST <url> -H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"archestra-catalog","version":"1.0"}}}' -D -- HTTP 200 with a `result` → no auth required (`archestra_config.oauth.required: false`, no `oauth_config`).
- HTTP 401/403 (often with `WWW-Authenticate` / resource metadata) → OAuth required; copy the
`oauth_config` shape from an existing OAuth entry (e.g. `jam__remote-mcp.json`).
- Then call `tools/list` (reuse the `Mcp-Session-Id` response header if one was returned) and
fill the manifest's `tools` array with the REAL tool names + descriptions, not the vendor docs.
3. Write the manifest
Copy a fresh entry as the template — `mcp-catalog/data/mcp-evaluations/excalidraw__remote-mcp.json` (remote, no auth) or `jam__remote-mcp.json` (remote, OAuth). Current field set:
{
"name": "<derived name>", // must equal the filename
"display_name": "<Human Name>",
"description": "<1-3 factual sentences — trim vendor marketing speak>",
"long_description": "<optional>",
"author": { "name": "<Vendor>", "url": "<https://vendor.com/>" },
"homepage": "<optional>",
"documentation": "<optional>",
"support": "<optional>",
"icon": "data:image/svg+xml;base64,...", // see below
"tools": [{ "name": "...", "description": "..." }], // from the live tools/list
"prompts": [],
"keywords": ["..."],
"user_config": {},
"readme": null,
"category": "<must exist in the website's McpServerCategorySchema>",
"archestra_config": {
"client_config_permutations": null, // or real client config for local servers
"oauth": { "provider": null, "required": false },
"works_in_archestra": true // only if you actually verified it connects
},
"server": { "type": "remote", "url": "<endpoint>", "docs_url": "<docs or null>" },
"github_info": null, // remote servers; GitHub entries get repo info
"programming_language": null // null for remote servers
}Do NOT add evaluation-era fields (`quality_score`, `last_scraped_at`, `evaluation_model`, `framework`, `dependencies`, `raw_dependencies`, `protocol_features`, `score_breakdown`) — the pipeline that filled them is gone and the schema no longer has them.
**Icon**: prefer the vendor's official SVG, inlined as a base64 data URI. Iconify shortcut: `curl -s https://api.iconify.design/logos/<slug>.svg | base64`. Decode and eyeball it: static SVG only — no `<script>`, no external refs, no event handlers.
**Category**: the allowed values live in the website repo, `app/app/mcp-catalog/schemas.ts` → `McpServerCategorySchema` (https://github.com/archestra-ai/website/blob/main/app/app/mcp-catalog/schemas.ts). When in doubt grep existing entries: `grep -h '"category"' mcp-catalog/data/mcp-evaluations/*.json | sort | uniq -c`.
4. Validate before the PR
# JSON parses, name matches filename, URL present exactly once
python3 - << 'EOF'
import json
name = "<derived name>"
m = json.load(open(f"mcp-catalog/data/mcp-evaluations/{name}.json"))
assert m["name"] == name, "name != filename"
servers = json.load(open("mcp-catalog/data/mcp-servers.json"))
assert servers.count("<url>") == 1, "URL missing or duplicated in mcp-servers.json"
print("ok")
EOFFormat with prettier at print width 120 (the website's setting): `npx prettier --write --print-width 120 mcp-catalog/data/mcp-evaluations/<name>.json mcp-catalog/data/mcp-servers.json`
If an `archestra-ai/website` checkout sits next to this repo, run the full schema validation from `website/app`: `pnpm catalog:validate` (it reads the adjacent checkout).
5. Open the PR
One PR against this repo, both files, title `feat(mcp-catalog): add <display_name> MCP server`. In the body: what the server is, transport/auth (as verified by the live probe, not the docs), and the derived-name rule applied. A merged PR triggers a website deploy automatically — no other repo needs chan
Read more
name: archestra-mcp-catalog-entry description: Use when adding a new MCP server to the public MCP catalog (mcp-catalog/data) or preparing/reviewing a catalog-entry PR. Derives the entry name from the server URL, live-probes remote servers to fill in tools/transport/auth, fetches and encodes the icon, and validates the manifest against the catalog schema before opening the PR.
Add an MCP server to the Archestra MCP Catalog
The catalog is two files under `mcp-catalog/data/` (see `mcp-catalog/README.md`):
- `mcp-servers.json` — the master URL list. An entry only appears in the catalog if its URL is here.
- `mcp-evaluations/<name>.json` — one manifest per server.
Entries are maintained by hand — there is no scraping/evaluation pipeline. Your job is to machine-fill everything that CAN be derived (name, tools, transport, icon, defaults) so the human only supplies judgment calls (description quality, category, keywords).
1. Derive the entry name from the URL (do not guess)
The website derives the name from the URL; the filename and the manifest's `name` field must match it exactly:
- **GitHub** `https://github.com/<owner>/<repo>` → `<owner>__<repo>` (lowercased).
Monorepo path `…/tree/<branch>/<p1>/<p2>` → `<owner>__<repo>__<p1>__<p2>`.
- **Remote** endpoint → take the hostname, strip a leading `www.`/`mcp.`/`api.` (only those
three), take everything before the first remaining dot, append `__remote-mcp`.
- `https://mcp.linear.app/mcp` → `linear__remote-mcp`
- `https://agenttools.wolfram.com/mcp` → `agenttools__remote-mcp` (NOT `wolfram__remote-mcp` — only `www./mcp./api.` are stripped)
2. Live-probe remote servers (machine-fill, don't transcribe docs)
For `server.type: "remote"`, verify the endpoint and extract facts directly:
# initialize — confirms the endpoint is live, speaks streamable HTTP, and whether auth is required
curl -sS -m 20 -X POST <url> -H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"archestra-catalog","version":"1.0"}}}' -D -- HTTP 200 with a `result` → no auth required (`archestra_config.oauth.required: false`, no `oauth_config`).
- HTTP 401/403 (often with `WWW-Authenticate` / resource metadata) → OAuth required; copy the
`oauth_config` shape from an existing OAuth entry (e.g. `jam__remote-mcp.json`).
- Then call `tools/list` (reuse the `Mcp-Session-Id` response header if one was returned) and
fill the manifest's `tools` array with the REAL tool names + descriptions, not the vendor docs.
3. Write the manifest
Copy a fresh entry as the template — `mcp-catalog/data/mcp-evaluations/excalidraw__remote-mcp.json` (remote, no auth) or `jam__remote-mcp.json` (remote, OAuth). Current field set:
{
"name": "<derived name>", // must equal the filename
"display_name": "<Human Name>",
"description": "<1-3 factual sentences — trim vendor marketing speak>",
"long_description": "<optional>",
"author": { "name": "<Vendor>", "url": "<https://vendor.com/>" },
"homepage": "<optional>",
"documentation": "<optional>",
"support": "<optional>",
"icon": "data:image/svg+xml;base64,...", // see below
"tools": [{ "name": "...", "description": "..." }], // from the live tools/list
"prompts": [],
"keywords": ["..."],
"user_config": {},
"readme": null,
"category": "<must exist in the website's McpServerCategorySchema>",
"archestra_config": {
"client_config_permutations": null, // or real client config for local servers
"oauth": { "provider": null, "required": false },
"works_in_archestra": true // only if you actually verified it connects
},
"server": { "type": "remote", "url": "<endpoint>", "docs_url": "<docs or null>" },
"github_info": null, // remote servers; GitHub entries get repo info
"programming_language": null // null for remote servers
}Do NOT add evaluation-era fields (`quality_score`, `last_scraped_at`, `evaluation_model`, `framework`, `dependencies`, `raw_dependencies`, `protocol_features`, `score_breakdown`) — the pipeline that filled them is gone and the schema no longer has them.
**Icon**: prefer the vendor's official SVG, inlined as a base64 data URI. Iconify shortcut: `curl -s https://api.iconify.design/logos/<slug>.svg | base64`. Decode and eyeball it: static SVG only — no `<script>`, no external refs, no event handlers.
**Category**: the allowed values live in the website repo, `app/app/mcp-catalog/schemas.ts` → `McpServerCategorySchema` (https://github.com/archestra-ai/website/blob/main/app/app/mcp-catalog/schemas.ts). When in doubt grep existing entries: `grep -h '"category"' mcp-catalog/data/mcp-evaluations/*.json | sort | uniq -c`.
4. Validate before the PR
# JSON parses, name matches filename, URL present exactly once
python3 - << 'EOF'
import json
name = "<derived name>"
m = json.load(open(f"mcp-catalog/data/mcp-evaluations/{name}.json"))
assert m["name"] == name, "name != filename"
servers = json.load(open("mcp-catalog/data/mcp-servers.json"))
assert servers.count("<url>") == 1, "URL missing or duplicated in mcp-servers.json"
print("ok")
EOFFormat with prettier at print width 120 (the website's setting): `npx prettier --write --print-width 120 mcp-catalog/data/mcp-evaluations/<name>.json mcp-catalog/data/mcp-servers.json`
If an `archestra-ai/website` checkout sits next to this repo, run the full schema validation from `website/app`: `pnpm catalog:validate` (it reads the adjacent checkout).
5. Open the PR
One PR against this repo, both files, title `feat(mcp-catalog): add <display_name> MCP server`. In the body: what the server is, transport/auth (as verified by the live probe, not the docs), and the derived-name rule applied. A merged PR triggers a website deploy automatically — no other repo needs chan
Enterprise AI Platform with guardrails, MCP registry, gateway & orchestrator
Repo: archestra-ai/archestra
Other skills on archestra.
- /archestra-dev-backend-tests
Use when writing or modifying Archestra backend unit tests (platform/backend/src/**/*.test.ts) — mocking modules, stubbing globals, database fixtures, vitest projects/isolation, or test performance.
Open skill - /archestra-dev-backend
Use when adding or changing Archestra backend routes, models, services, API request/response schemas, endpoint permissions, or OpenAPI/codegen for the generated API client.
Open skill - /archestra-dev-bench-analysis
Map-reduce a finished archestra-bench run into a Tier-1/Tier-2 improvement report using Claude subagents (same analysis as the Rust analyzer, no API key).
Open skill - /archestra-dev-e2e
Use when writing, debugging, or running Archestra Playwright e2e tests, API/UI fixtures, WireMock-backed tests, local/CI e2e setup, or test selectors.
Open skill - /archestra-dev-frontend
Use when modifying Archestra frontend Next.js/React code, UI components, forms, TanStack Query hooks, generated API client usage, frontend copy, or documentation links.
Open skill - /archestra-dev-interactions-migrations
Use BEFORE writing or running any Drizzle migration that touches the `interactions` table (or any other very large, write-hot table). The interactions table is the platform's biggest, append-heavy table — every LLM proxy call writes a row — so a careless migration can take a
Open skill

