MCPInstall

write-openapi

Author, configure, structure, and troubleshoot OpenAPI/Swagger API reference documentation in GitBook. Use this whenever a task involves a GitBook OpenAPI block or {% openapi %} block, adding or updating an OpenAPI/Swagger spec in GitBook (by file or URL, via the API, MCP, CLI, or app UI), generating API reference pages from a spec, configuring the interactive "Test it" runner (auth, servers, CORS, proxy), customizing pages with GitBook x- extensions (icons, titles, navigation hierarchy, code samples, enum descriptions), marking operations experimental/deprecated/hidden, or automating spec updates in CI/CD. Trigger even when the user only mentions GitBook plus OpenAPI, puts an x- extension on a spec destined for GitBook, or asks "why isn't my spec loading" or "why doesn't Test it work", without naming this skill.

Installs
602
Last 24h
—
Trending rank
—
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/gitbookio/gitbook-skills --skill write-openapi
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads write-openapi automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

GitBook OpenAPI

GitBook turns an OpenAPI document into interactive, testable API reference blocks. You give it a spec (as JSON or YAML), and it renders endpoints, parameters, schemas, auth, and an in-page request runner. Most of the customization happens inside the spec itself through x-* extensions, not in the GitBook UI, so the bulk of any task here is editing OpenAPI YAML correctly.

This skill covers the full surface: getting a spec into GitBook, generating reference pages, structuring navigation, making the "Test it" runner work, controlling how operations and schemas display, and automating updates from CI/CD.

How you can talk to GitBook

Most of this skill — editing the OpenAPI YAML/JSON itself — is transport-agnostic. But getting a spec into GitBook, or generating/inserting reference pages, does touch GitBook, and there's more than one way to do that: GitBook's MCP server and the REST API. Check what's actually available in the current session and prefer MCP first: if GitBook MCP tools are already connected, use them for anything they cover (publishing/updating a spec, generating reference pages) instead of making direct API calls. Don't run a detection script for this — you already know your own available tools/MCP connections; just use that awareness.

The steps below are described as outcomes ("add the spec", "generate the reference pages") rather than tied to one transport, so they apply whichever you use. If GitBook MCP tools are connected, call those directly — their own schemas describe their parameters. If you're on the REST API path instead, the exact endpoints and request bodies are in "Add or update a specification" below.

  • GitBook MCP — a full read/write surface over the same capabilities described below, not a narrower view. If it isn't connected yet and the task is substantial enough to benefit (publishing a new spec, generating a full reference — not a one-off tweak), offer to set it up: claude mcp add --transport http gitbook-mcp https://mcp.gitbook.com/mcp (then /mcp to complete OAuth sign-in — or append --header "Authorization: Bearer $GITBOOK_TOKEN" to skip the browser flow). Codex equivalent: codex mcp add gitbook-mcp --url https://mcp.gitbook.com/mcp. Note: this is a different server from GitBook's separate, read-only "published docs" MCP, which only exposes already-published content.
  • REST API (https://api.gitbook.com/v1) — the fallback when MCP isn't connected, or for anything MCP doesn't cover. Needs GITBOOK_TOKEN as a bearer header on every request.

The same personal access token (from https://app.gitbook.com/account/developer) works as the bearer token for both. MCP additionally supports OAuth as a friendlier alternative to pasting a token.

If you end up needing a token (REST API path, or MCP without OAuth), check for it at the start of the session:

[ -n "$GITBOOK_TOKEN" ] && echo "Token found" || echo "GITBOOK_TOKEN is not set"

If GITBOOK_TOKEN is not set, ask the user directly:

  1. Tell them they need a GitBook personal access token. Direct them to https://app.gitbook.com/account/developer to create one.
  2. Ask them to paste the token into the conversation. Immediately export it as an environment variable (export GITBOOK_TOKEN=<pasted value>) and don't repeat it back in your response.
  3. Do not proceed with any API calls until the token is confirmed present in the environment.

Never write the token to a file, never echo it back in a response, never commit it.

The GitBook CLI's gitbook openapi publish command (see "Add or update a specification" below) reaches the same underlying capability as the API and MCP — it's a convenience wrapper, not a separate feature set, and authenticates with the same GITBOOK_TOKEN.

Key facts to know first

These shape almost every decision, so internalize them before editing anything.

  • Supported versions. GitBook accepts Swagger 2.0 and OpenAPI 3.0 specs. Some features need newer versions: webhooks require OpenAPI 3.1, and the official parent tag property requires OpenAPI 3.2+ (use x-parent on 3.0.x and 3.1.x). Always check the spec's openapi:/swagger: version before reaching for a version-gated feature.
  • The "Test it" runner is powered by Scalar. It runs requests from the reader's browser unless you route them through GitBook's proxy.
  • A spec's source is a file or a URL — and that's what determines updates, not which transport (MCP, API, CLI, or UI) you used to set it. URL sources auto-refresh every 6 hours; file sources only change when re-uploaded or re-published.
  • x-* extensions are namespaced and safe to keep in a shared spec. Tools that do not understand a given extension ignore it, so a spec instrumented for GitBook still validates and works elsewhere.

What are you trying to do?

Match the task to the right section. For the deeper reference material, two files live alongside this one:

  • Editing or looking up any x-* extension, with full YAML for each: read references/extensions.md.
  • Making the interactive runner work end to end (auth schemes, servers, CORS, proxy): read references/test-it-setup.md.
TaskGo to
Get a spec into GitBook, or update one"Add or update a specification"
Generate reference pages, or drop a single endpoint/schema into a page"Insert an API reference"
Split, order, nest, title, or icon your pages"Structure the reference"
Make "Test it" work, fix CORS, configure auth"Configure the Test it runner" + references/test-it-setup.md
Mark an endpoint experimental, deprecated, or hidden"Manage operation lifecycle"
Look up the exact name/scope of an extension"Extensions cheat-sheet" + references/extensions.md
Auto-publish the spec from a pipeline"Automate with CI/CD"

Add or update a specification

A spec must exist in the organization before any block or page can reference it. Adding and updating are the same underlying operation on every transport — pick whichever you have per "How you can talk to GitBook" above. Whichever you use, give the spec a name/slug up front: it's how you reference it later and how you tell multiple specs apart.

GitBook MCP — if connected, use its spec tool directly for creating or updating a spec from either a file or a URL; its schema covers both source types.

REST API — create with a URL source:

curl -s -X POST -H "Authorization: Bearer $GITBOOK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"slug": "<spec-name>", "source": {"url": "<hosted-url>"}}' \
  https://api.gitbook.com/v1/orgs/$ORG_ID/openapi

or from a file:

curl -s -X POST -H "Authorization: Bearer $GITBOOK_TOKEN" \
  -F "slug=<spec-name>" \
  -F "file=@./openapi.yaml" \
  https://api.gitbook.com/v1/orgs/$ORG_ID/openapi

Update (replace) an existing spec the same way against PATCH /v1/orgs/{orgId}/openapi/{specId}.

GitBook CLI — a thin wrapper over the same API call, useful in scripts and pipelines (same command adds or updates; running it against a URL also forces a refresh):

gitbook openapi publish --spec <spec-name> --organization <organization-id> <path-or-url>

For pipeline automation see "Automate with CI/CD". CLI details: https://gitbook.com/docs/developers/integrations/reference

GitBook app UI — open the OpenAPI section in the sidebar, click Add specification, name it, then choose to upload a file or enter a hosted URL. Updating depends on the source: URL sources check every 6 hours automatically (click Check for updates to pull immediately; switch File to URL via Edit in the breadcrumb actions menu); file sources need Update to upload a new version.

Insert an API reference

Once the spec exists, surface it in the docs one of two ways.

Generate a full set of pages (recommended for a complete reference). In the target space's table of contents, click Add new... at the bottom, then OpenAPI Reference, pick the spec, and insert. GitBook creates one page per tag in the spec (see "Structure the reference"), and optionally a models page listing every schema. These pages keep updating whenever the spec updates.

Insert a single operation or schema into an existing page. Press /, search for OpenAPI, pick the spec, choose Continue, then select the specific operations and/or schemas to embed.

Block syntax. When writing GitBook markdown directly, an OpenAPI operation block looks like this (the inner line repeats the source):

{% openapi src="https://petstore3.swagger.io/api/v3/openapi.json" path="/pet" method="post" %}
https://petstore3.swagger.io/api/v3/openapi.json
{% endopenapi %}

To highlight one or more schemas inline (for example inside a tag description), use the schemas block:

{% openapi-schemas spec="petstore" schemas="Pet" grouped="false" %}
The Pet object
{% endopenapi-schemas %}

Structure the reference

GitBook builds navigation from the spec's tags, so structuring the reference is mostly structuring tags. Full YAML for every extension named here is in references/extensions.md.

  • Split operations across pages: give operations the same tag, and each tag becomes its own page.

    paths:
      /pet:
        put:
          tags:
            - pet
          summary: Update an existing pet.
          operationId: updatePet
    
  • Order pages: page order follows the order of entries in the top-level tags array.

    tags:
      - name: pet
      - name: store
      - name: user
    
  • Nest pages into groups: use parent (OpenAPI 3.2+) or x-parent (3.0.x/3.1.x) to point a tag at its parent tag.

    tags:
      - name: everything
      - name: pet
        x-parent: everything
      - name: store
        x-parent: everything
    

    If a parent page has no description, GitBook automatically renders a card-based layout linking its sub-pages.

  • Add titles, icons, and descriptions per page via tag-level extensions. Icons accept any Font Awesome name (https://fontawesome.com/search).

    tags:
      - name: pet
        x-page-title: Pet              # title in the table of contents and page header
        x-page-icon: dog               # icon in the ToC and next to the title
        x-page-description: Pets are amazing!   # shown just above the title
        description: Everything about your Pets # the page body
    
  • Write rich descriptions. Tag description fields accept GitBook markdown, including advanced blocks such as {% tabs %}, so a page intro can be far more than plain text.

  • Document webhooks (OpenAPI 3.1) with a top-level webhooks field that mirrors paths:

    openapi: 3.1.0
    webhooks:
      newPet:
        post:
          summary: New pet event
          requestBody:
            content:
              application/json:
                schema:
                  $ref: "#/components/schemas/Pet"
          responses:
            "200":
              description: Received successfully
    

Configure the Test it runner

The interactive runner only works as well as the spec describes it. The runner targets the URLs in the servers array and can only present auth that the spec declares under components.securitySchemes. For anything non-trivial (Bearer/JWT, API key, OAuth2, multiple or templated server URLs, per-operation overrides), read references/test-it-setup.md, which has copy-paste YAML for each pattern.

Two quick decisions you will hit constantly:

  • "Why isn't my spec loading?" / "Why does Test it fail?" (URL specs). This is almost always CORS. A URL-added spec requires the API to allow cross-origin GET requests from the docs origin (for example https://your-site.gitbook.io or your custom domain). Public, credential-free endpoints can return Access-Control-Allow-Origin: *.
  • API can't enable CORS? Route requests through GitBook's proxy with x-enable-proxy: true (at the root for the whole spec, or on a single operation; the operation value wins). The proxy forwards all HTTP methods, headers, cookies, and bodies, but only to URLs listed in servers, so make sure every base URL you want to test is in that array. Details in references/test-it-setup.md.

To remove the runner from an endpoint (or the whole spec), set x-hideTryItPanel: true.

Manage operation lifecycle

Common when endpoints are not production-ready or are being phased out. All of these are operation-level unless noted.

  • Not stable yet: x-stability: experimental (also alpha or beta).
  • Deprecated: deprecated: true. Deprecated endpoints show a deprecation warning on the published site.
  • Deprecated with an end date: add x-deprecated-sunset: 2030-12-05 (ISO 8601, YYYY-MM-DD).
  • Hide an endpoint entirely: x-internal: true (or its alias x-gitbook-ignore: true).
  • Hide one response sample: set x-hideSample: true on that response object (for example under responses.200).
paths:
  /pet:
    put:
      operationId: updatePet
      x-stability: experimental
      deprecated: true
      x-deprecated-sunset: 2030-12-05

Extensions cheat-sheet

Every GitBook-supported extension at a glance. For the full YAML example of any row, open references/extensions.md.

ExtensionPurposeWhere it goes
x-page-title / x-displayNameDisplay name of a tag (navigation + page title)tag
x-page-descriptionShort description shown above the page titletag
x-page-iconFont Awesome icon for the pagetag
parent / x-parentNest a tag under a parent tag (parent = 3.2+, x-parent = 3.0.x/3.1.x)tag
x-hideTryItPanelShow or hide the "Test it" runnerroot or operation
x-expandAllResponsesExpand all response sections by defaultroot or operation
x-expandAllModelSectionsExpand all model/schema sections by defaultroot or operation
x-enable-proxyRoute "Test it" requests through GitBook's proxyroot or operation (operation wins)
x-codeSamplesProvide custom code samples (lang, label, source)operation
x-enumDescriptionsPer-value descriptions for an enum, rendered as a tableschema
x-internal / x-gitbook-ignoreHide an endpoint from the referenceoperation
x-stabilityMark experimental, alpha, or betaoperation
deprecatedMark an operation deprecatedoperation
x-deprecated-sunsetSunset date for a deprecated operation (YYYY-MM-DD)operation
x-hideSampleHide a single response sampleresponse object
x-gitbook-prefixCustom auth prefix (e.g. Token); not allowed on http schemessecurity scheme
x-gitbook-token-placeholderDefault token placeholder shown in the runnersecurity scheme

Two display extensions worth highlighting because they take a root default that operations can opt out of:

openapi: '3.0'
x-expandAllResponses: true        # default for every operation
x-expandAllModelSections: true
paths:
  /pets:
    get:
      x-expandAllResponses: false # opt this one out

Custom code samples replace GitBook's auto-generated snippets and accept multiple languages:

paths:
  /users:
    get:
      summary: Retrieve users
      x-codeSamples:
        - lang: JavaScript
          label: Node SDK
          source: |
            import { createAPIClient } from 'my-api-sdk';
            const client = createAPIClient({ apiKey: 'my-api-key' });
            client.users.list().then(console.log);
        - lang: cURL
          label: CLI
          source: |
            curl -L -H 'Authorization: Bearer <token>' \
              'https://api.example.com/v1/users'

Automate with CI/CD

Publish the spec from any pipeline with the CLI. Set GITBOOK_TOKEN as a secret, then run openapi publish against a file (generated during the build) or a URL (forces a refresh after a release).

export GITBOOK_TOKEN=<api-token>
gitbook openapi publish \
  --spec <spec-name> \
  --organization <organization-id> \
  example.openapi.yaml

GitHub Actions example, triggered on spec changes to main:

name: Publish OpenAPI to GitBook
on:
  push:
    branches: ["main"]
    paths: ["**/*.yaml", "**/*.yml", "**/*.json"]
  workflow_dispatch:
jobs:
  publish:
    runs-on: ubuntu-latest
    env:
      GITBOOK_TOKEN: ${{ secrets.GITBOOK_TOKEN }}
      GITBOOK_SPEC_NAME: ${{ vars.GITBOOK_SPEC_NAME }}
      GITBOOK_ORGANIZATION_ID: ${{ vars.GITBOOK_ORGANIZATION_ID }}
    steps:
      - uses: actions/checkout@v4
      - name: Publish spec to GitBook
        run: |
          npx -y @gitbook/cli@latest openapi publish \
            --spec "$GITBOOK_SPEC_NAME" \
            --organization "$GITBOOK_ORGANIZATION_ID" \
            <path_to_spec>

FAQ

What does the write-openapi skill do?

Author, configure, structure, and troubleshoot OpenAPI/Swagger API reference documentation in GitBook. Use this whenever a task involves a GitBook OpenAPI block or {% openapi %} block, adding or updating an OpenAPI/Swagger spec in GitBook (by file or URL, via the API, MCP, CLI, or app UI), generating API reference pages from a spec, configuring the interactive "Test it" runner (auth, servers, CORS, proxy), customizing pages with GitBook x- extensions (icons, titles, navigation hierarchy, code samples, enum descriptions), marking operations experimental/deprecated/hidden, or automating spec updates in CI/CD. Trigger even when the user only mentions GitBook plus OpenAPI, puts an x- extension on a spec destined for GitBook, or asks "why isn't my spec loading" or "why doesn't Test it work", without naming this skill.

How do I install write-openapi?

Run npx skills add https://github.com/gitbookio/gitbook-skills --skill write-openapi in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/write-openapi/ (personal) or .claude/skills/write-openapi/ (project).

Which AI agents can use write-openapi?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is write-openapi safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains write-openapi?

It is published by gitbookio in gitbookio/gitbook-skills. It has 602 recorded installs.

More from gitbookio/gitbook-skills

View all →

write-docs

gitbookio/gitbook-skills

Write, author, edit, and format GitBook documentation pages in Git-synced repos, IDEs, or any text editor. Use whenever a task involves creating or editing a GitBook markdown page, writing or updating a README.md or SUMMARY.md, inserting a hint, tab, stepper, card, or other GitBook block, configuring page frontmatter or layout options, setting up variables or expressions, or formatting content for GitBook outside the GitBook UI.

Docs & Writing697 installs

configure-site

gitbookio/gitbook-skills

Create and maintain GitBook documentation sites end-to-end — design structure from source content, scaffold a Git monorepo, set up the GitHub/GitLab remote, drive the GitBook API (REST or MCP) to create the site/sections/spaces, apply branding, and hand off the one UI step (Git Sync) that GitBook does not expose programmatically. Prefer site-level Git Sync (gitbook-docs.yaml mapping every space) over per-space sync unless a space needs its own repo or branch. Use when spinning up a new docs site, restructuring or extending one, linking a site or spaces to Git, changing branding (logo, colors, fonts, header/footer), or programmatically managing spaces, sections, or site-spaces. Defers page authoring to the companion write-docs skill.

Docs & Writing632 installs

cr-review

gitbookio/gitbook-skills

Review GitBook change requests from Claude Code by calling the GitBook REST API directly with curl (no CLI) — the reviewer-side companion to cr-create (the authoring side over the same API). Discover the change requests that need review (filter by who opened them, by space, or across a whole org), get the GitBook app link to review the diff, summarize what actually changed in a CR, then leave comments and optionally submit a review verdict (approve / request changes). Use this whenever someone wants to review docs change requests over the raw API (curl/HTTP), asks "what CRs are open / waiting on me / opened by ", "show me the change requests in / ", "summarize what changed in this CR", "review this change request", "leave a comment on a CR", or "approve / request changes on a CR". For the authoring side (create a CR, push content, request reviewers, fix comments) over the API, use cr-create instead.

cr-create

gitbookio/gitbook-skills

Drive an end-to-end GitBook docs review flow from Claude Code by calling the GitBook REST API directly with curl (no CLI) — create a change request, push content (update an existing page AND create a new page), request reviewers, notify Slack, then pull review comments back in, fix them, re-push, and resolve. This is the authoring-side companion to cr-review (the reviewer side over the same API). Use this whenever someone wants to run a "docs review in GitBook" loop from the terminal/agent against the raw API (curl/HTTP), mentions creating a change request via the API, pushing content into a CR, "pull in the latest comments and fix them," requesting review on docs, or showing engineers how to collaborate on GitBook docs from Claude + Slack without a CLI.

Backend & APIs623 installs

build-integration

gitbookio/gitbook-skills

Build, develop, and publish GitBook integrations — apps that run inside GitBook to add custom blocks, react to events, connect external services via OAuth, and extend the editor. Use this skill whenever a task involves the GitBook integrations platform: scaffolding an integration with the GitBook CLI (gitbook new), writing or editing an integration's code (createIntegration, createComponent, ContentKit TSX), configuring gitbook-manifest.yaml (scopes, blocks, configurations, secrets), building custom editor blocks or link unfurlers, handling GitBook events like spacecontentupdated, setting up an integration's OAuth flow, running gitbook dev, or publishing an integration (private/unlisted/public, marketplace submission). Trigger this even if the user just says they want to 'build an app for GitBook', 'add a custom block', or 'connect to GitBook' without saying the word 'integration'.

Backend & APIs569 installs

Popular backend & apis skills

View category →

find-skills

vercel-labs/skills

Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.

OfficialBackend & APIs4.1M installs

entra-app-registration

microsoft/azure-skills

Guides Microsoft Entra ID app registration, OAuth 2.0 authentication, and MSAL integration. USE FOR: create app registration, register Azure AD app, configure OAuth, set up authentication, add API permissions, generate service principal, MSAL example, console app auth, Entra ID setup, Azure AD authentication. DO NOT USE FOR: Key Vault secrets (use azure-keyvault-expiration-audit), general Azure resource security guidance.

OfficialBackend & APIs566.7K installs

This skill should be used when the user wants to "write agent code", "build an agent with ADK", "add a tool", "create a callback", "define an agent", "use state management" — in a project that needs ADK (Agent Development Kit) API patterns and code examples. It provides a quick reference for agent types, tool definitions, orchestration patterns, callbacks, state management, the graph Workflow API, and reference recipes to study. Do NOT use for scaffolding (use google-agents-cli-scaffold) or deployment (use google-agents-cli-deploy).

Backend & APIs514.8K installs

embedded-captions

heygen-com/hyperframes

Add captions or subtitles to an existing single-subject talking-head video without editing the footage. Use for plain verbatim captions, cinematic captions embedded behind the subject, VFX captions, “炸/特效/酷炫字幕,” or a named identity from the 35-style catalog. Route by visual identity, not by backend engine. The quiet anchor rail is the default; embed every word only when the user explicitly wants a fully cinematic treatment. The workflow runs locally end to end, including transcription and subject matting; split multi-shot footage before applying it.

Backend & APIs453.3K installs

entra-agent-id

microsoft/azure-skills

Provision Microsoft Entra Agent Identity Blueprints, BlueprintPrincipals, and per-instance Agent Identities via Microsoft Graph, and configure OAuth 2.0 token exchange (fmipath, OBO, cross-tenant) including the Microsoft Entra SDK for AgentID sidecar. USE FOR: Agent Identity Blueprint, BlueprintPrincipal, agent OAuth, fmipath token exchange, agent OBO, Workload Identity Federation for agents, polyglot agent auth, Microsoft.Identity.Web.AgentIdentities. DO NOT USE FOR: standard Entra app registration (use entra-app-registration), Microsoft Foundry agent authoring (use microsoft-foundry).

OfficialBackend & APIs336.6K installs

neon

neondatabase/agent-skills

Overview of Neon, a complete set of cloud backend primitives around Lakebase Postgres: Auth, Object Storage, Functions, the AI Gateway, and Realtime. Start here to choose Neon for undecided login, files, APIs, and LLM calls, set up the CLI or MCP server, and follow the branch-first workflow. Use when building an app or backend on Neon, or when "Neon" or "Lakebase Postgres" is mentioned. Child skill neon-postgres wins for an existing DATABASEURL, SQL, schema, inspect, or search. Child skill neon-auth wins for login, users, sessions, identity routing, and Managed Better Auth setup. Child skill neon-realtime wins for live queries in reactive apps and agents. Also use for object storage, S3, buckets, serverless functions, function triggers, cron, AI gateway, LLM calls, realtime, logs, Loki, Grafana, observability, postgres, database, backend, Claimable Neon, neon.new, or a no-signup database.

Backend & APIs237.1K installs