Kenwea Notary
Server Details
Signed, traced record of what an npm package or file attempts when run, network included. No key.
- Status
- Healthy
- Uptime
- 100.0% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- kenwea-protocol/kenwea
- GitHub Stars
- 1
- Server Listing
- Kenwea Public MCP Server
TDQS
Scored across 4 tools
The four tools target clearly different operations: sandbox a single artifact (check), answer a whole dependency tree from stored records (check_tree), fetch the signing key (get_public_key), and validate a record (verify). The only mild overlap is between get_public_key and verify, since the key tool exists mainly as a manual-verification helper, but the descriptions explicitly cross-reference 'Not for' cases that resolve most confusion.
All tools share the kenwea_notary_ prefix and use snake_case throughout, which is highly predictable. The minor deviation is that check/verify are verb-only while check_tree and get_public_key add a noun, but the pattern is still readable and consistent in style.
Four tools is well-scoped for a notary service: run a check, batch-check a tree, fetch a key, verify a record. Each earns its place, though get_public_key is a thin helper that could in principle be folded into verify's output, making the set marginally leaner than ideal.
The core lifecycle is covered: produce signed records (check), aggregate them across a dependency tree (check_tree), distribute the key (get_public_key), and verify signature plus transparency-log inclusion (verify). Minor gaps remain, such as no standalone transparency-log query or batch-record-verify operation beyond what verify offers per artifact.
Available Tools
4 toolskenwea_notary_checkNotarize what an artifact doesARead-onlyInspect
Notarize what a file or npm package does at the moment Kenwea fetches it, and get a signed record anyone can check. Input: exactly one of artifactRef, a public https URL of a single file, npm tarball or Python wheel, or package, an npm package name such as express@4.18.2 (resolved to the exact tarball npm install would download; no version means latest), or a Python one as pypi:requests@2.31.0 (resolved on PyPI to the wheel this sandbox can import: pure Python, or musllinux for CPython 3.12), or an OpenClaw plugin on ClawHub as clawhub:name@version (the release ClawHub serves, refused unless it has the SHA-256 ClawHub publishes; no install step runs, as OpenClaw installs with --ignore-scripts, and the plugin is loaded as OpenClaw loads it, its openclaw.extensions entries imported and register() called with a stand-in OpenClaw API, decoy OpenClaw keys in its config and in ~/.openclaw). Behavior: Kenwea downloads the bytes (up to 32 MiB) and runs executable content in isolation: no route out (a stand-in network inside the sandbox answers lookups and connections on ports 80, 443, 8080 and 8443 and records them), all capabilities dropped, read-only filesystem, not as root, 15 seconds for a file and 55 for a package. For a package it runs the install steps npm would run (preinstall, install, postinstall, and the node-gyp step npm adds for a binding.gyp) with decoy credentials where a developer machine or CI runner keeps real ones (an npm token in ~/.npmrc and NPM_TOKEN, a GitHub token, AWS keys, an SSH key, CI variables), each traced for the network connections, DNS lookups and programs it attempts, the credential files it opens and any decoy it puts into what it sends or starts; a single file and a Python package run with the same decoys (plus a PyPI token for Python) and are traced the same way; a PyPI wheel (package pypi:name) is imported with its dependencies installed, resolved as pip would for CPython 3.12 on Linux x86_64 and each checked against PyPI's sha256. After its install a registry npm package is also loaded once, as an application would require or import it, and onLoad says what loading it did; a load that reaches the network or a credential is its own finding (load_tried_network, load_read_credentials, load_sent_credentials). For a registry package that runs something at install, the dependency tree npm would install goes in first, each tarball checked against the registry's integrity hash, and every install step in the tree runs, the dependencies' first; a package that declares none is checked when a dependency does (dependencies.installSteps names them). Returns: level, one word for what the record means (nothing_runs, quiet, network, reads_credentials, sends_credentials, unfinished), and summary, one sentence; installSteps (what runs at install; empty means nothing does) and observed (what the steps attempted, with credentialsRead and credentialsSent when a decoy was touched, and requests: what a step sent to the stand-in network, plain HTTP in full and TLS by server name and size, never decrypted); for an npm package, sincePrevious, which install steps were added, removed or changed since the previous published version (from the registry, not signed); a verdict and a reasonCode, the sha256 of what was read, and signedAttestation, an Ed25519 signature over the facts. quiet (verdict approved) means everything that ran finished, was traced whole and touched nothing watched; a step that tried the network, read a credential file, failed or could not be observed is manual_review with the reason; rejected is for a step that tried to send a decoy credential, and for files carrying a provider-formatted credential. A URL that cannot be fetched returns checked false with the reason instead of a verdict; a limit of our runner comes back as manual_review stated as ours. Limits: no key or signup; 20 checks per hour per network address (an IPv6 /64 counts as one address) within a shared hourly ceiling, refused with rate_limited and the reset time. A Kenwea API key sent as a Bearer token uses that key's own quota. At most four checks run at once; one that gets no slot within 10 seconds comes back manual_review with reasonCode runner_busy and nothing run, so retry. The same bytes at the same address under the same checker version get the record issued the first time, marked cached, and nothing is run again. Keeps no copy of the artifact; a finished record is held in memory for up to 24 hours to answer repeats, and a rate counter and a log line keep a short hash of your address. Not for: checking a record you already have (use kenwea_notary_verify, which runs nothing and does not spend your quota).
| Name | Required | Description | Default |
|---|---|---|---|
| package | No | npm package name with an optional version or dist-tag, for example express, express@4.18.2 or @types/node@20.0.0; or a PyPI project as pypi:name or pypi:name@version, for example pypi:requests@2.31.0; or an OpenClaw code plugin on ClawHub as clawhub:name or clawhub:name@version. Omit when using artifactRef. | |
| artifactRef | No | Public https URL of the artifact: a single .js, .mjs, .cjs or .py file, a shebang script, an npm tarball (.tgz) or a Python wheel or zip. Omit when using package. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds what annotations provide (readOnly/openWorld/idempotent=false): it discloses the sandbox profile (no route out, all capabilities dropped, read-only FS, non-root, 15s/55s limits), the 32 MiB cap, decoy credentials planted, what each verdict/reasonCode means, caching behavior, in-memory retention, and address hashing. No annotation is contradicted — running code in a sealed sandbox is consistent with readOnlyHint=true and destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded (purpose in sentence one) and uses scannable labels (Input, Behavior, Returns, Limits, Not for). However, it is roughly 700 words of dense prose for a two-parameter tool, with detail (TLS recorded by server name and size, PyPI sha256 checks) that an agent selecting or calling the tool does not need. Structure is good, density is excessive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates fully: it enumerates the return fields (level, summary, installSteps, observed, sincePrevious, verdict, reasonCode, sha256, signedAttestation) and defines each verdict word and reasonCode. For a complex, high-stakes analysis tool, an agent has everything needed to invoke it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value the schema does not: version resolution rules (no version means latest, PyPI resolved to a musllinux wheel for CPython 3.12, ClawHub releases gated on a published SHA-256), and the one-of constraint between the two parameters. It stops short of 5 only because much of the input detail is restated from the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource (notarize what a file or npm package does at fetch time) and names the exact output artifact (a signed record anyone can check). It also explicitly differentiates from a sibling: 'Not for: checking a record you already have (use kenwea_notary_verify...)'. An agent can distinguish this from verify without opening either schema, even though kenwea_notary_check_tree is left unaddressed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit mutual exclusivity ('exactly one of artifactRef... or package'), an explicit when-not with the alternative named (kenwea_notary_verify), and operational guidance (retry on runner_busy, rate_limited with reset time). It stops short of 5 because the sibling kenwea_notary_check_tree, clearly the nearest alternative for tree-shaped artifacts, is never mentioned or contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kenwea_notary_check_treeCheck a whole dependency treeARead-onlyIdempotentInspect
Answer for every package in a project's npm dependency tree at once, from records the notary already holds. Input: lockfile, the text of a package-lock.json (lockfileVersion 2 or 3, or its JSON), a pnpm-lock.yaml (v5, v6, v9) or a yarn.lock (v1 or berry); or packages, a list of {name, version, hasInstallScript}. Behavior: the lockfile says which packages run something at install (hasInstallScript, or requiresBuild in pnpm up to v6), and where it does not (pnpm v9, yarn) the registry is asked for each version (usually a few percent run something); the rest run nothing of their own and are only counted. Each package that runs something is answered from its stored signed record, made by kenwea_notary_check's sandbox run with decoy credentials; one that has none yet is queued and checked in the background, about two a minute, so ask again later with the same tree to collect it. Nothing runs during the call and it does not spend the per-address check quota (60 tree calls an hour per address). Returns: summary, counts (total, runNothing, runSomething, answered, queued), findings (packages whose level is network, reads_credentials or sends_credentials), and packages, each with status (answered, queued, not_queued) and, when answered, level, summary, verdict, reasonCode, observed and signedAttestation. Verify each record with kenwea_notary_verify or your own Ed25519 code; the tree summary itself is not signed. Not for: one package you want checked now (use kenwea_notary_check). A lockfileVersion 1 file has no hasInstallScript flags and is refused with a reason.
| Name | Required | Description | Default |
|---|---|---|---|
| lockfile | No | The contents of a package-lock.json (lockfileVersion 2 or 3, as text or as the JSON object), a pnpm-lock.yaml or a yarn.lock, as text. | |
| packages | No | Alternatively, the installed packages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly/idempotent/non-destructive/openWorld, and the description adds substantial context beyond them: nothing executes during the call, it does not consume the per-address check quota, throttling of ~2 background checks/minute, the 60 tree calls/hour limit, and the requirement to verify each record separately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well-structured with explicit Input/Behavior/Returns/Not-for sections, and the need-to-know constraints (no execution, no quota spend) are front-loaded. It is long relative to most definitions, though nearly every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description enumerates return fields (summary, counts, findings, packages with status/level/verdict/observed/signedAttestation), so an agent knows the response shape, plus limits and verification steps. Nothing needed to invoke or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters, but the description adds meaning beyond it — accepted lockfile formats and versions, the alternative `packages` shape, and how hasInstallScript (or pnpm requiresBuild) drives whether a package is answered or merely counted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and domain (answer for every package in an npm dependency tree from notary records) and explicitly contrasts with the sibling kenwea_notary_check ("Not for: one package you want checked now"). An agent can select it against alternatives without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (whole tree at once), when-not (single package, use kenwea_notary_check), and a concrete failure condition (lockfileVersion 1 is refused). It also tells the agent to re-ask later with the same tree to collect queued results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kenwea_notary_get_public_keyGet the notary's public keyARead-onlyIdempotentInspect
Return Kenwea's published Ed25519 notary key, so a signed record can be verified with your own code instead of kenwea_notary_verify. Input: none. Behavior: reads Kenwea's published key list (https://www.kenwea.com/.well-known/kenwea-attestation-keys.json) and caches it for an hour. Runs nothing, read-only, never counts against the check quota. Fails with key_unavailable if the list cannot be fetched. Returns: the active key's keyId, algorithm ed25519, the key as base64 (32 raw bytes) and as PEM, keyUrl and keysUrl, and keys, every published key with its status (active, retired or revoked). To verify, check signedAttestation.signature (base64) over the exact bytes of signedAttestation.payload with the key whose keyId the payload names, and treat a revoked key as no signature. Not for: checking an artifact (use kenwea_notary_check) or having the check done for you (use kenwea_notary_verify).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, openWorldHint=false, idempotentHint, destructiveHint=false), but the description adds real operational context: it fetches a specific well-known URL, caches for an hour, runs nothing, never counts against the check quota, and fails with the named error key_unavailable. That is exactly the beyond-annotations detail the bar asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then cleanly sectioned into Input / Behavior / Returns / Not for. It is dense but every clause carries non-redundant information — caching, quota, error name, verification recipe — with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the burden and does: it enumerates the returned fields (keyId, algorithm, base64, PEM, keyUrl, keysUrl, keys with status) and even explains how to use them to verify a signature. For a zero-param read-only tool with annotations covering safety, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, which sets the baseline at 4. The description states 'Input: none,' which correctly sets expectations that no arguments are needed, but there is nothing further to disambiguate since no parameters exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Return Kenwea's published Ed25519 notary key' — and immediately distinguishes it from siblings with 'Not for: checking an artifact (use kenwea_notary_check) or having the check done for you (use kenwea_notary_verify).' An agent can select this over its three siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('so a signed record can be verified with your own code instead of kenwea_notary_verify') and explicit exclusions naming the two competing siblings with the alternative action each performs. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kenwea_notary_verifyVerify a signed Kenwea recordARead-onlyIdempotentInspect
Check a signed record produced by kenwea_notary_check: whether its signature is valid under Kenwea's published Ed25519 key, what it attests, and whether it is in Kenwea's public transparency log (log.included, proven with an inclusion proof against a checkpoint signed by the same key), so it was shown to everyone and not only to you. Input: payload and signature exactly as they appear in the record's signedAttestation. payload is a JSON string and must be passed byte for byte; re-serialising it (reordering keys, changing spacing) breaks the signature. signature is standard base64 with padding. Optionally contentSha256, the hex sha256 of bytes you hold, compared without regard to letter case. Behavior: runs nothing and makes no request except fetching Kenwea's published key list (https://www.kenwea.com/.well-known/kenwea-attestation-keys.json), which it caches for an hour and reads again when a record names a key it does not hold. A record names its key inside the signed payload (format 2) and is checked against that key; an older record is tried against every published key. A record signed with a key Kenwea has revoked returns valid false and says so. Read-only and idempotent; it never counts against the check quota. Returns: valid, the keyId and its status, and the signed facts (verdict, reasonCode, installSteps, observed, contentSha256, issuedAt and the rest); with contentSha256, also matchesContentSha256. An altered or re-serialised record returns valid false with the reason, not an error. If the key list cannot be fetched the call fails with key_unavailable and says why. Not for: learning what an artifact does (use kenwea_notary_check). To verify without this tool, take the key from kenwea_notary_get_public_key and use any Ed25519 library.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | signedAttestation.payload from a check result, byte for byte. | |
| signature | Yes | signedAttestation.signature, base64. | |
| contentSha256 | No | Optional sha256 (hex) of the bytes you hold; the answer then says whether the record is about them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, the description adds substantial non-redundant behaviour: a single outbound fetch to a named URL cached for one hour, quota semantics (never counts against the check quota), revoked-key handling returning valid=false, malformed input returning valid=false with a reason rather than an error, and the key_unavailable failure mode. This is exactly the kind of operational detail annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The prose is organised into labelled Input / Behavior / Returns / Not for blocks with the purpose front-loaded, so an agent can scan to the section it needs. It is long, and a few phrases (e.g. 'so it was shown to everyone and not only to you') could be trimmed, but the density is justified by the tool's complexity rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-trivial verification tool with no output schema, the description fully covers inputs, network/auth behaviour, the returned fields (valid, keyId, status, signed facts, matchesContentSha256) and the error cases. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description materially exceeds it: it warns that payload must be passed byte for byte and that re-serialising (key reordering, spacing) breaks the signature, specifies signature is standard base64 with padding, and states contentSha256 is compared case-insensitively. These are invocation-critical constraints absent from the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource (verify a signed record produced by kenwea_notary_check) and enumerates the three things it determines: signature validity, attestation content, and transparency-log inclusion. It explicitly distinguishes itself from siblings via the 'Not for' clause naming kenwea_notary_check for artifact behaviour and kenwea_notary_get_public_key for manual verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit precondition (a record produced by kenwea_notary_check), an explicit exclusion ('Not for: learning what an artifact does'), and a named alternative workflow with concrete steps for verifying without the tool. When-to-use and when-not-to-use are both covered with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
kenwea_notary_check1 field changed- changed
Input schema / properties / package / descriptionPrevious value: -"npm package name with an optional version or dist-tag, for example express, express@4.18.2 or @types/node@20.0.0; or a PyPI project as pypi:name or pypi:name@version, for example pypi:requests@2.31.0. Omit when using artifactRef."New value: +"npm package name with an optional version or dist-tag, for example express, express@4.18.2 or @types/node@20.0.0; or a PyPI project as pypi:name or pypi:name@version, for example pypi:requests@2.31.0; or an OpenClaw code plugin on ClawHub as clawhub:name or clawhub:name@version. Omit when using artifactRef."
1 tool update
- Changed
kenwea_notary_check1 field changed- changed
Input schema / properties / package / descriptionPrevious value: -"npm package name with an optional version or dist-tag, for example express, express@4.18.2 or @types/node@20.0.0. Omit when using artifactRef."New value: +"npm package name with an optional version or dist-tag, for example express, express@4.18.2 or @types/node@20.0.0; or a PyPI project as pypi:name or pypi:name@version, for example pypi:requests@2.31.0. Omit when using artifactRef."
1 tool update
- Changed
kenwea_notary_check_tree1 field changed- changed
Input schema / properties / lockfile / descriptionPrevious value: -"The contents of package-lock.json (lockfileVersion 2 or 3), as text or as the JSON object."New value: +"The contents of a package-lock.json (lockfileVersion 2 or 3, as text or as the JSON object), a pnpm-lock.yaml or a yarn.lock, as text."
1 tool update
- Added
kenwea_notary_check_tree
6 tool updates
- Added
kenwea_notary_check - Added
kenwea_notary_get_public_key - Added
kenwea_notary_verify - Removed
kenwea.notary.check - Removed
kenwea.notary.getPublicKey - Removed
kenwea.notary.verify
1 tool update
- Added
kenwea.notary.getPublicKey
2 tool updates
- First observed
kenwea.notary.check - First observed
kenwea.notary.verify
Publisher details
- Operator
- Kenwea Protocol · Publisher source
- Operator website
- https://www.kenwea.com
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://www.kenwea.com/verify#use-it-in-your-tools
- Trust center
- Not available
- Restrictions
- None to connect: no key, signup, payment or OAuth. Rate limit: 20 checks per hour per network address within a shared hourly ceiling; a Kenwea API key sent as a Bearer token uses its own quota. · Publisher source
Related MCP Connectors
Signed sandbox verdicts on any artifact, plus an agent marketplace. No key, no signup, no payment.
Signed security scores for what an AI agent runs and reads: skills, MCP servers, prompts, tokens.
Use before citing a page, sharing links or installing a suggested package. Signed receipts.
Post-quantum, tamper-evident receipts for agent actions. Ed25519 + ML-DSA-65, offline verify.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceDeterministic supply-chain provenance, SBOM/AI-BOM generation, and dependency risk analysis for npm and PyPI packages, with 14 security rules and verifiable reports.1MIT- AlicenseNot gradedqualityCmaintenanceCaptures AI agent runs and turns them into tamper-evident execution records showing tool use, timing, failures, recoveries, and human interventions. Records can be inspected, exported, and verified offline.MIT
- AlicenseAqualityAmaintenanceSigned receipts for agent actions and a read-only-allowlist decision gate, as an MCP server. Ed25519, plus ML-DSA-65 when the post-quantum backend is available. gate_decision returns ALLOW, DENY or ESCALATE from action names and does not observe or block anything. verify_receipt takes expected_kid to pin which key signed. Seven tools.7Apache 2.0
- AlicenseAqualityDmaintenanceEnables local npm supply-chain inspection through tools for repository scanning, SBOM generation, dependency audit, and evidence reporting. Uses deterministic mock data and does not query live APIs.4MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.