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

siret-mcp

v0.1.1

Published

MCP server for French company registry data (SIRENE), with codes resolved to plain French

Readme

siret-mcp

MCP server for French company registry data. Ask about any French company by name, SIREN or SIRET and get back clean JSON — with every registry code already translated into plain French.

The official registry hands you "nature_juridique": "5710", "activite_principale": "62.01Z", "tranche_effectif_salarie": "12". An LLM handed that either guesses or hallucinates. This server hands it "Société par actions simplifiée (SAS)", "Programmation informatique", "20 à 49 salariés" — with the original code alongside so the answer stays checkable.

No API key. No account.

Install

Claude Code

claude mcp add siret -- npx -y siret-mcp

Cursor~/.cursor/mcp.json:

{
  "mcpServers": {
    "siret": {
      "command": "npx",
      "args": ["-y", "siret-mcp"]
    }
  }
}

Claude Desktopclaude_desktop_config.json, same block as Cursor.

Restart the client. You should see four tools.

Try these

  • "Is SIREN 552100554 still active, and what legal form is it?"
  • "Find software companies in Loire-Atlantique with more than 20 employees."
  • "What does NAF code 43.22A mean?"
  • "Here's a SIRET from an invoice: 55210055400015 — verify it and tell me the registered address."
  • "List every establishment for this SIREN and flag which is the head office."

Tools

| Tool | What it does | |---|---| | search_companies | Fuzzy search by name, trade name, acronym or officer. Filters: département, postal code, NAF code, active-only. Returns compact summaries. | | get_company | Full profile from a SIREN (9 digits) or SIRET (14). Validates the Luhn checksum before spending a request. | | list_establishments | All known sites for a SIREN, head office first, with a complete flag so you know if the list is exhaustive. | | explain_code | Decodes NAF / legal form / workforce bracket / status. Offline, no API call. |

Plus a siret://health resource exposing cache stats.

Design decisions worth knowing

Codes always travel with labels. Every coded field returns {code, label, exact, source}. exact: false means the label came from a fallback (a NAF section rather than the precise class), so a model can hedge appropriately instead of stating a guess as fact.

Absent fields are named, not nulled. Each profile carries a missing array. Given "workforce": null, a model will often invent a headcount. Given "missing": ["workforce"], it says the registry doesn't hold it.

Errors are returned, not thrown. Failures come back as JSON with a hint, so the model can retry or reformulate rather than dying mid-conversation.

Caching is the product, not an optimisation. The upstream rate-limits bursts. A 6h TTL cache (SIRENE_CACHE_TTL_MS) is what makes this usable in an agent loop that asks about the same company nine times.

Four tools, not twelve. Every extra tool costs the calling model context and adds a way for it to pick wrong.

Limitations

  • Code tables are partial. Full NAF rev. 2 is ~732 codes and catégorie juridique ~300; this ships the common ones plus a fallback that flags itself as approximate (exact: false).
  • Backed by recherche-entreprises.api.gouv.fr, not INSEE Sirene v3. No API key means this runs immediately. The trade-off is fewer fields and no exhaustive establishment listing.
  • Cache is in-process. Fine for a local stdio server, wrong for a hosted multi-tenant one.

Data & attribution

Data comes from the API Recherche d'Entreprises (DINUM), derived from INSEE SIRENE, under Licence Ouverte. Officer records may include a birth year. You are responsible for using the data lawfully.

Development

git clone https://github.com/tbellicha/siret-mcp.git
cd siret-mcp
npm install
npm run build
npm test                 # node:test, offline
npm run test:live        # hits the real API
npm run typecheck

Licence

MIT © 2026 tbellicha