All posts
MCP education··7 min read

Case study: AnnounceKit turned its GraphQL API into an 84-tool MCP in one afternoon

AnnounceKit, a changelog and product-updates SaaS, pointed Command+K's wizard at its GraphQL API and published a hosted MCP server with 84 typed tools the same afternoon. Every customer connects with their own AnnounceKit API key — validated, encrypted, revocable — and uses the product from Claude, Cursor and ChatGPT. This is the full story, including the three real-client bugs found and fixed along the way.

⌘
Command+K team
Platform engineering

AnnounceKit is a changelog and product-updates platform: SaaS teams publish release notes, collect feedback, and run roadmaps with it. Its customers kept asking a very 2026 question: "Can I just ask my AI assistant what shipped last week?"

The ask: be usable from inside the AI

AnnounceKit already had a complete GraphQL API. What it didn't have was a way for a customer to use that API from Claude — with their own account, safely. Writing an MCP server by hand was the easy part; per-customer authentication, OAuth for AI clients, quotas, logs, and revocation were months of gateway work nobody wanted to own.

The setup: one afternoon, zero MCP code

  • Scan. The wizard introspected the GraphQL endpoint (announcekit.app/gq/v2) and generated 84 typed MCP tools — posts, feeds, feedback, NPS, analytics, segments, webhooks.
  • Descriptions. AI wrote agent-grade docs for every tool — when to use it, exact argument formats, where to get IDs — in the background, without blocking publish.
  • Publish. A stable hosted URL went live: commandplusk.com/api/public/mcp/d/announcekit.
Works with Claude Cursor ChatGPT VS Code— verified with real clients

What an AnnounceKit customer does

They paste the MCP URL into Claude. OAuth discovery + dynamic client registration open the hosted connect screen; the customer enters their email and their own AnnounceKit API key — validated live against the API, stored encrypted:

Command+K hosted connect page for the AnnounceKit MCP: the customer enters their email and their own AnnounceKit API key; the key is validated against the API, stored encrypted, and a personal MCP access token is issued.
The hosted connect page — what your customer sees. Opens automatically when they add your MCP URL to Claude.

From then on, "list my latest posts", "how did last week's announcement perform", "draft a changelog entry from these commits" all run through the MCP — as that customer, never through a shared key. That's the same connect flow live on the AnnounceKit marketplace listing today.

What AnnounceKit sees

commandplusk.com/dashboard — Usage · Announcekit
Requests (30d)
5,368
Failures (30d)
95
p95 latency
870 ms
Daily requests — last 30 days Successful Failed

Every call is attributed. Per-customer usage makes support ("what did this customer's assistant actually call?"), abuse control (per-customer monthly allowances), and — later — usage-based pricing possible:

commandplusk.com/dashboard — Usage · Per-customer usage (this month)
CustomerCallsFailuresTop toolLast activity
ada@loopwork.io61317post8:57 PM
felix@brightpath.app40911me8:33 PM
admin@commandplusk.com236post4:51 PM

The three bumps that spec-reading never finds

Real clients are stricter than the spec. Getting AnnounceKit's MCP verified against Claude's production client surfaced three issues in one day — an HTTP 405-vs-401 handshake detail that caused an endless re-auth loop, a CORS preflight header (MCP-Protocol-Version) that browsers require, and Cloudflare's AI-bot protection silently blocking AI-client traffic at the edge. All three were fixed in the gateway, and every MCP hosted on Command+K inherits those fixes. (We wrote the war story up in detail: the three bugs that break real MCP clients.)

The takeaway

The MCP server was never the hard part. The hard part is everything around it — and that part is now a product, not a project. AnnounceKit went from "our customers ask for AI access" to "our customers use us from Claude, Cursor and ChatGPT" in one afternoon.

Want the same for your API? See how API → MCP works →

FAQ

How long did it take AnnounceKit to get a working MCP server?
One afternoon. The Command+K wizard introspected AnnounceKit's GraphQL API, generated 84 typed MCP tools, AI wrote the agent-facing descriptions in the background, and the MCP went live on a stable hosted URL the same day — no MCP code was written.
Did AnnounceKit customers need a shared API key?
No. Each customer connects with the AnnounceKit API key they already have: it's validated against the AnnounceKit API, stored encrypted, and forwarded per call — so AnnounceKit's API sees each customer as themselves, with per-customer usage, limits, and one-click revocation.
Which AI clients can use the AnnounceKit MCP?
Claude (web and desktop), Cursor, and ChatGPT — all verified with the real clients. The customer pastes one URL; OAuth discovery and dynamic client registration open the hosted connect screen automatically.
What broke along the way?
Three real-world issues, all invisible to spec-only testing: an HTTP 405-vs-401 handshake detail that sent Claude into a re-auth loop, a missing CORS header (MCP-Protocol-Version) that blocked requests client-side, and Cloudflare's AI-bot protection silently blocking Anthropic's traffic. All three are fixed in the gateway — every MCP hosted on Command+K inherits the fixes.

Keep reading

Go deeper