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

@shiftgraph/mcp

v0.1.2

Published

What public APIs were actually observed to return, as an MCP server. Answers from a public record instead of guessing, and refuses when it has none.

Downloads

431

Readme

@shiftgraph/mcp

What public APIs were actually observed to return, as an MCP server. It answers from a public record instead of guessing, and it refuses when it has none.

{
  "mcpServers": {
    "shiftgraph": { "command": "npx", "args": ["-y", "@shiftgraph/mcp"] }
  }
}

Zero dependencies. Nothing to install, no account, no key.

Why

An agent writing an integration has to know what an interface returns, and today it reads documentation that over-describes or it guesses.

Documentation over-describing is not sloppiness, it is structural. A specification lists the union of every response an endpoint could produce; your code receives exactly one, conditioned on your credentials, your plan, and the object you asked about. GitHub's own maintained OpenAPI description promises 105 fields on its repository endpoint. The live endpoint returns 84 for a user-owned repository and 86 for an organisation-owned one, at the same moment, with the same credentials.

A type generated from the specification marks nearly everything optional, which pushes the work back to the call site. A type generated from observation is narrow, and narrow is the entire value of a type.

What the tools do

lookup_contract takes a URL, host, or contract id and returns the observed TypeScript declaration, how many observations support it, over what period, and what the record cannot see.

list_contracts shows what the record covers, filterable by provider or category.

record_limits explains how the record is produced and what it structurally cannot know. Worth reading before relying on any answer.

What it refuses to do

Asked about an interface it has no record of, it says so and points at the tool that would observe one. It does not infer, approximate, or return the nearest thing it has.

That is the whole design. An agent handed a plausible shape cannot tell it from an observed one, and will proceed with the same confidence either way. A refusal it can act on is worth more than an answer it cannot check:

No observed record for "https://api.stripe.com/v1/charges".

This record covers 176 public, unauthenticated endpoints. It does not cover
authenticated interfaces, private services, or anything not on its list, and
it will not infer a shape it has not seen.

To observe this interface yourself right now:

    npx @shiftgraph/generate https://api.stripe.com/v1/charges

What it cannot tell you, stated plainly

It observes public, unauthenticated endpoints only. What an interface returns to you, on your plan, with your permissions, is not visible to any public record and never can be.

A profile describes what was observed, not what is specified, and is not a guarantee about future responses.

Optionality is earned: a field is marked optional only where the interface was watched omitting it. Below three observations, a genuinely conditional field may be typed as required, and the answer says so when that applies.

Where the answers come from

github.com/shiftgraph/observatory sweeps 180 public endpoints across 111 providers every six hours, profiles each response, and publishes the record openly. The record, the instrument that produces it, and every sweep are all public and checkable.

This client holds no generation logic at all. Everything it serves is pre-computed in that repository, because a client that generates is a client that can generate differently from the record, and then two answers to one question exist.

Related

npx @shiftgraph/generate <url> observes any public URL live and writes a typed file. Use it for interfaces the record does not cover.

Licence

MIT.