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

@hiddencontent/mcp

v0.4.14

Published

MCP server for the hidden-content service: an agent checks a document before it reads it.

Readme

@hiddencontent/mcp

An MCP server so an agent can check a document before it reads it.

Text hidden inside a document — white-on-white, zero-size fonts, text behind an image, off-page runs, comments, tracked deletions — is invisible to a person and read verbatim by a model. This server sits in front of that.

Design and the reasoning behind every decision: MCP.md.

Configure

Get a key (one command, returns a live token):

curl -fsS -X POST https://api.hiddencontent.ai/v1/signup

Then add the server. The JSON below works in Claude Desktop, Claude Code and Cursor unchanged:

{
  "mcpServers": {
    "hiddencontent": {
      "command": "npx",
      "args": ["-y", "@hiddencontent/mcp"],
      "env": {
        "HCS_API_TOKEN": "your-token",
        "HCS_CAPABILITIES": "tool-use"
      }
    }
  }
}

HCS_CAPABILITIES is worth setting. It is what turns on the checks for concealed text that instructs a model to send mail or call a tool (unauthorized-action, exfiltration). Declaring more can only raise severity, never lower it. Comma-separated: tool-use, network-egress, code-execution.

Tools

check_document

Give it one of path (best), url, or text.

Prefer a path or URL. Whole classes of concealment are properties of the file format and cannot be seen in extracted text, so a text submission is a deliberately weaker check and the response says so.

Returns a recommended action:

| action | meaning | |---|---| | proceed | nothing concealed worth reporting; read the document normally | | use_clean_text | concealed content was found and removed — read safe_text, not the file | | ask_human | a person should look before the agent goes further |

ask_human covers three cases, and the second is the one worth knowing about: concealed text shaped like an instruction to a model; concealed content that was deliberately retained in the text because removing it would have been data loss (so there is no safe version to hand over); and a degraded result, where the service did not answer and the check did not really happen.

get_evidence

Returns the concealed words from a previous check, so a person can judge them.

They are not in the default response. They come only from this explicit call, by which point the agent's routing decision is already made — an injection arriving then cannot change what it decided to do. The text is quoted inside a fence whose delimiter carries a token minted at analysis time, so a payload cannot close the block and escape into instruction position.

That last part is structural. The framing around it — declaring the block as data before and after, presenting spans as records — reduces compliance substantially but is not a proof.

What this package deliberately does not contain

No engine code, no rule pack, and no detection patterns. It calls /v1/analyze over HTTPS and its only dependency is the MCP SDK.

An earlier build used our client library, which carries an offline fallback, and that fallback dragged the rule pack — including the literal instruction-shape regexes — into the published bundle. Publishing a detection signature turns evasion from research into reading.

The consequence for you: with no connectivity you get "could not check this", not a partial local check. That is deliberate. If we are offline, we say so.

Build

npm run build  --workspace @hiddencontent/mcp   # tsc
npm run bundle --workspace @hiddencontent/mcp   # single-file bundle + dist/hiddencontent.mcpb
npx vitest run packages/mcp/test/

Against the live service:

HCS_CREDS=~/Desktop/hcs-credentials.txt npm run smoke:mcp

The unit tests prove the shaping logic against a fake client. They cannot prove the action an agent receives is right for a real document analysed by the deployed engine — every bug worth finding in this package was found that way, not by a fixture. smoke:mcp is that check, made repeatable.

bundle produces a self-contained dist/bundle.mjs (no node_modules required) and packs it into dist/hiddencontent.mcpb for one-click installation from Claude Desktop's Extensions tab. Verified 2026-08-28 by extracting the bundle into an empty directory and speaking MCP to it over stdio.