Skip to main content
Glama

OpenAPI MCP Server

A generic Model Context Protocol (MCP) server that exposes any OpenAPI-documented REST API to LLMs like Claude.

Features

  • Auto-discovers endpoints from any OpenAPI 3.x specification (YAML or JSON)

  • Two simple tools: api_discover and api_request

  • Flexible authentication: None, API Key, or Bearer token

  • Caching: Caches OpenAPI spec locally with configurable TTL

  • Retry logic: Automatic retry on rate limits (429) with exponential backoff

Related MCP server: Public API MCP Server

Installation

npm install @cloudwarriors/openapi-mcp

Or run directly with npx:

npx @cloudwarriors/openapi-mcp

Configuration

The server is configured via environment variables:

Required

Variable

Description

Example

API_BASE_URL

Base URL of the API

https://api.example.com

Optional

Variable

Description

Default

API_OPENAPI_PATH

Path to OpenAPI spec

/openapi.yaml

API_AUTH_TYPE

Authentication type: none, apiKey, bearer

none

API_KEY

API key (when API_AUTH_TYPE=apiKey)

-

API_KEY_HEADER

Header name for API key

X-API-Key

API_BEARER_TOKEN

Bearer token (when API_AUTH_TYPE=bearer)

-

API_TIMEOUT_MS

Request timeout in milliseconds

30000

API_CACHE_TTL_MS

OpenAPI spec cache TTL

3600000 (1 hour)

Usage with Claude Code

Add to your .mcp.json or Claude Code settings:

{
  "mcpServers": {
    "my-api": {
      "command": "npx",
      "args": ["@cloudwarriors/openapi-mcp"],
      "env": {
        "API_BASE_URL": "https://api.example.com",
        "API_OPENAPI_PATH": "/docs/openapi.yaml"
      }
    }
  }
}

Example: Connecting to Hermes

{
  "mcpServers": {
    "hermes": {
      "command": "npx",
      "args": ["@cloudwarriors/openapi-mcp"],
      "env": {
        "API_BASE_URL": "http://localhost:3345",
        "API_OPENAPI_PATH": "/api/docs/openapi.yaml"
      }
    }
  }
}

Example: Connecting to a Protected API

{
  "mcpServers": {
    "my-api": {
      "command": "npx",
      "args": ["@cloudwarriors/openapi-mcp"],
      "env": {
        "API_BASE_URL": "https://api.mycompany.com",
        "API_OPENAPI_PATH": "/openapi.json",
        "API_AUTH_TYPE": "bearer",
        "API_BEARER_TOKEN": "your-token-here"
      }
    }
  }
}

Tools

api_discover

Lists all available API endpoints grouped by domain/tag.

Parameters:

  • domain (optional): Filter endpoints by domain/tag

  • includeParameters (optional): Include parameter details (default: false)

Example:

{ "domain": "users", "includeParameters": true }

api_request

Makes an HTTP request to any API endpoint.

Parameters:

  • method (required): HTTP method (GET, POST, PUT, DELETE, PATCH)

  • path (required): API path (e.g., /api/users/{id})

  • body (optional): Request body for POST/PUT/PATCH

  • query (optional): Query parameters as key-value pairs

  • pathParams (optional): Path parameter substitutions

Example:

{
  "method": "GET",
  "path": "/api/users/{id}",
  "pathParams": { "id": "123" }
}

Finding Your API's OpenAPI Spec

Common locations for OpenAPI specifications:

  • /openapi.yaml or /openapi.json

  • /api/docs/openapi.yaml

  • /swagger.json

  • /v1/openapi.json

  • /api-docs

Check your API's documentation or try accessing these paths directly.

Development

# Install dependencies
npm install

# Build
npm run build

# Run tests
npm test

# Development mode (watch)
npm run dev

License

MIT

Author

CloudWarriors

Available Tools

2 tools
api_discoverDiscover API EndpointsA
Read-onlyIdempotent

List all available API endpoints grouped by domain. Call this first to understand what APIs are available before making requests. Returns method, path, description, and optionally parameters for each endpoint.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoFilter endpoints by domain/tag (e.g., 'auth', 'servers', 'workflows')
includeParametersNoInclude parameter details for each endpoint

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable context beyond annotations by specifying the return format ('Returns method, path, description, and optionally parameters for each endpoint') and the optional parameter inclusion behavior. While annotations cover safety (readOnlyHint, destructiveHint) and idempotency, the description provides practical output details that help the agent understand what to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise (two sentences) and front-loaded with the core purpose. Every sentence earns its place: the first states what it does, the second provides usage guidance and output details. There's zero wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (discovery operation with 2 parameters), rich annotations (4 hints covering safety and behavior), and no output schema, the description provides good completeness. It covers purpose, usage context, and output format, though it doesn't detail potential limitations like pagination or rate limits.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the input schema already fully documents both parameters. The description mentions 'optionally parameters for each endpoint' which relates to the 'includeParameters' parameter, but doesn't add significant meaning beyond what's in the schema. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('List all available API endpoints grouped by domain') and distinguishes it from the sibling tool 'api_request' by emphasizing this is for discovery before making actual requests. It explicitly mentions the verb 'list' and resource 'API endpoints' with grouping by domain.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool ('Call this first to understand what APIs are available before making requests') and implicitly suggests an alternative (use 'api_request' for actual API calls). It clearly establishes the context for discovery versus execution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

api_requestAPI RequestA

Make an HTTP request to any API endpoint. Use api_discover first to see available endpoints and their parameters. Supports path parameter substitution (e.g., '/api/servers/{id}' with pathParams: { 'id': '123' }).

ParametersJSON Schema
NameRequiredDescriptionDefault
methodYesHTTP method for the request
pathYesAPI path (e.g., '/api/auth/status' or '/api/servers/{id}')
bodyNoRequest body for POST/PUT/PATCH requests (will be JSON-encoded)
queryNoQuery parameters as key-value pairs
pathParamsNoPath parameters to substitute (e.g., { 'id': '123' } for /api/servers/{id})

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable behavioral context beyond annotations: it explains path parameter substitution syntax with a concrete example, mentions JSON encoding for request bodies, and references the api_discover prerequisite. While annotations cover safety aspects (readOnlyHint=false, destructiveHint=false), the description provides practical implementation details that help the agent use the tool correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely efficient two-sentence structure with zero waste. The first sentence states the core purpose, the second provides critical usage guidance and parameter example. Every word serves a clear purpose in helping the agent understand and use the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a flexible HTTP request tool with openWorldHint=true and no output schema, the description provides good context about the workflow (api_discover prerequisite) and parameter usage (path substitution example). However, it doesn't address potential authentication requirements, rate limits, or error handling that would be helpful for such a general-purpose tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema already documents all 5 parameters thoroughly. The description adds minimal parameter semantics - only clarifying path parameter substitution with an example. This meets the baseline expectation when schema coverage is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Make an HTTP request') and resource ('to any API endpoint'), with explicit differentiation from its sibling tool ('Use api_discover first'). It goes beyond the tool name/title by specifying the HTTP nature and endpoint targeting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance ('Use api_discover first to see available endpoints and their parameters') and names the alternative tool (api_discover). This creates clear workflow context for when to use this tool versus its sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 2 tool updatesv1.0.0
    • First observedapi_discover
    • First observedapi_request

TDQS

A4.1/5.0
Disambiguation5/5

The two tools have clearly distinct purposes: api_discover is for listing and exploring available API endpoints, while api_request is for executing HTTP requests to those endpoints. There is no overlap in functionality, making it easy for an agent to choose the right tool for each task.

Naming Consistency5/5

Both tools follow a consistent snake_case naming pattern with a clear 'api_' prefix and descriptive action names (discover and request). This uniformity makes the tool set predictable and easy to understand at a glance.

Tool Count2/5

With only two tools, the server feels under-scoped for an OpenAPI server, which typically involves operations like schema validation, endpoint testing, or parameter management. While the tools cover basic discovery and execution, the count is too low for comprehensive API interaction, limiting functionality.

Completeness2/5

The tool set is severely incomplete for an OpenAPI domain, lacking essential operations such as schema retrieval, parameter validation, response inspection, or error handling. Agents will face dead ends when needing to perform common API tasks beyond simple listing and requesting, leading to potential failures.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A generic MCP server that dynamically converts OpenAPI-defined REST APIs into tools for LLMs like Claude. It supports multiple authentication methods and transport protocols, enabling seamless interaction with any OpenAPI-compliant API.
    21
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Transforms OpenAPI specs into an MCP server, enabling dynamic API interaction through natural language with automatic authentication and endpoint discovery.
    131
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables LLMs to interact with any REST API that has an OpenAPI specification by providing a lightweight MCP server that translates between natural language and API calls.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A generic MCP server that converts any OpenAPI/Swagger specification into MCP tools, enabling AI assistants to search, explore, and execute REST APIs.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cloudwarriors-ai/openapi-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server