---
title: "List server skills"
method: POST
path: "/projects/{projectId}/servers/{serverId}/skills"
tags: ["Primitives"]
---

# List server skills

`POST /projects/{projectId}/servers/{serverId}/skills`

Returns the Agent Skills a connected server serves over the MCP skills extension (SEP-2640), including skills it advertises that MCPJam declines to load. Not paginated: the catalog is drained server-side, because duplicate detection spans the whole listing.

## Path parameters

- `projectId` string, required
- `serverId` string, required

## Request body

- object

## Response `200`

The server's skill catalog.

- ServerSkillCatalog — The server's skill catalog, drained across every page of `skills/list`.
  - `support` ServerSkillsSupport, required — Mutual-declaration state of the skills extension on this connection. `active` false means the extension was never negotiated — a capability state, not a failure.
    - `declared` boolean, required — The server declared the extension.
    - `advertised` boolean, required — The client advertised the extension.
    - `directoryRead` boolean, required
    - `active` boolean, required
  - `serverId` string, required
  - `skills` ServerSkillSummary[], required
    - `serverId` string, required
    - `skillUri` string, required — IDENTITY. `name` is a label; two skills may share one.
    - `name` string, required
    - `description` string, required
    - `frontmatter` unknown
    - `resources` ServerSkillResourceRef[], required
      - `uri` string, required
      - `digest` string, required
      - `size` integer — Declared byte length, when the server provides one.
    - `unloadable` object — Present when the skill is real and visible but cannot be loaded — an unverifiable manifest, or one past the SEP's per-skill limits. It stays in the catalog so you can see what was advertised.
      - `reason` 'no_resources' | 'dynamic_resources' | 'too_many_resources' | 'too_large'
      - `message` string
  - `duplicateUris` string[], required — URIs the server listed more than once. Every copy is rejected rather than resolved.
  - `rejected` object[], required — Entries whose manifest could not be made sense of at all, with the reason.
    - `skillUri` string
    - `reason` string
  - `ttlMs` integer
  - `cacheScope` string

## Other responses

- `400` — Malformed body or parameters.
- `401` — Missing, invalid, revoked, or orphaned key (`UNAUTHORIZED`) — or the **target MCP server** needs an OAuth grant (`OAUTH_REQUIRED`), which is a property of the server, not your key.
- `403` — Key is valid but not allowed to do this.
- `404` — Unknown project, server, or resource.
- `422` — The target server doesn't support this MCP capability.
- `429` — Per-key rate limit exceeded (60 requests/minute sustained, bursts up to 10). Honor `Retry-After` and back off with jitter.
- `500` — Something failed on MCPJam's side.
- `502` — Could not connect to the target MCP server.
- `504` — The target MCP server connected but didn't respond in time.

## Changes

- **2026-08-27** `7c19b09dcfff` — 14 info
  - the response property `duplicateUris` became required for the status `200`
  - the response property `rejected` became required for the status `200`
  - the response property `serverId` became required for the status `200`
  - the response property `skills` became required for the status `200`
  - …10 more
- **2026-08-27** `d85ee7ccc2b8` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/mcpjam/apis/mcpjam-api/changes/projects/:projectId/servers/:serverId/skills/post.md)

---

[API](https://skmtc.dev/mcpjam/apis/mcpjam-api.md) · [All operations](https://skmtc.dev/mcpjam/apis/mcpjam-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/mcpjam/mcpjam-api/revisions/c628a0e95b06/schema)
