Model Context Protocol (MCP) server that provides tools for interacting with API documentation. Supports GraphQL, OpenAPI/Swagger, and gRPC specifications, fetching schema definitions from various sources (local files or remote URLs), caching them, and exposing them through a set of tools.
- API Docs MCP
- Dynamic Tool Registration: Automatically discovers and registers tools from a specified directory.
- API Documentation Retrieval: Provides tools to list available API methods (
api_docs) and retrieve detailed documentation for specific methods (api_search). - Schema Caching: Caches API schema information to reduce redundant fetches and improve performance.
- Multiple Source Support:
- GraphQL: Supports loading GraphQL schemas from
graphql/gqlfiles orjsonintrospection results (local files or remote URLs). - OpenAPI/Swagger: Supports loading OpenAPI/Swagger
yaml/yml/jsonschemas from local files or remote URLs. - gRPC: Supports loading gRPC schemas from
protofiles or via gRPC reflection from remote URLs.
- GraphQL: Supports loading GraphQL schemas from
- Environment-based Configuration: Configures API sources via the
API_SOURCESenvironment variable, allowing flexible deployment and management. - Automatic Cache Refresh: Periodically refreshes cached schema data to ensure up-to-date documentation.
openapi.mp4
graphql.mp4
multiple-sources.mp4
The api-docs-mcp project is designed as an MCP server that integrates with various API documentation sources.
graph TD
mcpServer[MCP Server] e1@--> tools(Tools:<br/>api_docs / api_search);
tools e2@--> cacheManager{Cache Manager};
cacheManager e3@--> configuration[Configuration:<br/>API_SOURCES env var];
configuration e4@--> schemaSources{Schema Sources};
schemaSources e5@-- FileSource--> localFiles(Local Files:<br/>.graphql, .json, .yaml, .proto);
schemaSources e6@-- UrlSource--> remoteUrls(Remote URLs:<br/>GraphQL Endpoints, OpenAPI/Swagger Endpoints, gRPC Endpoints);
localFiles e7@--> processor[Schema Processors];
remoteUrls e8@--> processor;
processor e9@--> cacheManager;
processor e10@--> openAPIProcessor(OpenAPI Processor:<br/>OpenAPI/Swagger);
processor e11@--> graphQLProcessor(GraphQL Processor);
processor e12@--> grpcProcessor(gRPC Processor)
cacheManager e13@--Cached Data--> tools;
subgraph Core Components
mcpServer
tools
cacheManager
configuration
end
subgraph Data Flow
schemaSources
localFiles
remoteUrls
processor
openAPIProcessor
graphQLProcessor
grpcProcessor
end
e1@{ animate: true }
e2@{ animate: true }
e3@{ animate: true }
e4@{ animate: true }
e5@{ animate: true }
e6@{ animate: true }
e7@{ animate: true }
e8@{ animate: true }
e9@{ animate: true }
e10@{ animate: true }
e11@{ animate: true }
e12@{ animate: true }
e13@{ animate: true }
Flow of Operations:
- Server Initialization: The
index.tsentry point initializes the MCP server and dynamically registers tools defined in thesrc/toolsdirectory. - Configuration Loading: The
CacheManagerloads API source configurations from theAPI_SOURCESenvironment variable viasrc/utils/config.ts. - Schema Fetching & Caching:
- Based on the configured sources (file-based or URL-based), the
CacheManagerfetches API schemas. - For file sources, it reads local files (
graphql,gql,json,yaml,yml,proto). - For URL sources, it makes HTTP requests to GraphQL, OpenAPI, or gRPC endpoints.
- Schemas are then processed by specialized handlers (
src/api/api.tsfor OpenAPI,src/gql/gql.tsfor GraphQL,src/grpc/grpc.tsfor gRPC). - The processed documentation is stored in an in-memory cache (
src/utils/cache.ts) with a specified TTL (Time-To-Live). - The cache is periodically refreshed.
- Based on the configured sources (file-based or URL-based), the
- Tool Usage:
api_docs: When invoked, this tool retrieves a list of all available API resources from the cache, filtered bysourceif provided.api_search: When invoked with adetailName, this tool provides detailed documentation (request, response, error structures) for a specific API resource from the cache.
To set up the api-docs-mcp server, follow these steps:
-
Clone the repository:
git clone https://github.com/EliFuzz/api-docs-mcp.git cd api-docs-mcp -
Install dependencies:
pnpm install
-
Build the project:
pnpm build
The server's behavior is controlled by the API_SOURCES environment variable. This variable should contain a JSON string representing an array of SchemaSource objects. Each SchemaSource can be either a FileSource or a UrlSource.
For a local GraphQL schema:
{
"name": "MyGraphQLFile",
"path": "/path/to/your/schema.graphql",
"type": "gql"
}For a local OpenAPI JSON schema:
{
"name": "MyOpenAPIFile",
"path": "/path/to/your/openapi.json",
"type": "api"
}For a local gRPC proto file:
{
"name": "MyGrpcFile",
"path": "/path/to/your/service.proto",
"type": "grpc"
}For a remote GraphQL endpoint:
{
"name": "GitHubGraphQL",
"method": "POST",
"url": "https://api.github.com/graphql",
"headers": {
"Authorization": "Bearer YOUR_GITHUB_TOKEN"
},
"type": "gql"
}For a remote OpenAPI endpoint:
{
"name": "PetstoreAPI",
"method": "GET",
"url": "https://petstore.swagger.io/v2/swagger.json",
"type": "api"
}For a remote gRPC endpoint with reflection:
{
"name": "MyGrpcService",
"url": "grpc://localhost:9090",
"type": "grpc"
}You can set this in your shell before running the server:
export API_SOURCES='[{"name": "MyGraphQLFile", "path": "./example/fixtures/graphql/graphql-schema.graphql", "type": "gql"}, {"name": "PetstoreAPI", "method": "GET", "url": "https://petstore.swagger.io/v2/swagger.json", "type": "api"}]'Or in mcp.json for MCP execution:
"api-docs-mcp": {
"type": "stdio",
"command": "npx",
"args": [ "api-docs-mcp" ],
"env": {
"API_SOURCES": "[{\"name\": \"MyGraphQLFile\", \"path\": \"./example/fixtures/graphql/graphql-schema.graphql\", \"type\": \"gql\"}, {\"name\": \"PetstoreAPI\", \"method\": \"GET\", \"url\": \"https://petstore.swagger.io/v2/swagger.json\", \"type\": \"api\"}]"
}
}Once configured and running, the api-docs-mcp server exposes two primary tools: api_docs and api_search.
This tool provides a list of all available API methods from the configured sources.
Name: api_docs
Description: Get a list of all available API methods.
Input Schema:
{
source?: string; // The name of the API source (e.g., "GitHub") from MCP configuration environment variables. If not provided, docs from all sources will be returned.
}Output Schema:
{
sources: Array<{
name: string; // The name of the source API
resources: Array<{
name: string; // The name of the API resource
description: string; // A brief description of the API resource
resourceType: string; // The type of the API resource (e.g., "POST", "GET", "mutation", "query")
}>;
}>;
}Output Example:
{
"sources": [
{
"name": "GitHubGraphQL",
"resources": [
{
"name": "getUser",
"description": "Fetch a user by username",
"resourceType": "query"
},
{
"name": "createIssue",
"description": "Create a new issue in a repository",
"resourceType": "mutation"
}
]
},
{
"name": "PetstoreAPI",
"resources": [
{
"name": "getPetById",
"description": "Find pet by ID",
"resourceType": "GET"
},
{
"name": "addPet",
"description": "Add a new pet to the store",
"resourceType": "POST"
}
]
}
]
}This tool provides detailed documentation for a specific API method.
Name: api_search
Description: Search for a specific API method by name and get its full definition.
Input Schema:
{
detailName: string; // The exact resource name of the API method to search for that was provided in `api_docs` tool's output
}Output Schema:
{
details: Array<{
name: string; // The name of the cache entry
resources: Array<{
name: string; // The name of the resource
resourceType: "query" | "mutation" | "subscription"; // The type of GraphQL resource
description: string; // Context or description of the resource
details: {
request?: string; // The request structure or input parameters for the API method
response?: string; // The response structure or output format for the API method
error?: string; // Error information or error handling details for the API method
};
}>;
}>;
}Output Example:
{
"details": [
{
"name": "GitHubGraphQL",
"resources": [
{
"name": "getUser",
"resourceType": "query",
"description": "Fetch a user by username",
"details": {
"request": "{ username: String! }",
"response": "{ id: ID!, login: String!, name: String }",
"error": "{ message: String!, code: Int! }"
}
}
]
}
]
}-
Set the
API_SOURCESenvironment variable as described in the Configuration section. -
Start the server:
pnpm start
The server will connect to a StdioServerTransport, meaning it will communicate over standard input/output.
.
├── src/
│ ├── api/ # OpenAPI/Swagger schema processing
│ │ └── api.ts
│ ├── gql/ # GraphQL schema processing
│ │ └── gql.ts
│ ├── grpc/ # gRPC schema processing
│ │ └── grpc.ts
│ ├── tools/ # MCP tools definitions
│ │ ├── api_docs.ts
│ │ └── api_search.ts
│ ├── utils/ # Utility functions (cache, config, fetch, file, source)
│ │ ├── cache.ts
│ │ ├── config.ts
│ │ ├── fetch.ts
│ │ ├── file.ts
│ │ └── source.ts
│ ├── index.ts # Main entry point
│ └── server.ts # MCP server setup and tool registration
└── package.json # Project dependencies and scripts
└── README.md # This fileContributions are welcome! Please feel free to open issues or submit pull requests.
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.