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

@pixu1980/pi-cursor

v0.1.4

Published

Cursor API key provider for pi.dev - run Cursor local agents from pi using your own Cursor API key, stored only on your machine, with an audited egress surface (Cursor endpoints only)

Readme

pi-cursor

Cursor API key provider for pi — run Cursor agents from pi with your own Cursor API key.

pi install npm:@pixu1980/pi-cursor

Why this exists

pi-cursor-sdk (upstream, by Mitch Fultz) is a thorough Cursor provider, but it ships ~110 source files, an MCP tool bridge, a cloud-agent runtime, a usage reporting path and a 40-script smoke harness. pi-cursor is the small, auditable core: the Cursor API key, the Cursor models, and nothing else.

What the reduction dropped: cloud agents, the MCP tool bridge that exposed pi's tools over loopback HTTP, cloud usage reporting, the SDK key-fingerprint the upstream cache stored, and alias-based model ids.

Features

  • cursor provider — all Cursor models in pi's /model picker, discovered live from Cursor and cached locally for fast startup.
  • /login cursor — paste your Cursor API key once; pi stores it in ~/.pi/agent/auth.json (mode 0600), like every other provider.
  • Thinking levels — Cursor's effort / reasoning / thinking parameters mapped onto pi's off … max levels, so /think works.
  • Context and speed variants — grok-4.6@200k, grok-4.6:fast.
  • Local agents only — the Cursor agent runs on your machine, in your cwd. No cloud agents, no PR creation, no repo upload.
  • No telemetry added by this extension — zero requests are issued by pi-cursor itself. See Egress.

Install

pi install npm:@pixu1980/pi-cursor

Then, inside pi:

/login cursor          # paste your Cursor API key
/model                 # pick a Cursor model

Or use the environment variable instead of /login:

export CURSOR_API_KEY="..."   # machine-local only, never written by the extension

Commands

| Command | What it does | | --- | --- | | /cursor-models | Refresh the live Cursor model catalog without restarting pi | | /cursor-egress | Print the audited outbound surface and the backend-override state | | /cursor-key | Print which key source is active, masked (crsr…89 (48 chars)) — never the key |

Configuration

| Variable | Default | Effect | | --- | --- | --- | | CURSOR_API_KEY | — | API key fallback when nothing is stored via /login cursor | | PI_CURSOR_DISABLE_MODEL_CACHE | 0 | 1 disables the catalog cache | | PI_CURSOR_MODEL_CACHE_TTL_MS | 21600000 (6h) | Catalog cache freshness | | PI_CURSOR_LOG_EGRESS | 0 | 1 prints the outbound surface to stderr at startup | | PI_CURSOR_ALLOW_BACKEND_OVERRIDE | 0 | 1 permits CURSOR_BACKEND_URL outside the allowlist | | CURSOR_SDK_LOCAL_MODEL_CATALOG_JSON | set by pi-cursor | Catalog @cursor/sdk validates local model selections against. pi-cursor publishes the catalog it resolved; a value you set yourself is left untouched. |

Plans and model availability

Cursor's Cloud Agent API (GET https://api.cursor.com/v1/models) is what Cursor.models.list() reads, and it answers 403 [plan_required] on a Free plan. pi-cursor still works there:

  • Model catalog. When the live fetch is refused the extension keeps its local catalog, which includes Auto (default) — the one model a Free plan may select. Named models (grok-4.6, composer-2, …) stay listed and are rejected by Cursor's own backend with a clear message if your plan cannot use them.
  • Local agent validation. @cursor/sdk validates a local agent's model by calling that same Cloud endpoint, and treats a validation failure as fatal. At startup pi-cursor therefore exports CURSOR_SDK_LOCAL_MODEL_CATALOG_JSON (the SDK's own override) with the catalog it resolved, so validation happens in-process and never blocks a local run.
  • Quiet startup. A plan_required refusal is the expected answer on a Free plan, so it prints nothing: the local catalog is kept and pi starts normally. Run /cursor-models for the refusal on an explicit refresh — UnknownAgentError: [plan_required] … (code=plan_required, status=403). Any other discovery failure still prints one startup line naming the real error instead of the bare SDK error class.

Named models and the cloud endpoints need a paid Cursor plan; Auto is available on every plan.

Egress

pi-cursor ships no HTTP client of its own — there is no fetch, no http.request, no third-party networking package. Everything on the wire is the Cursor SDK, driven from three call sites:

| Host | Who calls it | What goes there | | --- | --- | --- | | api2.cursor.sh | Cursor SDK | API key exchange, agent run stream, model catalog, SDK run counters | | api.cursor.com | Cursor SDK | Model catalog |

Call sites: Cursor.models.list() (model discovery), Agent.create() (one local agent per pi session), agent.send() (one run per turn).

The catalog @cursor/sdk uses to validate a local model selection is supplied by pi-cursor through CURSOR_SDK_LOCAL_MODEL_CATALOG_JSON, so the SDK issues no GET /v1/models of its own for validation.

Your API key travels as a Authorization: Bearer … header to those two hosts and nowhere else. Two guards back that up:

  • CURSOR_BACKEND_URL is refused unless it resolves inside the allowlist, so a stray shell export cannot redirect your key to a third party. Opt in with PI_CURSOR_ALLOW_BACKEND_OVERRIDE=1 if you run your own Cursor backend.
  • Every string that can reach the transcript, an error, or stderr is scrubbed first, so the key cannot be echoed back by the SDK or by a failing request.
  • --offline is honoured. The Cursor SDK issues its own requests and does not read pi's offline flag, so pi-cursor checks PI_OFFLINE itself and skips startup model discovery entirely: an offline run makes no request at all. /cursor-models refuses too, instead of quietly sending your key.

Run /cursor-egress at any time to see the current state, or read DISCLOSURE for the precise statement.

How turns are handled

The Cursor SDK runs a self-contained agent: it executes shell, read, edit and search against your working directory. pi therefore treats a Cursor turn as a single unit and shows the agent's tool activity as a display-only trace, rather than handing pi toolCall blocks it would then execute a second time.

Consequence worth knowing: pi's tool approval prompts do not apply to the Cursor agent's own tools. The agent runs with the permissions of the pi process. If you need pi's tool layer in the loop, upstream pi-cursor-sdk's MCP bridge is the design you want.

Context handoff: on the first turn of a pi session the whole transcript is handed to a freshly created Cursor agent; afterwards only the newest user message is sent, because the agent already holds the earlier turns.

Development

cd packages/pi-cursor
pnpm install
pnpm test        # 166 tests
pnpm typecheck   # tsc --noEmit

The suite covers the security invariants directly: the egress allowlist, the refusal of a redirected backend, key scrubbing, the no-write guarantee for key material, the cache containing no key-derived value, and a source-level audit that fails if anyone adds a network API or a non-Cursor URL literal.

Security

This package carries your Cursor API key and is declared dual-use. Its DISCLOSURE states exactly what it can reach and what it writes, and SECURITY.md covers how to report a problem privately.

Credits

Inspired by pi-cursor-sdk (MIT, Mitch Fultz), which established the model-identity scheme and the delta-to-pi stream mapping this extension follows.

License

MIT