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(...), thenclient.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 ongetCall(...)
Optional environment variables:
AGENTPHONE_NUMBER_ID: reuse a specific number as caller ID.AGENTPHONE_NUMBER_COUNTRY: country for first-time number provisioning. Defaults toUS.AGENTPHONE_AREA_CODE: preferred area code for first-time number provisioning.
Development
npm install
npm test
npm run buildRun locally:
AGENTPHONE_API_KEY=ap_... npm run devStage Demo Plan
- Open Claude Code and show the MCP config JSON.
- Ask Claude to cancel a low-stakes subscription or call a test phone.
- Claude invokes
cancel_subscription. - Transcript turns stream back as MCP progress notifications.
- 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.
