# Discover plugins and skills

> What a workspace can add, from every marketplace it reads: plugins, one per listing (ref as name@marketplace, display_name, description, version, author, category, tags, how g1t would fetch it, and availability: available, installed with enabled, unavailable with why for sources g1t cannot read such as npm or a command, or soon for g1t's own announced ones), skills, one per skill inside those plugins (ref as plugin:skill, with added when the library already has it), and the marketplaces themselves.

<div class="g1t-endpoint"><span class="g1t-method" data-method="get">GET</span><code>/workspaces/{workspace}/customize/discover</code></div>

Members only.

`availability.kind` is `available`, `installed` (with `enabled`), `unavailable` (with `why`: an npm or command source, or a git host g1t does not read; such a plugin still works in Claude Code) or `soon` (g1t's own, announced but not released). `fetch` is where g1t reads the plugin from: `github` (at `sha` when the listing pins one, else `ref`), `g1t`, `archive` (a zip at `url`) or `unsupported`. `skills` on a plugin lists the skills its listing names outright, so a skills-only plugin shows them before it is fetched.

- **Authentication:** Required. Send an [access token](/reference/api/#authentication) as `Authorization: Bearer`.
- **MCP tool:** [`customize`](/reference/mcp/#customize) with `action` `discover`, and the same inputs
- **Scope:** An access token needs [`workspace:read`](/guides/authentication/#scopes).

## Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `workspace` | string | Yes | The workspace's slug. |

## Example request

```sh
curl https://api.g1t.sh/workspaces/flagon-io/customize/discover \
  -H "Authorization: Bearer $G1T_TOKEN"
```

## Example response

A successful request answers `200` with:

```json
{
  "plugins": [
    {
      "ref": "commit-commands@claude-plugins-official",
      "name": "commit-commands",
      "marketplace": "claude-plugins-official",
      "display_name": "Commit commands",
      "description": "Commands for committing, pushing and opening pull requests.",
      "version": "1.0.0",
      "author": "Anthropic",
      "homepage": null,
      "category": "productivity",
      "tags": [
        "git"
      ],
      "keywords": [],
      "fetch": {
        "kind": "github",
        "repo": "anthropics/claude-plugins-official",
        "ref": null,
        "sha": null,
        "path": "plugins/commit-commands"
      },
      "availability": {
        "kind": "installed",
        "enabled": true
      },
      "skills": []
    },
    {
      "ref": "release-notes@flagon-tools",
      "name": "release-notes",
      "marketplace": "flagon-tools",
      "display_name": "Release notes",
      "description": "Writes release notes from merged pull requests.",
      "version": "0.3.1",
      "author": "Flagon",
      "homepage": "https://g1t.sh/flagon-io/plugins",
      "category": "docs",
      "tags": [],
      "keywords": [
        "releases"
      ],
      "fetch": {
        "kind": "g1t",
        "repo": "flagon-io/plugins",
        "ref": null,
        "path": "plugins/release-notes"
      },
      "availability": {
        "kind": "available"
      },
      "skills": [
        "release-notes"
      ]
    }
  ],
  "skills": [
    {
      "ref": "release-notes:release-notes",
      "name": "release-notes",
      "plugin": "release-notes",
      "marketplace": "flagon-tools",
      "description": "Writes release notes from merged pull requests.",
      "category": "docs",
      "author": "Flagon",
      "added": false,
      "availability": {
        "kind": "available"
      }
    }
  ],
  "marketplaces": [
    {
      "name": "claude-plugins-official",
      "source": {
        "source": "github",
        "repo": "anthropics/claude-plugins-official"
      },
      "builtin": true,
      "about": "Official plugins from Anthropic.",
      "owner": "Anthropic",
      "plugins": 42,
      "fetched_at": "2026-10-11T14:02:11.408Z",
      "problem": null,
      "added_by": null,
      "added_at": null,
      "can_remove": false
    }
  ]
}
```

## Errors

A failed request answers with one of these statuses and a body like `{"error": {"code": "not_found", "message": "Repository not found."}}`. See [errors](/reference/api/#errors).

| Status | Code | When |
| --- | --- | --- |
| 401 | `unauthenticated` | A token is required, or the one sent is not valid. |
| 403 | `forbidden` | The token is valid but not allowed to do this, such as a member-only change or an agent token outside its repository. |
| 404 | `not_found` | It does not exist, or you cannot see it. |
| 422 | `invalid` | The input is not valid. `message` says which field and why. |
