Skip to main content
Glama

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; override MELOQA_BASE_URL to point at another instance (e.g. a local http://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-server

To pin it globally instead (exposes the meloqa-mcp binary):

npm install -g @meloqa/mcp-server

Configure 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

MELOQA_API_TOKEN

yes

—

API token sent as Authorization: Bearer <token>.

MELOQA_BASE_URL

no

https://api.meloqa.com

Base URL of the meloQA instance. Override to point at another deployment (e.g. http://localhost:3000).

MELOQA_RATE_LIMIT

no

30

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):

  1. Open the meloQA UI → User Menu → API Tokens.

  2. Click Revoke on the current token. It stops working server-side within seconds.

  3. Click Generate new token and copy the new value.

  4. Replace MELOQA_API_TOKEN in your MCP client config with the new value.

  5. 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>_delete for 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 tsx

To test the generated server against a running meloQA instance:

MELOQA_API_TOKEN=... MELOQA_BASE_URL=https://api.meloqa.com npm run dev

Then pipe JSON-RPC messages on stdin or wire it up via an MCP client.

License

MIT

Available Tools

83 tools
bug_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.

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:

  • name must not exceed 20 characters.

  • description must not exceed 250 characters.

  • projectPictureUrl must reference a project picture predefined by the meloQA API — list the available IDs via GET /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:

  • name must not exceed 20 characters.

  • description must not exceed 250 characters.

  • projectPictureUrl must reference a project picture predefined by the meloQA API — list the available IDs via GET /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

    C2.9/5.0

    Scored across 83 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action, with clear grouping by tags. No overlapping or ambiguous tool semantics.

    Naming Consistency5/5

    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'.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      C
      quality
      D
      maintenance
      Exposes 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.
      9
      1
      -
    • F
      license
      Not graded
      quality
      D
      maintenance
      Provides 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.
      -