Testomat.io
STDIOMCP server for Testomat.io API integration with AI assistants like Cursor.
MCP server for Testomat.io API integration with AI assistants like Cursor.
A Model Context Protocol (MCP) server for Testomat.io API integration with AI assistants like Cursor.
npx @testomatio/mcp@latest --token <your-token> --project <project-id>
The MCP server can be started using command line arguments or environment variables:
# Using short flags npx @testomatio/mcp@latest -t testomat_YOUR_TOKEN_HERE -p your-project-id # Using long flags npx @testomatio/mcp@latest --token testomat_YOUR_TOKEN_HERE --project your-project-id # With custom base URL npx @testomatio/mcp@latest --token testomat_YOUR_TOKEN_HERE --project your-project-id --base-url https://your-instance.testomat.io
# Set environment variables export TESTOMATIO_API_TOKEN=testomat_YOUR_TOKEN_HERE export TESTOMATIO_BASE_URL=https://app.testomat.io # Optional, defaults to https://app.testomat.io # Run with project ID npx @testomatio/mcp@latest --project your-project-id # Or run directly with environment variables TESTOMATIO_API_TOKEN=testomat_YOUR_TOKEN_HERE npx @testomatio/mcp@latest --project your-project-id
testomat_)Your project ID can be found in the URL when you're viewing your project:
https://app.testomat.io/projects/YOUR_PROJECT_ID
To use this MCP server with Cursor, add the following configuration to your Cursor settings:
Add this to your Cursor MCP settings (cursor-settings.json or through the Cursor settings UI):
{ "mcpServers": { "testomatio": { "command": "npx", "args": ["-y", "@testomatio/mcp@latest", "--token", "testomat_YOUR_TOKEN_HERE", "--project", "YOUR_PROJECT_ID"] } } }
First, set your environment variables in your shell profile (.bashrc, .zshrc, etc.):
export TESTOMATIO_API_TOKEN=testomat_YOUR_TOKEN_HERE
Then add this to your Cursor MCP settings:
{ "mcpServers": { "testomatio": { "command": "npx", "args": ["-y", "@testomatio/mcp@latest", "--project", "YOUR_PROJECT_ID"], "env": { "TESTOMATIO_API_TOKEN": "testomat_YOUR_TOKEN_HERE" } } } }
get_tests – Get all tests (params: plan, query, state, suite_id, tag, labels) — api: GET /testssearch_tests – Search tests (params: query, tql, labels, state, priority, filter, page) — api: GET /testscreate_test – Create a new test (params: suite_id, title, description, code, file, state, tags, jira_issues, assigned_to, labels_ids, fields) — api: POST /testsupdate_test – Update an existing test (params: test_id, suite_id, title, description, code, file, state, tags, jira_issues, assigned_to, labels_ids, fields) — api: PUT /tests/{test_id}search_suites – Search suites (params: query, labels, state, priority, page) — api: GET /suitesget_root_suites – List root-level suites (no params) — api: GET /suitesget_suite – Get one suite (params: suite_id) — api: GET /suites/{suite_id}create_suite – Create a new suite (params: title, description, parent_id, fields) — api: POST /suitescreate_folder – Create a new folder (params: title, description, parent_id, fields) — api: POST /suitescreate_label – Create a new label with optional custom field (params: title, color, scope, visibility, field) — api: POST /labelsThe MCP server provides two distinct ways to assign values to tests, suites, and folders:
labels_ids with label:value syntax{ "labels_ids": ["priority:high", "severity:critical", "type:regression"] }
label:value formatfields parameter (structured custom fields){ "fields": { "priority": "high", "severity": "critical", "risk_score": "8.5", "team": "backend" } }
Available for:
create_test and update_test - Test custom fieldscreate_suite - Suite custom fieldscreate_folder - Folder custom fields// Create a test with custom fields { "tool": "create_test", "arguments": { "suite_id": "123", "title": "Login Test", "fields": { "priority": "high", "severity": "critical", "team": "backend" } } } // Update a test with label:value syntax { "tool": "update_test", "arguments": { "test_id": "456", "labels_ids": ["priority:high", "severity:critical"] } }
get_runs – List all runs (no params) — api: GET /runsget_run – Get one run (params: run_id, tree) — api: GET /runs/{run_id}get_testruns – Runs for a test (params: test_id, finished_at_date_range) — api: GET /testrunsget_plans – List all plans (params: detail, labels, page) — api: GET /plansget_plan – Get one plan (params: plan_id) — api: GET /plans/{plan_id}Once configured, you can ask your AI assistant questions like:
These queries retrieve general information without specific filtering:
get_tests toolget_root_suites toolget_runs toolget_plans toolThese queries allow creating and updating tests:
create_test tool with title: "Login validation", suite_id: "suite-123"update_test tool with test_id: "test-456", description: "new description"create_test tool with state: "automated", tags: ["smoke"]create_test tool with title: "Test Title", suite_id: "suite-123", fields: { "priority": "high", "severity": "critical" }update_test tool with test_id: "test-789", fields: { "risk_score": "8.5", "team": "backend" }These queries help organize your test structure:
create_suite tool with title: "Authentication Tests"create_suite tool with title: "Login Tests", description: "All login related test cases"create_suite tool with title: "Backend Tests", fields: { "team": "backend", "priority": "high" }create_folder tool with title: "API Tests", parent_id: "suite-123"create_folder tool with title: "Integration Tests", fields: { "team": "qa", "project": "mobile-app" }create_suite tool with title: "Payment Features", description: "Tests covering payment processing"create_folder tool with title: "Integration Tests"Note: Suites can only contain other suites, while folders can contain both suites and folders (but no tests).
These queries help create custom labels for better test categorization:
create_label tool with title: "Severity", color: "#ff6b6b"create_label tool with title: "Severity", color: "#ffe9ad", field: { "type": "list", "short": true, "value": "Blocker\nCritical\nMajor\nNormal\nMinor\nTrivial" }create_label tool with title: "Test Type", scope: ["tests", "suites"]create_label tool with title: "Category", visibility: ["list"]These queries target specific entities by ID:
get_testruns tool with test_id: "abc123"get_run tool with run_id: "xyz789"get_suite tool with suite_id: "suite-456"These queries use advanced filtering capabilities:
search_tests tool with query: "@smoke", state: "automated"search_tests tool with query: "login"search_tests tool with tql: "tag == 'critical' or label == 'ux' and severity == 'critical'"search_tests tool with tql: jira == 'BDCP-2'The search_tests tool supports TQL for complex filtering:
"tag == 'smoke' and state == 'manual'"
"severity == 'critical' or label == 'ux'"
Tags can be searched using the @ prefix:
@smoke        # Tests tagged with 'smoke'
@regression   # Tests tagged with 'regression'
@critical     # Tests tagged with 'critical'
Tests linked to Jira issues can be found using issue keys:
JIRA-123      # Tests linked to JIRA-123
PROJ-456      # Tests linked to PROJ-456
"API token is required" error
testomat_"Project ID is required" error
Connection errors
app.testomat.ioMCP server not starting in Cursor
To see detailed logs when running the server:
DEBUG=* npx @testomatio/mcp --token <token> --project <project-id>
For detailed information about the underlying Testomat.io API, refer to the Testomat.io API Documentation.
Contributions are welcome! Please feel free to submit a Pull Request.
# Clone the repository git clone https://github.com/testomatio/mcp.git cd mcp # Install dependencies npm install # Run unit tests npm test # Run integration tests (requires environment variables) npm run test:integration # Run all tests npm run test:all
The project includes comprehensive test coverage:
# Unit tests only npm run test:unit # Integration tests (requires .env file) npm run test:integration # With coverage npm run test:coverage npm run test:coverage:integration
Create a .env file:
TESTOMATIO_API_TOKEN=testomat_your_token_here TESTOMATIO_PROJECT_ID=your_project_id TESTOMATIO_BASE_URL=https://app.testomat.io # optional
This project uses GitHub Actions for continuous integration:
This project is licensed under the MIT License - see the LICENSE file for details.
For support, please: