npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@mcpolyglot/security

v0.2.1

Published

Non-bypassable security middleware for mcpolyglot: scopes, redaction, audit, rate-limit, and untrusted-data wrapping.

Readme

@mcpolyglot/security

The non-bypassable security middleware for mcpolyglot. Implements every phase of the pipeline that wraps tool calls in @mcpolyglot/core.

What's in here

  • checkScopes — refuses tools whose required scopes aren't in the granted set.
  • RateLimiter — token bucket per session per tool, plus a max-concurrent gate.
  • Redactor — built-in regex set (emails, JWTs, AWS access keys, GitHub tokens, SSNs, credit-card numbers) plus per-table column deny lists.
  • AuditLogger: append-only JSONL audit sink. See Audit log.

Audit log

Every tool call writes one entry, including calls that were denied or failed:

{
  "ts": "…",
  "sessionId": "…",
  "agentId": "claude-code",
  "tool": "pg.main.query",
  "decision": "deny",
  "reason": "Table \"secrets\" is not accessible under this policy.",
  "argsHash": "3f9c…",
  "scopes": ["…"],
  "durationMs": 4,
  "rows": 0,
  "error": { "code": "forbidden.policy", "message": "…" }
}
  • agentId is the x-mcpolyglot-agent request header (HTTP), else the MCP client's clientInfo.name.
  • decision: allow, deny (policy, scope, rate limit or timeout), or error (anything else).
  • Sinks:
    • console, on by default: stdout, or stderr under stdio (where stdout is the protocol).
    • audit.path: an append-only file.
    • audit.webhookUrl: a best-effort POST. Failures go to stderr, never fail the call, and never echo the URL.
  • Never logged: raw args (only a 16-char sha256 prefix) and result rows. reason and error text are scrubbed of scheme://user:pass@ credentials and the built-in redaction patterns (email, JWT, keys, …), then truncated to 500 chars.
  • Limits:
    • "Append-only" means the process only opens the file with O_APPEND. Tamper-evidence (hash chains, WORM storage) is out of scope; ship to a webhook or your log pipeline for that.
    • Webhook posts still in flight when the process is killed are lost.
audit: { console: true, path: '~/.mcpolyglot/audit.log', webhookUrl: '${env:AUDIT_WEBHOOK}' }

Tests: src/__tests__/audit.test.ts (sinks, scrubbing) and packages/core/src/__tests__/audit.test.ts (decision, agent id, no raw args or rows).

  • wrapUntrusted / enforceSize — <mcpolyglot-data> prompt-injection wrapper and a hard byte cap on serialized output.
  • defaultSecurityHooks(opts) — composes all of the above into the SecurityHooks shape McpolyglotServer expects.

Why a separate package

Connectors, the CLI, and any embedding host all need to construct the security hooks the same way. Keeping them in one package makes that boring and reviewable.

Docs

  • Architecture → https://github.com/ishay60/mcpolyglot/blob/develop/ARCHITECTURE.md
  • Pipeline overview → see "The security pipeline" section in ARCHITECTURE.md

MIT licensed.