{
  "markdown": "# qtm4j-mcp-server\n\n[![CI](https://github.com/denis-platonov/qtm4j-mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/denis-platonov/qtm4j-mcp-server/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/%40denis-platonov%2Fqtm4j-mcp-server)](https://www.npmjs.com/package/@denis-platonov/qtm4j-mcp-server)\n[![Release](https://img.shields.io/github/v/release/denis-platonov/qtm4j-mcp-server)](https://github.com/denis-platonov/qtm4j-mcp-server/releases)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nMCP server for **QTM4J** (QMetry Test Management for Jira) Open API at `qtmcloud.qmetry.com/rest/api/latest`.\n\nPublished package: `@denis-platonov/qtm4j-mcp-server`\n\nMCP Registry name: `io.github.denis-platonov/qtm4j`\n\n## Supported Clients\n\n| Client | Status | Notes |\n|--------|--------|-------|\n| Cursor | Supported | Configure with `npx` in `~/.cursor/mcp.json` |\n| JetBrains IDEs | Supported | Configure in AI Assistant MCP settings |\n| VS Code | Supported | Configure in `.vscode/mcp.json` or user profile `mcp.json` |\n| Antigravity | Supported | Configure in `mcp_config.json` via raw config |\n\n## Tools\n\n| Tool | Description |\n|------|-------------|\n| `create_test_cycle` | Create a new test cycle (run) |\n| `search_test_case` | Search for a test case by key (e.g. PE26-TC-2) |\n| `search_test_cases` | Search test cases with pagination and optional summary filters |\n| `list_all_project_test_cases` | Fetch and merge paginated test case results across a project |\n| `create_test_case` | Create a new test case, optionally placing it in folders |\n| `list_cycle_test_cases` | List all test cases in a cycle |\n| `add_test_case_to_cycle` | Add a test case to a cycle |\n| `update_execution_status` | Update execution result (Pass/Fail) |\n| `close_test_cycle` | Close a test cycle |\n| `get_attachment_url` | Get presigned URL for attachment upload |\n| `add_test_case_steps` | Add one or more steps to a test case version |\n| `add_test_case_to_folders` | Add a test case version to one or more folders |\n| `create_test_case_folder` | Create a test case folder in a project |\n| `get_test_case` | Fetch a test case by ID or key |\n| `get_test_case_details` | Fetch full details for a specific test case version |\n| `get_test_case_steps` | List or search steps on a test case version |\n| `list_test_case_folders` | List project test case folders with flat paths |\n| `remove_test_case_from_folders` | Remove a test case version from folders |\n| `update_test_case_description` | Update a test case version description |\n| `update_test_case_step` | Update an existing test step |\n| `update_test_case_summary` | Update a test case version summary |\n\nThe full set of tools (including `search_test_cases` with `startAt`, `list_all_project_test_cases`, folder and step helpers) is defined in `src/tools.ts`. After `npm run build`, run `npm run list-tools` to print every registered tool name — use this to confirm Cursor is using **this** build (you should see `list_all_project_test_cases`).\n\n### Cursor: use the local build for full functionality\n\n`npx @denis-platonov/qtm4j-mcp-server` may be an older npm release. To guarantee tools such as **`list_all_project_test_cases`** and correct **`startAt`** handling:\n\n1. In this directory: `npm install && npm run build`.\n2. Merge `cursor-mcp.example.json` into your **user** Cursor config `~/.cursor/mcp.json` (Windows: `%USERPROFILE%\\.cursor\\mcp.json`). Adjust the `args` path to your absolute `dist/index.js`.\n3. Run `npm run list-tools` and confirm the tool count matches expectations.\n4. Restart Cursor or toggle the MCP server off/on.\n\n### Cursor workspace tool descriptors\n\nIf you use Cursor’s workspace `mcps/<server>/tools/*.json` hints for the agent, keep those JSON schemas in sync with `src/tools.ts` (same parameter names as the Zod definitions). Rebuild and restart MCP after changing tools.\n\n## Setup\n\n### Prerequisites\n\n- Node.js 20+\n- QTM4J Open API key (generate from Jira: QMetry > Configuration > Open API)\n\n### Use with Cursor\n\nAdd to `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"qtm4j\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@denis-platonov/qtm4j-mcp-server\"],\n      \"env\": {\n        \"QTM4J_API_KEY\": \"your-api-key\",\n        \"QTM4J_BASE_URL\": \"https://qtmcloud.qmetry.com/rest/api/latest\",\n        \"QTM4J_PROJECT_ID\": \"10800\"\n      }\n    }\n  }\n}\n```\n\n### Use with JetBrains IDEs\n\nIn JetBrains AI Assistant, open `Tools > AI Assistant > Model Context Protocol (MCP)` and add:\n\n```json\n{\n  \"mcpServers\": {\n    \"qtm4j\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@denis-platonov/qtm4j-mcp-server\"],\n      \"env\": {\n        \"QTM4J_API_KEY\": \"your-api-key\",\n        \"QTM4J_BASE_URL\": \"https://qtmcloud.qmetry.com/rest/api/latest\",\n        \"QTM4J_PROJECT_ID\": \"10800\"\n      }\n    }\n  }\n}\n```\n\nRestart AI Assistant after saving the configuration.\n\n### Use with VS Code\n\nAdd this to your user or workspace MCP configuration file, typically `.vscode/mcp.json` or your profile-level `mcp.json`:\n\n```json\n{\n  \"servers\": {\n    \"qtm4j\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@denis-platonov/qtm4j-mcp-server\"],\n      \"env\": {\n        \"QTM4J_API_KEY\": \"your-api-key\",\n        \"QTM4J_BASE_URL\": \"https://qtmcloud.qmetry.com/rest/api/latest\",\n        \"QTM4J_PROJECT_ID\": \"10800\"\n      }\n    }\n  }\n}\n```\n\n### Use with Antigravity\n\nIn Antigravity, open `Manage MCP Servers` and then `View raw config`, then add this to `mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"qtm4j\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@denis-platonov/qtm4j-mcp-server\"],\n      \"env\": {\n        \"QTM4J_API_KEY\": \"your-api-key\",\n        \"QTM4J_BASE_URL\": \"https://qtmcloud.qmetry.com/rest/api/latest\",\n        \"QTM4J_PROJECT_ID\": \"10800\"\n      }\n    }\n  }\n}\n```\n\n### Build\n\n```bash\nnpm install\nnpm run build\n```\n\n### Testing\n\nRun the hermetic test suite:\n\n```bash\nnpm test\n```\n\nRun once without watch mode:\n\n```bash\nnpm run test:run\n```\n\nGenerate a coverage report:\n\n```bash\nnpm run test:coverage\n```\n\nRun opt-in live integration tests against a real QTM4J environment:\n\n```bash\nnpm run test:live\n```\n\nLive tests are skipped unless the required environment is present. The live suite currently supports:\n\n- Read-focused checks using `QTM4J_API_KEY`, `QTM4J_BASE_URL`, and `QTM4J_PROJECT_ID`\n- Search coverage with `QTM4J_LIVE_TEST_CASE_KEY`\n- Cycle listing coverage with `QTM4J_LIVE_TEST_CYCLE_ID`\n- Attachment URL coverage with `QTM4J_LIVE_TEST_EXECUTION_ID`\n- Optional mutation checks only when `QTM4J_LIVE_ENABLE_MUTATIONS=1`\n\nExample:\n\n```bash\nQTM4J_API_KEY=your-api-key \\\nQTM4J_PROJECT_ID=10800 \\\nQTM4J_LIVE_TEST_CASE_KEY=PE26-TC-2 \\\nQTM4J_LIVE_TEST_CYCLE_ID=PE26-R1 \\\nQTM4J_LIVE_TEST_EXECUTION_ID=12345 \\\nnpm run test:live\n```\n\n### Local Development\n\nCopy `cursor-mcp.example.json` into `~/.cursor/mcp.json` (merge with existing `mcpServers`) and set `args` to the absolute path of `dist/index.js`, for example on Windows:\n\n`\"args\": [\"C:/Users/you/projects/qa-all-in-one/tools/qtm4j-mcp-server/dist/index.js\"]`\n\nOptional: `NODE_TLS_REJECT_UNAUTHORIZED\": \"0\"` in `env` only if you must use self-signed TLS.\n\n### Publish\n\nThis repository uses a tag-driven GitHub Actions release workflow.\n\n1. Align `package.json` and `server.json` to the release version.\n2. Build and verify locally:\n\n```bash\nnpm run build\nnpm run test:run\n```\n\n3. Commit the release-prep changes.\n4. Create and push the release tag:\n\n```bash\ngit tag v1.1.0\ngit push origin sync/desktop-qtm4j-source\ngit push origin v1.1.0\n```\n\n5. GitHub Actions will verify the tag matches `package.json` and `server.json`, publish the npm package, and then publish `server.json` to the MCP Registry.\n\nYou can then verify discovery with:\n\n```bash\ncurl \"https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.denis-platonov/qtm4j\"\n```\n\n### GitHub Actions\n\nThis repo includes two workflows:\n\n- `CI`: runs `npm run build`, `npm run test:run`, and `npm run test:coverage` on pushes to `main` and on pull requests\n- `Release`: runs on tags matching `v*`, verifies the tag matches `package.json` and `server.json`, publishes to npm, and then publishes `server.json` to the MCP Registry\n\nTo use the release workflow, add this repository secret:\n\n- `NPM_TOKEN`: npm access token with permission to publish `@denis-platonov/qtm4j-mcp-server`\n\nThen cut a release like this:\n\n```bash\ngit tag v1.1.0\ngit push origin v1.1.0\n```\n\n### Environment Variables\n\n| Variable | Required | Default | Description |\n|----------|----------|---------|-------------|\n| `QTM4J_API_KEY` | Yes | — | QTM4J Open API key |\n| `QTM4J_BASE_URL` | No | `https://qtmcloud.qmetry.com/rest/api/latest` | API base URL |\n| `QTM4J_PROJECT_ID` | No | — | Default project ID (avoids passing it in every call) |\n| `NODE_TLS_REJECT_UNAUTHORIZED` | No | — | Set to `0` for self-signed certs |\n",
  "bytes": 8903,
  "sha": "30c173618b73711c32514657e3f6d89c85c481ae9dea82ef2d654695be207f9f",
  "repo_slug": "denis-platonov/qtm4j-mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_denis_platonov_qtm4j_baa858c8/readme"
}