DEV Community

Postbye Team
Postbye Team

Posted on

Subscription Cancellation MCP Server: 4 Read-Only Tools for Claude, Cursor and VS Code

We built a public MCP server that lets an AI assistant answer one narrow question properly: how do I cancel this subscription? It exposes four read-only tools over a single endpoint, needs no API key, and stores nothing. This post covers what it does, how to add it to Claude, Cursor or VS Code, what a real call returns, and the design choices we made. The source is open: postbye-team/postbye-mcp.

What it does

Ask an assistant "how do I cancel Planet Fitness?" and a general model may guess, or send you to a help page that may have moved. Our server gives the assistant structured answers from our cancellation guides instead: how the company takes cancellations, the notice period, the traps to check first, billing-partner notes, sources, the date the facts were verified, and the mailing address on file.

Every answer is built from the same data as the matching company page on postbye.com, so the assistant and the website cannot disagree. The site publishes 8,692 cancellation guides in 30 categories, 1,038 of them verified by hand against each company's own pages.

The four tools

All four are marked read-only and closed-world in their annotations (readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false).

  • search_companies: finds a company by name and returns its slug, category, how it takes cancellations and the guide URL. Inputs are query and an optional limit from 1 to 10.
  • get_cancellation_guide: the full guide for one company, from a slug. Merged duplicate slugs resolve to the current company.
  • get_cancellation_letter: a plain-text cancellation letter built from the same template as our free letter tool, plus where to send it. Inputs are slug, optional customer_name and optional account_number. Anything you do not supply stays as a [bracketed] placeholder.
  • list_categories: the guide categories (streaming, gyms, phone and internet, insurance and more) with the number of guides in each and the hub URL.

The intended flow is simple: search_companies turns a name into a slug, then get_cancellation_guide or get_cancellation_letter takes that slug.

The endpoint

https://postbye.com/mcp
Enter fullscreen mode Exit fullscreen mode

It speaks MCP Streamable HTTP with JSON responses and no sessions. It only accepts POST; a GET returns a short description with HTTP 405. Cross-origin calls from web clients are allowed. Our server card advertises these protocol versions: 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05. Authentication is none.

Add it to your client

Claude

On claude.ai, Claude Desktop or the mobile app, open Settings, then Connectors, and choose Add custom connector. Enter Postbye as the name and https://postbye.com/mcp as the URL, then save. Leave the sign-in fields empty.

For Claude Code, run this once:

claude mcp add --transport http postbye https://postbye.com/mcp
Enter fullscreen mode Exit fullscreen mode

Cursor

Add this to .cursor/mcp.json in your project, or to ~/.cursor/mcp.json for every project:

{
  "mcpServers": {
    "postbye": {
      "url": "https://postbye.com/mcp"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

VS Code

Add this to .vscode/mcp.json in your workspace (GitHub Copilot agent mode reads it):

{
  "servers": {
    "postbye": {
      "type": "http",
      "url": "https://postbye.com/mcp"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Note the different top-level key and the explicit "type": "http": Cursor uses mcpServers, VS Code uses servers.

A real call

You can test it with nothing but curl. First, initialize:

curl -s https://postbye.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"demo","version":"0.1"}}}'
Enter fullscreen mode Exit fullscreen mode

The response (trimmed):

{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18",
 "capabilities":{"tools":{"listChanged":false}},
 "serverInfo":{"name":"postbye","title":"Postbye","version":"1.2.0"},
 "instructions":"Read-only reference for cancelling subscriptions and memberships by mail. ..."}}
Enter fullscreen mode Exit fullscreen mode

Then tools/list returns the four tool names: search_companies, get_cancellation_guide, get_cancellation_letter, list_categories. Now the useful call, with "method":"tools/call" and these params:

{"name": "get_cancellation_guide", "arguments": {"slug": "planet-fitness"}}
Enter fullscreen mode Exit fullscreen mode

The text content of the response (trimmed):

How to cancel Planet Fitness (Gyms & fitness)
Slug: planet-fitness. Accepts cancellations: Mail (written notice to your home club),
in person at your home club, or online (sign in to the member portal on planetfitness.com).

Notice period: Cancel at least 7 days before the next billing date; same 7 days before
the annual fee date

Traps to check before cancelling:
- $58 buyout fee if the membership has a minimum term and ends early
- Annual fee bills separately and needs its own 7-day notice
- Some policies and procedures may vary by location ...

Where the cancellation letter goes: to your home club, not head office. ...
Address on file (not for cancellations):
- Head office (not for cancellations): Planet Fitness, 4 Liberty Ln W, Hampton, NH 03842.

Sources:
- https://www.planetfitness.com/about-planet-fitness/customer-service

Verified October 28, 2026.
Full guide: https://postbye.com/cancel/planet-fitness
Enter fullscreen mode Exit fullscreen mode

One response carries the channel, the notice rule, the traps, the address on file, a source and a verification date.

Design choices

Read-only. The tools only look things up. Nothing is changed, bought or sent through the server. That makes it safe to connect to any assistant without a permissions conversation, and the annotations say so in a form clients can read.

Stateless. No sessions, no accounts, nothing you type is stored. A client can call it at any time without a handshake it has to remember.

No API key. There is no account, key or token to set up. Cancellation information is the kind of reference data an assistant should be able to fetch the moment a user asks, and a sign-up step would defeat that.

Sources and verification dates in every guide. An assistant that tells someone to cancel by a certain date needs to say where that rule came from and how fresh it is. Each guide response carries its sources and a "Verified" date, so the model can pass that on instead of presenting a rule as timeless. The category listing also separates total guides from guides verified by hand.

One answer for the site and the assistant. The server reads the same data as the company page, so there is no second copy to drift.

Discovery files. We publish a server card, a /.well-known/mcp.json with the endpoint, transport and four tools, and an official MCP Registry entry named com.postbye/postbye (version 1.2.0), so clients that look for servers on their own can find it. The repo's server.json is the file published to the registry.

What it does not do

It does not mail anything or take payment, and it cannot see your account. If a guide says a company takes written notice, the letter tool gives you plain text to fill in and send yourself. Our site offers a separate mailed-letter service for people who want one, but that is not part of the MCP server.

Try it and tell us what breaks

The repository is MIT licensed. The README holds the same setup notes as this post, and issues are welcome: a wrong address, a missing company or a guide that has gone stale is exactly what we want to hear about. The full documentation lives on our MCP server page, and the service itself is at postbye.com.

Postbye Team

Top comments (0)