Metadata-Version: 2.4
Name: qai-consultant-mcp
Version: 3.4.4
Summary: Local, keyless MCP server: standards-grounded QA knowledge retrieval (ISTQB, OWASP, IEEE, ISO, EU AI Act), deterministic QA effort estimation, QA document quality review, and test-results health analysis.
Author: QAI Consultant Contributors
License: Apache-2.0
Project-URL: Homepage, https://github.com/gvasile29/qai-consultant
Project-URL: Repository, https://github.com/gvasile29/qai-consultant
Keywords: mcp,model-context-protocol,qa,testing,quality-assurance
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: aiohappyeyeballs==2.7.1
Requires-Dist: aiohttp==3.14.3
Requires-Dist: aiosignal==1.4.0
Requires-Dist: annotated-types==0.8.0
Requires-Dist: anyio==4.14.2
Requires-Dist: async-timeout==4.0.3; python_full_version < "3.11"
Requires-Dist: attrs==26.1.0
Requires-Dist: certifi==2026.7.22
Requires-Dist: cffi==2.1.1; platform_python_implementation != "PyPy"
Requires-Dist: charset-normalizer==3.5.1
Requires-Dist: click==8.5.0; sys_platform != "emscripten"
Requires-Dist: cloudpickle==3.1.2
Requires-Dist: colorama==0.4.6; sys_platform == "win32"
Requires-Dist: cryptography==50.0.1
Requires-Dist: defusedxml==0.7.1
Requires-Dist: distro==1.9.0
Requires-Dist: exceptiongroup==1.3.1; python_full_version < "3.11"
Requires-Dist: filelock==3.32.4
Requires-Dist: frozenlist==1.8.0
Requires-Dist: fsspec==2026.7.0
Requires-Dist: greenlet==3.5.5; platform_machine == "AMD64" or platform_machine == "WIN32" or platform_machine == "aarch64" or platform_machine == "amd64" or platform_machine == "ppc64le" or platform_machine == "win32" or platform_machine == "x86_64"
Requires-Dist: h11==0.16.0
Requires-Dist: hf-xet==1.6.0; platform_machine == "aarch64" or platform_machine == "amd64" or platform_machine == "arm64" or platform_machine == "x86_64"
Requires-Dist: httpcore==1.0.9
Requires-Dist: httpx==0.28.1
Requires-Dist: httpx-sse==0.4.3
Requires-Dist: huggingface-hub==0.36.2
Requires-Dist: idna==3.19
Requires-Dist: jinja2==3.1.6
Requires-Dist: joblib==1.6.0
Requires-Dist: jsonpatch==1.33
Requires-Dist: jsonpointer==3.1.1
Requires-Dist: jsonschema==4.26.0
Requires-Dist: jsonschema-specifications==2025.9.1
Requires-Dist: langchain-classic==1.0.8
Requires-Dist: langchain-community==0.4.2
Requires-Dist: langchain-core==1.6.1
Requires-Dist: langchain-protocol==0.0.19
Requires-Dist: langchain-text-splitters==1.1.2
Requires-Dist: langsmith==0.11.2
Requires-Dist: markupsafe==3.0.3
Requires-Dist: mcp==1.28.1
Requires-Dist: mpmath==1.3.0
Requires-Dist: multidict==6.7.1
Requires-Dist: narwhals==2.25.0; python_full_version >= "3.11"
Requires-Dist: networkx==3.4.2; python_full_version < "3.11"
Requires-Dist: networkx==3.6.1; python_full_version >= "3.11"
Requires-Dist: numpy==2.2.6; python_full_version < "3.11"
Requires-Dist: numpy==2.4.6; python_full_version == "3.11.*"
Requires-Dist: numpy==2.5.2; python_full_version >= "3.12"
Requires-Dist: orjson==3.12.0; platform_python_implementation != "PyPy"
Requires-Dist: packaging==26.3
Requires-Dist: pillow==12.3.0
Requires-Dist: platformdirs==4.11.0
Requires-Dist: propcache==0.5.2
Requires-Dist: pycparser==3.0; implementation_name != "PyPy" and platform_python_implementation != "PyPy"
Requires-Dist: pydantic==2.13.5
Requires-Dist: pydantic-core==2.46.5
Requires-Dist: pydantic-settings==2.15.0
Requires-Dist: pyjwt==2.13.0
Requires-Dist: python-dotenv==1.2.3
Requires-Dist: python-multipart==0.0.32
Requires-Dist: pywin32==312; sys_platform == "win32"
Requires-Dist: pyyaml==6.0.3
Requires-Dist: referencing==0.37.0
Requires-Dist: regex==2026.8.31
Requires-Dist: requests==2.34.2
Requires-Dist: requests-toolbelt==1.0.0
Requires-Dist: rpds-py==0.30.0; python_full_version < "3.11"
Requires-Dist: rpds-py==2026.6.3; python_full_version >= "3.11"
Requires-Dist: safetensors==0.8.0
Requires-Dist: scikit-learn==1.7.2; python_full_version < "3.11"
Requires-Dist: scikit-learn==1.9.0; python_full_version >= "3.11"
Requires-Dist: scipy==1.15.3; python_full_version < "3.11"
Requires-Dist: scipy==1.17.1; python_full_version == "3.11.*"
Requires-Dist: scipy==1.18.1; python_full_version >= "3.12"
Requires-Dist: sentence-transformers==2.7.0
Requires-Dist: setuptools==84.0.0
Requires-Dist: sniffio==1.3.1
Requires-Dist: sqlalchemy==2.0.52
Requires-Dist: sse-starlette==3.4.8
Requires-Dist: starlette==1.6.0
Requires-Dist: sympy==1.14.0
Requires-Dist: tenacity==9.1.4
Requires-Dist: threadpoolctl==3.6.0
Requires-Dist: tokenizers==0.22.2
Requires-Dist: torch==2.13.0
Requires-Dist: tqdm==4.70.0
Requires-Dist: transformers==4.57.6
Requires-Dist: typing-extensions==4.16.0
Requires-Dist: typing-inspection==0.4.4
Requires-Dist: urllib3==2.7.0
Requires-Dist: uuid-utils==0.17.0
Requires-Dist: uvicorn==0.52.4; sys_platform != "emscripten"
Requires-Dist: websockets==16.1.1; python_full_version < "3.11"
Requires-Dist: websockets==17.1; python_full_version >= "3.11"
Requires-Dist: xxhash==4.0.1
Requires-Dist: yarl==1.24.5
Requires-Dist: zstandard==0.25.0
Dynamic: license-file

<!-- mcp-name: io.github.gvasile29/qai-consultant-mcp -->
![QAI Consultant](https://raw.githubusercontent.com/gvasile29/qai-consultant/master/assets/brand/qai_logo_horizontal_1680.png)

# qai-consultant-mcp

[![qai-consultant MCP server](https://glama.ai/mcp/servers/gvasile29/qai-consultant/badges/card.svg)](https://glama.ai/mcp/servers/gvasile29/qai-consultant)
[![qai-consultant MCP server](https://glama.ai/mcp/servers/gvasile29/qai-consultant/badges/score.svg)](https://glama.ai/mcp/servers/gvasile29/qai-consultant)
![MCP Registry](https://img.shields.io/badge/MCP%20Registry-listed-6B46C1?logo=anthropic)
![Awesome MCP Servers](https://img.shields.io/badge/Awesome%20MCP%20Servers-listed-blue?logo=github)

Listed on the [official MCP registry](https://registry.modelcontextprotocol.io) (`io.github.gvasile29/qai-consultant-mcp`), [Glama](https://glama.ai/mcp/servers/gvasile29/qai-consultant), and [Awesome MCP Servers](https://github.com/punkpeye/awesome-mcp-servers).

![qai-consultant-mcp answering a retrieve_qa_knowledge call in MCP Inspector](https://raw.githubusercontent.com/gvasile29/qai-consultant/master/assets/demo/qai-consultant-mcp-demo.gif)

A local, fully keyless [MCP](https://modelcontextprotocol.io) server: standards-grounded QA knowledge retrieval (ISTQB, OWASP, IEEE, ISO, EU AI Act), deterministic QA effort estimation, QA document quality review, and test-results health analysis — callable directly from Claude Code, Claude Desktop, or claude.ai.

No API keys, no Pinecone, no cloud LLM calls. It runs a local embedding index over a self-authored QA knowledge base and does the estimation math itself; **the client LLM writes the narrative**, this server just supplies grounding and numbers.

> This package is the MCP companion to [QAI Consultant](https://github.com/gvasile29/qai-consultant), an AI QA Architect web app / CLI. If you're looking for the full app (Test Strategy / Risk Register / Effort Report generation with a browser UI), see the [main project](https://github.com/gvasile29/qai-consultant) instead — this package is just the MCP server piece of it.

## Install

```bash
uvx qai-consultant-mcp
```

**Claude Code:**
```bash
claude mcp add qai-consultant -- uvx qai-consultant-mcp
```

**Claude Desktop** (`claude_desktop_config.json`):
```json
{
  "mcpServers": {
    "qai-consultant": {
      "command": "uvx",
      "args": ["qai-consultant-mcp"]
    }
  }
}
```

First run downloads the embedding model (`sentence-transformers/all-MiniLM-L6-v2`, CPU-only) and builds a local index — this takes a minute or two the first time, then it's cached.

## Tools

| Tool | What it does |
|---|---|
| `retrieve_qa_knowledge` | Grounding chunks from the knowledge base (ISTQB, OWASP, IEEE, ISO standards; testing methodologies; audit/evaluation frameworks; the EU AI Act), filterable by category |
| `list_kb_sources` | Every document in the knowledge base, grouped by category |
| `estimate_qa_effort` | Deterministic PERT-based effort estimate (baseline + complexity multipliers + team capacity + confidence score) — no LLM narrative, you write your own from the numbers |
| `review_qa_document` | Deterministic 0–100 quality score for an existing Test Plan/Strategy/test case list across six ISTQB/IEEE-829-grounded dimensions, with findings and resolved KB citations — no LLM scoring, you write the narrative from the findings |
| `analyze_test_results` | Deterministic health metrics from JUnit XML or CSV test execution data — flaky tests, ever-failing tests, slowest tests, and failure clustering — no LLM anywhere in this tool |

## Try It — Example Prompts

Type these directly in Claude Code, Claude Desktop, or claude.ai once the server is attached:

- *"Using qai-consultant, what does the knowledge base say about risk-based testing?"* → `retrieve_qa_knowledge`
- *"List every document in the qai-consultant knowledge base, grouped by category."* → `list_kb_sources`
- *"Using qai-consultant's estimate_qa_effort, estimate the effort for a B2B SaaS project called 'Test Migration', React + Node.js + PostgreSQL, 2 QA / 5 dev engineers, 3-month timeline, Agile/Scrum, no notable known risks, minimal existing test automation, no special compliance requirements."* → `estimate_qa_effort`
- *"Here's a Test Plan [paste it] — use qai-consultant to review it with review_qa_document and give me the score and findings."* → `review_qa_document`
- *"Here's a JUnit XML report from my last 3 CI runs [paste them] — use qai-consultant's analyze_test_results to find flaky tests."* → `analyze_test_results`

The first one (`retrieve_qa_knowledge`) is the fastest way to confirm the server actually attached.

## Prompts

- `qa_project_interview` — the project-intake interview (11 questions covering scope, tech stack, team, timeline, risks, compliance)
- `risk_register_structure` — Risk Register document structure + grounding instructions
- `test_strategy_structure` — Test Strategy document structure + grounding instructions
- `test_plan_structure` — IEEE 829-aligned Test Plan structure + grounding instructions

Each `*_structure` prompt instructs the client to ground its generation in `retrieve_qa_knowledge` results with `[Source N]` citations, and to label the output as AI-generated.

## Privacy

Usage telemetry is **off by default**. Set `QAI_TELEMETRY=1` to opt in. Even then, only the tool name, a success flag, duration, retrieval `k`/`category`, package/Python version, OS family, and a random anonymous install ID are sent — never your query text, project details, or knowledge-base content.

## Source

[github.com/gvasile29/qai-consultant](https://github.com/gvasile29/qai-consultant) — Apache 2.0 licensed.
