- 9public data-service clients behind one server
- 15tool classes in the .NET port
- 2MCP SDKs the same product was built on
Aggregate before answering
In the Auth and access plane I built a weather MCP server as a worked example of a product-shaped tool server, and the problem it solves is size. Public weather data is hourly, multi-variable and far larger than an assistant should read, and an assistant asked "can we pour concrete on Thursday?" needs a judgment.
I decided the server would aggregate before it answers.
The advisory interprets conditions for field work, and saved locations let a user ask about "the north site".
Public sources, each with its own failure handling
Behind it sit clients for national forecasts and alerts, climate history, wildfire incidents, an open global forecast service, precipitation radar, lightning detection and address geocoding. Public services differ in reliability, rate limits and response shape, so each client has its own cache, retries and timeouts.
Two surfaces for two kinds of client
Desktop assistants read the full surface over standard input. Microsoft Copilot Studio's connector works best with a small, stable HTTP surface, so the Streamable-HTTP server exposes a trimmed set shaped for that connector.
One product in TypeScript and .NET
I packaged the server as a versioned container with a deployment guide for Azure Container Apps, then ported it to C# on the official MCP SDK for .NET over the same services. Building the same product on both SDKs showed the design was not tied to one runtime.
I can shape messy third-party data into a tool surface built around how a language model and a specific enterprise platform consume it, and deliver it in two ecosystems. The data belongs to the public services; the clients, aggregation, tools and port are mine.