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

csvto-mcp

v0.1.2

Published

MCP server for local CSV, JSON and Excel conversion. Converts files on your own machine and never uploads them, and returns summaries instead of pulling whole files into the model's context.

Readme

csvto-mcp

An MCP server for converting CSV, JSON and Excel files — on the machine it runs on.

Point your assistant at a file path and it writes the converted file next to it. Nothing is uploaded anywhere, and the file's contents never pass through the model's context.

Why this exists

Two problems with asking an AI assistant to convert a spreadsheet:

  1. The file has to go somewhere. Pasting it into the chat sends your data to a model provider; using a web converter sends it to that service's servers. Spreadsheets are exports — customer lists, payroll, transactions — and often shouldn't leave the machine.
  2. Large files don't fit. A 50,000-row CSV pasted into a conversation is expensive, slow, and frequently just doesn't fit.

This server takes a path, does the work locally, and returns a short summary. A 200MB file costs the same number of tokens as a 2KB one.

Install

Claude Code:

claude mcp add csvto -- npx -y csvto-mcp

Or in any MCP client's config:

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

Requires Node 18+.

Tools

| Tool | Does | | --- | --- | | inspect_file | Columns, row count, detected types and parse warnings for a CSV, JSON or Excel file | | read_rows | A slice of rows, with optional search and sorting — read part of a large file without loading all of it | | csv_to_excel | CSV → .xlsx workbook | | csv_to_json | CSV → JSON, as objects or arrays | | csv_to_pdf | CSV → paginated PDF table, headers repeated on every page | | csv_to_sql | CSV → CREATE TABLE plus batched INSERTs (ANSI/PostgreSQL or MySQL) | | csv_to_xml | CSV → XML | | csv_to_markdown | CSV → a Markdown table | | json_to_csv | JSON → CSV | | excel_to_csv | .xlsx → CSV |

Types are inferred per column, not per cell

This is the part that matters, and it's where most converters quietly corrupt data.

A column is converted to numbers only if every value in it survives the round trip exactly. If one value would change, the whole column stays text. So:

  • 01234 keeps its leading zero instead of becoming 1234
  • A 16-digit account number stays itself instead of becoming 1.23457E+14
  • 1250.50 keeps its trailing zero instead of becoming 1250.5
  • A column never ends up as a mix of numbers and strings

Verified: 01234 survives a CSV → xlsx → CSV round trip intact.

Other behaviour worth knowing:

  • JSON → CSV takes the union of keys across all records, so fields that only appear in later records aren't dropped. Nested values are serialised back to JSON in the cell rather than discarded.
  • CSV → SQL escapes single quotes (O'Brien → 'O''Brien') and infers a type per column, so an identifier column stays TEXT.
  • CSV → XML rewrites column names that aren't valid element names (first name → first_name) rather than emitting a file no parser can read.
  • CSV → PDF is limited to the latin-1 character set. Characters outside it become question marks, and the tool tells you exactly which ones rather than letting you discover it later.

Example

> Inspect ~/exports/orders.csv, then convert it to Excel

  inspect_file  → orders.csv (csv): 48,210 rows, 9 columns.
                  Columns: order_id, customer, city, zip, amount, ...
  csv_to_excel  → Converted orders.csv -> ~/exports/orders.xlsx
                  48,210 rows, 9 columns.
                  Conversion ran locally. No file contents were uploaded anywhere.

The same tools in a browser

Everything here also runs as a web tool at csvtosite.com, using the same conversion engine, also entirely client-side.

Licence

MIT