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.
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:

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
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:
| Customer | Calls | Failures | Top tool | Last activity |
|---|---|---|---|---|
| ada@loopwork.io | 613 | 17 | post | 8:57 PM |
| felix@brightpath.app | 409 | 11 | me | 8:33 PM |
| admin@commandplusk.com | 23 | 6 | post | 4: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
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.