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

openapi-mcpify

v0.0.0

Published

Turn any OpenAPI spec into a live MCP server — with built-in confirmation prompts for mutating operations.

Readme

openapi-mcpify

Turn any OpenAPI spec into a live MCP server — with built-in confirmation prompts for mutating operations.

What it does

openapi-mcpify reads an OpenAPI 3.x spec, generates one MCP tool per route, and exposes them over stdio. When an AI agent tries to call a POST, PUT, or DELETE route, it triggers a MCP elicitation dialog asking the user to confirm before the HTTP request is actually sent.

OpenAPI spec  →  MCP tools  →  AI agent calls  →  (confirm if mutating)  →  HTTP request

Usage (user)

With bunx

bunx openapi-mcpify --spec ./openapi.json --url https://api.example.com

Parameters

| Parameter | Required | Description | |---|---|---| | --spec | yes | Path or URL to the OpenAPI 3.x spec (JSON or YAML) | | --url | yes | Base URL of the target API | | --default-args | no | JSON string injected into every tool call (useful for auth headers) | | --disable-methods | no | Comma-separated HTTP methods to exclude (e.g. post,delete) |

Examples

# Basic usage
dist/index.js --spec ./petstore.json --url https://petstore.example.com

# With an auth header injected by default
dist/index.js \
  --spec ./petstore.json \
  --url https://petstore.example.com \
  --default-args '{"headers": {"Authorization": "Bearer mytoken"}}'

# Read-only mode: disable all mutating methods
dist/index.js \
  --spec ./petstore.json \
  --url https://petstore.example.com \
  --disable-methods post,put,delete,patch

Claude Desktop / MCP client config

Add this to your MCP client configuration (e.g. claude_desktop_config.json):

{
  "mcpServers": {
    "petstore": {
      "command": "dist/index.js",
      "args": [
        "--spec", "/path/to/openapi.json",
        "--url", "https://api.example.com",
        "--default-args", "{\"headers\":{\"Authorization\":\"Bearer mytoken\"}}"
      ]
    }
  }
}

Development

Prerequisites

Install

bun install

Build

bun run build

The compiled output lands in dist/.

Project structure

src/
  index.ts   — entry point, wires CLI args → OpenAPI → MCP server
  cli.ts     — argument parser
  swager.ts  — OpenAPI spec loader & route extractor
  tool.ts    — OpenAPI route → MCP tool + HTTP call + elicitation logic

How tools are generated

Each route in the spec becomes one MCP tool named {METHOD}_{path} (e.g. GET_pets__id_). Its input schema is built from:

  • path parameters → required fields
  • query parameters → optional or required per spec
  • request body (application/json) → body field
  • headers → always optional, merged with --default-args headers

Elicitation (confirmation dialog)

For POST, PUT, and DELETE routes, the server calls server.elicitInput() before executing the HTTP request. The client (e.g. Claude Desktop) displays a confirmation form showing the method, path, and parameters. The request is only sent if the user confirms.


License

MIT