README.md•12.4 kB
# Swagger/Postman MCP Server
Server that ingests and serves Swagger/OpenAPI specifications and Postman collections as MCP (Model Context Protocol) tools using a **simplified strategic approach**.
Instead of generating hundreds of individual tools for each API endpoint, this server provides **only 4 strategic tools** that allow AI agents to dynamically discover and interact with APIs:
```bash
Example prompt:
Help me generate an axios call using our api mcp. I want to implement updating a user. Follow our same DDD pattern (tanstack hook -> axios service)
```
## Features
- **Strategic Tool Approach**: Only 4 tools instead of hundreds for better AI agent performance
- **OpenAPI/Swagger Support**: Load OpenAPI 2.0/3.0 specifications from URLs or local files
- **Postman Collection Support**: Load Postman collection JSON files from URLs or local files
- **Environment Variables**: Support for Postman environment files
- **Authentication**: Multiple authentication methods (Basic, Bearer, API Key, OAuth2)
- **Dynamic API Discovery**: Tools for listing, searching, and getting details about API endpoints
- **Request Execution**: Execute API requests with proper parameter handling and authentication
## Security
This is a personal server!! Do not expose it to the public internet.
If the underlying API requires authentication, you should not expose the MCP server to the public internet.
## TODO
- secrets - the MCP server should be able to use secrets from the user to authenticate requests to the API
- Comprehensive test suite
## Prerequisites
- Node.js (v18 or higher)
- Yarn package manager
- TypeScript
## Installation
```bash
# Clone the repository
git clone <repository-url>
cd swag-mcp
# Install dependencies
npm install
# or
yarn install
# Build the project
npm run build
# or
yarn build
# Make the start script executable (Linux/macOS)
chmod +x start-mcp.sh
```
### Quick Setup for Cursor
1. **Clone and build** (commands above)
2. **Configure** your `config.json` with your API details
3. **Update paths**: Edit `start-mcp.sh` and change the `cd` path to your installation directory
4. **Add to Cursor**: Edit `~/.cursor/mcp.json` and add:
```json
{
"mcpServers": {
"postman-swagger-api": {
"command": "/full/path/to/your/swag-mcp/start-mcp.sh"
}
}
}
```
5. **Restart Cursor** and start using the 4 strategic MCP tools!
## Configuration
The server uses a `config.json` file for configuration. You can specify either OpenAPI/Swagger specifications or Postman collections.
### OpenAPI/Swagger Configuration
```json
{
"api": {
"type": "openapi",
"openapi": {
"url": "https://petstore.swagger.io/v2/swagger.json",
"apiBaseUrl": "https://petstore.swagger.io/v2",
"defaultAuth": {
"type": "apiKey",
"apiKey": "special-key",
"apiKeyName": "api_key",
"apiKeyIn": "header"
}
}
},
"log": {
"level": "info"
}
}
```
### Postman Collection Configuration
```json
{
"api": {
"type": "postman",
"postman": {
"collectionUrl": "https://www.postman.com/collections/your-collection-id",
"collectionFile": "./examples/postman-collection.json",
"environmentUrl": "https://www.postman.com/environments/your-environment-id",
"environmentFile": "./examples/postman-environment.json",
"defaultAuth": {
"type": "bearer",
"token": "your-api-token-here"
}
}
},
"log": {
"level": "info"
}
}
```
### Configuration Options
#### API Configuration
- `api.type`: Either `"openapi"` or `"postman"`
- `api.openapi`: OpenAPI/Swagger specific configuration
- `url`: URL to the OpenAPI specification
- `apiBaseUrl`: Base URL for API requests
- `defaultAuth`: Default authentication configuration
- `api.postman`: Postman specific configuration
- `collectionUrl`: URL to the Postman collection (optional)
- `collectionFile`: Path to local Postman collection file (optional)
- `environmentUrl`: URL to the Postman environment (optional)
- `environmentFile`: Path to local Postman environment file (optional)
- `defaultAuth`: Default authentication configuration
#### Authentication Configuration
- `type`: Authentication type (`"basic"`, `"bearer"`, `"apiKey"`, `"oauth2"`)
- `username`: Username (for basic auth)
- `password`: Password (for basic auth)
- `token`: Token (for bearer/oauth2 auth)
- `apiKey`: API key value
- `apiKeyName`: API key parameter name
- `apiKeyIn`: Where to send API key (`"header"` or `"query"`)
#### Logging Configuration
- `log.level`: Logging level (`"debug"`, `"info"`, `"warn"`, `"error"`)
## Usage
### Starting the MCP Server
The server runs via stdio transport for MCP connections:
```bash
# Start the simplified MCP server via stdio
./start-mcp.sh
# Or directly with node
node dist/simple-stdio.js
# For development with auto-reload
npm run dev:simple
# or
yarn dev:simple
```
### MCP Integration
This server uses stdio transport and is designed to be used with MCP clients like Claude Desktop or Cursor.
## Installing in Cursor
To use this MCP server with Cursor, you need to add it to your Cursor MCP configuration:
### 1. Locate your Cursor MCP configuration file
The configuration file is located at:
- **Linux/macOS**: `~/.cursor/mcp.json`
- **Windows**: `%APPDATA%\.cursor\mcp.json`
### 2. Add the MCP server configuration
Edit your `mcp.json` file to include this server:
```json
{
"mcpServers": {
"postman-swagger-api": {
"command": "/path/to/your/swag-mcp/start-mcp.sh"
}
}
}
```
**⚠️ Important: Change the path!**
Replace `/path/to/your/swag-mcp/start-mcp.sh` with the actual path to your cloned repository. For example:
- **Linux/macOS**: `"/home/username/Documents/swag-mcp/start-mcp.sh"`
- **Windows**: `"C:\\Users\\username\\Documents\\swag-mcp\\start-mcp.sh"`
### 3. Example complete configuration
```json
{
"mcpServers": {
"supabase": {
"command": "npx",
"args": [
"-y",
"@supabase/mcp-server-supabase@latest",
"--access-token",
"your-supabase-token"
]
},
"postman-swagger-api": {
"command": "/home/username/Documents/swag-mcp/start-mcp.sh"
}
}
}
```
### 4. Restart Cursor
After saving the configuration file, restart Cursor for the changes to take effect.
### 5. Verify installation
In Cursor, you should now have access to the 4 strategic MCP tools:
- `list_requests` - List all available requests
- `get_request_details` - Get detailed request information
- `search_requests` - Search requests by keyword
- `make_request` - Execute any API request
### Troubleshooting
If the MCP server fails to start:
1. **Update start-mcp.sh path**: Edit `start-mcp.sh` and change the `cd` path from `/path/to/your/swag-mcp` to your actual installation directory
2. **Check the path**: Ensure the path in `mcp.json` points to your actual `start-mcp.sh` file
3. **Check permissions**: Make sure `start-mcp.sh` is executable (`chmod +x start-mcp.sh`)
4. **Check build**: Ensure you've run `npm run build` to compile the TypeScript files
5. **Check logs**: Look in Cursor's MCP logs for error messages
### Example Path Updates
If you cloned to `/home/username/Documents/swag-mcp/`, then:
**In `start-mcp.sh`:**
```bash
cd "/home/username/Documents/swag-mcp"
```
**In `~/.cursor/mcp.json`:**
```json
"command": "/home/username/Documents/swag-mcp/start-mcp.sh"
```
## How It Works
### Strategic Tool Approach
Instead of generating hundreds of individual tools for each API endpoint, this server provides **4 strategic tools** that enable dynamic API discovery and interaction:
### OpenAPI/Swagger Mode
**4 Strategic Tools:**
1. **`list_endpoints`** - List all available API endpoints
2. **`get_endpoint_details`** - Get detailed information about specific endpoints
3. **`search_endpoints`** - Search endpoints by keyword
4. **`make_api_call`** - Execute any API call with proper authentication
**Process:**
1. Loads the OpenAPI specification from the configured URL or file
2. Parses the specification to extract API endpoints, parameters, and security schemes
3. Makes endpoint information available through the 4 strategic tools
4. Handles authentication and parameter validation dynamically
5. Executes API requests and returns responses
### Postman Collection Mode
**4 Strategic Tools:**
1. **`list_requests`** - List all available requests in the collection
2. **`get_request_details`** - Get detailed information about specific requests
3. **`search_requests`** - Search requests by keyword
4. **`make_request`** - Execute any request from the collection
**Process:**
1. Loads the Postman collection JSON from the configured URL or file
2. Optionally loads a Postman environment file for variable substitution
3. Parses requests, folders, and nested items in the collection
4. Makes request information available through the 4 strategic tools
5. Handles variable substitution, authentication, and parameter mapping dynamically
6. Executes requests with proper headers, query parameters, and body data
### Benefits of Strategic Tools
- **Better AI Performance**: 4 tools vs hundreds means faster decision making
- **Dynamic Discovery**: AI agents can explore APIs without knowing endpoints beforehand
- **Flexible Interaction**: Any endpoint can be called through `make_api_call`/`make_request`
- **Reduced Overwhelm**: AI agents aren't flooded with tool options
## Strategic Tools Reference
### For OpenAPI/Swagger APIs
1. **`list_endpoints`**
- Lists all available API endpoints with methods and paths
- No parameters required
- Returns: Array of endpoint summaries
2. **`get_endpoint_details`**
- Get detailed information about a specific endpoint
- Parameters: `method` (GET/POST/etc), `path` (/users/{id}/etc)
- Returns: Full endpoint specification with parameters, body schema, responses
3. **`search_endpoints`**
- Search endpoints by keyword in path, summary, or description
- Parameters: `query` (search term)
- Returns: Filtered list of matching endpoints
4. **`make_api_call`**
- Execute an API call to any endpoint
- Parameters: `method`, `path`, `pathParams`, `queryParams`, `headers`, `body`
- Returns: API response with status and data
### For Postman Collections
1. **`list_requests`**
- Lists all available requests in the collection
- No parameters required
- Returns: Array of request summaries
2. **`get_request_details`**
- Get detailed information about a specific request
- Parameters: `requestId` or `requestName`
- Returns: Full request specification
3. **`search_requests`**
- Search requests by keyword
- Parameters: `query` (search term)
- Returns: Filtered list of matching requests
4. **`make_request`**
- Execute any request from the collection
- Parameters: `requestId`, `variables` (for substitution)
- Returns: Request response
### Authentication
The server supports multiple authentication methods:
- **Basic Authentication**: Username/password
- **Bearer Token**: JWT or other bearer tokens
- **API Key**: In headers or query parameters
- **OAuth2**: Bearer token based
Authentication can be configured globally or overridden per request.
## Example Configuration
Your `config.json` should specify either OpenAPI or Postman configuration as shown above.
### Example Postman Collection Structure
```json
{
"info": {
"name": "Sample API Collection",
"description": "A sample Postman collection"
},
"item": [
{
"name": "Get Users",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseUrl}}/users",
"host": ["{{baseUrl}}"],
"path": ["users"]
}
}
}
]
}
```
## Development
```bash
# Install dependencies
npm install
# Run in development mode
npm run dev
# Run tests
npm test
# Build for production
npm run build
```
## License
ISC
## Environment Variables
- `PORT`: Server port (default: 3000)
- `API_USERNAME`: Username for API authentication (fallback)
- `API_PASSWORD`: Password for API authentication (fallback)
- `API_TOKEN`: API token for authentication (fallback)
- `DEFAULT_API_BASE_URL`: Default base URL for API endpoints (fallback)
- `DEFAULT_SWAGGER_URL`: Default Swagger specification URL