I wanted to build an MCP server of a platform that I use quite often. I noticed that SeatGeek had a developer API but I didn't see an MCP server that could allow me to use it from an MCP client.
So I thought, "why not build one myself?" It gave me the opportunity to learn more about how to build an MCP server from scratch.
I used Typescript to implement this project, and I was able to run it in both Claude Desktop and OpenWebUI/Ollama.
Biggest Takeaway
Building tools is not so easy. I used to think that a tool was just a simple interface to call an API, but when an endpoint has many flexible parameters, the LLM opts to use them as much as possible.
For example, many public/developer APIs offer a free-search parameter. In the SeatGeek API, it was the "q" parameter. Every search ended up using the "q" parameter, which often brought back poor results.
It was even worse for some APIs where "q" could search both performers and events together. So my solution was to expose more structured, yet flexible parameters. I separately evaluated the user's query to determine possible "event_q" and "performers_q" parameters and individually ran them on an event search query and a performer search query, then aggregated the results.
Tool calls have to be designed carefully to avoid ambiguity and poor results.
Interesting Fact
Because no one has built an MCP server for SeatGeek, I am the top Google Search result and am even included by responses from ChatGPT, Gemini, and Claude when asked about the SeatGeek MCP server. It's funny, and it's like a UFC belt. Just waiting for someone to take it away from me.