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

@qampi/mcp-server

v0.1.2

Published

Qampi MCP server — drive LinkedIn outreach from Claude Code, Codex, Cursor or any MCP client.

Readme

Qampi MCP server

Make LinkedIn a step in your pipeline. This exposes Qampi's outreach engine as MCP tools, so an agent in Claude Code, Codex, Cursor — or any MCP client — can research a prospect, add them to Qampi, enroll them in a sequence, and read back what happened, without leaving the editor.

It is a thin client over Qampi's public REST API. It holds no LinkedIn credentials: your Qampi API key authenticates, and every safety rule (daily and weekly caps, the invite ramp, action pacing, the outstanding-invite ceiling) is enforced server-side. An agent cannot talk its way past a cap by phrasing a tool call differently.

Setup

  1. Create an API key in Qampi → Settings → API keys (shown once).
  2. Add the server to your client.

The quickest route in Claude Code or Codex is the plugin, which also teaches the agent the safe order of work. See qampi-plugins.

If your client doesn't pass environment variables through, save the key in ~/.config/qampi/api-key instead (or point QAMPI_API_KEY_FILE at a file).

Claude Code

claude mcp add qampi --env QAMPI_API_KEY=qampi_live_… -- npx -y @qampi/mcp-server

or commit .mcp.json to share it with your team:

{
  "mcpServers": {
    "qampi": {
      "command": "npx",
      "args": ["-y", "@qampi/mcp-server"],
      "env": { "QAMPI_API_KEY": "qampi_live_…" }
    }
  }
}

Cursor

.cursor/mcp.json (project) or ~/.cursor/mcp.json (global) — same shape as above.

Codex

~/.codex/config.toml:

[mcp_servers.qampi]
command = "npx"
args = ["-y", "@qampi/mcp-server"]
env = { QAMPI_API_KEY = "qampi_live_…" }

Modes — read this before enabling writes

| QAMPI_MODE | Behaviour | |---|---| | read-only (default) | Only read tools are registered. The agent cannot see, let alone call, anything that changes state. | | full | Adds leads, campaigns, enrollment, launch, email lookup, webhooks. |

Write tools are withheld rather than merely discouraged, because "the model was told not to" is not a safety property. Start in read-only; switch to full when you actually want the pipeline to act.

qampi_launch_campaign is the only tool that contacts real people. It is annotated destructive, and requires confirm: true — meant to represent a human's explicit go-ahead, not the model's own enthusiasm. A sent invitation cannot be unsent, and a withdrawn one cannot be resent for three weeks.

Tools

Read (always available)

| Tool | What it does | |---|---| | qampi_status | LinkedIn connection + health, plan, and today's remaining budget. Call this first — the invite allowance ramps with account age and acceptance rate, so it is not a fixed number. | | qampi_list_templates | Prebuilt sequences. | | qampi_list_leads / qampi_get_lead | Leads and their enrichment. | | qampi_list_campaigns / qampi_get_campaign / qampi_campaign_leads | Campaigns and per-lead progress. | | qampi_search_people | LinkedIn people search. Costs one search from the monthly commercial-use budget. |

Write (QAMPI_MODE=full)

| Tool | What it does | |---|---| | qampi_add_leads | Adds leads. Contacts nobody. | | qampi_annotate_lead | Tags and notes only — enrichment is engine-written, status is engine-derived. | | qampi_create_campaign | Creates a campaign in DRAFT. | | qampi_enroll_leads | Adds leads to a campaign. Still sends nothing. | | qampi_launch_campaign | Starts real outreach. Requires confirm: true. | | qampi_find_email | Finds a work email. Consumes one credit. | | qampi_register_webhook | Subscribe a URL to lifecycle events so a pipeline reacts instead of polling. |

Environment

| Variable | Default | | |---|---|---| | QAMPI_API_KEY | — | Required, unless the key file below exists. | | QAMPI_API_KEY_FILE | ~/.config/qampi/api-key | Read when QAMPI_API_KEY is unset. | | QAMPI_MODE | read-only | full enables write tools. | | QAMPI_BASE_URL | https://api.qampi.com/api/public/v1 | Point at a staging API. | | QAMPI_TIMEOUT_MS | 60000 | Searches can take a while. |

Example

"Find the three companies we mentioned in notes.md, look up their heads of growth on LinkedIn, and add the 2nd-degree ones to Qampi tagged q4-pilot."

The agent reads your file, calls qampi_search_people, filters by degree, then qampi_add_leads + qampi_annotate_lead. Nothing is sent to anyone — launching stays a separate, deliberate step.

Development

npm run build      # esbuild → dist/index.js
npm run smoke      # drives the server over stdio against a live account

npm run smoke needs QAMPI_API_KEY and makes real (read-only) API calls.