{"_id":"@appsurify-testmap/mcp-server","_rev":"3-dd37cc4b02ae72e1da9e15e5e4eac953","name":"@appsurify-testmap/mcp-server","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@appsurify-testmap/mcp-server","version":"0.1.0","keywords":["mcp","mcp-server","model-context-protocol","appsurify","testmap","test-coverage","testing","qa"],"author":{"url":"https://appsurify.com","name":"Appsurify"},"license":"MIT","_id":"@appsurify-testmap/mcp-server@0.1.0","maintainers":[{"name":"whenessel","email":"ar.demidenko@gmail.com"}],"homepage":"https://github.com/Appsurify/appsurify-testmap-mcp#readme","bugs":{"url":"https://github.com/Appsurify/appsurify-testmap-mcp/issues"},"bin":{"testmap-mcp":"dist/index.js"},"dist":{"shasum":"b9849b9c7fa9fabdf6f0d76155a0fd225a734480","tarball":"https://registry.npmjs.org/@appsurify-testmap/mcp-server/-/mcp-server-0.1.0.tgz","fileCount":57,"integrity":"sha512-7XCm3LMFPkhcOc0it3Qzle32v4cs3ix/WSkQuaVlyIG0cROt+zQ5KumqdJ8XT7vgeWz9nw2u2dkw9XHoMEeNuQ==","signatures":[{"sig":"MEQCIErRphaNL94mvnAhsput64I9K4Ge8Fryqn6yZ0c+/EZyAiBroXHoks3TApAvYf0DFv/zgBkfblIdkMwHUqEMvEK2Qw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117894},"main":"dist/index.js","type":"module","engines":{"node":">=20"},"exports":{".":"./dist/index.js"},"gitHead":"55eb9b6fbc37549a5060bde29efb3de945af9ec9","mcpName":"com.appsurify/testmap","scripts":{"dev":"tsx watch src/index.ts","eval":"npm run build && cd evals && python3 evaluation.py -t stdio -c node -a ../dist/index.js -e \"TESTMAP_URL=$TESTMAP_URL\" \"TESTMAP_TOKEN=$TESTMAP_TOKEN\" \"NODE_EXTRA_CA_CERTS=$NODE_EXTRA_CA_CERTS\" -m claude-opus-5 -o reports/latest.md questions.xml","lint":"biome check src tests","test":"vitest run --project unit --project contract","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","dev:http":"tsx watch src/index.ts --transport http","lint:fix":"biome check --write src tests","inspector":"npm run build && npx @modelcontextprotocol/inspector -e \"TESTMAP_URL=$TESTMAP_URL\" -e \"TESTMAP_TOKEN=$TESTMAP_TOKEN\" -e \"NODE_EXTRA_CA_CERTS=$NODE_EXTRA_CA_CERTS\" node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build","test:integration":"vitest run --project integration"},"_npmUser":{"name":"whenessel","email":"ar.demidenko@gmail.com"},"repository":{"url":"git+https://github.com/Appsurify/appsurify-testmap-mcp.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for Appsurify TestMap — exposes test-coverage analytics (context resolution, ranked coverage gaps, element context, zero-coverage pages) to AI agents.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","vitest":"^4.1.11","typescript":"^7.0.2","@types/node":"^26.4.0","@biomejs/biome":"^2.5.10","@modelcontextprotocol/client":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.0_1787849124041_0.5967595524522853","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@appsurify-testmap/mcp-server","version":"0.2.0","keywords":["mcp","mcp-server","model-context-protocol","appsurify","testmap","test-coverage","testing","qa"],"author":{"url":"https://appsurify.com","name":"Appsurify"},"license":"MIT","_id":"@appsurify-testmap/mcp-server@0.2.0","maintainers":[{"name":"whenessel","email":"ar.demidenko@gmail.com"}],"homepage":"https://github.com/Appsurify/appsurify-testmap-mcp#readme","bugs":{"url":"https://github.com/Appsurify/appsurify-testmap-mcp/issues"},"bin":{"testmap-mcp":"dist/index.js"},"dist":{"shasum":"477bcafae4bb3043cd4c472aa1538a8a79869537","tarball":"https://registry.npmjs.org/@appsurify-testmap/mcp-server/-/mcp-server-0.2.0.tgz","fileCount":61,"integrity":"sha512-jlBy1QJq2y3SLs3dSJ36aahKw5oVEIFjy44vhrvmVyng/N/35GnpLaw0QKstQpwCJLm8PiLhFFlvWd0YylYIog==","signatures":[{"sig":"MEUCIQCVXMaqcxQE/tVj7BEC2xIdPWLfykATf/ENmOR6+NTkjwIgfdVVWI2IaRIanIG5uiyHYdEvoo5dwmxNr5HBEoblyoo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAVw2S00DlDq8zXoUilQesc0k4eSMnCqeOFNEvLnPUZbAiEAtaARv1+dnktf/gb3Rz7BiFfRsxVdpEjETdloiTWdrF8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125801},"main":"dist/index.js","type":"module","engines":{"node":">=20"},"exports":{".":"./dist/index.js"},"gitHead":"21a15e1b4568c3f0197522ed70d7543f6684c061","mcpName":"com.appsurify/testmap","scripts":{"dev":"tsx watch src/index.ts","eval":"npm run build && cd evals && python3 evaluation.py -t stdio -c node -a ../dist/index.js -e \"TESTMAP_URL=$TESTMAP_URL\" \"TESTMAP_TOKEN=$TESTMAP_TOKEN\" \"NODE_EXTRA_CA_CERTS=$NODE_EXTRA_CA_CERTS\" -m claude-opus-5 -o reports/latest.md questions.xml","lint":"biome check src tests","test":"vitest run --project unit --project contract","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","eval:cc":"npm run build && node evals/run-eval-cc.mjs","dev:http":"tsx watch src/index.ts --transport http","lint:fix":"biome check --write src tests","inspector":"npm run build && npx @modelcontextprotocol/inspector -e \"TESTMAP_URL=$TESTMAP_URL\" -e \"TESTMAP_TOKEN=$TESTMAP_TOKEN\" -e \"NODE_EXTRA_CA_CERTS=$NODE_EXTRA_CA_CERTS\" node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build","test:integration":"vitest run --project integration"},"_npmUser":{"name":"whenessel","email":"ar.demidenko@gmail.com"},"repository":{"url":"git+https://github.com/Appsurify/appsurify-testmap-mcp.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for Appsurify TestMap — exposes test-coverage analytics (context resolution, ranked coverage gaps, element context, zero-coverage pages) to AI agents.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","vitest":"^4.1.11","typescript":"^7.0.2","@types/node":"^26.4.0","@biomejs/biome":"^2.5.10","@modelcontextprotocol/client":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.2.0_1787925742171_0.27773107567059285","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"_id":"@appsurify-testmap/mcp-server@0.3.0","bin":{"testmap-mcp":"dist/index.js"},"bugs":{"url":"https://github.com/Appsurify/appsurify-testmap-mcp/issues"},"dist":{"shasum":"59ab730fbd3347ae89fd88427b31a8504b6fab23","tarball":"https://registry.npmjs.org/@appsurify-testmap/mcp-server/-/mcp-server-0.3.0.tgz","fileCount":61,"integrity":"sha512-iFK5dVu/TdIjiv8QDCwM8ncLvrazLDzO3Qi+l9zujQ9wP+BH1cM7xlTuXM9a+SP7Y9BB2Wop8lItehh+DaQVcQ==","signatures":[{"sig":"MEQCIGLYm+ibi2WZRYdxchFW5guMTrHdB6rjhSGZgbf23G/BAiB5Kz5OrH6mmvzvzFa03tmelt9h0bkaZ75TCZKJB1lhXw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHiCYZaRgEtbn5fjsnK8PUbnP8Riw7b8PYvrXe9fTB95AiBwSgFe+7HWaDJeu/JEE8sgA+LOiLJH6L4u0nnWXcOgUA=="}],"unpackedSize":126066},"main":"dist/index.js","name":"@appsurify-testmap/mcp-server","type":"module","author":{"url":"https://appsurify.com","name":"Appsurify"},"engines":{"node":">=20"},"exports":{".":"./dist/index.js"},"gitHead":"91c849429bca0d708500d998596b2f95729fa46f","license":"MIT","mcpName":"io.testmap/mcp-server","scripts":{"dev":"tsx watch src/index.ts","eval":"npm run build && cd evals && python3 evaluation.py -t stdio -c node -a ../dist/index.js -e \"TESTMAP_URL=$TESTMAP_URL\" \"TESTMAP_TOKEN=$TESTMAP_TOKEN\" \"NODE_EXTRA_CA_CERTS=$NODE_EXTRA_CA_CERTS\" -m claude-opus-5 -o reports/latest.md questions.xml","lint":"biome check src tests","test":"vitest run --project unit --project contract","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","eval:cc":"npm run build && node evals/run-eval-cc.mjs","dev:http":"tsx watch src/index.ts --transport http","lint:fix":"biome check --write src tests","inspector":"npm run build && npx @modelcontextprotocol/inspector -e \"TESTMAP_URL=$TESTMAP_URL\" -e \"TESTMAP_TOKEN=$TESTMAP_TOKEN\" -e \"NODE_EXTRA_CA_CERTS=$NODE_EXTRA_CA_CERTS\" node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build","test:integration":"vitest run --project integration"},"version":"0.3.0","_npmUser":{"name":"whenessel","email":"ar.demidenko@gmail.com"},"homepage":"https://github.com/Appsurify/appsurify-testmap-mcp#readme","keywords":["mcp","mcp-server","model-context-protocol","appsurify","testmap","test-coverage","testing","qa"],"repository":{"url":"git+https://github.com/Appsurify/appsurify-testmap-mcp.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for Appsurify TestMap — exposes test-coverage analytics (context resolution, ranked coverage gaps, element context, zero-coverage pages) to AI agents.","directories":{},"maintainers":[{"name":"whenessel","email":"ar.demidenko@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","vitest":"^4.1.11","typescript":"^7.0.2","@types/node":"^26.4.0","@biomejs/biome":"^2.5.10","@modelcontextprotocol/client":"^2.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-server_0.3.0_1787927740142_0.1755537904919353"}}},"time":{"created":"2026-08-27T16:45:23.921Z","modified":"2026-08-28T14:35:40.402Z","0.1.0":"2026-08-27T16:45:24.174Z","0.2.0":"2026-08-28T14:02:22.273Z","0.3.0":"2026-08-28T14:35:40.226Z"},"bugs":{"url":"https://github.com/Appsurify/appsurify-testmap-mcp/issues"},"author":{"url":"https://appsurify.com","name":"Appsurify"},"license":"MIT","homepage":"https://github.com/Appsurify/appsurify-testmap-mcp#readme","keywords":["mcp","mcp-server","model-context-protocol","appsurify","testmap","test-coverage","testing","qa"],"repository":{"url":"git+https://github.com/Appsurify/appsurify-testmap-mcp.git","type":"git"},"description":"MCP server for Appsurify TestMap — exposes test-coverage analytics (context resolution, ranked coverage gaps, element context, zero-coverage pages) to AI agents.","maintainers":[{"name":"whenessel","email":"ar.demidenko@gmail.com"}],"readme":"# Appsurify TestMap MCP Server\n\nMCP ([Model Context Protocol](https://modelcontextprotocol.io)) server that exposes\n[Appsurify TestMap](https://appsurify.com) test-coverage analytics to AI agents:\ncontext resolution, ranked coverage gaps, per-element test context, journeys to\nelements, zero-coverage pages, coverage diffs between runs, and suite efficiency.\n\nRuns as a local stdio CLI (for Claude Code, Claude Desktop, Cursor, etc.) or as a\nStreamable HTTP service (Docker / remote deployments) from the same codebase.\n\n## Tools\n\n| Tool | Backend endpoint | Description |\n| --- | --- | --- |\n| `testmap_resolve_context` | `GET /api/v1/agent/context` | Resolve project names, page URLs and \"the latest run\" into the UUIDs the other tools need — call it first |\n| `testmap_list_gaps` | `GET /api/v1/agent/projects/{id}/gaps` | Rank untested / under-tested elements of a run across all pages |\n| `testmap_get_element` | `GET /api/v1/agent/projects/{id}/elements/{semantic_id}` | Everything needed to write a test for one element: locator attributes, metrics, covering tests |\n| `testmap_get_journey` | `GET /api/v1/agent/projects/{id}/elements/{semantic_id}/journey` | Recorded steps an existing test used to reach the element (login, navigation, modals) |\n| `testmap_get_page` | `GET /api/v1/agent/projects/{id}/pages/{semantic_id}` / `…/pages?page_href=` | Everything about one page: which tests touch it, all its interactive elements (covered included) |\n| `testmap_list_zero_coverage` | `GET /api/v1/agent/projects/{id}/zero-coverage` | Pages with interactive elements no test ever touched |\n| `testmap_get_run_diff` | `GET /api/v1/agent/projects/{id}/diff` | Coverage diff between two runs — confirms a gap closed and nothing regressed |\n| `testmap_get_suite_efficiency` | `GET /api/v1/agent/projects/{id}/efficiency` | Test Efficiency Score and per-page coverage rollup — suite health overview |\n\nAll tools are read-only (the agent API group contains no non-GET route) and\nauthenticate with a TestMap personal access token (`Bearer tmap_...`).\nResponses are capped at 25,000 characters; oversized results are truncated\nwith guidance to narrow the query.\n\n## Requirements\n\n- Node.js >= 20\n- A TestMap installation and an API key\n\n## Quick start (stdio)\n\nAdd the server to your MCP client — Claude Code, Claude Desktop, Cursor and\nsimilar clients all take the same shape:\n\n```json\n{\n  \"mcpServers\": {\n    \"testmap\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@appsurify-testmap/mcp-server\"],\n      \"env\": {\n        \"TESTMAP_URL\": \"https://example.testmap.cloud\",\n        \"TESTMAP_TOKEN\": \"<your-api-token>\"\n      }\n    }\n  }\n}\n```\n\nPer-client setup, demo scenarios and a full walkthrough: **[USAGE.md](USAGE.md)**.\n\n## Streamable HTTP\n\n```bash\nTESTMAP_URL=... TESTMAP_TOKEN=... npx @appsurify-testmap/mcp-server --transport http --port 3000\n```\n\nThe MCP endpoint is `POST http://<host>:<port>/mcp`; `GET /health` returns a\nliveness probe. Stateless mode: no sessions, each request is served by a fresh\nserver instance.\n\n## Docker\n\n```bash\ndocker build -t testmap-mcp .\ndocker run --rm -p 3000:3000 \\\n  -e TESTMAP_URL=https://example.testmap.cloud \\\n  -e TESTMAP_TOKEN=<your-api-token> \\\n  testmap-mcp\n```\n\nThe image serves the HTTP transport on `0.0.0.0:3000` and ships a `/health`\nDocker health check. Set `MCP_ALLOWED_HOSTS` / `MCP_ALLOWED_ORIGINS` when the\ncontainer is reachable from untrusted networks.\n\n## Configuration\n\nConfiguration is resolved as: CLI flag > environment variable > default.\n\n| Variable | Description | Default |\n| --- | --- | --- |\n| `TESTMAP_URL` | Base URL of the TestMap installation, e.g. `https://example.testmap.cloud` | — (required for tool calls) |\n| `TESTMAP_TOKEN` | TestMap API token | — (required for tool calls) |\n| `TESTMAP_TIMEOUT_MS` | Timeout for TestMap API requests | `30000` |\n| `TRANSPORT` | `stdio` or `http` | `stdio` |\n| `PORT` | HTTP port | `3000` |\n| `HOST` | HTTP bind address | `127.0.0.1` |\n| `MCP_ALLOWED_HOSTS` | Comma-separated `Host` allowlist (DNS-rebinding protection) | localhost list when bound to loopback |\n| `MCP_ALLOWED_ORIGINS` | Comma-separated `Origin` allowlist | localhost list when bound to loopback |\n| `LOG_LEVEL` | `debug`, `info`, `warn`, `error` | `info` |\n\nCLI flags: `--transport/-t`, `--port/-p`, `--host`, `--help/-h`, `--version/-v`.\n\n## Documentation\n\n- **[USAGE.md](USAGE.md)** — for building demos: per-client setup and the\n  end-to-end demo scenario (find a gap → write a test → prove it closed).\n- **[DEVELOPMENT.md](DEVELOPMENT.md)** — for the development team: commands,\n  test tiers, debugging ladder, releasing.\n- **[CHANGELOG.md](CHANGELOG.md)** — release history.\n\n## License\n\nMIT © Appsurify, Inc.\n","readmeFilename":"README.md"}