{"_id":"mcp-contract-tester","name":"mcp-contract-tester","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"mcp-contract-tester","version":"0.1.0","description":"Black-box contract testing, fuzzing, and reporting for MCP servers.","type":"module","exports":{".":"./src/index.js"},"scripts":{"test":"node --test"},"keywords":["mcp","model-context-protocol","testing","contract-testing","agents"],"license":"MIT","engines":{"node":">=18"},"_id":"mcp-contract-tester@0.1.0","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-aIxfMaS8PRT+M9OQGht/jFPgNeQiQBpL6FFKXATdBDG56H9izjgrIcpbRC1oKMoaWBV06r0K+iqZQQvpxzF63Q==","shasum":"8a9dab1d1459d873a829173197fceeaea7df2b7d","tarball":"https://registry.npmjs.org/mcp-contract-tester/-/mcp-contract-tester-0.1.0.tgz","fileCount":4,"unpackedSize":11491,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCnIIfHdl3nRP9bocYQcobarreWGwLArz26FjLXIovf8AIhAIU9SkTa0ueP6W4uMLRwaX1Ath/Do9ukQGIAReUOeSxR"}]},"_npmUser":{"name":"ryanmccollum1","email":"eldiablo27033@gmail.com"},"directories":{},"maintainers":[{"name":"ryanmccollum1","email":"eldiablo27033@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-contract-tester_0.1.0_1775066578863_0.2515586763202313"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-01T18:02:58.862Z","0.1.0":"2026-04-01T18:02:59.000Z","modified":"2026-04-01T18:02:59.191Z"},"maintainers":[{"name":"ryanmccollum1","email":"eldiablo27033@gmail.com"}],"description":"Black-box contract testing, fuzzing, and reporting for MCP servers.","keywords":["mcp","model-context-protocol","testing","contract-testing","agents"],"license":"MIT","readme":"# mcp-contract-tester\n\n`mcp-contract-tester` is a black-box contract test harness for MCP servers. It validates advertised tools, probes invalid inputs, records error-shape stability, and emits deterministic reports.\n\n## Features\n\n- Validates duplicate names, missing schemas, and malformed metadata\n- Runs happy-path assertions against expected output fragments\n- Fuzzes tool inputs by deleting required keys, widening primitive types, and injecting junk fields\n- Produces JSON and Markdown summaries for CI or human review\n\n## Usage\n\n```js\nimport { runContractSuite, createMarkdownReport } from \"mcp-contract-tester\";\n\nconst adapter = {\n  async listTools() {\n    return [\n      {\n        name: \"sum\",\n        title: \"Sum\",\n        description: \"Add two numbers\",\n        inputSchema: {\n          type: \"object\",\n          required: [\"a\", \"b\"],\n          properties: {\n            a: { type: \"number\" },\n            b: { type: \"number\" }\n          }\n        }\n      }\n    ];\n  },\n  async callTool(name, args) {\n    if (name !== \"sum\") {\n      throw new Error(\"unknown tool\");\n    }\n    if (typeof args.a !== \"number\" || typeof args.b !== \"number\") {\n      throw new Error(\"invalid args\");\n    }\n    return { content: [{ type: \"text\", text: String(args.a + args.b) }] };\n  }\n};\n\nconst suite = await runContractSuite(adapter, {\n  tools: {\n    sum: {\n      sampleArgs: { a: 2, b: 3 },\n      expectContentTextIncludes: [\"5\"]\n    }\n  }\n});\n\nconsole.log(createMarkdownReport(suite));\n```\n","readmeFilename":"README.md","_rev":"1-00306b213ff34c25442cf57a2200f773"}