Hermoso AI Discovery API

Machine-readable documents that let a client find and describe this server without being configured by hand.

GitHub OpenAPI

Operations 3

GET /.well-known/mcp.json Get the MCP server card #
GET /.well-known/oauth-protected-resource Get OAuth protected-resource metadata (RFC 9728) #
GET /.well-known/oauth-authorization-server Get OAuth authorization server metadata (RFC 8414) #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/hermoso-ai:hermoso-ai-discovery-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

hermoso-ai-discovery-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Hermoso MCP server and OAuth (not the REST API) Discovery…
  version: 1.0.0
  summary: 'The Hermoso MCP endpoint and its OAuth documents. The REST API at /v1 is described by its own spec, generated from the router: https://app.hermoso.ai/openapi.json'
  description: 'Hermoso is an AI marketing studio built to be driven by an agent. The **public programmatic interface is a Model Context Protocol (MCP) server** at `POST https://app.hermoso.ai/mcp`, speaking JSON-RPC 2.0 over the MCP Streamable HTTP transport. One connection exposes the whole loop as tools: research the ads running in a market, generate on-brand image and video ads, publish or schedule them to the brand''s own channels, and build and read paid campaigns.


    **This document describes the MCP endpoint and the OAuth documents around it, and nothing else.** It is deliberately small, because the MCP surface genuinely is: the tools are not separate REST paths, they are `tools/call` methods on the single MCP endpoint. Call `tools/list` after `initialize` to enumerate them, or read the generated roster at .


    **There is also a public REST API, and it has its own document.** `/v1` covers publishing, scheduling, media, channels and credits on the same `hmk_` bearer token, and an agent with no account can provision one on a paid plan with `POST /v1/signup`. It is not described here, deliberately: its OpenAPI document is GENERATED from the same operations table the router is mounted from, so a second hand-written copy would be a second thing to go stale. Read it at (live, authoritative) or (static copy), and the prose at . `/v1` sends no CORS headers either, on purpose: an API key carries full account authority.


    **What genuinely has no contract are the routes under `/api` on the app.** They are shaped for our own web client, they authenticate with a browser session, and they change frequently. They are not documented anywhere because building against them will break. Use `/v1`, MCP or the npm CLI (`npm install -g hermoso`).


    ## Authenticating


    Two methods, both bearer tokens on the `Authorization` header:


    - **OAuth 2.1 authorization code + PKCE** — the path an MCP client takes. Dynamic client registration is open (RFC 7591), so a client can register itself with no pre-arranged credentials. Discovery follows RFC 9728 and RFC 8414: the `401` from `/mcp` carries a `WWW-Authenticate: Bearer resource_metadata="…"` header pointing at the protected-resource document.

    - **Agent key** — a long-lived `hmk_…` token minted at app.hermoso.ai → MCP & CLI → Terminal & API keys, for scripts and headless agents.


    `initialize` answers without a token so a client can discover the server before authenticating. `tools/call` requires one.


    ## Errors


    Every failure has the same JSON shape — `error` (a human-safe string), an optional `connector` key naming a provider that is not linked, and an optional `meta` object of machine-readable hints. The one rule worth memorising: **a 401 without a `connector` field means your key is bad; a 401 with one means that provider is not connected.** Branch on the field''s presence, never on the message text. Full contract: .


    ## Costs


    Generation is metered in credits with exact published per-render prices. Call the `hermoso_capabilities` tool — free and read-only — before rendering: it returns the valid model ids with their exact credit costs and what this workspace has connected. Machine-readable price list: .'
  termsOfService: https://hermoso.ai/terms/
  contact:
    name: Hermoso support
    email: admin@hermoso.ai
    url: https://hermoso.ai/contact/
  license:
    name: Proprietary
    url: https://hermoso.ai/terms/
servers:
- url: https://app.hermoso.ai
  description: Production
security:
- bearerAuth: []
- oauth2:
  - hermoso.research
  - hermoso.generate
tags:
- name: Discovery
  description: Machine-readable documents that let a client find and describe this server without being configured by hand.
paths:
  /.well-known/mcp.json:
    get:
      operationId: getMcpServerCard
      tags:
      - Discovery
      summary: Get the MCP server card
      description: 'The server''s own description in the Model Context Protocol server schema: its name, what it does, the remote Streamable HTTP URL, and the npm package that runs it over stdio. Generated live from the running server, so it is authoritative if it ever disagrees with the prose on the website.'
      security:
      - {}
      responses:
        '200':
          description: The server card.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/McpServerCard'
  /.well-known/oauth-protected-resource:
    get:
      operationId: getProtectedResourceMetadata
      tags:
      - Discovery
      summary: Get OAuth protected-resource metadata (RFC 9728)
      description: Names the resource an access token must be audience-bound to, the authorization servers that may issue one, and the scopes this resource understands. An unauthenticated request to `/mcp` points here from its `WWW-Authenticate` header, which is how a client bootstraps the whole flow knowing only the MCP URL.
      security:
      - {}
      responses:
        '200':
          description: Protected-resource metadata.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProtectedResourceMetadata'
  /.well-known/oauth-authorization-server:
    get:
      operationId: getAuthorizationServerMetadata
      tags:
      - Discovery
      summary: Get OAuth authorization server metadata (RFC 8414)
      description: The authorization, token and dynamic-registration endpoints, the grant and response types supported, the PKCE methods accepted, and the scopes on offer. Everything a client needs to run the flow without being configured by hand.
      security:
      - {}
      responses:
        '200':
          description: Authorization server metadata.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthorizationServerMetadata'
components:
  schemas:
    McpServerCard:
      type: object
      title: McpServerCard
      description: The Model Context Protocol server description, as published in the MCP registry.
      required:
      - name
      - description
      - version
      properties:
        $schema:
          type: string
          format: uri
          description: The MCP server schema this document conforms to.
        name:
          type: string
          description: The registry name of the server.
          examples:
          - io.github.hermoso-ai/hermoso
        title:
          type: string
          description: The display name.
        description:
          type: string
          description: What the server does, written for an agent deciding whether to reach for it.
        version:
          type: string
          description: The published version, matching the npm package.
        websiteUrl:
          type: string
          format: uri
          description: The documentation home.
        repository:
          type: object
          description: Where the source lives.
          properties:
            url:
              type: string
              format: uri
              description: The repository URL.
            source:
              type: string
              description: The hosting service.
              examples:
              - github
            subfolder:
              type: string
              description: The path within the repository.
        remotes:
          type: array
          description: Hosted transports a client can connect to directly.
          items:
            type: object
            required:
            - type
            - url
            properties:
              type:
                type: string
                description: The transport.
                examples:
                - streamable-http
              url:
                type: string
                format: uri
                description: The endpoint URL.
        packages:
          type: array
          description: Packages that run the same server locally over stdio.
          items:
            type: object
            additionalProperties: true
    ProtectedResourceMetadata:
      type: object
      title: ProtectedResourceMetadata
      description: RFC 9728 protected-resource metadata.
      required:
      - resource
      - authorization_servers
      properties:
        resource:
          type: string
          format: uri
          description: The resource identifier an access token must be bound to.
          examples:
          - https://app.hermoso.ai/mcp
        authorization_servers:
          type: array
          description: Issuers permitted to mint tokens for this resource.
          items:
            type: string
            format: uri
        scopes_supported:
          type: array
          description: The scopes this resource understands.
          items:
            type: string
            enum:
            - hermoso.research
            - hermoso.generate
        bearer_methods_supported:
          type: array
          description: How a token may be presented.
          items:
            type: string
            enum:
            - header
    AuthorizationServerMetadata:
      type: object
      title: AuthorizationServerMetadata
      description: RFC 8414 authorization server metadata.
      required:
      - issuer
      - authorization_endpoint
      - token_endpoint
      properties:
        issuer:
          type: string
          format: uri
          description: The issuer identifier.
        authorization_endpoint:
          type: string
          format: uri
          description: Where a browser starts the flow.
        token_endpoint:
          type: string
          format: uri
          description: Where a code is exchanged for a token.
        registration_endpoint:
          type: string
          format: uri
          description: Where a client registers itself (RFC 7591).
        response_types_supported:
          type: array
          description: Supported response types.
          items:
            type: string
            enum:
            - code
        grant_types_supported:
          type: array
          description: Supported grant types.
          items:
            type: string
            enum:
            - authorization_code
        code_challenge_methods_supported:
          type: array
          description: Supported PKCE methods. `plain` is deliberately not offered.
          items:
            type: string
            enum:
            - S256
        token_endpoint_auth_methods_supported:
          type: array
          description: Clients are public, so no secret is issued and none is accepted.
          items:
            type: string
            enum:
            - none
        scopes_supported:
          type: array
          description: The scopes on offer.
          items:
            type: string
            enum:
            - hermoso.research
            - hermoso.generate
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'A Hermoso agent key (`hmk_…`), minted at app.hermoso.ai → MCP & CLI → Terminal & API keys. Sent as `Authorization: Bearer hmk_…`. A key is pinned to one brand workspace, and that pin is re-authorised on the server for every request — it is never read off a header the caller controls.'
    oauth2:
      type: oauth2
      description: OAuth 2.1 authorization code flow with PKCE (S256). Dynamic client registration is open, so no credentials need to be arranged in advance.
      flows:
        authorizationCode:
          authorizationUrl: https://app.hermoso.ai/oauth/authorize
          tokenUrl: https://app.hermoso.ai/oauth/token
          scopes:
            hermoso.research: 'Names the research surface: the Meta, Google and LinkedIn ad libraries, organic social search, competitor teardowns, and reads of the brand, workspace, credit balance and job status.'
            hermoso.generate: 'Names the acting surface: generating creative, publishing to connected channels, and building and reading ad campaigns. Renders consume credits, and any call that arms real ad spend requires an explicit per-call confirmation regardless of the token presented.'
externalDocs:
  description: Hermoso developer documentation
  url: https://hermoso.ai/docs/