Больше, чем просто
документация Swagger.
nestjs-docfy отделяет документацию Swagger/OpenAPI от логики контроллера через соглашение об именах companion-файлов, ровно так же, как Nest уже поступает с *.controller.spec.ts.
npm install nestjs-docfy
# peer deps
npm install @nestjs/common @nestjs/swagger reflect-metadatadocfy-ui: справочник, заточенный под ИИ
Спецификацию OpenAPI, которую собирает nestjs-docfy, docfy-ui и отрисовывает. Отдельной настройки нет, источник данных один.
- Copy for AI: детерминированная выжимка по эндпоинту, готовая для LLM, а не сырой JSON с $ref
- Поиск по всем эндпоинтам через ⌘K, без задержки
- Полное описание запроса и ответа по каждому эндпоинту, прямо из спецификации






Сделано для агентов, а не только для людей
docfy-mcp отдаёт вашу спецификацию OpenAPI как инструменты MCP, поэтому Claude, Cursor или любой совместимый агент обращается к API напрямую, без вставки JSON в промпт.
- list_endpoints / get_endpoint: просмотр и разбор любой операции в том же нормализованном виде, что рисует docfy-ui
- lint_spec: ловит недостающие summary, описания, теги и ответы с ошибками до того, как они уедут в прод
- diff_specs: сравнивает два документа OpenAPI и отделяет ломающие изменения от информационных
- contract_test: проверяет живой ответ на соответствие объявленной схеме, прямо из вызовов агента
- Работает без настройки против запущенного сервера NestJS либо по указанному файлу спецификации
{
"mcpServers": {
"docfy": {
"command": "npx",
"args": ["-y", "docfy-mcp", "--url", "http://localhost:3000/docs-json"]
}
}
}Как это выглядит на практике
Было: контроллер, погребённый под декораторами. Стало: одни только маршруты, а документация лежит рядом, в companion-файле.
@WithDocs()
@Controller('users')
export class UsersController {
constructor(private readonly users: UsersService) {}
@Get(':id')
findOne(@Param('id') id: string) {
return this.users.findOne(id);
}
}import { docs } from 'nestjs-docfy';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { UsersController } from './users.controller';
docs(UsersController, {
classDecorators: [ApiTags('users')],
methods: {
findOne: [
ApiOperation({ summary: 'Get user by id' }),
ApiResponse({ status: 200, description: 'OK', type: UserDto }),
ApiResponse({ status: 404, description: 'User not found' }),
],
},
});Никакого monkey-patching и прокси в рантайме
Только точный момент вызова и метаданные Reflect.
Напишите companion-файл
users.controller.docs.ts вызывает docs(UsersController, { ... }). Обычные декораторы Swagger, просто в другом файле.
Обнаружение при старте
DocfyModule.forRoot() находит файл по соглашению об именах и записывает метаданные Reflect в методы контроллера ещё до вызова SwaggerModule.createDocument().
Результат OpenAPI не отличается
SwaggerModule видит ровно те же метаданные, что и при декораторах, написанных прямо в контроллере.
Это не плагин к Swagger. Это весь инструментарий.
Большинство инструментов заканчиваются на декораторах. В nestjs-docfy входят CLI, просмотрщик и интеграция с ИИ, то есть всё, чем команда реально удержит документацию в актуальном состоянии.
CLI, которая стережёт ваш CI
generate, check, coverage --min, lint и patch-spec роняют сборку в тот момент, когда документация разошлась с кодом, а не спустя полгода.
Нулевая стоимость в рантайме, если она вам нужна
Плагин CLI для webpack считает всё во время сборки. В проде на каждый запрос не выполняется ничего.
docfy-ui входит в комплект, а не продаётся отдельно
Полноценный справочник с прицелом на ИИ идёт вместе с библиотекой: без отдельного аккаунта и без отдельного тарифа.
Агенты на равных правах
docfy-mcp отдаёт ту же спецификацию в Claude, Cursor и любой клиент MCP. Ваш API становится не только читаемым, к нему можно обращаться запросами.
Подходит к той структуре NestJS, которая у вас уже есть
Простые проекты, воркспейсы Nx и монорепозитории Nest CLI определяются сами. Конфиг руками писать не придётся.
От нуля до полностью настроенного проекта одной командой
nestjs-docfy init подключает модуль, расставляет декораторы по контроллерам и генерирует документацию за один заход.