mcpField
K
k11 API Contract QA

k11 API Contract QA

本地服务
github.com其他0今天更新

关于 k11 API Contract QA

k11 API Contract QA 是面向跨服务 API 变更评估的 MCP 服务。它结合契约差异与消费者级证据,并支持 REST、GraphQL、gRPC、事件和 SOAP 的 CI 报告。

主要功能

  1. 01检测六种契约格式的破坏性变更
  2. 02将变更关联到消费者服务和字段
  3. 03检查已部署契约漂移及 REST 响应
  4. 04从源代码发现消费者用法
  5. 05生成 REST 契约测试和 CI 报告

适用场景

  1. 01合并拉取请求前评估 API 变更
  2. 02查明哪些消费者使用了变更字段
  3. 03将已部署 API 契约与规范文件比对
  4. 04为 CI 生成 REST 检查

MCP 相关

向 MCP 客户端提供契约分析、消费者发现、漂移与一致性检查以及测试生成工具。支持 Claude Code、Claude Desktop 和其他 MCP 客户端。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"k11-software-solutions-api-contract-qa": {
"command": "uvx",
"args": [
"k11-api-contract-qa-mcp"
],
"env": {
"QA_MCP_ROOT": "<QA_MCP_ROOT>"
}
}
}
}
启动命令uvx k11-api-contract-qa-mcp
需要配置的环境变量
QA_MCP_ROOTFolder of the service or repo with the spec (default: current directory)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypik11-api-contract-qa-mcp0.1.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

README 原文English

来自项目 README

README 暂无中文译文,以下为英文原文;中文介绍见上方。

k11 API Contract QA — MCP server & Claude Code plugin

Know which services an API change breaks before you merge it, and why. REST, GraphQL, gRPC, events and SOAP.

A pull request renames a field or tightens a request body. Its own tests pass. Three other services break in production. Spec-diff tools can tell you a change is "breaking", but not who it breaks, so teams either ignore the warnings or block every change. This MCP server answers the real question:

  • Breaking-change detection for OpenAPI 3.x, Swagger 2.0, GraphQL, gRPC/protobuf, AsyncAPI 2.x/3.x and SOAP/WSDL 1.1, including $refs, nested fields and array items, with the rule each change broke.
  • Consumer-aware impact. It knows which services call which endpoints, and which fields they read or send. A removed field only counts against the consumers that use it.
  • A verdict with evidence: breaking, breaking but no known consumer uses it, or compatible. When 2 or more consumers break, or a critical one does, it says a person should decide before merge.
  • Deployed-contract drift: compares what a running service publishes (GraphQL introspection, ?wsdl, /v3/api-docs) with your spec file.
  • Live conformance checks for REST: status codes, content type and the JSON body validated against the schema.
  • Consumer discovery that scans a consumer's source code (Python, Java, TypeScript, Go, …) for calls to your API, with file and line. For GraphQL it parses the consumer's actual queries, so it knows exactly which fields they read.
  • Contract test generation for pytest + httpx or Java REST Assured.
  • contract-ci: a pull-request comment that lists every affected consumer and the reason.

Deterministic rules, no LLM calls, the same result every run. Works with Claude Code (as a plugin with /check-api-change and /api-contract-tests), Claude Desktop and any MCP client. Listed in the official MCP Registry as io.github.K11-Software-Solutions/api-contract-qa.


See it in a pull request

In the demo, Order Service v2 changes total from a number to a string, drops customer.email, adds a required channel to POST /orders and removes DELETE /orders/{id}. Four services consume it. contract-ci posted:

API contract check: 🔴 Breaking for known consumers

Order Service: main → this PR. 11 changes, 6 breaking (worst: critical); 4 known consumers, 3 affected.

Needs a person before merge: 3 consumers break (threshold 2); high-criticality consumers break: notification-svc, billing-svc, checkout-web.

ConsumerOwnerCriticalityBreaking changeWhy it affects them
billing-svc@team-billingcriticalGET /orders/{id}: Response field 'total' changed type from number to stringreads 'total'
checkout-web@team-webhighPOST /orders: New required request field 'channel'doesn't send the now-required 'channel'
notification-svc@team-notifyhighGET /orders/{id}: Response field 'customer.email' was removedreads 'customer.email'

Breaking, no known consumer: DELETE /orders/{orderId} was removed, plus two response changes on POST /orders that checkout-web doesn't read.

analytics-svc calls GET /orders too, but it reads only id and status, so it isn't flagged.

Supported contracts

The format is detected automatically from the file. Every format goes through the same rules, consumer impact, report and contract-ci, plus rules specific to it.

FormatOperations are namedFormat-specific rulesDeployed drift check
OpenAPI 3.xGET /orders/{id}parameters, request bodies, success responses, authGET the published document
Swagger 2.0GET /api/orders/{id}converted to OpenAPI 3 on load (body/formData, definitions, basePath)GET the published document
GraphQL (SDL or introspection JSON)QUERY order, MUTATION createOrderremoving any argument breaks (unknown arguments are errors); non-null → nullable breaks readersintrospection query
gRPC / protobuf (.proto, imports followed)RPC shop.v1.OrderService/GetOrderfield number changed or reused, field renamed (wire-safe but breaks JSON and generated code), removed numbers not reserved, streaming changed, message replacednot yet (needs server reflection)
AsyncAPI 2.x / 3.xEMITS order.created, RECEIVES order.cancelemitted messages follow reader rules; received messages follow writer rulesGET the published document
SOAP / WSDL 1.1SOAP OrderPort/GetOrderXSD minOccurs/maxOccurs/nillable, enumerations, extension; SOAPAction and binding style; strict about unknown elementsGET ...?wsdl

Consumer discovery finds HTTP paths, GraphQL query documents (exact fields read), gRPC stub calls, SOAP client calls (zeep, JAX-WS, .NET) and AsyncAPI topic names. Live response checks and test generation are for REST (OpenAPI and Swagger).

Tools

ToolWhat it does
list_operationsLists a contract's operations and its detected format.
diff_contractsClassifies every change between two versions of a contract: rule, field path, before/after, severity.
assess_impactWhich consumers a change breaks and why; the verdict and whether a person should decide. Optionally writes the report.
discover_consumer_usageFinds a consumer's calls to your API in its source code and drafts its consumers.yaml entry.
check_deployed_contractCompares what a running service publishes with the spec: matches, drift or incompatible.
check_live_conformanceCalls a running REST endpoint and checks the response against the spec. Header values can use ${ENV:NAME}.
generate_api_testsREST contract tests (status + JSON schema) for pytest + httpx or REST Assured.
write_testWrites generated files under tests/ or src/test/ only, never overwriting unless asked.

Specs are files in the project or git refs: origin/main:openapi.yaml, origin/main:proto/orders.proto (imports are read from the same ref).

Tell it who your consumers are

.qa-mcp/consumers.yaml:

consumers:
  - name: billing-svc
    repo: acme/billing-svc
    owner: "@team-billing"
    criticality: critical          # critical | high | medium | low
    uses:
      - endpoint: GET /orders/{id}
        reads: [id, total, currency]   # leave out to mean "any field"
  - name: checkout-web
    owner: "@team-web"
    criticality: high
    uses:
      - endpoint: POST /orders
        sends: [customerId, items]
        reads: [id]

Endpoints use the operation names from the table above (QUERY order, RPC shop.v1.OrderService/GetOrder, EMITS order.created, …). Field lists are what make the verdict precise. Without them, any breaking change on an endpoint counts against everyone who calls it. Start with discover_consumer_usage on each consumer's code, then add the fields.

In CI

k11-api-contract-qa-mcp contract-ci --spec openapi.yaml --base origin/main

It compares the spec in the pull request with origin/main, writes contract-report.md (the PR comment) and contract-report.json, sets GitHub Actions outputs (verdict, breaking, consumers_affected, needs_human, report) and exits non-zero according to --fail-on:

--fail-onFails when
breaking (default)a known consumer breaks
needs-human2+ consumers or a critical/high one break
any-breakingany breaking change, used or not
neverreport only

Copy docs/contract-check.yml to .github/workflows/ to comment on every pull request that touches the spec.

Install

Requires Python 3.10+.

Claude Code: plugin (recommended)

Needs uv:

/plugin marketplace add K11-Software-Solutions/k11techlab-api-contract-qa-mcp
/plugin install api-contract-qa@k11-api-contract-qa
Claude Code: MCP server only
claude mcp add api-contract-qa -- uvx k11-api-contract-qa-mcp
Claude Desktop and other MCP clients
{
  "mcpServers": {
    "api-contract-qa": {
      "command": "uvx",
      "args": ["k11-api-contract-qa-mcp"],
      "env": { "QA_MCP_ROOT": "/path/to/your/service" }
    }
  }
}

Or pip install k11-api-contract-qa-mcp.

Try the demo

cd demo/order-service
k11-api-contract-qa-mcp contract-ci --spec openapi.yaml --base-spec openapi.v1.yaml
python server.py --port 8080    # v2 implementation with one deliberate contract bug

Then ask Claude to check_live_conformance on GET /orders/{id} with id 1001. It finds that total is still sent as a number.

demo/formats/ has a v1 and v2 contract for each other format (Swagger 2.0, GraphQL, protobuf with an import, AsyncAPI 2.x → 3.x, WSDL) and a small consumer for each, for example:

k11-api-contract-qa-mcp contract-ci --spec demo/formats/graphql/schema.graphql --base-spec demo/formats/graphql/schema.v1.graphql --fail-on never

Rules

These apply to every format (with each format's names for inputs and outputs):

RuleBreaking?
Endpoint removedyes (critical)
Response field removed, type changed, became nullable, no longer guaranteedyes
Success response or JSON media type removedyes
New required request field / parameter, field or parameter became requiredyes
Request enum value removed, request field newly restricted to an enumyes
New authentication requirementyes (critical)
Required request field removed (any removed input for GraphQL and SOAP)yes
New endpoint, optional field or parameter; response enum value addedno (enum additions flagged for exhaustive switches)
Path parameter renamed, endpoint deprecatedno
protobuf: field number changed, message replaced, streaming changedyes
protobuf: field renamed with the same numberyes (medium: wire-safe, breaks JSON and generated code)

The rules extend the K11 research on cross-repository contract testing and change impact analysis (IJECS, 2026), whose reference system is k11techlab-microservice-qa-system. This server adds $ref, nested and array-item rules, field-level consumer matching and five more contract formats.

Attribution and licensing. k11 API Contract QA is a new, independent implementation. It reuses the design of the reference system (its breaking-change taxonomy, severity levels and the rule that two or more broken consumers need a person's decision), not its code, and it has no dependency on that repository. The reference system is Apache-2.0 licensed; this project is MIT licensed. Both are by Kavita Jadhav / K11 Software Solutions LLC.

How it compares

Spec diff tools (e.g. oasdiff)Consumer-driven contracts (e.g. Pact)k11 API Contract QA
Knows who breaksNoYesYes, field-level
Setup per consumerNoneContract tests in every consumerOne YAML entry; discovery drafts it
Explains whyRule onlyFailing interactionRule, field, and what the consumer reads or sends
FormatsUsually oneHTTP and messagesOpenAPI, Swagger, GraphQL, gRPC, AsyncAPI, SOAP
Usable by an AI agentNoNoYes, over MCP

Safety

  • Specs, consumer folders and reports must be inside the project folder; git refs are read with git show, never a shell.
  • write_test writes only under tests/ or src/test/, and won't overwrite without asking.
  • Tokens for live checks are read from the environment (${ENV:NAME}) and never echoed.

Development

python -m venv .venv && .venv/Scripts/pip install -e ".[dev]"   # bin/pip on macOS/Linux
pytest   # rules for all formats, consumer impact, discovery, drift, conformance, generated tests, contract-ci, MCP (38)

Roadmap

  • Transitive impact (a consumer that re-exposes the data to its own consumers)
  • Live gRPC checks through server reflection; WSDL 2.0; GraphQL federation
  • Optional LLM review for "uncertain" cases, as in the research system

Built by K11 Software Solutions. Part of the K11 Tech Lab agentic QA series, alongside Playwright QA, Selenium QA and LLM Assure. MIT licensed.

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。