{"_id":"@agent-tool-platform/testkit","_rev":"3-41e5566b81f7d207c5fe105dff4e6bf2","name":"@agent-tool-platform/testkit","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@agent-tool-platform/testkit","version":"0.1.0","keywords":["mcp","model-context-protocol","agent-tools","tool-server","conformance","testing"],"license":"MIT","_id":"@agent-tool-platform/testkit@0.1.0","maintainers":[{"name":"ashergarland","email":"asher.garland@gmail.com"}],"homepage":"https://github.com/ashergarland/agent-tool-platform/tree/main/packages/testkit#readme","bugs":{"url":"https://github.com/ashergarland/agent-tool-platform/issues"},"dist":{"shasum":"77697f65be4769e68c8ef135bf5ec0c3bd52af6a","tarball":"https://registry.npmjs.org/@agent-tool-platform/testkit/-/testkit-0.1.0.tgz","fileCount":33,"integrity":"sha512-Ij5G6BVJ+DBwXccRHg8IcShbjPKlMB2wHjHCl5sO2v1M00RV2cz3ly3EA9EwJV32CYJ1pOiz1YX19rhihRc1cw==","signatures":[{"sig":"MEQCHzD0C1CFpqq2vXtv6qwc8q27XaQbNUif7VKMtkiSNGMCIQCPu7XTxL5gDfYySm5eksAFkkdQ9e4KdUbDsqkuadaeWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68646},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mcp":{"types":"./dist/mcp.d.ts","import":"./dist/mcp.js"},"./auth":{"types":"./dist/auth.d.ts","import":"./dist/auth.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./openapi":{"types":"./dist/openapi.d.ts","import":"./dist/openapi.js"},"./process":{"types":"./dist/process.d.ts","import":"./dist/process.js"},"./routing":{"types":"./dist/routing.d.ts","import":"./dist/routing.js"},"./metadata":{"types":"./dist/metadata/index.d.ts","import":"./dist/metadata/index.js"},"./registry":{"types":"./dist/registry.d.ts","import":"./dist/registry.js"},"./lifecycle":{"types":"./dist/lifecycle.d.ts","import":"./dist/lifecycle.js"},"./package.json":"./package.json","./root-boundary":{"types":"./dist/root-boundary.d.ts","import":"./dist/root-boundary.js"},"./transport-parity":{"types":"./dist/transport-parity.d.ts","import":"./dist/transport-parity.js"}},"gitHead":"3486ad6b6711242e981ac4f3e3b80690183836ad","scripts":{"build":"tsc -p tsconfig.build.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\""},"_npmUser":{"name":"ashergarland","email":"asher.garland@gmail.com"},"repository":{"url":"git+https://github.com/ashergarland/agent-tool-platform.git","type":"git","directory":"packages/testkit"},"_npmVersion":"11.17.0","description":"Reusable conformance helpers that prove a capability satisfies the agent tool platform contracts.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"4.4.3","@modelcontextprotocol/sdk":"1.30.0","@agent-tool-platform/runtime":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.9.3","@types/node":"22.20.1"},"_npmOperationalInternal":{"tmp":"tmp/testkit_0.1.0_1787167340006_0.7787987935647853","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@agent-tool-platform/testkit","version":"0.1.1","keywords":["mcp","model-context-protocol","agent-tools","tool-server","conformance","testing"],"license":"MIT","_id":"@agent-tool-platform/testkit@0.1.1","maintainers":[{"name":"ashergarland","email":"asher.garland@gmail.com"}],"homepage":"https://github.com/ashergarland/agent-tool-platform/tree/main/packages/testkit#readme","bugs":{"url":"https://github.com/ashergarland/agent-tool-platform/issues"},"dist":{"shasum":"8021551f3088eb071d6a3f5d9cc03ad2e684cc1c","tarball":"https://registry.npmjs.org/@agent-tool-platform/testkit/-/testkit-0.1.1.tgz","fileCount":33,"integrity":"sha512-a5qDLhe4N38NplMB7X85kEepZvm/rYqlcupn9oPXes1MSn7LF3fOMCLgP5rh8Me5yUTtM08lrPkITu8Tgv+ghg==","signatures":[{"sig":"MEUCIB10alPjLtCHHdFUUGqccHthLtS1Rh/Sl7i2fUt3r3KGAiEAkH5Crd0y51oY+VsEHSUM4tUauA+uxk0qIKp212d6xvs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agent-tool-platform%2ftestkit@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":68420},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mcp":{"types":"./dist/mcp.d.ts","import":"./dist/mcp.js"},"./auth":{"types":"./dist/auth.d.ts","import":"./dist/auth.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./openapi":{"types":"./dist/openapi.d.ts","import":"./dist/openapi.js"},"./process":{"types":"./dist/process.d.ts","import":"./dist/process.js"},"./routing":{"types":"./dist/routing.d.ts","import":"./dist/routing.js"},"./metadata":{"types":"./dist/metadata/index.d.ts","import":"./dist/metadata/index.js"},"./registry":{"types":"./dist/registry.d.ts","import":"./dist/registry.js"},"./lifecycle":{"types":"./dist/lifecycle.d.ts","import":"./dist/lifecycle.js"},"./package.json":"./package.json","./root-boundary":{"types":"./dist/root-boundary.d.ts","import":"./dist/root-boundary.js"},"./transport-parity":{"types":"./dist/transport-parity.d.ts","import":"./dist/transport-parity.js"}},"gitHead":"2436222357367be900c603350a816cf297543e8e","scripts":{"build":"tsc -p tsconfig.build.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:762a8dfe-b0a4-47f7-aed5-45e3350fef1d"}},"repository":{"url":"git+https://github.com/ashergarland/agent-tool-platform.git","type":"git","directory":"packages/testkit"},"_npmVersion":"11.19.0","description":"Reusable conformance helpers that prove a capability satisfies the agent tool platform contracts.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"4.4.3","@modelcontextprotocol/sdk":"1.30.0","@agent-tool-platform/runtime":"0.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.9.3","@types/node":"22.20.1"},"_npmOperationalInternal":{"tmp":"tmp/testkit_0.1.1_1787330422577_0.7963833486088556","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@agent-tool-platform/testkit","version":"0.1.2","description":"Reusable conformance helpers that prove a capability satisfies the agent tool platform contracts.","license":"MIT","type":"module","engines":{"node":">=22.0.0"},"homepage":"https://github.com/ashergarland/agent-tool-platform/tree/main/packages/testkit#readme","repository":{"type":"git","url":"git+https://github.com/ashergarland/agent-tool-platform.git","directory":"packages/testkit"},"bugs":{"url":"https://github.com/ashergarland/agent-tool-platform/issues"},"keywords":["mcp","model-context-protocol","agent-tools","tool-server","conformance","testing"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./auth":{"types":"./dist/auth.d.ts","import":"./dist/auth.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./lifecycle":{"types":"./dist/lifecycle.d.ts","import":"./dist/lifecycle.js"},"./mcp":{"types":"./dist/mcp.d.ts","import":"./dist/mcp.js"},"./metadata":{"types":"./dist/metadata/index.d.ts","import":"./dist/metadata/index.js"},"./openapi":{"types":"./dist/openapi.d.ts","import":"./dist/openapi.js"},"./process":{"types":"./dist/process.d.ts","import":"./dist/process.js"},"./registry":{"types":"./dist/registry.d.ts","import":"./dist/registry.js"},"./root-boundary":{"types":"./dist/root-boundary.d.ts","import":"./dist/root-boundary.js"},"./routing":{"types":"./dist/routing.d.ts","import":"./dist/routing.js"},"./transport-parity":{"types":"./dist/transport-parity.d.ts","import":"./dist/transport-parity.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\""},"dependencies":{"@agent-tool-platform/runtime":"0.1.2","@modelcontextprotocol/sdk":"1.30.0","zod":"4.4.3"},"devDependencies":{"@types/node":"22.20.1","typescript":"5.9.3"},"gitHead":"85cc1a2c3573288902464e21cec5d84309e4568d","_id":"@agent-tool-platform/testkit@0.1.2","_nodeVersion":"24.19.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-knytq0r7Cm/xKYEmnWzp4lBVn0okhtd25bdTa7KVD807WZtuUU3yafH648agYK1CDE/Do0fd7RQSZu7bUNNMDA==","shasum":"212aff9e82ca5276958864aa92bddf204e9362e1","tarball":"https://registry.npmjs.org/@agent-tool-platform/testkit/-/testkit-0.1.2.tgz","fileCount":33,"unpackedSize":68420,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agent-tool-platform%2ftestkit@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBJGSUAlrp9gvmFzfGuPCtD81+mDnCEfWhMY5hG/NxcTAiEAyiq+zUZOkSqcPcVd+zIH9/erHBuDJlpLuUlUp2TsCPs="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:762a8dfe-b0a4-47f7-aed5-45e3350fef1d"}},"directories":{},"maintainers":[{"name":"ashergarland","email":"asher.garland@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/testkit_0.1.2_1787373949576_0.3819954552499527"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-19T19:22:19.795Z","modified":"2026-08-22T04:45:50.053Z","0.1.0":"2026-08-19T19:22:20.144Z","0.1.1":"2026-08-21T16:40:22.722Z","0.1.2":"2026-08-22T04:45:49.725Z"},"bugs":{"url":"https://github.com/ashergarland/agent-tool-platform/issues"},"license":"MIT","homepage":"https://github.com/ashergarland/agent-tool-platform/tree/main/packages/testkit#readme","keywords":["mcp","model-context-protocol","agent-tools","tool-server","conformance","testing"],"repository":{"type":"git","url":"git+https://github.com/ashergarland/agent-tool-platform.git","directory":"packages/testkit"},"description":"Reusable conformance helpers that prove a capability satisfies the agent tool platform contracts.","maintainers":[{"name":"ashergarland","email":"asher.garland@gmail.com"}],"readme":"# @agent-tool-platform/testkit\n\nReusable conformance suites that prove a capability satisfies the agent tool platform contracts.\n\nThese suites test **platform invariants only**. No suite asserts anything about ASTs, repositories,\nAzure resources, documents, or images — domain behaviour stays in the capability's own tests.\n\nVersion 0.1.0 is publicly available from the primary npm registry.\n\n```bash\nnpm install -D @agent-tool-platform/testkit\n```\n\nThe testkit depends on `@agent-tool-platform/runtime` at exactly the same version, so for v0 the two\nare installed as a matched pair.\n\n## Why it exists\n\nWithout it, every capability repository rewrites the same tests: does `/tools` require auth, does\nthe OpenAPI document match the registry, does MCP publish the same schemas as HTTP, does a weak API\nkey get refused. Rewritten tests drift, and a drifted test is worse than no test because it looks\nlike coverage.\n\n## Usage\n\nThe testkit imports no test runner, so each suite runs inside whichever `it(...)` you already use.\nA suite throws a `ConformanceError` naming every failed check, or returns a result you can inspect\nwith `{ throwOnFailure: false }`.\n\n```ts\nimport { describe, it } from 'vitest';\nimport {\n  runHttpConformance,\n  runOpenApiConformance,\n  runRegistryConformance,\n  runTransportParity,\n} from '@agent-tool-platform/testkit';\n\ndescribe('platform conformance', () => {\n  it('registry', async () => {\n    await runRegistryConformance({ registry: app.registry, services: app.services });\n  });\n\n  it('openapi', () => {\n    runOpenApiConformance({ document: app.openApiDocument(), registry: app.registry });\n  });\n\n  it('http', async () => {\n    await runHttpConformance({ app: app.http, registry: app.registry, apiKey });\n  });\n\n  it('transport parity', async () => {\n    await runTransportParity({\n      app: app.http,\n      createMcpServer: () => app.createStdioServer(),\n      apiKey,\n      samples: [{ name: 'my_read_tool', input: {} }],\n    });\n  });\n});\n```\n\n## Suites\n\n| Suite                        | Proves                                                                                                              |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------- |\n| `runRegistryConformance`     | Unique names, published schemas, input and output validation, no leakage of an invalid handler result.              |\n| `runRoutingConformance`      | Routing content quality, prerequisite and next-step references, state disclosure matching kind.                     |\n| `runOpenApiConformance`      | One operation per tool, schemas derived from the registry, consequentiality following kind, shared error responses. |\n| `runHttpConformance`         | Public and protected surfaces, request-id bounds and echo, cache headers, credential handling, normalized 404s.     |\n| `runMcpConformance`          | Instructions published, tool metadata verbatim from the registry, read and write invocation, in-band failures.      |\n| `runTransportParity`         | The same tool and input produce the same result over HTTP and MCP.                                                  |\n| `runAuthConformance`         | Credential strength enforcement, safe principal identity, production refusal of disabled auth.                      |\n| `runConfigConformance`       | Capability config composes with the platform, blank handling, strict booleans, cross-field validation.              |\n| `runLifecycleConformance`    | Start and stop hooks, readiness aggregation, draining behaviour, in-flight cancellation.                            |\n| `runRootBoundaryConformance` | In-root resolution, traversal denial, absolute and symlink escape denial, root addressability.                      |\n| `runProcessConformance`      | No shell, timeouts, cancellation, output bounds, secret-free child environment, queue overflow.                     |\n| `runMetadataConformance`     | Truthful metadata accepted, placeholders and version drift rejected.                                                |\n\n## Fixtures\n\n`generateTestApiKey`, `createTestPlatformConfig`, `createTestInvocationContext`, and\n`connectInMemoryMcpClient` are exported so a capability's own tests do not have to invent a weaker\nversion of each.\n","readmeFilename":"README.md"}