omie-mcp
omie-mcp
MCP-сервер (Model Context Protocol) для интеграции Claude с API Omie.
Позволяет Claude запрашивать и выполнять операции в ERP Omie через MCP-инструменты. В этой v1 основное внимание уделяется модулю Производственный цех (производственные заказы, структура продуктов, склад и закупка сырья) с универсальным инструментом, который уже покрывает все остальные модули Omie (Общие, CRM, Финансы, Продажи/NF-e, Услуги/NFS-e, Панель бухгалтера).
Настройка
Установите зависимости:
pnpm installМенеджер пакетов этого репозитория — pnpm (workspace). Не запускайте
npm installилиnpm runв корне. Единственное намеренное исключение — запускnpm test/npm run buildиз каталогаpackages/omie-data.devDependency
viteв корне не используется ни одним кодом — она существует только для фиксации разрешения peer-зависимостиvitest. Без неё pnpm разрешалvite@5, несовместимый сvitest@4(который требуетvite ^6 || ^7 || ^8), и весь набор тестов падал при запуске. Не удаляйте её как «осиротевшую зависимость» — ни один тест не поймает это удаление.Скопируйте
.env.exampleв.envи заполните App Key и App Secret Omie (полученные на https://developer.omie.com.br/my-apps/):cp .env.example .envСкомпилируйте:
pnpm run buildЗарегистрируйте сервер в вашем MCP-клиенте (например, Claude Desktop / Claude Code), указав
dist/index.js, с переменными окруженияOMIE_APP_KEYиOMIE_APP_SECRET.Пример конфигурации (
claude_desktop_config.jsonили эквивалент):{ "mcpServers": { "omie": { "command": "node", "args": ["/caminho/completo/para/omie-mcp/dist/index.js"], "env": { "OMIE_APP_KEY": "sua_app_key", "OMIE_APP_SECRET": "seu_app_secret" } } } }
Локальный HTTP API (необязательно, для использования из собственного фронтенда/бэкенда)
Помимо MCP-сервера (stdio, для Claude), существует второй транспорт —
src/httpServer.ts — который предоставляет те же инструменты (allTools +
handleToolCall, тот же реестр MCP) в виде простого REST API для тех,
кто хочет создать фронтенд или другой бэкенд, использующий эту логику без
протокола MCP.
Требуется API-ключ: сгенерируйте его с помощью pnpm run gerar-api-key, поместите в
HTTP_API_KEY в .env — без него сервер откажется запускаться. Каждый маршрут требует
заголовок Authorization: Bearer <HTTP_API_KEY> (без него возвращается 401). Пока
слушает только на 127.0.0.1; API-ключа достаточно на этом этапе (локальный,
однопользовательский) — но его недостаточно, если это когда-нибудь будет открыто наружу.
Два дополнительных уровня защиты:
Ограничение частоты запросов — не более 120 запросов в минуту (фиксированное окно); сверх этого отвечает
429.Подтверждение деструктивных операций — инструменты, которые добавляют, изменяют или удаляют данные в Omie (
omie_op_incluir/alterar/excluir,omie_estoque_ajuste_incluir,omie_requisicao_compra_incluir,omie_pedido_compra_incluirи любые вызовы черезomie_chamar_api, чейcallначинается сIncluir/Alterar/Excluir/Cancelar/Deletar), требуют"confirmar": trueв полезной нагрузке, иначе отвечают400— предотвращает случайные деструктивные вызовы (баговый скрипт, цикл и т. д.).
pnpm run gerar-api-key # gera a chave e mostra a linha pra colar no .env
pnpm run dev:http # desenvolvimento (tsx)
pnpm run start:http # produção (build + node dist/httpServer.js)GET /tools— выводит список всех доступных инструментов (имя + описание). Передайте?schema(например:/tools?schema), чтобы также получить JSON Schema полезной нагрузки каждого инструмента.GET /tools/<nome>/schema— JSON Schema полезной нагрузки ОДНОГО конкретного инструмента (поля, типы, обязательные поля, описание каждого) — полезно для фронтенда, чтобы сформировать правильную форму/полезную нагрузку без угадывания.GET /tools/<nome>?campo=valor&outroCampo=valor— вызывает инструмент напрямую через URL (можно тестировать в браузере, без Postman/curl). Каждое значение строки запроса интерпретируется как JSON, когда это возможно (true,123,"texto"), иначе остаётся строкой.POST /tools/<nome>— вызывает инструмент; тело запроса (JSON) — это полезная нагрузка инструмента. Предпочтительно для больших/вложенных полезных нагрузок (например, массивов вcodigos_conta_corrente).
Примеры:
# ver o payload esperado por uma ferramenta
curl -H "Authorization: Bearer $HTTP_API_KEY" http://127.0.0.1:3939/tools/omie_fluxo_caixa_gerar/schema
# chamar direto pela URL (também funciona colado na barra do navegador)
curl -H "Authorization: Bearer $HTTP_API_KEY" "http://127.0.0.1:3939/tools/omie_familias_listar?pagina=1®istros_por_pagina=5"
# chamar via POST (corpo JSON)
curl -H "Authorization: Bearer $HTTP_API_KEY" -X POST http://127.0.0.1:3939/tools/omie_fluxo_caixa_gerar \
-H "Content-Type: application/json" \
-d '{"data_inicio":"01/07/2026","data_fim":"31/07/2026","agrupamento":"dia"}'⚠️ Только для локального использования. Слушает на
127.0.0.1(не принимает подключения извне машины), без аутентификации, без проверки источника. Не открывайте этот порт за пределы машины/локальной сети до добавления аутентификации — то же предупреждение о безопасности, что и о превращении omie-mcp в удалённый коннектор (см. раздел о безопасности). Замысел такой: использовать локально сейчас для разработки, а переносить на по-настоящему открытый сервис только после реализации минимальной безопасности (аутентификация, валидация входных данных).
Архитектура
Существует два формата модулей, выбираемых по необходимости:
Passthrough (плоский) —
src/tools/<modulo>.ts, массивToolDef, который сопоставляет 1:1 сresource+callOmie, без собственной логики. Используйте, когда Omie уже возвращает данные в том виде, который нужен пользователю (в большинстве случаев).Многослойный модуль —
src/modules/<modulo>/, сapplication/use-cases,infrastructure/gatewaysиpresentation/mcp. Используйте, когда API Omie не отдаёт данные в готовом виде — например, вestoqueнет «общего остатка продукта», только позиция по складу (с постраничной навигацией); use-case получает всё и суммирует. В этом случае бизнес-логика (пагинация, фильтрация, агрегация) не может жить внутриOmieClient(который является общим) или в определении инструмента (которое является лишь метаданными MCP).
В обоих форматах ToolDef (src/tools/types.ts) — это общий контракт:
PassthroughToolDef (resource/call) или UseCaseToolDef (пользовательский execute).
src/tools/registry.ts объединяет все модули в единый массив (allTools) и
решает, каким путём следовать; src/index.ts только перебирает этот массив и регистрирует каждый
инструмент на MCP-сервере — добавление нового модуля не требует изменения
index.ts, достаточно создать модуль и импортировать его в реестр.
src/
omieClient.ts # cliente HTTP genérico (auth, retries, throttle) — nunca tem regra de negócio
index.ts # bootstrap do servidor MCP (stdio), registra allTools + genérica
httpServer.ts # bootstrap do servidor HTTP (local, opcional) — mesmo allTools + genérica
tools/
types.ts # ToolDef (Passthrough | UseCase), helper defineTool()
registry.ts # agrega os módulos e expõe handleToolCall()
generic.ts # ferramenta omie_chamar_api (fallback p/ qualquer endpoint)
compras.ts # passthrough: Requisição e pedido de compra
modules/
ordemProducao/ # módulo em camadas (cruza com produtos/)
application/
use-cases/ # ex: listar OPs já com descrição do produto
dto/
infrastructure/
gateways/
presentation/
mcp/
ordemProducao-register.ts
index.ts
estoque/ # módulo em camadas (tem lógica própria)
application/
use-cases/ # regra de negócio (ex: somar estoque entre locais)
dto/ # schemas zod + tipos de entrada/saída do use-case
infrastructure/
gateways/ # isola as chamadas Omie específicas do módulo
presentation/
mcp/ # definição das ToolDefs expostas via MCP
estoque-register.ts # agrega as tools do módulo
index.ts # barrel export
produtos/ # módulo em camadas (mesma estrutura, cruza com estoque/)
application/
use-cases/ # ex: listar produtos com quantidade/valor em estoque
dto/
infrastructure/
gateways/
presentation/
mcp/
produtos-register.ts
index.ts
pedidoVenda/ # módulo em camadas
application/
use-cases/ # ex: produtos que precisam ser separados p/ despacho
dto/
infrastructure/
gateways/
presentation/
mcp/
pedidoVenda-register.ts
index.ts
clientesFornecedores/ # módulo em camadas (gateway reutilizável por outros módulos)
infrastructure/
gateways/
presentation/
mcp/
clientesFornecedores-register.ts
index.ts
contasCorrentes/ # módulo em camadas (gateway reutilizável, mesmo padrão de clientesFornecedores)
infrastructure/
gateways/
presentation/
mcp/
contasCorrentes-register.ts
index.ts
fluxoCaixa/ # módulo em camadas (cruza com contasCorrentes/)
application/
use-cases/ # agrega lançamentos em fluxo de caixa por dia/mês/conta
dto/
infrastructure/
gateways/
presentation/
mcp/
fluxoCaixa-register.ts
index.ts
contasPagar/ # módulo em camadas (resolve nome do fornecedor via clientesFornecedores)
application/
use-cases/
dto/
infrastructure/
gateways/
presentation/
mcp/
contasPagar-register.ts
index.ts
contasReceber/ # módulo em camadas (resolve nome do cliente via clientesFornecedores)
application/
use-cases/
dto/
infrastructure/
gateways/
presentation/
mcp/
contasReceber-register.ts
index.tsМногослойные модули могут зависеть от шлюза другого модуля, когда отчёт пересекает два домена (например,
produtosиспользуетEstoqueOmieGatewayизestoqueдля расчёта стоимости запасов по продукту;ordemProducaoиспользуетProdutosOmieGatewayизprodutosдля разрешения описаний ПЗ) — это явная зависимость между модулями, а не дублирование кода доступа к Omie.
Доступные инструменты
Полная техническая справка (название каждого инструмента, параметры по одному, какие из них деструктивные, и общие ограничения):
docs/FERRAMENTAS.md, генерируется автоматически из кода с помощьюpnpm run doc-ferramentas. Разделы ниже сосредоточены на бизнес- контексте и выводах каждого модуля (почему); сгенерированный — на том, что (схема).
Навык Claude Code (
.claude/skills/omie-skill/): та же техническая справка, но разбитая на кэш по модулям (cache/*.md+cache/_index.md), чтобы Claude обращался только к нужному модулю, а не ко всемуFERRAMENTAS.mdцеликом — экономит токены контекста при использовании инструментовomie_*. Кэш создаётся командой (pnpm run skill-cacheили/omie-skill:atualizar-cacheв чате), не автоматически; подробности см. в.claude/skills/omie-skill/SKILL.mdи в.claude/commands/omie-skill/для терминальных команд (/omie-skill:guia,/omie-skill:atualizar-cache,/omie-skill:verificar-cache). Также есть команды, которые вызывают реальный API и возвращают уже отформатированный результат (не сырой JSON) для некоторых модулей:/omie-skill:estoque,/omie-skill:produtos,/omie-skill:op,/omie-skill:estrutura,/omie-skill:pedidos.
Универсальный фильтр (
filtros): несколько инструментов «обогащённого» списка (которые уже разрешают имена клиентов/продуктов и т. д.) принимают необязательный параметрfiltros: список критериев{ campo, operador, valor }, применяемый к ЛЮБОМУ полю результата, даже к тем, которые Omie изначально не фильтрует (src/shared/filtro.ts). Операторы:igual,diferente,contem(игнорирует регистр/диакритику),maior_que,menor_que,entre(valor: [min, max]). Поддерживаются вложенные поля через dot-path (например,cliente.razaoSocial). Все критерии должны совпадать (И). Дополняет, а не заменяет собственные фильтры каждой конечной точки (семейство, этап, дата и т. д.), которые по-прежнему предпочтительны, когда существуют, — они выполняются на сервере Omie, без необходимости перелистывать всё перед фильтрацией.
Производственный заказ (src/modules/ordemProducao/)
omie_op_incluir/omie_op_alterar/omie_op_excluir/omie_op_consultar— use-case (первые 3 деструктивные), CRUD поверхIOrdemProducaoGateway, тестируется черезOpFakeGatewayбез обращения к реальной Omie. Внимание: проверено вживую (полный цикл с одноразовым продуктом/сырьём/ структурой), что продукт принимает ПЗ только если уже заполнена структура (спецификация), и чтоcodigo_local_estoqueобязателен даже при простом добавлении (0 = склад по умолчанию), несмотря на то, что публичная документация Omie помечает его как необязательныйomie_op_listar— passthrough, выводит список сырых ПЗ (продукт только как код, этап как сырой код)omie_op_listar_com_produto— use-case: выводит список ПЗ с уже разрешёнными описанием/SKU продукта (переиспользуетProdutosOmieGatewayиз модуляprodutos) и полемconcluida(true/false, надёжное) в дополнение к сыромуetapaCodigo
Этап (
cEtapa) ПЗ — это код канбана, настраиваемый для каждого аккаунта (от 3 до 6 фаз, названия задаются самим пользователем в Omie), и у API нет конечной точки для перевода кода в название фазы — поэтому инструменты и не пытаются его интерпретировать, а только предоставляют полеconcluida(производное отcConcluida, которому можно доверять) и сырой код для тех, кто уже знает значение этапов в своём аккаунте.
Продукты (src/modules/produtos/)
omie_produtos_consultar— passthrough, карточка конкретного продуктаomie_produtos_listar— passthrough, выводит список продуктов (полеquantidade_estoqueНЕ надёжно, всегда приходит 0). Принимаетfiltrar_apenas_familia(код семейства, найден при тестировании WSDL — не документировано на справочной странице) для ограничения семейством продуктов. Также принимаетfiltrar_apenas_descricao("%texto%"= содержит,"texto%"= начинается с и т. д.) для поиска по названию без перелистывания всегоomie_produtos_incluir/omie_produtos_alterar/omie_produtos_excluir— use-case (деструктивные), по тому же шаблону шлюз+интерфейс+фейк+тест, что и остальные методы модуля (IProdutosGateway.incluirProduto/alterarProduto/excluirProduto) — тестируется черезProdutosFakeGatewayбез обращения к реальной Omie. Внимание: проверено вживую (цикл создать→изменить→удалить), чтоcodigo(SKU) обязателен вIncluirProduto, даже если публичная документация Omie помечает его как необязательныйomie_familias_listar— passthrough, семейства продуктовomie_produtos_listar_com_estoque— use-case: выводит список продуктов с уже рассчитанными количеством и стоимостью запасов (продажа и средняя себестоимость), сопоставляя карточку продукта с позицией склада по всем местам хранения (переиспользуетEstoqueOmieGatewayиз модуляestoque). Также принимаетfiltrar_apenas_familia— фильтрует по семейству и сразу возвращает рассчитанные запасы одним вызовом
Структура продуктов (src/modules/estrutura/)
omie_estrutura_listar— сценарий использования: выводит товары, у которых заведена структура (BOM/технологическая карта), уже с названием товара и каждого входящего компонента (Omie возвращает это готовым вListarEstruturas, ресурсgeral/malha— связываться с карточкой товаров не нужно)omie_estrutura_buscar_por_produto— сценарий использования: находит структуру товара по названию/описанию (или его фрагменту) либо по коду, не зная заранее внутренний код Omie — например: «какая структура у товара 100kg». Прогоняет весьListarEstruturasцеликом и фильтрует на стороне клиента (у Omie нет текстового поиска в этом endpoint)omie_estrutura_incluir/omie_estrutura_alterar/omie_estrutura_excluir— сценарий использования (разрушающие), CRUD позиций структуры (IEstruturaGateway.incluirItensEstrutura/alteraItensEstrutura/excluirItemEstrutura), который можно тестировать черезEstruturaFakeGatewayбез обращения к реальной Omie. Внимание: проверено вживую (round-trip включить → изменить → удалить на временном одноразовом товаре), что родительский товар должен быть типа '03 - Produto em Processo"ou '04 - Produto Acabado(принято), чтоintMalhaобязательно вIncluirEstrutura(публичная документация помечает его как опциональный) и чтоAlterarEstrutura/ExcluirEstruturaтребуютidProdMalhaвместе сidMalha.
Склад (src/modules/estoque/)
omie_estoque_ajuste_incluir/omie_estoque_ajuste_excluir— сценарий использования (разрушающие), CRUD корректировки черезIEstruturaGateway.incluirAjuste/excluirAjuste, тестируется черезEstoqueFakeGatewayбез обращения к реальной Omie. Внимание, важная находка при живом тесте: полеmotivoпринимает только'INI'/'INV'/'OPE'/'PDV'(не описано в публичной документации, появляется только в ошибке валидации Omie); и после ЛЮБОЙ корректировки остатков по товару этот товар уже никогда нельзя удалить — в Omie остаётся постоянное «Movimento de Estoque (calculado)», связанное с ним, даже если сама корректировка потом удалена.omie_estoque_movimentos_listar— транзитный вызов, список движений за периодomie_estoque_total_produto— сценарий использования: суммирует физический остаток товара по всем складам, поскольку Omie отдаёт доступ только по конкретному месту
omie_estoque_consultar(ConsultarEstoque) удалена: мы её протестировали, и такого метода не существует в актуальном API Omie (возвращаетMethod "ConsultarEstoque" not exists).
Заказ на продажу (src/modules/pedidoVenda/)
omie_pedido_venda_consultar/omie_pedido_venda_incluir/omie_pedido_venda_alterar/omie_pedido_venda_excluir— сценарий использования (последние три — разрушающие), CRUD надIPedidoVendaGateway, тестируется черезPedidoVendaFakeGatewayбез обращения к реальной Omie. Внимание: проверено вживую (полный round-trip с одноразовым клиентом и товаром) — у клиента в карточке должен быть заполнен штат UF, иначе Omie отклонит заказ, аcodigo_categoria/codigo_conta_corrente, обязательные даже в простом заказе.omie_pedido_venda_listar— транзитный вызов, список заказов (принимает встроенный фильтр Omieetapa)omie_pedido_venda_etapas_listar— транзитный вызов, каталог этапов выставления (канбан продаж/обслуживания/закупок) с кодом и описанием — в отличие от этапа OP, здесь этап фиксирован и документированomie_pedido_venda_produtos_para_separar— сценарий использования: список товаров, которые нужно отделить со склада для отправки (заказы на запрошенной этапе «Separar Estoque», обычно код20), при этом отменённые уже исключаются и возвращается сводка, сгруппированная по товару (общее количество, в каком количестве заказов)omie_pedido_venda_listar_com_cliente— сценарий использования: список заказов уже с именем клиента (переиспользуетClientesOmieGatewayиз модуляclientesFornecedores), этапом по полному наименованию и позициями заказа (товар/SKU/описание/количество/единица) в виде логического статусаcancelado/faturadoи общей суммой заказа. Необязательный фильтрetapa_codigo(без него возвращаются все этапы — не отфильтрованы отменёнными по умолчанию, в отличие от инструмента выше)omie_pedido_separar_estoque_listar— сценарий использования: короткий доступ к самому просматриваемому отчёту на текущий момент — в том же формате, что иome_pedido_venda_listar_com_cliente, но с фиксированнымetapa_codigo«Separar Stock» и отменёнными по умолчанию исключёнными (параметрincluir_canceladosпросматривает также отменённые). Внутри используетListarPedidosComClienteUseCase.
Важная находка при тестировании: отменённые заказы не сбрасывают
etapaв Omie — отменённая заявка продолжает отображаться как «Separar-заказ», если была отменена на этой фазе. Поэтомуomie_pedido_venda_produtos_para_separarвсегда сверяетinfoCadastro.cancelado, перед тем как считать заказ действительно отменённым;omie_pedido_venda_listar_com_clienteже — это общая выборка, которая просто отображаетcancelado, чтобы вызывающий решил, что делать с этим дальше.
Клиенты и поставщики (src/modules/clientesFornecedores/)
В Omie клиент и поставщик — это ОДНА карточка (
geral/clientes), различаются только поtag(Cliente,Fornecedor,Colaborador,Sócios, и их может быть несколько) — отдельного эндпоинтаgeral/fornecedoresнет.
omiae_clientes_consultar— транзитный вызов, один клиент/поставщик (юр. название, фантазийное название, CNPJ/CPF, контакт, адрес, теги)omiae_clientes_listar— транзитный вызов, список клиентов/поставщиков; есть расширенный фильтр черезclientesFiltro(например,{"tags": [{"tag": "Fornecedor"}]})omiae_fornecedores_listar— облегчённый сценарий: ярлык кomiae_clientes_listar, уже отдельный фильтр по тегуFornecedor, с поиском по юр./фантазийному имени/CNPJ-CPF иapenas_ativos(удаляет неактивных на клиенте, потому чтоclientesFiltro.tagsне сочетается с фильтром по статусу в одном вызове напрямую)omiae_clientes_incluir/omiae_clientes_alterar/omiae_clientes_excluir— сценарий (разрушающие), CRUD черезIClientesGateway.incluirCliente/alterarCliente/excluirCliente, тестируется черезClientesFakeGatewayбез реальной Omie. Внимание: проверено живьём (round-trip создать→изменить→удалить) — обязательностьcodigo_cliente_integracaoвIncluirClienteдаже при указании опционального в публичной документации
Текущий охват: только чтение (консультация/список). По запросу пользователя полный CRUD (включение, изменение, удаление) остаётся на потом — после того как у MCP появится минимальная защита (см. раздел про квоты/безопасность и
src/httpServer.ts).
Текущие счета (src/modules/contasCorrentes/)
om_contas_correntes_listar— транзитный вызов, список текущих счетов (банки, кассы, карты, эквайринговые терминалы) с кодом, описанием, банком, типом и начальным зарегистрированным остаткомom_extrato_conta_corrente_consultar— сценарий использования: выписка по текущему счёту за указанный период (операции с датой/описанием/суммой/категорией/состоянием сверки и остатками: предыдущий/текущий/инн/конко/доступный). Метод Omie:ListarExtrato(ресурсfinancas/extrato), тестируется черезContasCorrentesFakeGatewayбез обращения к реальной Omie. Принимает общий параметрfiltrosпо операциям (например, замысел, категория). Проверено вживую на реальном счёте.
Денежный поток (src/modules/fluxoCaixa/)
omie_fluxo_caixa_gerar— сценарий использования: собирает денежный поток (поступления, оттоки, остаток за период и накопленным) в табличном виде, группируя по дням или месяцам и по счёту. Готового отчёта в Omie нет — толькоfinancas/mfListarMovimentos: проводка за проводкой по счетам к оплате/к получению, постранично по 100 записей — поэтому этот инструмент тянет все операции периода, разделяет выполненные (уже поступления/выплаты, по дате платежа) и планируемые (в работе/не погашённые, по дате срока, с исключением отменённых), и агрегирует всё, подставляя имя связанного счёта (изContasCorrentesOmGatewayмодуляcontasCorrentes). Формат подобран так, чтобы его можно было потом выгружать в таблицу. По умолчанию (apenas_favoritas: true) ограничивается избранными счетами пользователя (src/modules/fluxoCaixa/application/contas-favoritas.ts: Cartão NuBank, Stone, Banco do Brasil, Wix, iFood, Sicoob, Itaú, Cartão Elo LEANDRO, Amazon, CAIXA LOJAS — остальные ~39 счетов, заведённых в Omie, например старые карты и отдельные эквайры, остаются в стороне); используйтеapenas_favoritas: false, чтобы увидеть все счета, илиcodigos_conta_correnteдля своего списка.
Реальный остаток (опция,
usar_saldo_real: true): по silent default накопленный остаток — это только сумма изменения за период, указанный в запросе, а не фактический банковский остаток — Salário через API исторического дневного остатка по каждому счёту Omie не отдаёт. Приusar_saldo_real: trueинструмент привязывает расчёт кsaldo_inicial/saldo_data, указанным по каждому счёту (черезomie_contas_correntes_listar): суммирует операции, проведённые междуsaldo_dataи началом периода, и даётsaldoRealAcumulado, близкое к фактическому банковскому остатку, — это не жёстокосвязанное значение в MCP, оно считывается из карточки Omа, поэтому когда кто-то там введёт реальный остаток по счёту (например, 01/01), расчёт уже автоматически станет учитывать это без изменений в коде. Если счёт без заданныхsaldo_data/saldo_inicial(илиsaldo_dataпозже начала периода), выдаётsaldoRealAcumulado: nullвместо «изобретённого» числа. За этим расчётом добавляется нулевое учреждение (операции между самой раннейsaldo_dataсреди счетов и началом периода) — может быть медленно, еслиsaldo_dataв далёком прошлом.Важная находка при тестировании: Omie отклоняет два параллельных вызова одного и того же метода (ошибка "Já existe uma requisição desse método em execução"), даже если параметры разные — поэтому проходы сделанных и планируемых (оба используют
ListarMovimentos) в сценарий внутри выполняются последовательно, а не параллельно. Это дополнительное ограничение помимо rate limit в следующем разделе, специально для параллельных вызовов одногоcall.Длинные периоды дают очень много страниц (например, только поступления за ~3 недели уже превысили 3.700 записей) — предпочтительнее периоды до ~3 месяцев за вызов.
Счета к оплате (src/modules/contasPagar/)
omie_contas_pagar_listar— сценарий использования: список записей изfinancas/contapagar(ListarContasPagar) уже с подстановкой имени поставщика (используется модульclientesFornecedores—ClientesOmieGateway, так как Omie возвращает только код), суммой, датой уплаты, состоянием (PAGO/ABERTO/VENCIDO по счёту), фискальным полем, категорией и комментарием. Паджин, необязательный фильтрdata_fluxo_de/data_fluxo_ate.
Счета к получению (src/modules/contasReceber/)
omie_contas_receber_listar— use-case: список записей изfinancas/contareceber(ListarContasReceber) уже с разрешённым именем клиента (переиспользуетClientesOmieGatewayиз модуляclientesFornecedores), сумма, дата погашения, статус (PAGO/ABERTO/VENCIDO), фискальный документ, номер заказа и категория. С пагинацией, с необязательным фильтромdata_alteracao_de/data_alteracao_ate.omie_contas_receber_boleto_gerar/omie_contas_receber_boleto_obter/omie_contas_receber_boleto_prorrogar/omie_contas_receber_boleto_cancelar— use-case (генерация/пролонгация/отмена деструктивные), CRUD банковского билета по счёту к получению (financas/contareceberboleto:GerarBoleto/ObterBoleto/ProrrogarBoleto/CancelarBoleto), тестируемый черезContasReceberFakeGatewayбез обращения к реальной Omie. Внимание: проверено вживую, что этот аккаунт Omie не имеет настроенного банковского соглашения/билета —ProrrogarBoletoвозвращает "Não temos suporte para geração da remessa de pagamento para o banco -sem instituição-";GerarBoletoвероятно завершится ошибкой по той же причине (не тестировалось вживую, чтобы не создавать реальный билет по счёту клиента из продакшена).ObterBoleto/CancelarBoletoбыли проверены вживую (безопасно возвращают "nenhum boleto gerado", без побочных эффектов).
Важная находка при тестировании: параметр фильтра по дате Omie в этих двух конечных точках (
filtrar_por_data_de/filtrar_por_data_ate) фильтрует по дате последнего изменения записи (info.dAlt), а не по дате погашения — подтверждено запросом диапазона в 1 день и сравнением сdata_vencimentoвозвращённых записей (разные даты погашения,dAltвсегда в пределах запрошенного диапазона). Поэтому инструменты MCP выставляют параметр какdata_alteracao_de/data_alteracao_ate(неdata_vencimento_de/ate), чтобы не предполагать поведение, которого нет в API. Не существует (проверено) нативного фильтра по дате погашения в этих двух конечных точках — для этого используйте `omie_fluxo_ca
omie_servico_incluir/omie_servico_alterar/omie_servico_excluir/omie_servico_consultar/omie_servico_listar— use-case (первые 3 деструктивные), CRUD кадастра услуг (servicos/servico), тестируемый черезServicoFakeGatewayбез обращения к реальной Omie. Внимание, находка при живом тестировании:AlterarCadastroServicoтребует код, вложенный вintEditar, а не вcabecalho, как казалось бы естественным — в публичной документации это не отражено.omie_os_incluir/omie_os_alterar/omie_os_excluir/omie_os_consultar/omie_os_listar— use-case (первые 3 деструктивные), CRUD заказа на услуги (servicos/os), тестируемый черезOrdemServicoFakeGatewayбез обращения к реальной Omie. Внимание, важные находки при живом тестировании: (1) каждый элемент требуетcodigo_servico_municipal/codigo_servico_lc116— код, уже зарегистрированный в таблице LC116 (см.omie_servicos_lc116_listar), а не произвольный текст — иначе Omie отклоняет запрос с сообщением «Código da LC116 não cadastrada»; (2)cRetemISSобязателен в каждом элементе, даже если он не помечен как обязательный в публичной документации; (3) у клиента в шапке должно быть заполнено поле UF (то же требование, что и в заказе на продажу). Проверено при живом тестировании с полным безопасным циклом создания и удаления (использовался одноразовый тестовый клиент, созданный и удалённый без следов).omie_os_listar— use-case: список NFS-e (счёт-фактура на услуги;servicos/nfse,ListarNFSEs), тестируемый черезNfseFakeGateway. ТОЛЬКО ЧТЕНИЕ — то же правило, что и для модуля NF-e по товарам (налоговый документ, имеющий юридическую силу; безопасная выписка невозможна).omie_servicos_lc116_listar— use-case: возвращает 255 допустимых кодов Дополнительного закона 116 (классификация услуг), используется для определения правильного кода перед созданием заказа на услуги. Метод Omie: ListarLC116 (ресурсservicos/lc116).
Вне рамок этого цикла (не запрошено, низкий приоритет): периодический контракт на услуги (
servicos/contrato) и пакетное выставление счетов по ОУ/контракту (servicos/osp,servicos/oslote,servicos/contratofat,servicos/contratolote) — реализовать только когда понадобится пользователю.
Закупки (src/modules/compras)
omie_pedido_compra_incluir/omie_pedido_compra_alterar/omie_pedido_compra_excluir/omie_pedido_compra_consultar/omie_pedido_compra_listar— use-case (первые 3 деструктивные), полный CRUD черезIPedidoCompraGateway(produtos/pedidocompra), тестируемый черезPedidoCompraFakeGatewayбез обращения к реальной Omie. Внимание, важные находки при живом тестировании: (1)nCodConta(передаётся какcodigo_conta_corrente) требует код расчётного счёта (geral/contacorrente), а не департамента/подразделения, несмотря на название — Omie отклоняет с ошибкой «Conta corrente não cadastrada», если использовать не то; (2)PesquisarPedidoCompraпо умолчанию скрывает ВСЕ заказы — нужно явно запрашивать каждый статус (lExibirPedidosPendentes/Faturados/Recebidos/Cancelados/RecParciais/FatParciais, все'S'), что gateway уже делает всегда; (3) когда на странице нет записей, Omie возвращает ошибку (SOAP-ENV:Client-5113) вместо пустого списка — в gateway это нормализовано, возвращается пустой список.omie_requisicao_compra_incluir/omie_requisicao_compra_alterar/omie_requisicao_compra_excluir/omie_requisicao_compra_consultar/omie_requisicao_compra_listar— use-case (первые 3 деструктивные), полный CRUD черезIRequisicaoCompraGateway(produtos/requisicaocompra), тестируемый черезRequisicaoCompraFakeGatewayбез обращения к реальной Omie. Внимание, находка при живом тестировании: в отличие от других эндпоинтов, поляIncluirReq/AlterarReqпередаются в корне запроса, а не внутри обёрткиrequisicaoCadastro: {...}, как указано в публичной документации (Omie отклоняет запрос с XML, если использовать обёртку из документации). Проверено при живом тестировании.
Generic (src/tools/generic.ts)
omie_chamar_api— принимаетresource(путь конечной точки) иaction(метод), позволяя вызывать любой ресурс и метод Omie без изменения кода. ATTENTION: ответ может быть строкой (не JSON) для операций без возвращаемого значения;OmieClientвозвращает в этом случае{ success: true }.
Диагностика (src/tools/diagnostics.ts)
omie_diagnostics_estado— внутренний инструмент: возвращает сводку по заданнымclient_id/client_secretбез вызова Omie: список избранного (можно листовым обходом черезnavegarполучить13/todo), максимальный HTTP-размер тела запроса и сведения о зарегистрированных инструментах. Полезен, чтобы понять, почему конечная точка не работает, — проблемы обычно связаны с отсутствием доступа к API или неправильными настройками приложения.
Примечание: модуль услуг имеет право на существование рядом с модулем «Товары» (
produtos/), потому что в Omie это независимые модули с независимой аутентификацией (app key/secret), и распространённая конфигурация интеграции включает в себя «Товары/услуги» вместе. Стоимость поддержки минимальна (несколько файлов), и он закрывает интеграцию без необходимости двух разных MCP-серверов.
Общие услуги (servicos/)
Подробности в секции выше. Вкратце: локальная таблица 255 кодов LC116 (только чтение, кэшируется, без вызовов Omie) для валидации codigo_servico_municipal/codigo_servico_lc116; внесение услуг основано на LC116; заказ на услуги (OS) всегда требует codigo_servico_municipal/codigo_servico_lc116 как действительный код LC116 (не свободный текст), а также cRetemISS, клиента с заполненным UF. Проверено на живом аккаунте путём цикла создания-изменения-запроса-удаления.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Hosted Amazon Seller Central and Amazon Ads MCP server for Claude, ChatGPT, Cursor, and agents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Walessonrdreis/omie-mcp-v1.0'
If you have feedback or need assistance with the MCP directory API, please join our Discord server