meloqa-mcp
MCP server exposing meloQA public v1 API operations as tools so LLM clients can read and manage QA data.
Projects: list/get/create/update/delete; inspect members, platforms, execution statuses, test-case custom fields, and project pictures.
Test cases: CRUD, list/archived list, unarchive, folders with 3-level hierarchy, steps/BDD/custom fields, and attachments via presigned S3 upload.
Cycles: CRUD/list, folders, and statuses.
Executions: CRUD/list, run/pause/finish state transitions, and attachments via presigned S3 upload.
Bugs: CRUD/list, folders, attachments via presigned S3 upload, and reference data for statuses, priorities, types, and environments.
Links: create, batch create, list, and delete entity links; paid-plan only.
Organizations and tags: organization get/list/update/members; tag CRUD/list.
Reference data: countries, test case statuses/types, cycle statuses, bug statuses/priorities/types/environments, and project pictures.
Configuration/behavior: Bearer token via MELOQA_API_TOKEN, configurable base URL and client-side rate limit; non-2xx errors are surfaced as tool errors.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@meloqa-mcp list my projects"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
meloqa-mcp
Model Context Protocol (MCP) server for the meloQA public v1 API.
Exposes every operation from the v1 OpenAPI spec as an MCP tool, so LLM clients (Claude Desktop, Claude Code, Cursor, etc.) can read and manage meloQA projects, test cases, cycles, executions, bugs, links, and reference data.
Status: pre-release. Defaults to the public endpoint
https://api.meloqa.com; overrideMELOQA_BASE_URLto point at another instance (e.g. a localhttp://localhost:3000).
Requirements
Node.js 18+ (uses native
fetch).A meloQA API token (see User Menu → API Tokens in the meloQA app).
Related MCP server: mealie-mcp
Install
The package is published on npm as @meloqa/mcp-server.
You don't need to install it manually — the MCP client config below runs it on demand with npx, which fetches the latest version automatically:
npx -y @meloqa/mcp-serverTo pin it globally instead (exposes the meloqa-mcp binary):
npm install -g @meloqa/mcp-serverConfigure in your MCP client
Claude Desktop / Claude Code
Add an entry to your MCP config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS for Claude Desktop, or .claude.json for Claude Code):
{
"mcpServers": {
"meloqa": {
"command": "npx",
"args": ["-y", "@meloqa/mcp-server"],
"env": {
"MELOQA_API_TOKEN": "your-token-here",
"MELOQA_BASE_URL": "https://api.meloqa.com"
}
}
}
}Restart the client. The meloqa server should appear with one tool per v1 endpoint (96 as of 0.3.0).
Environment variables
Variable | Required | Default | Description |
| yes | — | API token sent as |
| no |
| Base URL of the meloQA instance. Override to point at another deployment (e.g. |
| no |
| Client-side limit (requests/minute) used to throttle outgoing calls. Match the server's limit. |
Token lifecycle
The token sits in plaintext inside your MCP client config (e.g. ~/.claude.json). The file is chmod 600 by default, but the token still lives on disk — treat it as a credential.
To rotate (recommended periodically, and immediately if you suspect exposure):
Open the meloQA UI → User Menu → API Tokens.
Click Revoke on the current token. It stops working server-side within seconds.
Click Generate new token and copy the new value.
Replace
MELOQA_API_TOKENin your MCP client config with the new value.Restart the MCP client (Claude Desktop / Claude Code / etc.) so it re-spawns the server with the updated env.
Per-machine tokens: generate a separate token for each machine/environment so revoking one doesn't break the others.
Do not commit your MCP client config (~/.claude.json, .mcp.json, claude_desktop_config.json) to a public repo — it contains the token.
Tools
Tool names follow <resource>_<verb>, derived from the OpenAPI spec:
<resource>_list,<resource>_get,<resource>_create,<resource>_update,<resource>_deletefor CRUD endpoints.Action endpoints keep the action as the suffix:
executions_run,executions_pause,executions_finish,test_cases_unarchive,links_batch_create.Sub-resource listings use the parent resource as the prefix:
projects_members_list,projects_execution_statuses_list, etc.
Each tool's description includes the OpenAPI summary, the tag, and any validation rules documented on the endpoint (e.g. max lengths, required referenced IDs).
Behavior notes
Auth header: the token is sent as
Authorization: Bearer <token>(RFC 6750).Rate limit: the client uses an in-process sliding-window limiter (default 30 req/min). It blocks outgoing calls until a slot is available. If you hit the server-side 429 anyway, the tool call surfaces a clear error.
Errors: non-2xx responses (400/401/403/404/etc.) are returned as MCP tool errors with the response body included.
Development
npm install
npm run sync-spec # refresh spec/openapi.json from MELOQA_SPEC_URL (default https://api.meloqa.com/v1/docs.json)
npm run gen # regenerate src/tools.generated.ts from the spec
npm run build # gen + tsc → dist/
npm run dev # run from source via tsxTo test the generated server against a running meloQA instance:
MELOQA_API_TOKEN=... MELOQA_BASE_URL=https://api.meloqa.com npm run devThen pipe JSON-RPC messages on stdin or wire it up via an MCP client.
License
MIT
Available Tools
83 toolsbug_environments_listB
List environments for a project
Tag: Bug Environments
Inputs: projectId (required).
bug_folders_createD
Create bug folder
Tag: Bug Folders
Inputs: name (required), projectId (required), order, parentId.
bug_folders_deleteC
Delete bug folder
Tag: Bug Folders
Inputs: id (required).
bug_folders_getB
Get bug folder by ID
Tag: Bug Folders
Inputs: id (required).
bug_folders_listC
List bug folders
Tag: Bug Folders
Inputs: projectId (required), parentId.
bug_folders_updateC
Update bug folder
Tag: Bug Folders
Inputs: id (required), name, order, parentId.
bug_priorities_listA
List all bug priority levels
Tag: Bug Priorities
Inputs: no named parameters.
bugs_attachments_createA
Create bug attachment (returns presigned upload URL)
Tag: Bug Attachments
Cria o registro do anexo (uploaded=false) e retorna uma presigned URL S3 (PUT, 300s). Faça o PUT do arquivo na uploadUrl e depois confirme com PATCH /v1/bugs/:id/attachments/:attachmentId.
Inputs: id (required), md5 (required), size (required), type (required), +1 more.
bugs_attachments_deleteA
Delete bug attachment
Tag: Bug Attachments
Remove o anexo (registro + arquivo no S3).
Inputs: id (required), attachmentId (required).
bugs_attachments_listA
List bug attachments
Tag: Bug Attachments
Lista os anexos do bug. Itens com uploaded=true trazem downloadUrl (presigned, 300s).
Inputs: id (required).
bugs_attachments_updateA
Confirm bug attachment upload
Tag: Bug Attachments
Marca o anexo como enviado (uploaded=true) após o PUT no S3.
Inputs: id (required), attachmentId (required).
bugs_createC
Create bug
Tag: Bugs
Inputs: name (required), statusId (required), projectId (required), type, +6 more.
bugs_deleteC
Delete bug
Tag: Bugs
Inputs: id (required).
bugs_getA
Get bug by ID
Tag: Bugs
Inputs: id (required).
bugs_listB
List bugs
Tag: Bugs
At least one query parameter is required: projectId or folderId.
Inputs: folderId, projectId.
bug_statuses_listA
List all bug statuses
Tag: Bug Statuses
Inputs: no named parameters.
bugs_updateD
Update bug
Tag: Bugs
Inputs: id (required), name, type, folderId, +6 more.
bug_types_listB
List bug types for a project
Tag: Bug Types
Inputs: projectId (required).
cycle_folders_createD
Create cycle folder
Tag: Cycle Folders
Inputs: name (required), projectId (required), order, parentId.
cycle_folders_deleteC
Delete cycle folder
Tag: Cycle Folders
Inputs: id (required).
cycle_folders_getB
Get cycle folder by ID
Tag: Cycle Folders
Inputs: id (required).
cycle_folders_listC
List cycle folders
Tag: Cycle Folders
Inputs: projectId (required), parentId.
cycle_folders_updateC
Update cycle folder
Tag: Cycle Folders
Inputs: id (required), name, order, parentId.
cycles_createD
Create cycle
Tag: Cycles
Inputs: name (required), projectId (required), type, endAt, +5 more.
cycles_deleteC
Delete cycle
Tag: Cycles
Inputs: id (required).
cycles_getB
Get cycle by ID
Tag: Cycles
Inputs: id (required).
cycles_listA
List cycles
Tag: Cycles
At least one query parameter is required: projectId or folderId.
Inputs: folderId, projectId.
cycle_statuses_listB
List all cycle statuses
Tag: Cycle Statuses
Inputs: no named parameters.
cycles_updateD
Update cycle
Tag: Cycles
Inputs: id (required), name, type, endAt, +5 more.
executions_attachments_createA
Create execution attachment (returns presigned upload URL)
Tag: Execution Attachments
Cria o registro do anexo (uploaded=false) e retorna uma presigned URL S3 (PUT, 300s). Faça o PUT do arquivo na uploadUrl e depois confirme com PATCH /v1/executions/:id/attachments/:attachmentId.
Inputs: id (required), md5 (required), size (required), type (required), +1 more.
executions_attachments_deleteB
Delete execution attachment
Tag: Execution Attachments
Remove o anexo (registro + arquivo no S3).
Inputs: id (required), attachmentId (required).
executions_attachments_listA
List execution attachments
Tag: Execution Attachments
Lista os anexos da execução. Itens com uploaded=true trazem downloadUrl (presigned, 300s).
Inputs: id (required).
executions_attachments_updateA
Confirm execution attachment upload
Tag: Execution Attachments
Marca o anexo como enviado (uploaded=true) após o PUT no S3.
Inputs: id (required), attachmentId (required).
executions_createC
Create execution
Tag: Executions
The state field is system-managed and is silently ignored if sent in the body. Use /v1/executions-run, /v1/executions-pause and /v1/executions-finish to drive transitions.
Inputs: projectId (required), testCaseId (required), testsCycleId (required), order, +5 more.
executions_deleteC
Delete execution
Tag: Executions
Inputs: id (required).
executions_finishA
Finish an execution
Tag: Executions
Sets the execution state to DONE and records executedAt and executedBy. Allowed only when the current state is IN_PROGRESS — returns 400 for WAITING, PAUSED or DONE, when its parent tests cycle is FINISHED, or when the execution's statusId is still "Em aberto" (NOT_EXECUTED) — a verdict must be set first.
Inputs: id (required).
executions_getC
Get execution by ID
Tag: Executions
Inputs: id (required).
executions_listC
List executions
Tag: Executions
Inputs: projectId, testCaseId, testsCycleId.
executions_pauseA
Pause an execution
Tag: Executions
Sets the execution state to PAUSED. Allowed only when the current state is IN_PROGRESS — returns 400 for WAITING, PAUSED or DONE, or when its parent tests cycle is FINISHED.
Inputs: id (required).
executions_runA
Start running an execution
Tag: Executions
Sets the execution state to IN_PROGRESS. Allowed only when the current state is WAITING or PAUSED. Returns 400 when the execution is already IN_PROGRESS or DONE, or when its parent tests cycle is FINISHED.
Inputs: id (required).
executions_updateA
Update execution
Tag: Executions
Executions in state: DONE are read-only and cannot be updated through this endpoint (public V1 only — the internal API does not enforce this guard). The state field itself is system-managed and is silently ignored if sent in the body — use /v1/executions-run, /v1/executions-pause and /v1/executions-finish instead.
Inputs: id (required), order, statusId, assignedTo, +3 more.
links_batch_createA
Link one entity to multiple entities at once
Tag: Links
Creates one record per target. Operation is atomic — if any record fails, none are created. Paid-plan only: free-plan organizations receive 403.
Inputs: targets (required), entityAId (required), entityAType (required).
links_createA
Create a link between two entities
Tag: Links
Creates a directional link between two entities.
entityA is the entity currently open or being edited — its ID is stored in the corresponding foreign key field.
entityB is the entity being linked to entityA — its type is stored in type and its ID in meloQaLinkedId.
Example use case: A user is editing a bug and opens the link panel to attach a test case.
To replicate this action via the API, set entityAType to bug and entityAId to the ID of the open bug,
then set entityBType to test-case and entityBId to the ID of the selected test case.
The same logic applies regardless of which entity type is open: always pass the entity being viewed as entityA and the entity being attached as entityB.
Paid-plan only: this endpoint requires the organization to have an active subscription. Free-plan organizations receive 403.
Inputs: entityAId (required), entityBId (required), entityAType (required), entityBType (required).
links_deleteB
Remove a link
Tag: Links
Paid-plan only: free-plan organizations receive 403.
Inputs: id (required).
links_listA
List links for an entity
Tag: Links
Returns all entities linked to the given entity, regardless of which side of the link it was created from.
Example use case: A user opens a bug and the UI needs to display its linked items panel.
Pass entityType=bug and entityId as the ID of the open bug to retrieve all entities attached to it.
The response includes links where the given entity appears as either entityA (the entity that was open when the link was created) or entityB (the entity that was attached). Both directions are returned in a single call.
Inputs: entityId (required), entityType (required).
location_countries_listA
List all location countries
Tag: Location Countries
Inputs: no named parameters.
organizations_getB
Get organization by ID
Tag: Organizations
Inputs: id (required).
organizations_listC
List organizations
Tag: Organizations
Inputs: no named parameters.
organizations_members_listC
List members of an organization
Tag: Organizations
Inputs: id (required).
organizations_updateC
Update organization
Tag: Organizations
The employeeQuantity field accepts one of the following values: 1 a 10, 11 a 50, 51 a 100, 100+. Send null to clear the value.
Inputs: id (required), name, ownerId, location, +5 more.
project_pictures_listB
List available project pictures
Tag: Projects
Inputs: no named parameters.
project_platforms_listB
List platforms for a project
Tag: Project Platforms
Inputs: projectId (required).
projects_createC
Create project
Tag: Projects
Validation rules:
namemust not exceed 20 characters.descriptionmust not exceed 250 characters.projectPictureUrlmust reference a project picture predefined by the meloQA API — list the available IDs viaGET /v1/project-pictures.
Inputs: name (required), organizationId (required), projectPictureUrl (required), description, +1 more.
projects_deleteB
Delete project
Tag: Projects
Inputs: id (required).
projects_execution_statuses_listA
List execution statuses available in a project
Tag: Projects
Returns the execution statuses that can be assigned to executions in this project. Includes both the system-wide defaults (projectId: null, isDefault: true) and any project-specific statuses created for it. Use the id of an entry as statusId when creating or updating an execution.
Inputs: id (required).
projects_getB
Get project by ID
Tag: Projects
Inputs: id (required).
projects_listA
List projects
Tag: Projects
Returns only projects the authenticated user has effective access to (i.e. is a project member of).
Inputs: no named parameters.
projects_members_listA
List members of a project
Tag: Projects
Returns the active (non-deleted) members of the project. The caller must be a member of the project.
Inputs: id (required).
projects_test_case_custom_fields_listA
List custom field definitions for test cases of a project
Tag: Projects
Returns the custom field schema configured for test cases in the project. Use the id of each entry as projectCustomFieldId when reading or writing test case custom field values.
Inputs: id (required).
projects_updateB
Update project
Tag: Projects
Validation rules:
namemust not exceed 20 characters.descriptionmust not exceed 250 characters.projectPictureUrlmust reference a project picture predefined by the meloQA API — list the available IDs viaGET /v1/project-pictures.
Inputs: id (required), name, isArchived, description, +2 more.
tags_createC
Create tag
Tag: Tags
Inputs: name (required), projectId (required), color.
tags_deleteC
Delete tag
Tag: Tags
Inputs: id (required).
tags_getB
Get tag by ID
Tag: Tags
Inputs: id (required).
tags_listC
List tags
Tag: Tags
Inputs: projectId (required).
tags_updateC
Update tag
Tag: Tags
Inputs: id (required), name, color.
test_case_folders_createB
Create test case folder
Tag: Test Case Folders
Folder hierarchy is limited to 3 sub-levels below the project root. Creating a folder under a parent that is already at the 3rd sub-level returns 400.
Inputs: name (required), projectId (required), order, parentId.
test_case_folders_deleteA
Delete test case folder
Tag: Test Case Folders
Removes the folder and hard-deletes every test case it contained, matching the meloQA front-end behavior. Child folders are removed in the same operation.
Inputs: id (required).
test_case_folders_getB
Get test case folder by ID
Tag: Test Case Folders
Inputs: id (required).
test_case_folders_listC
List test case folders
Tag: Test Case Folders
Inputs: projectId (required), parentId.
test_case_folders_updateA
Update test case folder
Tag: Test Case Folders
When parentId is changed, the folder is moved together with its whole subtree. The resulting hierarchy must not exceed 3 sub-levels below the project root — otherwise the request is rejected with 400.
Inputs: id (required), name, order, parentId.
test_cases_archived_listA
List archived test cases
Tag: Test Cases
Returns only archived test cases (statusId === ARCHIVED). At least one of projectId or folderId is required.
Inputs: folderId, projectId.
test_cases_attachments_createB
Create test case attachment (returns presigned upload URL)
Tag: Test Case Attachments
Cria o registro do anexo (uploaded=false) e retorna uma presigned URL S3 (PUT, 300s). Faça o PUT do arquivo na uploadUrl e depois confirme com PATCH /v1/test-cases/:id/attachments/:attachmentId.
Inputs: id (required), md5 (required), size (required), type (required), +1 more.
test_cases_attachments_deleteA
Delete test case attachment
Tag: Test Case Attachments
Remove o anexo (registro + arquivo no S3).
Inputs: id (required), attachmentId (required).
test_cases_attachments_listA
List test case attachments
Tag: Test Case Attachments
Lista os anexos do test case. Itens com uploaded=true trazem downloadUrl (presigned, 300s).
Inputs: id (required).
test_cases_attachments_updateB
Confirm test case attachment upload
Tag: Test Case Attachments
Marca o anexo como enviado (uploaded=true) após o PUT no S3.
Inputs: id (required), attachmentId (required).
test_cases_createC
Create test case
Tag: Test Cases
Inputs: name (required), type (required), statusId (required), projectId (required), +13 more.
test_cases_deleteC
Delete test case
Tag: Test Cases
Inputs: id (required).
test_cases_getC
Get test case by ID
Tag: Test Cases
Inputs: id (required).
test_cases_listA
List test cases
Tag: Test Cases
At least one query parameter is required: projectId or folderId. Archived test cases (statusId === ARCHIVED) are excluded — use GET /v1/test-cases/archived to list those.
Inputs: folderId, projectId.
test_case_statuses_listB
List all test case statuses
Tag: Test Case Statuses
Inputs: no named parameters.
test_cases_unarchiveA
Unarchive test case
Tag: Test Cases
Restores an archived test case (statusId === ARCHIVED) into the folder specified by folderId. The status returns to whatever it was before archiving (statusBeforeId); when no previous status is recorded the test case falls back to FINISHED.
Inputs: id (required), folderId (required).
test_cases_updateC
Update test case
Tag: Test Cases
Archived test cases (statusId === ARCHIVED) are read-only and cannot be updated through this endpoint.
Inputs: id (required), name, type, order, +13 more.
test_case_types_listB
List all test case types
Tag: Test Case Types
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 83 tools
Each tool targets a distinct resource and action, with clear grouping by tags. No overlapping or ambiguous tool semantics.
All tools follow a consistent resource_action naming pattern using snake_case. Verbs are uniform (list, create, delete, get, update) with few deviations like 'unarchive' and 'batch_create'.
With 83 tools, the count far exceeds the typical well-scoped range (3-15). While the domain is complex, the sheer number may overwhelm agents.
The tool set covers CRUD and lifecycle operations for all main entities (bugs, cycles, executions, test cases, projects, etc.). Minor gaps like missing direct test case status management are present but not critical.
Maintenance
Related MCP Connectors
Every Canopy public API operation as a tool, run as you after a browser sign-in or on an API key.
All public upAPI operations as MCP tools: web scraping, search, screenshots, PDF, OCR and more.
AI-callable tools for API mocking, testing, monitoring, security, and automation.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Related MCP Servers
- AlicenseDqualityDmaintenanceExposes all Dokploy API endpoints as MCP tools, enabling AI models and other clients to manage projects, applications, databases, and more on a Dokploy server.10013 npmApache 2.0
- AlicenseCqualityBmaintenanceExposes every endpoint of the Mealie REST API as MCP tools, enabling LLMs to manage recipes, meal plans, shopping lists, and more.211563 npm4MIT
- FlicenseCqualityDmaintenanceExposes Panaya REST APIs as MCP tools for managing entities like projects, requirements, tests, defects, releases, cycles, and business processes. Enables Claude or any MCP client to perform CRUD operations on Panaya data via natural language.91-
- FlicenseNot gradedqualityDmaintenanceProvides MCP tools that give LLM agents a full QA engineer workflow: scanning projects, generating deterministic test suites, executing them across browser/API/mobile, diagnosing failures, and proposing fixes that require human approval.-