{"openapi":"3.1.0","info":{"title":"Skillselion public API","version":"1.0.0","summary":"Read-only catalog, machine-readable files, and MCP discovery for Skillselion.","description":"Skillselion is an independent directory of agent skills, MCP servers and marketplaces. Skills are ranked by installs; MCP servers and marketplaces are ranked by GitHub stars. This spec covers the **public** same-origin surface only. Catalog JSON is reached via `/api/v1/*` (version 1; `/api/upstream/*` is the unversioned alias). The Next.js proxy injects the server-side frontend secret; callers do not send an API key. There is no public API-key product and no billed developer sandbox. Versioning: send `API-Version: 1` or use the `/api/v1` / `/v1/` prefix. Breaking changes increment the version. Policy document: GET /api/v1. Deprecated operations will send HTTP `Deprecation` and `Sunset` headers plus a `rel=\"deprecation\"` Link. No public operation is deprecated today. Rate limit: 120 requests / 60 seconds per IP. Responses include IETF `RateLimit` / `RateLimit-Policy` and `Retry-After` on 429. POST tool-like routes (MCP `tools/call`, A2A `message/send`, `/ask`) honor `Idempotency-Key`. For agent install, use the published npm package `skillselion-mcp` (`npx -y skillselion-mcp`). Human docs: /developers. Auth: /auth.md. Pricing: /pricing.md (free).","contact":{"name":"Skillselion","email":"info@skillselion.com","url":"https://skillselion.com/contact"},"license":{"name":"Catalog data is factual; reuse research datasets under CC BY 4.0 where marked."}},"servers":[{"url":"https://skillselion.com","description":"Production (skillselion.com)"},{"url":"https://skillselion.com/api/v1","description":"Version 1 catalog prefix (current)"},{"url":"https://skillselion.com/v1","description":"Version 1 prefix (same handlers as /api/v1)"}],"x-api-versioning":{"current":"1","header":"API-Version","pathPrefix":"/api/v1","deprecationHeaders":["Deprecation","Sunset"]},"tags":[{"name":"catalog","description":"Public listing search and detail (same-origin proxy to the Fly API)."},{"name":"meta","description":"Site-wide totals and editorial singletons."},{"name":"discovery","description":"Machine-readable maps: OpenAPI, llms.txt, sitemap, MCP, API catalog."}],"paths":{"/api/upstream/listings":{"get":{"operationId":"listListings","tags":["catalog"],"summary":"Search and list catalog entries","description":"Returns listings filtered by type, category, owner, or free text. Always pass `limit` (max 2000). Default sort is real installs descending. This is the same read the website search and hubs use.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}},{"name":"q","in":"query","required":false,"description":"Keyword match on name, description, repo, or author.","schema":{"type":"string","maxLength":128}},{"name":"semantic","in":"query","required":false,"description":"Natural-language semantic search (embedding cosine). Falls back to `q` when embeddings are unavailable.","schema":{"type":"string","maxLength":256}},{"name":"type","in":"query","required":false,"description":"Single listing type.","schema":{"type":"string","enum":["skill","marketplace","plugin","mcp","workflow"]}},{"name":"types","in":"query","required":false,"description":"Comma-separated types when a hub spans more than one.","schema":{"type":"string","maxLength":64,"examples":["marketplace,plugin"]}},{"name":"category","in":"query","required":false,"description":"Catalog category slug when filtering a hub.","schema":{"type":"string","maxLength":128}},{"name":"owner","in":"query","required":false,"description":"GitHub owner (repo prefix or author).","schema":{"type":"string","maxLength":128}},{"name":"sort","in":"query","required":false,"description":"Rank key. Default is real installs descending.","schema":{"type":"string","enum":["installs","trending","stars","searchTrend"],"default":"installs"}},{"name":"limit","in":"query","required":false,"description":"Cap rows (1–2000). Recommended for every agent call.","schema":{"type":"integer","minimum":1,"maximum":2000,"default":20}},{"name":"offset","in":"query","required":false,"description":"Skip this many rows (offset pagination). Prefer `cursor` on /api/v1/listings.","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Matching listings, installs-first unless `sort` is set. Raw array (website/MCP alias).","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Listing"}}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/upstream/listings/{id}":{"get":{"operationId":"getListing","tags":["catalog"],"summary":"Get one listing by slug id","description":"Full detail row for a skill, MCP server, marketplace or plugin. Path-style ids (colons, slashes, hashes) must be URL-encoded.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}},{"name":"id","in":"path","required":true,"description":"Listing slug id, e.g. `frontend-design` or a path-style `skill:owner/repo#slug`.","schema":{"type":"string","minLength":1,"maxLength":256}}],"responses":{"200":{"description":"The listing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Listing"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/upstream/listings/{id}/files":{"get":{"operationId":"getListingFiles","tags":["catalog"],"summary":"Skill file tree and contents","description":"SKILL.md first, then bundled files. Empty array when files are not stored.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}},{"name":"id","in":"path","required":true,"description":"Listing slug id, URL-encoded when it contains slashes or hashes.","schema":{"type":"string","minLength":1,"maxLength":256}}],"responses":{"200":{"description":"Files for the skill (may be empty).","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ListingFile"}}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/upstream/catalog/stats":{"get":{"operationId":"getCatalogStats","tags":["meta"],"summary":"Public catalog totals","description":"Per-type counts plus summed installs. Pure catalog aggregation, not traffic.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}}],"responses":{"200":{"description":"Totals.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogStats"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/upstream/meta":{"get":{"operationId":"getSiteMeta","tags":["meta"],"summary":"Site meta singleton","description":"Brand, tagline, independence disclaimer, and last-updated timestamp.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}}],"responses":{"200":{"description":"Editorial meta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMeta"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/upstream/stages":{"get":{"operationId":"listStages","tags":["catalog"],"summary":"Journey stages in order","description":"Idea → Validate → Build → Ship → Launch → Grow → Operate.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}}],"responses":{"200":{"description":"Stage rows.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Stage"}}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/upstream/categories":{"get":{"operationId":"listCategories","tags":["catalog"],"summary":"Flat category list","description":"Each row is `{ type, name }`.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}}],"responses":{"200":{"description":"Categories.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1":{"get":{"operationId":"getApiVersioningPolicy","tags":["meta"],"summary":"API versioning and deprecation policy","description":"Current version is 1. Path prefix /api/v1 (also /v1/). Header API-Version: 1. Deprecated operations send Deprecation and Sunset headers. None are deprecated today.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}}],"responses":{"200":{"description":"Versioning policy.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersioningPolicy"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/listings":{"get":{"operationId":"listListingsV1","tags":["catalog"],"summary":"Search listings (API version 1)","description":"Versioned catalog search. Response is a pagination envelope (`items`, `limit`, `offset`, `hasMore`, `next`, `pageToken`, `cursor`). Prefer `cursor` (opaque next-page token). `pageToken` is the same value. `/api/upstream/listings` remains the raw Listing[] alias. Send `API-Version: 1`. `pageSize`/`pageToken`/`cursor` are accepted as aliases of `limit`/`offset`.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":128}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["skill","marketplace","plugin","mcp","workflow"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":2000,"default":20}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0}},{"name":"pageSize","in":"query","required":false,"description":"Alias of `limit` (ARD pagination).","schema":{"type":"integer","minimum":1,"maximum":2000}},{"name":"pageToken","in":"query","required":false,"description":"Alias of `offset` (ARD pagination). Empty or omitted for the first page.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Preferred cursor-based alias of `offset` / `pageToken`. Pass the previous response cursor.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated listings.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingPage"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/listings/batch":{"post":{"operationId":"batchListingsV1","tags":["catalog"],"summary":"Load several listings by id","description":"Real catalog batch read. Body `{ \"ids\": string[] }` (max 25). Returns `{ items, notFound }` using the same getListing path as single-id reads. No auth.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string"},"maxItems":25}}}}}},"responses":{"200":{"description":"Found listings plus ids that did not resolve.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["items","notFound"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Listing"}},"notFound":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/listings/{id}":{"get":{"operationId":"getListingV1","tags":["catalog"],"summary":"Get one listing (API version 1)","description":"Versioned alias of GET /api/upstream/listings/{id}.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":256}}],"responses":{"200":{"description":"The listing.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Listing"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/listings":{"get":{"operationId":"listListingsV1Short","tags":["catalog"],"summary":"Search listings (/v1/ prefix)","description":"Rewrite of GET /api/v1/listings. Same pagination envelope.","parameters":[{"name":"API-Version","in":"header","required":false,"description":"Public catalog version. Current and only version is `1`. Unversioned `/api/upstream/*` is an alias of `/api/v1/*`. Deprecation will be signaled with `Deprecation` + `Sunset` headers before a version is removed. No version is deprecated today.","schema":{"type":"string","enum":["1"],"default":"1"}}],"responses":{"200":{"description":"Paginated listings.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingPage"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiSpec","tags":["discovery"],"summary":"This OpenAPI document","description":"The document you are reading. No auth.","responses":{"200":{"description":"OpenAPI 3.1 object.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","tags":["discovery"],"summary":"Curated AI-crawler map","description":"Markdown map of hubs, research, and machine-access links. Regenerated daily.","responses":{"200":{"description":"Markdown (served as text/plain).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}}},"/llms-full.txt":{"get":{"operationId":"getLlmsFullTxt","tags":["discovery"],"summary":"Long-form AI-crawler map","description":"Same as /llms.txt plus ranking/methodology prose and every comparison shortlist.","responses":{"200":{"description":"Markdown (served as text/plain).","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}}},"/sitemap.xml":{"get":{"operationId":"getSitemapIndex","tags":["discovery"],"summary":"Sitemap index","description":"Index of sitemap shards (misc, guides, skills, ja, …).","responses":{"200":{"description":"XML sitemap index.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/XmlDocument"}}}}}}},"/mcp":{"post":{"operationId":"postProductMcpOnHub","tags":["discovery"],"summary":"Product MCP JSON-RPC on /mcp","description":"Official SDK path. POST initialize / tools/list / resources/list / resources/read for ui://skillselion/catalog.html. Browser GET /mcp remains the HTML MCP-servers hub.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional replay key for POST tools/call, A2A message/send, and /ask. Identical key + body returns the cached response for 5 minutes.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"202":{"description":"Notification acknowledged (no body)."},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/.well-known/mcp":{"get":{"operationId":"getMcpDiscovery","tags":["discovery"],"summary":"MCP server discovery document","description":"Well-known MCP handshake/discovery. Describes the published `skillselion-mcp` npm package (stdio via npx) and accepts a live JSON-RPC `initialize` on POST. This is not a rebuild of the npm server.","responses":{"200":{"description":"MCP discovery metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpDiscovery"}}}}}},"post":{"operationId":"postMcpHandshake","tags":["discovery"],"summary":"MCP JSON-RPC handshake","description":"Accepts `initialize`, `notifications/initialized`, `ping`, `tools/list`, and `tools/call` (search_skillselion, load_skill, top_skillselion, get_catalog_stats against the live catalog; resources/list + resources/read for ui://skillselion/catalog.html). stdio remains `npx -y skillselion-mcp`. Honors Idempotency-Key on POST.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional replay key for POST tools/call, A2A message/send, and /ask. Identical key + body returns the cached response for 5 minutes.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC result or error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"202":{"description":"Notification acknowledged (no body)."},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/.well-known/api-catalog":{"get":{"operationId":"getApiCatalog","tags":["discovery"],"summary":"RFC 9727 API catalog","description":"Linkset pointing at the OpenAPI spec, developer docs, and MCP discovery.","responses":{"200":{"description":"Linkset document.","content":{"application/linkset+json":{"schema":{"$ref":"#/components/schemas/ApiCatalog"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiCatalog"}}}}}}},"/.well-known/ai-catalog.json":{"get":{"operationId":"getAiCatalog","tags":["discovery"],"summary":"Agentic Resource Discovery catalog","description":"ARD / AI Catalog listing the real MCP server card, A2A card, and agent skill.","responses":{"200":{"description":"AI Catalog document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiCatalog"}}}}}}},"/.well-known/mcp/server-card.json":{"get":{"operationId":"getMcpServerCard","tags":["discovery"],"summary":"MCP server card","description":"SEP-style server card for skillselion-mcp (stdio + Streamable HTTP remotes).","responses":{"200":{"description":"MCP server card.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerCard"}}}}}}},"/.well-known/agent-card.json":{"get":{"operationId":"getA2aAgentCard","tags":["discovery"],"summary":"A2A agent card","description":"Agent-to-Agent card. JSON-RPC message/send lives at /a2a/v1.","responses":{"200":{"description":"A2A agent card.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentCard"}}}}}}},"/a2a/v1":{"post":{"operationId":"postA2aMessage","tags":["discovery"],"summary":"A2A JSON-RPC message/send","description":"Searches the public catalog. Honors Idempotency-Key. No streaming.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional replay key for POST tools/call, A2A message/send, and /ask. Identical key + body returns the cached response for 5 minutes.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ask":{"get":{"operationId":"askCatalogGet","tags":["discovery"],"summary":"NLWeb-shaped catalog ask","description":"GET /ask?query= (also q / question) returns a schema.org ItemList. SSE when Accept: text/event-stream or ?stream=1. Browser document navigation 302s to /browse. Accept: text/html without Sec-Fetch navigate still returns JSON.","parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","maxLength":256}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":256}},{"name":"question","in":"query","required":false,"schema":{"type":"string","maxLength":256}},{"name":"stream","in":"query","required":false,"description":"Set to 1 for text/event-stream (start / item / complete events).","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"schema.org ItemList, or SSE when streaming.","content":{"application/ld+json":{"schema":{"$ref":"#/components/schemas/AskResult"}},"application/json":{"schema":{"$ref":"#/components/schemas/AskResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}},"post":{"operationId":"askCatalogPost","tags":["discovery"],"summary":"NLWeb-shaped catalog ask (POST)","description":"Same as GET /ask. Honors Idempotency-Key. `{ \"stream\": true }` for SSE.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional replay key for POST tools/call, A2A message/send, and /ask. Identical key + body returns the cached response for 5 minutes.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"q":{"type":"string"},"question":{"type":"string"},"stream":{"type":"boolean"}}}}}},"responses":{"200":{"description":"schema.org ItemList.","content":{"application/ld+json":{"schema":{"$ref":"#/components/schemas/AskResult"}},"application/json":{"schema":{"$ref":"#/components/schemas/AskResult"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pricing.md":{"get":{"operationId":"getPricingMarkdown","tags":["discovery"],"summary":"Machine-readable pricing (free)","description":"Skillselion is free. schema.org Offer price 0 on /pricing.","responses":{"200":{"description":"Markdown.","content":{"text/markdown":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"operationId":"getOauthAuthorizationServer","tags":["discovery"],"summary":"RFC 8414 authorization server metadata","description":"Issuer is this origin. grant_types_supported is empty. Token and register endpoints are reachable and refuse minting. See /auth.md.","responses":{"200":{"description":"Authorization server metadata (no grants).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OauthAuthorizationServer"}}}}}}},"/oauth/authorize":{"get":{"operationId":"getOauthAuthorize","tags":["discovery"],"summary":"Authorization endpoint (not offered)","description":"Reachable GET that states Skillselion does not issue tokens. POST returns 400 with the same JSON.","responses":{"200":{"description":"authorization_server_not_offered JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OauthNotOffered"}}}}}}},"/oauth/token":{"get":{"operationId":"getOauthToken","tags":["discovery"],"summary":"Token endpoint (not offered)","description":"Reachable GET explaining no tokens are issued. POST refuses with 400 JSON.","responses":{"200":{"description":"authorization_server_not_offered JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OauthNotOffered"}}}}}}},"/oauth/resource":{"get":{"operationId":"getOauthResourceProbe","tags":["discovery"],"summary":"401 WWW-Authenticate probe","description":"Always HTTP 401 with WWW-Authenticate Bearer resource_metadata. Not a token issuer. Public catalog reads do not use this path.","responses":{"200":{"description":"Not used. This probe always returns 401 with WWW-Authenticate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing token. WWW-Authenticate names the protected-resource metadata URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/oauth/register":{"get":{"operationId":"getOauthRegister","tags":["discovery"],"summary":"Client registration (not offered)","description":"Reachable GET explaining no client registration. POST refuses with 400 JSON.","responses":{"200":{"description":"authorization_server_not_offered JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OauthNotOffered"}}}}}}},"/feeds/listings.json":{"get":{"operationId":"getListingsDataFeed","tags":["discovery"],"summary":"schema.org DataFeed of top listings","description":"NLWeb schema feed: schema.org DataFeed of current top catalog listings. Additive; robots.txt is unchanged so Google still receives the same HTML.","responses":{"200":{"description":"schema.org DataFeed.","content":{"application/ld+json":{"schema":{"$ref":"#/components/schemas/DataFeed"}},"application/json":{"schema":{"$ref":"#/components/schemas/DataFeed"}}}}}}},"/.well-known/mcp.json":{"get":{"operationId":"getMcpDiscoveryAlias","tags":["discovery"],"summary":"MCP discovery alias","description":"Same MCP discovery document as GET /.well-known/mcp.","responses":{"200":{"description":"MCP discovery metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpDiscovery"}}}}}}},"/mcp.json":{"get":{"operationId":"getMcpClientConfig","tags":["discovery"],"summary":"mcp.json client config","description":"stdio npx -y skillselion-mcp plus the Streamable HTTP remote URL.","responses":{"200":{"description":"mcpServers map.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpClientConfig"}}}}}}},"/.well-known/mcp/sse":{"get":{"operationId":"getMcpSse","tags":["discovery"],"summary":"MCP SSE remote (GET)","description":"Server-Sent Events endpoint event for the Skillselion MCP remote. Does not replace /.well-known/mcp.","responses":{"200":{"description":"text/event-stream handshake.","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}},"post":{"operationId":"postMcpSse","tags":["discovery"],"summary":"MCP SSE remote (POST JSON-RPC)","description":"Same JSON-RPC as /.well-known/mcp, wrapped as text/event-stream.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional replay key for POST tools/call, A2A message/send, and /ask. Identical key + body returns the cached response for 5 minutes.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"SSE JSON-RPC result.","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}}},"/api/v1/auth/me":{"get":{"operationId":"getAuthMe","tags":["meta"],"summary":"Staff identity probe","description":"Without Authorization this returns 401 plus WWW-Authenticate Bearer resource_metadata pointing at the RFC 9728 document. With a staff Bearer JWT it proxies the Nest /auth/me route. Not required for catalog reads.","responses":{"200":{"description":"Staff profile when a valid Bearer JWT is sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffProfile"}}}},"401":{"description":"Missing token. WWW-Authenticate names the protected-resource metadata URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.yaml":{"get":{"operationId":"getOpenApiYaml","tags":["discovery"],"summary":"This OpenAPI document as YAML","description":"Same document as /openapi.json, YAML-encoded. Also at /api/openapi.yaml.","responses":{"200":{"description":"OpenAPI 3.1 YAML.","content":{"application/yaml":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}}},"/sandbox":{"get":{"operationId":"getSandboxInfo","tags":["catalog"],"summary":"Read-only sandbox descriptor","description":"Honest test surface: the public catalog with no writes and no tokens. /sandbox/listings aliases /api/v1/listings.","responses":{"200":{"description":"Sandbox descriptor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxInfo"}}}}}}},"/agent/auth":{"get":{"operationId":"getAgentAuthProbe","tags":["discovery"],"summary":"401 WWW-Authenticate probe","description":"Always HTTP 401 with WWW-Authenticate Bearer resource_metadata. Not a token issuer.","responses":{"200":{"description":"Not used. This probe always returns 401.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing token. WWW-Authenticate names the protected-resource metadata URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/.well-known/mcp/docs":{"get":{"operationId":"getDocsMcpDiscovery","tags":["discovery"],"summary":"Documentation MCP discovery","description":"Second MCP surface for Skillselion website docs (search_docs, get_doc, list_docs). Not the product catalog MCP.","responses":{"200":{"description":"Docs MCP discovery.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpDiscovery"}}}}}},"post":{"operationId":"postDocsMcpHandshake","tags":["discovery"],"summary":"Documentation MCP JSON-RPC","description":"initialize / tools/list / tools/call for search_docs, get_doc, and list_docs.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional replay key for POST tools/call, A2A message/send, and /ask. Identical key + body returns the cached response for 5 minutes.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/.well-known/mcp/product":{"get":{"operationId":"getProductMcpDiscovery","tags":["discovery"],"summary":"Product catalog MCP discovery","description":"Alias of the Skillselion product catalog MCP (same tools as /.well-known/mcp). Separate from the docs MCP.","responses":{"200":{"description":"Product MCP discovery.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpDiscovery"}}}}}},"post":{"operationId":"postProductMcpHandshake","tags":["discovery"],"summary":"Product catalog MCP JSON-RPC","description":"Same initialize / tools / resources as /.well-known/mcp.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional replay key for POST tools/call, A2A message/send, and /ask. Identical key + body returns the cached response for 5 minutes.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"400":{"description":"Invalid query or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication required (staff routes only).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No listing or route matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry-After and RateLimit headers are set.","headers":{"RateLimit":{"description":"IETF RateLimit: limit, remaining, reset.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"Policy window.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"API-Version":{"schema":{"type":"string","enum":["1"]}},"Sunset":{"description":"RFC 8594. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 9745. Sent only when an operation is deprecated. None are deprecated today.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Upstream or server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"operationId":"getOauthProtectedResource","tags":["discovery"],"summary":"RFC 9728 protected-resource metadata","description":"Public catalog is anonymous. identity_types_supported is [anonymous].","responses":{"200":{"description":"Protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OauthProtectedResource"}}}}}}},"/.well-known/agent-instructions":{"get":{"operationId":"getAgentInstructions","tags":["discovery"],"summary":"When to use Skillselion","description":"Dedicated when-to-use file for agents. Same jobs as the When to use this section in llms.txt and the agent skill.","responses":{"200":{"description":"Markdown instructions.","content":{"text/markdown":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}}},"/mcp-apps/catalog.html":{"get":{"operationId":"getMcpAppCatalogView","tags":["discovery"],"summary":"MCP Apps catalog widget","description":"Public HTML for ui://skillselion/catalog.html. No login. Frameable by ChatGPT and Claude.","responses":{"200":{"description":"MCP App HTML.","content":{"text/html":{"schema":{"$ref":"#/components/schemas/McpAppHtml"}}}}}}},"/schemamap.xml":{"get":{"operationId":"getSchemamapXml","tags":["discovery"],"summary":"NLWeb Schema Map","description":"XML index of structured-data feeds. Advertised via the additive Schemamap: line in robots.txt.","responses":{"200":{"description":"Schema map XML.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/XmlDocument"}}}}}}},"/feeds/listings.jsonl":{"get":{"operationId":"getListingsJsonl","tags":["discovery"],"summary":"Catalog Schema Feed (JSONL)","description":"One schema.org SoftwareApplication per line for the current top listings.","responses":{"200":{"description":"JSON Lines.","content":{"application/x-jsonlines":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}}},"/.well-known/http-message-signatures-directory":{"get":{"operationId":"getWebBotAuthDirectory","tags":["discovery"],"summary":"Web Bot Auth directory","description":"HTTP Message Signatures directory. keys is present and empty — Skillselion does not sign outbound bot traffic.","responses":{"200":{"description":"Directory document with keys array.","content":{"application/http-message-signatures-directory+json":{"schema":{"$ref":"#/components/schemas/WebBotAuthDirectory"}},"application/json":{"schema":{"$ref":"#/components/schemas/WebBotAuthDirectory"}}}}}}},"/.well-known/jwks.json":{"get":{"operationId":"getWebBotAuthJwks","tags":["discovery"],"summary":"Empty JWKS (no signing keys)","description":"RFC 7517 JWKS twin of the Web Bot Auth directory. keys is always an empty array — Skillselion does not invent signing keys.","responses":{"200":{"description":"JWKS with keys array.","content":{"application/jwk-set+json":{"schema":{"$ref":"#/components/schemas/Jwks"}},"application/json":{"schema":{"$ref":"#/components/schemas/Jwks"}}}}}}},"/functions.json":{"get":{"operationId":"getFunctionCallingTools","tags":["discovery"],"summary":"OpenAI-style function tools","description":"Every public OpenAPI operation as an OpenAI function (name = operationId, JSON Schema parameters). Same catalog as /openapi.json. No extra invented endpoints.","responses":{"200":{"description":"Function-calling catalog.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionCallingCatalog"}}}}}}},"/auth.md":{"get":{"operationId":"getAuthMarkdown","tags":["discovery"],"summary":"Authentication policy","description":"Executable walkthrough: GET protected-resource metadata, GET authorization-server metadata, then GET /api/v1/listings with no Authorization. grant_types_supported is empty; this origin does not issue tokens.","responses":{"200":{"description":"Markdown.","content":{"text/markdown":{"schema":{"$ref":"#/components/schemas/TextDocument"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["code","message","resolution","statusCode","error"],"properties":{"code":{"type":"string","description":"Stable machine code (NOT_FOUND, BAD_REQUEST, UNAUTHORIZED, …).","examples":["NOT_FOUND"]},"message":{"type":"string","description":"Human-readable error."},"resolution":{"type":"string","description":"What an agent should do next."},"statusCode":{"type":"integer","description":"HTTP status repeated in the body."},"error":{"type":"string","description":"Alias of message (legacy Nest clients)."},"details":{"description":"Optional field-level validation details."},"path":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"Listing":{"type":"object","required":["id","type","name"],"properties":{"id":{"type":"string","description":"Listing slug id (path-style ids are URL-encoded)."},"type":{"type":"string","enum":["skill","marketplace","plugin","mcp","workflow"]},"name":{"type":"string"},"author":{"type":"string"},"repo":{"type":"string","description":"GitHub owner/repo when known."},"description":{"type":"string"},"summary":{"type":"string"},"category":{"type":"string"},"stage":{"type":"string","enum":["idea","validate","build","ship","launch","grow","operate"]},"stars":{"type":"integer"},"installs":{"type":"integer","description":"Real install count from the skills.sh registry."},"votes":{"type":"integer","description":"Internal ranking tiebreak only; voting UI is retired."},"verifiedSafe":{"type":"boolean"},"trustScore":{"type":"number"}}},"ListingPage":{"type":"object","required":["items","limit","offset","hasMore","pageToken"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Listing"}},"limit":{"type":"integer","minimum":1,"maximum":2000},"offset":{"type":"integer","minimum":0},"hasMore":{"type":"boolean"},"next":{"type":"string","nullable":true,"description":"Relative URL of the next page, or null. Uses the cursor query param."},"pageToken":{"type":"string","description":"Opaque next-page cursor. Empty string on the last page. Same value as cursor."},"cursor":{"type":"string","description":"Cursor-based next-page token (preferred). Same value as pageToken."}}},"VersioningPolicy":{"type":"object","required":["apiVersion","current","header","pathPrefix","deprecation"],"properties":{"apiVersion":{"type":"string","enum":["1"]},"current":{"type":"string","enum":["1"]},"header":{"type":"string","enum":["API-Version"]},"pathPrefix":{"type":"string","enum":["/api/v1"]},"alias":{"type":"string"},"documentation":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"deprecation":{"type":"object","required":["headers","note"],"properties":{"headers":{"type":"array","items":{"type":"string"}},"linkRel":{"type":"string"},"note":{"type":"string"}}},"rateLimit":{"type":"object"}}},"CatalogStats":{"type":"object","required":["listings","skills","mcp","installs"],"properties":{"listings":{"type":"integer"},"skills":{"type":"integer"},"mcp":{"type":"integer"},"marketplaces":{"type":"integer"},"plugins":{"type":"integer"},"workflows":{"type":"integer"},"installs":{"type":"integer"}}},"SiteMeta":{"type":"object","required":["brand"],"properties":{"brand":{"type":"string"},"tagline":{"type":"string"},"note":{"type":"string"},"updatedAt":{"type":"string"}}},"Stage":{"type":"object","required":["key","label"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"order":{"type":"integer"}}},"Category":{"type":"object","required":["type","name"],"properties":{"type":{"type":"string"},"name":{"type":"string"}}},"ListingFile":{"type":"object","required":["path"],"properties":{"path":{"type":"string"},"content":{"type":"string"},"contents":{"type":"string"},"bytes":{"type":"integer"}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{"description":"JSON-RPC id (number or string). Omit for notifications."},"method":{"type":"string"},"params":{"type":"object"}}},"JsonRpcResponse":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{},"result":{"type":"object"},"error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"OpenApiDocument":{"type":"object","required":["openapi","info","paths"],"properties":{"openapi":{"type":"string"},"info":{"type":"object"},"paths":{"type":"object"},"components":{"type":"object"}},"additionalProperties":true},"ApiCatalog":{"type":"object","required":["linkset"],"properties":{"linkset":{"type":"array","items":{"type":"object"}}}},"AiCatalog":{"type":"object","required":["specVersion","entries"],"properties":{"specVersion":{"type":"string"},"host":{"type":"object"},"entries":{"type":"array","items":{"type":"object"}}}},"McpServerCard":{"type":"object","required":["name","version","serverUrl"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"serverUrl":{"type":"string","format":"uri"},"description":{"type":"string"},"tools":{"type":"array","items":{"type":"string"}},"transport":{"type":"object"},"remotes":{"type":"array","items":{"type":"object"}}}},"AgentCard":{"type":"object","required":["name","description","version","supportedInterfaces","skills"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"supportedInterfaces":{"type":"array","items":{"type":"object"}},"skills":{"type":"array","items":{"type":"object"}}}},"AskResult":{"type":"object","required":["@type","itemListElement","_meta"],"properties":{"@type":{"type":"string","enum":["ItemList"]},"name":{"type":"string"},"query":{"type":"string"},"numberOfItems":{"type":"integer"},"itemListElement":{"type":"array","items":{"type":"object"}},"_meta":{"type":"object","required":["response_type","version"],"properties":{"response_type":{"type":"string","enum":["item_list"]},"version":{"type":"string"},"site":{"type":"string","format":"uri"}}}}},"OauthAuthorizationServer":{"type":"object","required":["issuer","grant_types_supported","identity_types_supported"],"properties":{"issuer":{"type":"string","format":"uri"},"authorization_endpoint":{"type":"string","format":"uri"},"token_endpoint":{"type":"string","format":"uri"},"registration_endpoint":{"type":"string","format":"uri"},"grant_types_supported":{"type":"array","items":{"type":"string"}},"identity_types_supported":{"type":"array","items":{"type":"string"}},"agent_auth":{"type":"object"}}},"OauthNotOffered":{"type":"object","required":["error","error_description"],"properties":{"error":{"type":"string","enum":["authorization_server_not_offered"]},"error_description":{"type":"string"},"resource_metadata":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"}}},"DataFeed":{"type":"object","required":["@type","dataFeedElement"],"properties":{"@type":{"type":"string","enum":["DataFeed"]},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"dateModified":{"type":"string"},"dataFeedElement":{"type":"array","items":{"type":"object"}}}},"McpClientConfig":{"type":"object","required":["mcpServers"],"properties":{"mcpServers":{"type":"object","additionalProperties":{"type":"object","properties":{"command":{"type":"string"},"args":{"type":"array","items":{"type":"string"}},"url":{"type":"string","format":"uri"}}}}}},"StaffProfile":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"}}},"TextDocument":{"type":"object","required":["mediaType","encoding"],"properties":{"mediaType":{"type":"string","description":"text/plain, text/markdown, or text/event-stream."},"encoding":{"type":"string","enum":["utf-8"]}}},"XmlDocument":{"type":"object","required":["mediaType","encoding"],"properties":{"mediaType":{"type":"string","enum":["application/xml","text/xml"]},"encoding":{"type":"string","enum":["utf-8"]}}},"McpAppHtml":{"type":"object","required":["mediaType"],"properties":{"mediaType":{"type":"string","enum":["text/html;profile=mcp-app"]},"encoding":{"type":"string","enum":["utf-8"]}}},"OauthProtectedResource":{"type":"object","required":["resource","authorization_servers","identity_types_supported"],"properties":{"resource":{"type":"string","format":"uri"},"resource_name":{"type":"string"},"authorization_servers":{"type":"array","items":{"type":"string","format":"uri"}},"identity_types_supported":{"type":"array","items":{"type":"string","enum":["anonymous"]}},"anonymous":{"type":"object","required":["credential_types_supported"],"properties":{"credential_types_supported":{"type":"array","items":{"type":"string"}},"credential_formats_supported":{"type":"array","items":{"type":"string"}},"authorization_required":{"type":"boolean"}}},"agent_auth":{"type":"object"}}},"WebBotAuthDirectory":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","items":{"type":"object"},"description":"Empty: no signing keys."},"purpose":{"type":"string"},"alg":{"type":"string"},"note":{"type":"string"}}},"Jwks":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","items":{"type":"object"},"description":"Empty: no signing keys."}}},"FunctionCallingCatalog":{"type":"object","required":["format","functions"],"properties":{"format":{"type":"string","enum":["openai.function"]},"spec":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"},"count":{"type":"integer"},"functions":{"type":"array","items":{"type":"object","required":["name","description","parameters"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"parameters":{"type":"object"}}}}}},"SandboxInfo":{"type":"object","required":["sandbox","writes","listings"],"properties":{"sandbox":{"type":"boolean","enum":[true]},"writes":{"type":"boolean","enum":[false]},"authentication":{"type":"string"},"description":{"type":"string"},"listings":{"type":"string","format":"uri"},"versioned":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"},"auth":{"type":"string","format":"uri"}}},"McpDiscovery":{"type":"object","required":["mcp_version","server_name","endpoints"],"properties":{"mcp_version":{"type":"string"},"server_name":{"type":"string"},"server_version":{"type":"string"},"endpoints":{"type":"object","properties":{"stdio":{"type":"string","description":"npx command for the published npm package."},"streamable_http":{"type":"string","format":"uri"}}},"capabilities":{"type":"object"},"documentation":{"type":"string","format":"uri"}}}}},"externalDocs":{"description":"Skillselion developer resources (MCP, catalog API, CLI note).","url":"https://skillselion.com/developers"}}