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

cancel-my-sub-mcp

v0.1.0

Published

MCP server: agents can cancel subs, dispute charges, and negotiate bills via real phone calls

Downloads

126

Readme

cancel-my-sub-mcp

Give your coding agent a phone. Cancel subs, dispute charges, and negotiate bills via real phone calls from inside Claude Code, Cursor, Windsurf, Zed, ChatGPT desktop, or any MCP client.

Built at the Call My Agent Hackathon (May 2026), YC SF.

Install

Add this MCP server to your client config:

{
  "mcpServers": {
    "cancel-my-sub": {
      "command": "npx",
      "args": ["-y", "cancel-my-sub-mcp"],
      "env": {
        "AGENTPHONE_API_KEY": "ap_..."
      }
    }
  }
}

For local development from this checkout:

{
  "mcpServers": {
    "cancel-my-sub": {
      "command": "node",
      "args": ["/Users/t3rni/agentphone/dist/index.js"],
      "env": {
        "AGENTPHONE_API_KEY": "ap_..."
      }
    }
  }
}

Demo Prompts

  • "Cancel my Planet Fitness membership. Account is under my email."
  • "Dispute the $45 overage on last month's Comcast bill."
  • "Call AT&T and negotiate my plan down to $50/mo. Verizon offered me that."

Tools

cancel_subscription

Places a real call to cancel a subscription. The voice agent navigates IVR, asks for a human representative, declines retention offers by default, and tries to obtain a confirmation number.

dispute_charge

Places a real call to dispute a charge. The voice agent explains the disputed charge, asks for a refund or credit, and escalates when the first representative cannot help.

negotiate_bill

Places a real call to negotiate down a recurring bill. The voice agent asks for loyalty or retention pricing, mentions competitor offers when supplied, and asks for a supervisor if needed.

How It Works

flowchart LR
  A[MCP client] --> B[cancel-my-sub-mcp]
  B --> C[AgentPhone TypeScript SDK]
  C --> D[AgentPhone REST API]
  D --> E[Real phone call]
  E --> F[Live transcript SSE]
  F --> B
  B --> G[MCP progress notifications]
  B --> H[Final transcript and outcome]

The server uses stdio transport only. There is no UI, webhook server, account system, or persistence layer.

AgentPhone Integration Notes

This package was wired against the installed agentphone SDK, not guessed API names:

  • Constructor: new AgentPhoneClient({ token: process.env.AGENTPHONE_API_KEY })
  • Agent creation: client.agents.createAgent({ voiceMode: "hosted", systemPrompt, ... })
  • Number provisioning: client.numbers.createNumber({ agentId })
  • Number reuse: client.numbers.listNumbers(...), then client.agents.attachNumberToAgent(...)
  • Outbound calls: client.calls.createOutboundCall({ agentId, toNumber, fromNumberId, initialGreeting, systemPrompt })
  • Completion: live transcript SSE when available, then client.calls.getCall(...) polling
  • Transcript fallback: client.calls.getCallTranscript(...) or transcript data on getCall(...)

Optional environment variables:

  • AGENTPHONE_NUMBER_ID: reuse a specific number as caller ID.
  • AGENTPHONE_NUMBER_COUNTRY: country for first-time number provisioning. Defaults to US.
  • AGENTPHONE_AREA_CODE: preferred area code for first-time number provisioning.

Development

npm install
npm test
npm run build

Run locally:

AGENTPHONE_API_KEY=ap_... npm run dev

Stage Demo Plan

  1. Open Claude Code and show the MCP config JSON.
  2. Ask Claude to cancel a low-stakes subscription or call a test phone.
  3. Claude invokes cancel_subscription.
  4. Transcript turns stream back as MCP progress notifications.
  5. The call ends and Claude reports the outcome, transcript, duration, and any confirmation number.

Have a pre-recorded backup, but try the live call first.