AstroWay/api v2.190.0 · nl
alle systemen normaal

Getypeerde MCP-output: waarom 600+ tools outputSchema hebben

De meeste MCP-servers geven een agent niet-getypeerde JSON - het model moet de vorm van de respons raden. We publiceren een strikt outputSchema voor 600+ tools. We bespreken hoe dit werkt, welke bug dit in strict-mode clients heeft geopend en hoe we het hebben opgelost via open schema's.

Een MCP-tool kan van alles retourneren - het protocol vereist geen beschrijving van de antwoordvorm. Daarom geven de meeste servers de agent kale JSON, en het model raadt de structuur uit de tekst. Dit werkt totdat het misgaat: de agent pakt een veld dat niet bestaat, of interpreteert de nesteling verkeerd.

Wij hebben de strikte weg gekozen: meer dan 600 van onze MCP-tools publiceren outputSchema - een machinaal schema van het antwoord, gegenereerd uit hetzelfde OpenAPI-contract als de REST API.

Wanneer een tool een uitvoerschema declareert, kent de client de vorm van het antwoord vóór de aanroep. De agent raadt niet - hij ziet dat chart.houses.ascendant bestaat en het type ‘getal, ecliptische lengte in graden’ heeft. Minder hallucinaties over de structuur, een nauwkeurigere aanroepketen, de mogelijkheid om het antwoord aan de clientzijde te valideren.

De catalogus is stapsgewijs gegroeid: 285 tools bij de start, daarna 624, nu meer dan 630 - en de getypeerde uitvoer heeft bijna volledige dekking bereikt (meer dan 600 van de 630+). De schema’s worden niet handmatig geschreven: de generator leest live /v1/openapi.json tijdens de build, dus drift tussen REST en MCP is per constructie onmogelijk.

Bug die door strikte typering werd ontdekt

Section titled “Bug die door strikte typering werd ontdekt”

Strikt zijn heeft een prijs. Wanneer een tool een closed-schema declareert (geen velden buiten de opgesomde), en het antwoord bevat aanvullende metadata, dan wijst een strict-mode client dit af. Bij de chart-family tools hebben we precies dit probleem ondervonden:

McpError: MCP error -32602: Structured content does not match
the tool's output schema: data must NOT have additional properties

De reden: de gegenereerde Zod-schema’s waren in closed-vorm, terwijl het daadwerkelijke antwoord van de backend verschillende service-metadata-velden bevatte die niet in het schema waren gedeclareerd. De client valideerde structuredContent tegen het schema in strict-modus en gaf -32602 terug.

Een interessant detail: Claude Desktop en Cursor toonden de bug niet - zij werken in loose-modus en slaan extra velden over. Het waren juist de strict-mode SDK-clients die crashten, omdat zij strikt valideren. Dit betekent dat het probleem onzichtbaar was in de meest populaire clients en alleen naar voren kwam in eigen integraties bovenop de MCP SDK.

Fix: open schema’s in plaats van gesloten

Section titled “Fix: open schema’s in plaats van gesloten”

De oplossing is om de typering niet weg te gooien, maar de schema’s open te maken. In de toolgenerator worden de uitvoer ZodObject-schema’s omgezet naar een passthrough-vorm: gedeclareerde velden blijven verplicht en getypeerd, terwijl aanvullende servicevelden de validatie doorstaan zonder de aanroep te laten crashen.

Voor de hosted-catalogus is afzonderlijk een noodoplossing toegepast - het deregistreren van outputSchema voor tools waar de validatie toch al kapot was, zodat strict-clients niet crashen totdat de schema’s volledig open zijn. Een bewuste compromis: beter een correcte aanroep zonder clientvalidatie dan een harde crash.

De les is eenvoudig: getypeerde MCP-uitvoer is nuttig, maar het antwoordschema moet openstaan voor aanvullende velden. API’s evolueren, metadata verschijnt, en een closed-schema verandert elke dergelijke toevoeging in een breaking change voor strict-clients.

De getypeerde catalogus is op twee manieren beschikbaar:

// hosted, без установки
{
"mcpServers": {
"astroway": {
"url": "https://mcp.astroway.info/mcp",
"headers": { "Authorization": "Bearer aw_live_..." }
}
}
}

Of het stdio-pakket npx -y @astroway/mcp met een sleutel in ASTROWAY_API_KEY. Beide leveren dezelfde getypeerde catalogus; een complete gids voor clients vind je op /agent-setup/.

MakSeong · AstroWay

I build the AstroWay API: Swiss Ephemeris on a clean REST surface, and I write about the dull parts that turn out to matter.

// bouw hierop

Dezelfde Swiss Ephemeris als in Solar Fire - in 4 regels code.

Gratis sleutel zonder kaart. 5.000 calls per maand tot de eerste betaling.

Meer uit de blog alle berichten →

Engineering 2026-07-15

Drie officiële SDK's: TypeScript, Python, PHP in plaats van rauwe curl

Rauwe HTTP werkt, maar een getypeerde client bespaart uren: autocompletion voor paden, request- en responstypes, ingebouwde retry voor 408/409/429/5xx en Stainless-style foutenhiërarchie. We bespreken de drie officiële SDK's - @astroway/sdk (npm), astroway (PyPI), astroway/sdk (Packagist) - en hoe ze zijn gegenereerd uit één OpenAPI-contract.

Industry 2026-06-05

Free Astrology API: Which One Has the Best Free Tier in 2026?

A side-by-side of free tiers across the major astrology APIs - credits, request caps, card requirements - and how much you can actually build for free.

Engineering 2026-06-05

Horoscope API Tutorial: Build a Daily Horoscope Feature

Add daily, weekly and monthly horoscopes to your app via API - sign-based text vs transit-based personalization - with TypeScript and Python code.