Превращает CLI-приложение на autumn-cli в MCP-сервер (Model Context Protocol, stdio) — чтобы ИИ-агенты могли вызывать команды приложения как инструменты.
Единый источник истины — обычная CLI-команда. Помечаешь подкоманду маркером
&ДоступноВMCP — и она автоматически появляется как MCP-инструмент. Схема параметров
генерируется рефлексией из аннотаций autumn-cli (&Опция/&Аргумент/&НаборОпций/
&Перечисление/&Т*) — дублировать ничего не нужно.
Точка входа MCP-сервера приложения (например src/mcp.os):
#Использовать autumn
#Использовать autumn-cli
#Использовать autumn-mcpify
#Использовать "." // исходники приложения: команды, сервисы, наборы опций
Запуск = Новый MCP_Запуск();
Запуск.Старт();
autumn-mcpподключать в точке входа не нужно — его тянет самautumn-mcpify(внутриMCP_Запуск).
Регистрация сервера у клиента (Claude Code / Cursor / IDE), рабочий каталог — корень проекта:
Аннотации autumn-mcpify (
&ДоступноВMCPи др.) ставятся на команды, поэтому#Использовать autumn-mcpifyнужен и в обычной точке входа CLI (src/main.os) — иначе OneScript не разрешит маркеры при штатном запуске приложения.
&ПодкомандаПриложения(Имя = "compile", Родитель = "КомандаCf", Описание = "Собрать cf")
&ДоступноВMCP
Процедура ПриСозданииОбъекта()
КонецПроцедурыВсё. Команда работает и в CLI (myapp cf compile ...), и как MCP-инструмент
cf_compile. Имя инструмента = путь подкоманды через _.
Рядом с &ДоступноВMCP:
&MCPДлительная // долгая команда → по умолчанию исполняется в фоне (taskId)
&MCPТолькоЧтение // readOnlyHint = true
&MCPРазрушающая // destructiveHint = true, readOnlyHint = false
&MCPИдемпотентная // idempotentHint = true
&MCPВнешнийМир // openWorldHint = true (иначе false)
&MCPЗаголовок("Дружелюбное имя") // title (по умолчанию = описание команды)&MCPДлительная управляет фоновым исполнением (см. ниже). Остальные маркеры
транслируются в блок annotations ответа tools/list (хинты протокола MCP): по
ним клиент решает, например, спрашивать ли подтверждение перед вызовом. Требуется
сервер autumn-mcp ≥ 1.1.0 (с поддержкой АннотацииИнструмента()); со старым
сервером маркеры безвредно игнорируются.
Когда команда вызывается с опциями, их значения запоминаются на сессию по имени
опции и автоматически подставляются в последующие команды с такой же опцией.
Например, строку подключения ibconnection достаточно указать один раз — дальше
она применяется ко всем командам, где есть эта опция (в т.ч. к опциям из общих
наборов &НаборОпций). Явно переданное в вызове значение всегда перекрывает кэш.
Кэшируются только опции (&Опция); позиционные аргументы (&Аргумент) — нет.
Это поведение описано в описании каждого инструмента, чтобы было понятно клиенту.
Команды с &MCPДлительная по умолчанию исполняются фоном (не блокируют stdio):
запускается отдельный процесс oscript <точка входа CLI> <подкоманда> <флаги>, вывод
пишется в файл, инструмент сразу возвращает taskId. Эффективные опции (с учётом
кэша) реконструируются в CLI-флаги — дочерний процесс самодостаточен.
| Инструмент | Назначение |
|---|---|
task_status |
состояние по taskId: running / completed / failed |
task_result |
результат и лог (доступен и пока задача выполняется) |
task_cancel |
отменить (завершает дерево процессов) |
Опция background: false у длительной команды — выполнить синхронно с потоковым логом.
У каждой команды есть debug. При debug: true команда выполняется синхронно,
уровень логгеров поднимается до Отладки, собранный лог возвращается в результате
(в т.ч. при исключении). Длительную команду debug переводит в синхронный режим.
По умолчанию параметры выводятся из соглашений (запуск oscript <entry> из корня
проекта):
| Параметр | Умолчание |
|---|---|
| Рабочий каталог | ТекущийКаталог() |
| Точка входа CLI | <рабочий каталог>/src/main.os |
| Путь oscript | автоопределение в PATH |
| Каталог фоновых задач | <рабочий каталог>/build/.mcp-tasks |
| Префикс логгера (debug) | "" (все логгеры) |
Нестандартное приложение переопределяет нужное до Старт():
Запуск = Новый MCP_Запуск();
Запуск.Конфигурация()
.УстановитьТочкаВходаCLI("app/cli.os")
.УстановитьПрефиксЛоггера("myapp");
Запуск.Старт();Сервер — отдельная точка входа (не подкоманда myapp mcp): так рогатки
autumn-cli и autumn-mcp не конфликтуют (обе вешают ПриЗапускеПриложения).
MCP_Запуск строит autumn-контекст с ЗапускатьРогатки = Ложь и запускает сервер
(MCP_Сервер из autumn-mcp) вручную.
Команды исполняются in-process: бин команды резолвится из контейнера, сервисы
&Пластилин автовайрятся, поля заполняются Рефлектором. Лог стримится клиенту как
notifications/message.
autumn-mcpподключается только вMCP_Запуск(#Использовать autumn-mcp). OneScript компилирует классы лениво, поэтому этот#Использоватьсрабатывает лишь приНовый MCP_Запуск()— в точке входа MCP. При штатном запуске приложения (#Использовать autumn-mcpifyвmain.os, чтобы разрешить маркеры&ДоступноВMCP)MCP_Запускне инстанцируется, autumn-mcp не загружается, и его рогатка не перехватывает обычные команды.
| Класс | Роль |
|---|---|
MCP_Запуск |
сборка контекста и запуск сервера |
MCP_Конфигурация |
параметры запуска (zero-config соглашения + сеттеры) |
MCP_РеестрИнструментов |
рефлексия команд autumn-cli → MCP-инструменты + JSON Schema |
MCP_ИнструментКоманды |
исполнение команды in-process: синхронно / фоном / debug |
MCP_КэшОпций |
сессионный кэш значений опций по имени |
MCP_РеестрЗадач |
реестр фоновых задач: запуск процесса, статус, лог, отмена |
MCP_ИнструментЗадачи |
инструменты task_status / task_result / task_cancel |
MCP_АппендерУведомлений |
аппендер logos → notifications/message (стриминг лога) |
MCP_БуферАппендер |
буфер-аппендер logos для захвата debug-лога |
MCP_АннотацияДоступноВMCP |
маркер &ДоступноВMCP (opt-in) |
MCP_Аннотация* |
маркеры намерения (&MCPДлительная и пр.) |
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
| oscript src/mcp.os