What I learned shipping a read-only MCP server on Next.js and Vercel A developer built Padel Expert Lab, a free French-language padel racket comparator, and shipped a read-only remote MCP server alongside it on Next.js and Vercel so users can query racket recommendations and specs directly through Claude or ChatGPT. The server exposes three tools with read-only annotations and runs sessionless streamable HTTP via mcp-handler, avoiding Redis; the developer documented fixes for trailing-slash 308 redirects that broke some MCP clients and registry authentication using an Ed25519 key at /.well-known/mcp-registry-auth. The server was accepted into the official MCP registry and picked up by Glama and mcptry within minutes, and it logs only anonymous per-day counters with no IP addresses or arguments. I play padel as a beginner, and choosing my racket was hard: hundreds of models, and the specs are spread over the brands' websites. So I built Padel Expert Lab https://padelexpertlab.com/ , a free padel racket comparator in French , and then a small remote MCP server so that people can ask Claude or ChatGPT directly instead of reading forty product pages. The server is read-only, has three tools and no authentication. It lives at https://padelexpertlab.com/api/mcp/ , inside the same Next.js app as the site. Here is what was worth knowing. recommander raquettes : up to 3 rackets for a player profile level, style, weight, how often you play, budget . It runs the same engine as the site's quiz. chercher raquettes : search by name or by criteria brand, level, shape, price range, weight , 10 results per page. voir raquettes : the specs of 1 to 4 rackets, side by side. Each tool has a title and readOnlyHint: true , destructiveHint: false , openWorldHint: false . Claude's connector directory checks these annotations, and read-only tools can run without asking the user every time. Every answer ends with one link to a page of the site "open the racket page to see the photos" . No shop link and no affiliate link: the assistant gets data, and the visitor gets a reason to come and look. I used mcp-handler https://github.com/vercel/mcp-handler on a Next.js route handler. Streamable HTTP without sessions means no Redis and no long-lived connection: each request is an ordinary POST, which suits Vercel functions. GET answers 405, since there is nothing to stream. The site uses trailingSlash: true , so Next.js answers a POST to /api/mcp with a 308 to /api/mcp/ . Some MCP clients do not follow it. Then Claude's connector directory stored my address without the slash, and its probe reported the 308. The fix: turn off Next's own redirect skipTrailingSlashRedirect: true and write the same two rules in redirects , leaving /api/mcp out. One trap: a custom rule also matches its source with a final slash, so without a ? . /$ lookahead every address that already ended with a slash redirected to itself. I caught it on a local production build by checking 23 paths before shipping, and a test now checks the rules in both matching modes. The official registry https://registry.modelcontextprotocol.io/ accepts a reverse-domain name com.padelexpertlab/raquettes if you prove you own the domain. The HTTP proof is a static file, /.well-known/mcp-registry-auth , holding an Ed25519 public key; mcp-publisher login http then signs with the private key, which stays off the repo. Two details: macOS's LibreSSL cannot generate Ed25519 keys use Homebrew's OpenSSL 3 , and with trailingSlash: true you want to check that .well-known files are served as they are Next leaves .well-known alone . Glama and mcptry picked the server up from the registry on their own within minutes, and PulseMCP says it will do the same when it reopens: publish there first. The server keeps one anonymous counter per day, tool and client family, with no IP address, no arguments and no text. The rate limiter keys on an HMAC of the address, in memory only. The privacy page says exactly that, and tests fail if the code starts logging arguments. The specs come from the brands' official pages. The prices are the last ones collected by hand on the brands' official stores, so every answer that shows a price says it may have changed and links to how prices are updated. An assistant rephrases what you give it: the clearer your caveats, the fewer wrong answers it will repeat. If you want to try it: add https://padelexpertlab.com/api/mcp/ as a custom connector in Claude or claude mcp add --transport http padel-expert-lab https://padelexpertlab.com/api/mcp/ in Claude Code . The answers are in French. Documentation: padelexpertlab.com/connecteur-ia/ https://padelexpertlab.com/connecteur-ia/ ยท Repository: github.com/FluxCoreGroup/padelexpertlab-mcp https://github.com/FluxCoreGroup/padelexpertlab-mcp