Как мы сделали SDK, CLI и MCP с ИИ за неделю
За 7 дней мы создали SDK, CLI и MCP-сервер для нашего API на Python. Рассказываем, как использовали Flask, Marshmallow и современные AI-инструменты, чтобы ускорить разработку и избежать типичных ошибок.
220 открытий4К показов
За последнюю неделю мы в Pingera активно работали над расширением возможностей нашего API, создав SDK, CLI и даже Model Context Protocol (MCP) сервер. В этой статье я расскажу, как мы это делали, и с какими трудностями столкнулись.
Начнем с API
Исторически сложилось так, что наш бэкенд написан на Python с использованием Flask. На старте мы сразу заложили строгую типизацию данных с помощью библиотеки Marshmallow. Это позволяет описывать схемы данных, которые API должен отдавать, и валидировать входящие запросы. Если вы работали с Django REST, то Marshmallow — это аналог их Schemas.
В какой-то момент мы решили, что хотим отдавать OpenAPI-спецификацию для нашего API. Мы попробовали flask-apispec, но столкнулись с проблемой: сгенерированная спецификация имела кучу ошибок в валидаторе, потому что библиотека миксовала OpenAPI v2 и v3. Частично это удалось решить с помощью ручных @doc() декораторов, но это было неудобно и больше походило на костыль, чем на нормальное решение.
В итоге я перешел на flask-smorest. Эта библиотека активно развивается, работает поверх Flask и Marshmallow и умеет генерировать корректный OpenAPI v3. Все завелось «из коробки» с минимальными изменениями. Marshmallow-схемы поддерживают метаданные, которые smorest потом проксирует в спецификацию. Например, так выглядит поле type для проверок в нашем коде:
smorest берёт эти данные и добавляет их в спеку. Кроме того, можно (и нужно) описать, какие коды ответов возвращает ваш API-метод и другие детали:
Как только мы это сделали, то получили приличный Swagger и валидную OpenAPI JSON-спецификаци
SDK
Далее мы поняли, что одного API недостаточно. Чтобы вызывать методы API из будущих CLI или MCP, нам не хотелось писать клиент с нуля. Поэтому мы решили создать SDK.
Если у вас есть OpenAPI-спецификация, то писать клиент с нуля бессмысленно. Для этого есть отличный инструмент — openapi-generator. Он позволяет сгенерировать API-клиенты для разных языков одной командой, просто получив на вход спецификацию.
Так мы получили полноценный Python-клиент и залили его в PyPI. Весь код можно найти на GitHub: pingera/pingera-python-sdk. Особенно интересен файл generate-client.py, который запускает openapi-generator и подменяет директории. После этого оставалось только залить все в PyPI, чтобы можно было использовать пакет в других сервисах и продуктах.
Конечно, имена сгенерированных методов не самые изящные, например v1_checks_check_id_results_check_result_id_get, но это в сто раз лучше, чем каждый раз писать requests.get, добавлять try-except обертки и волноваться об изменениях в API.
Model Context Protocol (MCP) сервер
MCP — это стандарт, разработанный компанией Anthropic (создатели Claude). Его идея — стандартизировать взаимодействие LLM с данными или сервисами, превращая их в ИИ-агентов. Теперь не нужно объяснять агенту, как взять данные из базы данных или JIRA, достаточно указать MCP-сервер, который уже это умеет, и агент сам разберётся.
Мы в Pingera давно задумывались о том, как искусственный интеллект повлияет на мониторинг, поэтому создание собственного MCP-сервера было логичным шагом.
Для создания MCP-сервера мы использовали фреймворк fastmcp. Код MCP-инструментов («tools») повторяет структуру нашего SDK. Например, в MCP есть код, который выводит список проверок:
list_checks здесь просто вызывает метод SDK v1_checks_get().
Из-за такой повторяемости 80-85% кода MCP-сервера было сгенерировано ИИ-агентом Replit (можно взять любой другой). Весь код мы также опубликовали на GitHub: pingera/pingera-mcp. Подробнее о сценариях использования можно прочитать в нашем блоге: Pingera MCP сервер — ближе к AI.
Command Line Interface (CLI)
CLI — это про консоль и инженеров. Иногда гораздо удобнее выполнить команду в терминале, чем заходить в веб-интерфейс и кликать мышкой.
Создание CLI было похоже на работу над MCP — много похожих вызовов методов. ИИ-агент снова отлично справился, хотя были проблемы с выводом результатов. Мы взяли две библиотеки: Typer для создания интерфейса и Rich для красивого, цветного вывода в консоль. С Rich были трудности — то таблица уезжала, то цвет не тот. Но ИИ справился и помог решить эти проблемы.
Весь код также доступен на GitHub: pingera/pingera-cli. Из-за ограниченного контекста LLM, нельзя было скормить агенту всю спецификацию сразу. Поэтому пока наш CLI умеет работать только с проверками.
Заключение
Использование ИИ-агентов для генерации повторяющегося кода — это не просто удобная фича. Как показал наш опыт с Replit, такие помощники берут на себя рутину, освобождая время для более сложных и творческих задач. Когда 80-85% кода MCP-сервера было сгенерировано автоматически, это позволило нам сосредоточиться на архитектуре, логике и оптимизации, вместо того чтобы вручную переписывать однотипные вызовы методов.
В конечном итоге, ИИ-агенты — это не замена инженеру, а инструмент, который многократно может повысить производительность. В будущем мы видим всё больше сценариев, где ИИ будет не просто предлагать фрагменты кода, а создавать целые модули и сервисы на основе высокоуровневых спецификаций. Это приближает нас к тому моменту, когда разработка будет похожа на управление оркестром, где дирижер (разработчик или продакт) задает направление, а умные агенты исполняют отдельные партии, обеспечивая гармонию и эффективность всего процесса.
220 открытий4К показов






