API Testing MCP
Обзор
Самый полный MCP-сервер для тестирования API — 42 инструмента, нулевая настройка, ничего подобного не существует. Это не просто отправитель запросов. Это полноценная рабочая среда для тестирования: HTTP-запросы с утверждениями (assertions), многошаговые потоки с извлечением переменных, импорт OpenAPI с генерацией мок-данных на основе схем, нагрузочное тестирование с метриками перцентилей, сравнение ответов между окружениями, пакетные тесты, переиспользуемые коллекции, группы окружений с привязкой к директориям и постоянными значениями по умолчанию, импорт/экспорт Postman и экспорт cURL. Все это через естественный диалог. Никаких аккаунтов, облаков или сгенерированных файлов. Все работает локально и сохраняется в виде обычного JSON, который принадлежит вам.
Просто общайтесь
Вам не нужно учить названия инструментов или параметры. Опишите, что вы хотите, и ИИ сам выберет нужный инструмент.
"Create a group called my-project and add this directory as scope"
"Set up a dev environment with BASE_URL http://localhost:3000"
"Switch to prod for this session"
"Set dev as the default environment"
"Import my API spec from /api-docs-json"
"Show me all user endpoints"
"GET /users"
"Create a user with random data"
"Verify that DELETE /users/5 returns 204"
"Login as admin, extract the token, then fetch dashboard stats"
"How fast is /health with 50 concurrent requests?"
"Run all my saved smoke tests"
"Compare the users endpoint between dev and prod"
"Export the create-user request as curl"
"Export my collection to Postman"Если вы импортировали спецификацию OpenAPI, ИИ уже знает каждый эндпоинт, каждое обязательное поле и каждое допустимое значение перечисления (enum). Когда вы говорите «создай пост в блоге», он считывает схему и правильно формирует запрос — никаких догадок.
Установка
Claude Code
claude mcp add --scope user api-testing -- npx -y @cocaxcode/api-testing-mcp@latestClaude Desktop
Добавьте в файл конфигурации (~/Library/Application Support/Claude/claude_desktop_config.json на macOS, %APPDATA%\Claude\claude_desktop_config.json на Windows):
{
"mcpServers": {
"api-testing": {
"command": "npx",
"args": ["-y", "@cocaxcode/api-testing-mcp@latest"]
}
}
}Cursor / Windsurf
Добавьте в .cursor/mcp.json или .windsurf/mcp.json в корне вашего проекта:
{
"mcpServers": {
"api-testing": {
"command": "npx",
"args": ["-y", "@cocaxcode/api-testing-mcp@latest"]
}
}
}VS Code — добавьте в .vscode/mcp.json:
{
"servers": {
"api-testing": {
"command": "npx",
"args": ["-y", "@cocaxcode/api-testing-mcp@latest"]
}
}
}Codex CLI (OpenAI):
codex mcp add api-testing -- npx -y @cocaxcode/api-testing-mcp@latestИли добавьте в ~/.codex/config.toml:
[mcp_servers.api-testing]
command = "npx"
args = ["-y", "@cocaxcode/api-testing-mcp@latest"]Gemini CLI — добавьте в ~/.gemini/settings.json:
{
"mcpServers": {
"api-testing": {
"command": "npx",
"args": ["-y", "@cocaxcode/api-testing-mcp@latest"]
}
}
}Быстрый старт
После установки настройте окружение, чтобы относительные пути разрешались автоматически:
"Create an environment called dev with BASE_URL http://localhost:3000"Если у вашего API есть спецификация Swagger/OpenAPI, импортируйте её:
"Import my API spec from http://localhost:3000/api-docs-json"Проверьте командой: "List my environments" — вы должны увидеть только что созданное окружение.
Возможности
HTTP-запросы
Отправляйте запросы с любым HTTP-методом, заголовками, параметрами запроса, JSON-телом, аутентификацией и интерполяцией {{variable}}. Относительные URL автоматически разрешаются относительно BASE_URL.
"POST to /api/users with name Jane and email jane@company.com using my bearer token"Поддерживаются: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS — Bearer / API Key / Basic auth — пользовательские тайм-ауты.
Утверждения (Assertions)
Проверяйте ответы с помощью структурированных результатов (пройдено/не пройдено):
"Verify that GET /api/health returns 200, body.status is ok, and responds in under 500ms"PASS — 3/3 assertions passed
status === 200
body.status === "ok"
timing.total_ms < 50010 операторов: eq, neq, gt, gte, lt, lte, contains, not_contains, exists, type
Потоки запросов
Связывайте запросы с извлечением переменных между шагами. Идеально подходит для потоков аутентификации и последовательностей CRUD.
"Login as admin@test.com, extract the access token, then use it to fetch all users"flow_run({
steps: [
{
name: "login",
method: "POST",
url: "/auth/login",
body: { email: "admin@test.com", password: "SecurePass#99" },
extract: { "TOKEN": "body.access_token" }
},
{
name: "get-users",
method: "GET",
url: "/api/users",
headers: { "Authorization": "Bearer {{TOKEN}}" }
}
]
})Импорт OpenAPI
Импортируйте спецификации из URL или локального файла (JSON и YAML). После импорта ИИ знает каждый эндпоинт, параметр и схему.
"Import my API spec from http://localhost:3000/api-docs-json"
"Import the spec from ./openapi.yaml"
"What parameters does POST /users expect?"Поддерживается OpenAPI 3.x с полным разрешением $ref, allOf, oneOf, anyOf. OpenAPI 2.0 поддерживается частично.
Генерация мок-данных
Генерируйте реалистичные фиктивные данные на основе ваших схем OpenAPI. Учитываются типы, форматы (email, uuid, date-time), перечисления и обязательные поля.
"Generate mock data for creating a user"{
"email": "user42@example.com",
"name": "Test User 73",
"password": "TestPass123!",
"role": "admin"
}Нагрузочное тестирование
Запускайте N параллельных запросов и получайте метрики производительности:
"How fast is the health endpoint with 50 concurrent requests?"LOAD TEST — GET /api/health
Requests: 50 concurrent
Successful: 50 | Failed: 0
Req/sec: 23.31
Min: 45ms | Avg: 187ms
p50: 156ms | p95: 412ms | p99: 523ms
Max: 567msСравнение ответов (Diffing)
Выполняйте два запроса и сравнивайте их ответы по полям. Обнаруживайте регрессии или сравнивайте окружения.
"Compare the users endpoint between dev and prod"Пакетное тестирование
Запускайте все сохраненные запросы в коллекции (или фильтруйте по тегу) и получайте сводку:
"Run all my saved smoke tests"BULK TEST — 8/8 passed | 1.2s total
health — GET /health → 200 (45ms)
list-users — GET /users → 200 (123ms)
create-post — POST /blog → 201 (89ms)
login — POST /auth/login → 200 (156ms)Коллекции
Сохраняйте запросы для повторного использования с тегами. Создавайте наборы регрессионных тестов.
"Save this request as create-user with tags auth, smoke"
"List all requests tagged smoke"Окружения
Окружения хранят ваши переменные — BASE_URL, токены, API-ключи — и разделяют их по контексту. Система имеет три основных понятия:
Группа. Группа организует окружения и привязывает их к директориям. Группа имеет N областей видимости (директорий), которые используют её окружения, и ровно одно окружение по умолчанию. Когда вы создаете окружение внутри группы, оно принадлежит этой группе. Когда вы переходите (cd) в директорию, являющуюся областью видимости группы, её окружения становятся доступны автоматически.
По умолчанию. Окружение по умолчанию активируется автоматически, когда вы входите в область видимости его группы. Оно сохраняется между сессиями — перезапустите редактор, откройте терминал заново, и значение по умолчанию останется на месте. Установите один раз и забудьте.
Активное. Активное окружение — это то, которое используется прямо сейчас для разрешения переменных. При входе в область видимости оно устанавливается как «по умолчанию», но вы можете переключить его в любой момент. Активный выбор действует только в рамках сессии — при перезапуске он сбрасывается на значение по умолчанию.
Глобальные окружения (не связанные с группой) также существуют. Они требуют явной активации через env_switch и не сохраняются между сессиями.
Практический пример:
"Create a group called my-api"
"Add this directory as scope to my-api"
"Create a dev environment with BASE_URL http://localhost:3000" <- auto-joins group, auto-default
"Create a prod environment with BASE_URL https://api.example.com"
"List environments" <- shows dev (active, default) and prod
"Switch to prod" <- session only
"Set prod as default" <- persistsАвтоматическая интерполяция. Любая переменная {{variable}} в URL, заголовках, параметрах запроса или теле запроса разрешается относительно активного окружения перед отправкой запроса. Установите BASE_URL один раз, и любой относительный путь будет работать.
Ваши учетные данные никогда не покидают ваш компьютер. Файлы окружений — это обычные JSON-файлы, хранящиеся в ~/.api-testing/. Ничего не синхронизируется с облаком. Ничего не встраивается в экспортируемые файлы. Ничего не отслеживается через git. Ваши токены и секреты остаются там, где им и положено быть: на вашем диске, под вашим контролем.
Импорт и экспорт Postman
Двусторонняя поддержка Postman. Переходите между Postman и вашим рабочим процессом с ИИ без проблем.
"Import my Postman collection from ./exported.postman_collection.json"
"Export my collection to Postman"
"Export the dev environment for Postman"Коллекция: Формат Postman v2.1. Папки становятся тегами. Аутентификация наследуется от папок/уровня коллекции. Поддерживаются тела запросов raw JSON, x-www-form-urlencoded, form-data.
Окружение: Предпочитает currentValue вместо value. Пропускает отключенные переменные. Опциональный флаг activate.
Коллекция: Запросы группируются в папки по тегам. Аутентификация отображается в нативный формат Postman. {{variables}} сохраняются как есть.
Окружение: Все переменные экспортируются как enabled: true в формате, совместимом с Postman.
Нативный экспорт и импорт
Экспортируйте коллекции и окружения в переносимую папку .atm/. Делитесь с командой или копируйте между проектами.
"Export my collection and dev environment"your-project/
└── .atm/
├── collection.json
└── dev.env.jsonПримечание:
.atm/автоматически добавляется в.gitignoreпри первом экспорте.
Экспорт cURL
Преобразуйте любой сохраненный запрос в готовую к вставке команду cURL с разрешенными переменными.
"Export the create-user request as curl"curl -X POST \
'https://api.example.com/users' \
-H 'Authorization: Bearer eyJhbGci...' \
-H 'Content-Type: application/json' \
-d '{"name":"Jane","email":"jane@company.com"}'Справочник инструментов
42 инструмента в 9 категориях:
Категория | Инструменты | Кол-во |
Запросы |
| 1 |
Тестирование |
| 1 |
Потоки |
| 1 |
Коллекции |
| 4 |
Окружения |
| 8 |
Группы |
| 7 |
API Specs |
| 4 |
Моки |
| 1 |
Утилиты |
| 12 |
Совет: Вам не нужно вызывать инструменты напрямую. Опишите, что вы хотите, и ИИ сам выберет нужный.
Хранилище
Все локально. Никаких баз данных, облачной синхронизации или телеметрии. Все данные живут в ~/.api-testing/ в виде обычных JSON-файлов, которые вы можете прочитать, создать резервную копию или удалить в любое время.
~/.api-testing/
├── groups/ # Environment groups with scopes and defaults
├── environments/ # Environment variables — tokens, keys, passwords
├── collections/ # Saved requests (shareable, no secrets)
├── specs/ # Imported OpenAPI specs
└── project-envs.json # Session-only active environments (cleared on restart)Глобальное хранилище против экспорта проектов. Директория ~/.api-testing/ — это ваше личное глобальное хранилище, где живут учетные данные, и они никогда его не покидают. Когда вы экспортируете коллекцию или окружение, они попадают в .atm/ в корне вашего проекта. Эта папка автоматически добавляется в .gitignore при первом экспорте, но даже если вы решите закоммитить её, ваши учетные данные останутся в ~/.api-testing/ и никогда не будут скопированы в .atm/. Вы можете безопасно делиться экспортами .atm/ с командой, не опасаясь утечки секретов.
Переопределение пути к хранилищу по умолчанию:
{
"env": { "API_TESTING_DIR": "/path/to/custom/.api-testing" }
}Предупреждение: Если вы переопределяете
API_TESTING_DIRна путь внутри git-репозитория, добавьте.api-testing/в ваш.gitignore, чтобы избежать отправки учетных данных в репозиторий.
Архитектура
src/
├── index.ts # Entry point (shebang + StdioServerTransport)
├── server.ts # createServer() factory
├── tools/ # 42 tool handlers (one file per category)
│ ├── request.ts # HTTP requests (1)
│ ├── assert.ts # Assertions (1)
│ ├── flow.ts # Request chaining (1)
│ ├── collection.ts # Collection CRUD (4)
│ ├── environment.ts # Environment management (8)
│ ├── group.ts # Environment groups (7)
│ ├── api-spec.ts # OpenAPI import/browse (4)
│ ├── mock.ts # Mock data generation (1)
│ ├── load-test.ts # Load testing (1)
│ └── utilities.ts # curl, diff, bulk, import/export (12)
├── lib/ # Business logic (no MCP dependency)
│ ├── http-client.ts # fetch wrapper with timing
│ ├── storage.ts # JSON file storage engine
│ ├── schemas.ts # Shared Zod schemas
│ ├── url.ts # BASE_URL resolution
│ ├── path.ts # Dot-notation accessor (body.data.0.id)
│ ├── interpolation.ts # {{variable}} resolver
│ └── openapi-parser.ts # $ref + allOf/oneOf/anyOf resolution
└── __tests__/ # 10+ test suites, 120+ testsСтек: TypeScript (strict) · MCP SDK · Zod · Vitest · tsup
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/cocaxcode/api-testing-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server