AstroWay/api v2.130.2 · blog
усі системи в нормі

Типізований вивід MCP: чому 600+ інструментів мають outputSchema

Більшість MCP-серверів віддають агенту нетипізований JSON - модель мусить вгадувати форму відповіді. Ми публікуємо строгий outputSchema для 600+ інструментів. Розбираємо, як це працює, який баг це відкрило у strict-mode клієнтів і як ми його полагодили через відкриті схеми.

MCP-інструмент може повернути що завгодно - протокол не вимагає описувати форму відповіді. Тому більшість серверів віддають агенту голий JSON, а модель вгадує структуру з тексту. Це працює, поки не ламається: агент бере поле, якого немає, або неправильно інтерпретує вкладеність.

Ми пішли строгим шляхом: понад 600 з наших MCP-інструментів публікують outputSchema - машинну схему відповіді, згенеровану з того самого OpenAPI-контракту, що й REST API.

Коли інструмент оголошує вихідну схему, клієнт знає форму відповіді до виклику. Агент не вгадує - він бачить, що chart.angles.asc існує і має тип «обʼєкт зі знаком і градусом». Менше галюцинацій про структуру, точніший ланцюжок викликів, можливість валідувати відповідь на боці клієнта.

Каталог виріс поетапно: 285 інструментів на старті, потім 624, зараз понад 630 - і типізований вивід підтягнувся майже до повного покриття (понад 600 з 630+). Схеми не пишуться руками: генератор читає live /v1/openapi.json на білді, тому drift між REST і MCP неможливий за побудовою.

Баг, який відкрила строга типізація

Section titled “Баг, який відкрила строга типізація”

Строгість має ціну. Коли інструмент оголошує closed-схему (жодних полів понад перелічені), а відповідь містить додаткову метадату, strict-mode клієнт це відхиляє. На chart-family інструментах ми впіймали саме це:

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

Причина: згенеровані Zod-схеми були в closed-формі, а фактична відповідь бекенда несла кілька службових metadata-полів, не оголошених у схемі. Клієнт валідував structuredContent проти схеми в strict-режимі і кидав -32602.

Цікавий нюанс: Claude Desktop і Cursor баг не показували - вони в loose-режимі і додаткові поля пропускають. Падали саме strict-mode SDK-клієнти, які валідують жорстко. Тобто проблема була невидима в найпопулярніших клієнтах і виринала тільки у власних інтеграціях поверх MCP SDK.

Фікс: відкриті схеми замість closed

Section titled “Фікс: відкриті схеми замість closed”

Рішення - не викидати типізацію, а зробити схеми відкритими. У генераторі інструментів вихідні ZodObject-схеми переводяться в passthrough-форму: оголошені поля лишаються обовʼязковими й типізованими, а додаткові службові поля проходять валідацію, не валлячи виклик.

Для hosted-каталогу окремо застосований запасний варіант - зняти outputSchema з реєстрації тих інструментів, де валідація і так була зламана, щоб strict-клієнти не падали, поки схеми не відкриті повністю. Компроміс усвідомлений: краще коректний виклик без клієнтської валідації, ніж жорсткий збій.

Урок простий: типізований вивід MCP корисний, але схема відповіді має бути відкритою на додаткові поля. API еволюціонує, метадата зʼявляється, і closed-схема перетворює кожне таке доповнення на breaking change для strict-клієнтів.

Типізований каталог доступний обома шляхами:

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

Або stdio-пакет npx -y @astroway/mcp з ключем у ASTROWAY_API_KEY. Обидва віддають той самий типізований каталог; повний гайд по клієнтах - на /agent-setup/.

AstroWay team

Інженерна команда AstroWay API. Ми загортаємо Swiss Ephemeris у чистий REST і пишемо про нудні деталі, які насправді важливі.

// побудуй на цьому

Той самий Swiss Ephemeris, що й у Solar Fire — у 4 рядках коду.

Безкоштовний ключ без картки. 5 000 викликів на місяць до першої оплати.

Більше з блогу усі дописи →

Engineering 2026-07-15

Три офіційні SDK: TypeScript, Python, PHP замість сирого curl

Сирий HTTP працює, але типізований клієнт економить години: автодоповнення шляхів, типи запиту й відповіді, вбудований retry на 408/409/429/5xx і Stainless-style ієрархія помилок. Розбираємо три офіційні SDK - @astroway/sdk (npm), astroway (PyPI), astroway/sdk (Packagist) - і чим вони згенеровані з одного OpenAPI-контракту.

Engineering 2026-06-05

X-Cache header: видимий cache-status для оптимізації клієнтських інтеграцій

Кожна response API тепер несе X-Cache: MISS | HIT | BYPASS — клієнт відразу бачить чи запит обчислений з нуля, чи витягнутий з кешу. Це відкриває cache hit % колонку в /dashboard/usage та дозволяє оптимізувати інтеграцію без guesswork.

Ephemeris 2026-06-02

Eclipse path, cosmogram і Vedic-карти: pure-SVG візуалізатори без headless-Chrome

Шість ендпоінтів сімейства /v1/render/* для специфічних візуалізацій — три Vedic-картки (North/South/East Indian), Hamburg-School 90° cosmogram, equirectangular eclipse-path та stereographic star-map. Усі рендери — чистий SVG-стрінг, без браузерного worker-а.