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

@zahid15/mcpprobe

v0.3.0

Published

Safety-first scripted testing and fuzzing for MCP servers

Readme

mcpprobe

Scripted testing, fuzzing and benchmarking for Model Context Protocol servers, as a CLI and a TypeScript library.

mcpprobe finding a bug in an MCP server

Features

  • Checks the protocol, error handling, schemas, resources, prompts, logging, completions, progress and cancellation, plus Origin, auth and session handling over HTTP.
  • Calls tools with valid, invalid and hostile inputs from their schemas, and shrinks failing inputs.
  • Finds crashes, leaked stack traces or secrets, slow calls, and prompt injection hidden in tool descriptions.
  • Runs your own scenarios, catches breaking changes against a saved snapshot, and runs as a GitHub Action.
  • Only calls read-only tools unless you allow more. Reports as console, JSON, JUnit, Markdown or SARIF.

Installation

Requires Node.js 22.12 or later. The library is ESM only.

npm install -g @zahid15/mcpprobe   # CLI
npm install @zahid15/mcpprobe      # library

Quick Start

mcpprobe inspect --stdio "node ./server.js"                # list tools, resources and prompts
mcpprobe test --stdio "node ./server.js"                   # run all checks
mcpprobe fuzz --stdio "node ./server.js" --tool search     # random inputs for one tool
mcpprobe bench --http https://host/mcp --tool search       # latency and throughput
mcpprobe call search --stdio "node ./server.js" --args '{"query":"hello"}'
mcpprobe run scenarios.yaml --stdio "node ./server.js"     # your own expectations
mcpprobe snapshot baseline.json --stdio "node ./server.js" # save the inventory
mcpprobe diff baseline.json --stdio "node ./server.js"     # fail on breaking changes
scenarios:  # each step has one of call, read (resource URI) or prompt; without expect it must succeed
  - name: finds milk
    call: search_notes
    args: { query: milk }
    expect: { contains: "Buy milk", maxMs: 500 }  # also: notContains, matches, isError, structured, error, errorCode

Exit codes: 0 passed, 1 checks failed, 2 invalid command or config, 3 could not connect. Run mcpprobe <command> --help for all options. To call tools that are not read-only, use --allow-tool <name>, --allow-unsafe or --allow-destructive, plus --yes in CI.

import { resolveOptions, testServer, formatReport } from "@zahid15/mcpprobe";
const report = await testServer(resolveOptions({}, { stdio: "node ./server.js" }));
console.log(formatReport(report, "markdown"));
process.exitCode = report.exitCode;

API

| Function | Returns | |---|---| | resolveOptions(config?, flags?, env?) | Options built from a config object and flags such as stdio, http, headers, tool, seed, allowTool | | loadConfig(file?) | Promise<Config> from mcpprobe.config.{json,yaml,yml} in the working directory, or the given file | | inspect(options) | Promise<Report> with the server inventory in report.inventory | | testServer(options, strict?) | Promise<Report> from the full check suite | | fuzz(options, strict?) | Promise<Report> from fuzzing (options.runs per tool) | | bench(options, strict?) | Promise<Report> with latency stats in report.benchmarks | | callTool(options, name, args) | Promise<{ result?, report }> for a single tool call | | runScenarios(options, scenarios, strict?) | Promise<Report> from scenarios, loaded with loadScenarios(file) | | diff(options, baseline, strict?) | Promise<Report> comparing the server with a baseline from loadSnapshot(file) | | diffInventories(before, after) | Finding[] comparing two inventories without a server | | formatReport(report, format?, color?) | string in console, json, junit, markdown or sarif format |

A Report contains findings (each with status, id, explanation, fix and an optional reproduction), a summary count per status, and an exitCode. Types are exported: Report, Finding, Options, Config and more. Invalid options throw UsageError. Setting allowUnsafe or allowDestructive also requires yes: true.

GitHub Action

- uses: zahidhasann88/[email protected]  # needs Node.js 22.12+ and permissions: security-events: write
  with:
    args: --stdio "node server.js"      # command defaults to test; also run, diff, fuzz, bench

Findings appear in the job summary and the Security tab; set upload-sarif: false if code scanning is off. All inputs and outputs are in action.yml.

Configuration

The CLI reads mcpprobe.config.yaml (or .yml / .json) from the working directory. Flags override it, and ${NAME} reads an environment variable. All keys are in mcpprobe.config.example.yaml.

defaultTarget: local
targets:
  local:
    stdio: "node ./server.js"
  staging:
    http: https://host/mcp
    headers:
      Authorization: "Bearer ${TOKEN}"

License

MIT