OpenMonetis MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@OpenMonetis MCP show me my spending by category last month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
openmonetis-mcp
Servidor MCP para o OpenMonetis. Permite que agentes de IA leiam e alterem seus dados financeiros conversando com a API oficial do OpenMonetis — sem acesso direto ao banco e sem duplicar regra de negócio.
Cliente HTTP puro da API pública do OpenMonetis (
/openapi.jsoné o contrato).Autenticação por sessão Better Auth (
email+senha), com renovação automática em401.75 ferramentas de leitura e escrita, com dry-run obrigatório nas alterações (14 no perfil
core).Dois transportes:
stdio(local) e Streamable HTTP (remoto, protegido por bearer token).
Como funciona
cliente MCP ──stdio/HTTP──▶ openmonetis-mcp ──HTTP + cookie──▶ API do OpenMonetisNo primeiro uso o servidor faz
POST {OPENMONETIS_URL}/api/auth/sign-in/emailcomOPENMONETIS_EMAIL/OPENMONETIS_PASSWORDe mantém o cookie de sessão em memória.Se a API responder
401, a sessão é renovada uma única vez e a requisição é repetida.Toda resposta é desembrulhada do envelope
{ "data": ..., "error": null }da API.
O servidor nunca lê o banco, nunca importa código do OpenMonetis e nunca imprime credenciais.
Related MCP server: OpenBudget MCP Server
Instalação
# direto do GitHub
npx -y github:Welington98/openmonetis-mcp
# ou a partir do código
git clone git@github.com:Welington98/openmonetis-mcp.git
cd openmonetis-mcp
pnpm install
pnpm build
node dist/index.jsCofre de credenciais (recomendado)
Em vez de espalhar e-mail e senha no JSON de cada cliente MCP, guarde-os uma vez no cofre local:
npx -y github:Welington98/openmonetis-mcp auth set
# URL do OpenMonetis: https://financas.exemplo.com/api-proxy
# E-mail: voce@exemplo.com
# Credencial de voce@exemplo.com (não será exibida): ********
# Login validado. Guardado em: Keychain do macOS.O login é validado antes de salvar — se a credencial estiver errada, nada é gravado.
Comando | O que faz |
| Valida o login e grava URL, e-mail e credencial |
| Modo não-interativo (systemd, Docker, CI): lê o segredo do stdin |
| Mostra o cofre em uso e a origem efetiva das credenciais, sem revelar o segredo |
| Remove o que está guardado |
Onde fica:
Plataforma | Backend |
macOS | Keychain ( |
Linux |
|
Fallback |
|
Precedência: OPENMONETIS_EMAIL/OPENMONETIS_PASSWORD do ambiente sempre ganham do cofre. Com o
cofre preenchido, os exemplos de cliente abaixo podem omitir essas duas variáveis.
# provisionamento sem interação
printf '%s' "$SENHA" | openmonetis-mcp auth set \
--url=https://financas.exemplo.com/api-proxy --email=voce@exemplo.com --password-stdinConfiguração
Copie .env.example para .env e preencha pelo menos OPENMONETIS_URL e as credenciais.
Variável | Obrigatória | Padrão | Descrição |
| não |
| Raiz da instalação. Em produção use |
| sim¹ | — | E-mail da conta usada pelo agente. |
| sim¹ | — | Senha da conta. Prefira |
| não | — | Alternativa: header |
| não | origem de | Enviado como |
| não |
|
|
| não |
| Timeout por chamada à API. |
| não |
| Teto do JSON devolvido por ferramenta. Acima disso, listas são cortadas com |
| não |
| TTL do cache de leituras (GET). GETs idênticos no intervalo reaproveitam a resposta e chamadas concorrentes compartilham a requisição. Escritas invalidam o recurso alterado. |
| não |
| Tentativas extras em leituras após |
| não |
| Perfil do catálogo: |
| não | — |
|
| não |
| Diretório onde exportações e modelos de importação são gravados. |
| não |
| Força o backend do cofre: |
| não |
| Diretório do cofre quando o backend é arquivo. |
| não | — |
|
| não |
| Host do transporte HTTP. |
| não |
| Porta do transporte HTTP. |
| sim² | — | Bearer token exigido pelo transporte HTTP. |
¹ Ou defina OPENMONETIS_COOKIE.
² Obrigatório quando o host HTTP não é loopback.
Perfil de catálogo (core vs full)
full é o padrão e expõe as 75 ferramentas. core reduz o catálogo a 14 leituras
(get_dashboard_overview, get_dashboard_attention, get_dashboard_snapshot,
list_transactions, get_transaction, list_accounts, list_cards, list_invoices,
list_bills, list_budgets, list_goals, list_categories, list_tags, list_people),
que cobrem a rotina do mês sem as ferramentas avançadas nem as de escrita.
Use core quando o agente tem orçamento de contexto apertado ou quando o cliente cobra o
tools/list a cada sessão: o catálogo cai de ~78 KB (~20 mil tokens) para ~12 KB
(~3,2 mil tokens), uma economia de ~84%. Nesse perfil as instructions do servidor avisam
que o catálogo está reduzido; basta definir OPENMONETIS_MCP_TOOLS=full para reabrir tudo.
O cache e o retry são transparentes. Se precisar ver dados que acabaram de mudar, reduza
OPENMONETIS_MCP_CACHE_TTL_MS (ou use 0 para desligar o cache). Escritas sempre invalidam
o cache do recurso alterado, então o fluxo "alterar e reler" continua correto.
Qual URL usar
Cenário |
|
|
|
Docker Compose (web em 7002, proxy em |
|
Produção |
|
Clientes
Claude Desktop / Claude Code
{
"mcpServers": {
"openmonetis": {
"command": "npx",
"args": ["-y", "github:Welington98/openmonetis-mcp"],
"env": {
"OPENMONETIS_URL": "https://financas.exemplo.com/api-proxy",
"OPENMONETIS_EMAIL": "voce@exemplo.com",
"OPENMONETIS_PASSWORD": "sua-senha",
"OPENMONETIS_MCP_WRITES": "confirm"
}
}
}
}claude mcp add openmonetis \
-e OPENMONETIS_URL=https://financas.exemplo.com/api-proxy \
-e OPENMONETIS_EMAIL=voce@exemplo.com \
-e OPENMONETIS_PASSWORD=sua-senha \
-- npx -y github:Welington98/openmonetis-mcpopencode
{
"mcp": {
"openmonetis": {
"type": "local",
"enabled": true,
"command": ["npx", "-y", "github:Welington98/openmonetis-mcp"],
"environment": {
"OPENMONETIS_URL": "https://financas.exemplo.com/api-proxy",
"OPENMONETIS_EMAIL": "voce@exemplo.com",
"OPENMONETIS_PASSWORD": "sua-senha"
}
}
}
}Codex CLI
[mcp_servers.openmonetis]
command = "npx"
args = ["-y", "github:Welington98/openmonetis-mcp"]
env = { OPENMONETIS_URL = "https://financas.exemplo.com/api-proxy", OPENMONETIS_EMAIL = "voce@exemplo.com", OPENMONETIS_PASSWORD = "sua-senha" }Hermes Agent (Nous Research)
O Hermes Agent tem suporte nativo a MCP e normalmente roda
em container, então o caminho recomendado é HTTP, não stdio. Coloque o MCP na mesma rede
Docker do Hermes e aponte a URL para o nome do serviço.
1. Serviço no mesmo docker-compose.yml do Hermes
services:
openmonetis-mcp:
image: ghcr.io/welington98/openmonetis-mcp:0.2.0
restart: unless-stopped
environment:
# OpenMonetis na mesma máquina do host Docker:
OPENMONETIS_URL: http://host.docker.internal:7002/api-proxy
OPENMONETIS_ALLOW_INSECURE: "1"
OPENMONETIS_ORIGIN: http://localhost:7002
OPENMONETIS_EMAIL: demo@openmonetis.local
OPENMONETIS_PASSWORD: demo2026
OPENMONETIS_MCP_HTTP_HOST: 0.0.0.0
MCP_HTTP_TOKEN: ${OPENMONETIS_MCP_TOKEN}
# Exportações e uploads precisam de volume próprio (ver "Arquivos locais")
OPENMONETIS_EXPORT_DIR: /data/exports
volumes:
- ./openmonetis-exports:/data/exports
extra_hosts:
- "host.docker.internal:host-gateway"Se o OpenMonetis for público em HTTPS, use OPENMONETIS_URL: https://seu-dominio/api-proxy e remova
OPENMONETIS_ALLOW_INSECURE e OPENMONETIS_ORIGIN.
2. Token no .env do projeto do Hermes
OPENMONETIS_MCP_TOKEN=$(openssl rand -hex 32)3. hermes-data/config.yaml
mcp_servers:
openmonetis:
url: "http://openmonetis-mcp:7317/mcp"
headers:
Authorization: "Bearer ${OPENMONETIS_MCP_TOKEN}"
timeout: 120 # export, importação e diagnóstico podem passar dos 20s padrão
lazy: true # registra as ferramentas pelo cache e conecta no primeiro uso
tools:
include:
- get_dashboard_overview
- get_dashboard_attention
- list_transactions
- get_transaction
- list_accounts
- list_bills
- list_invoices
- list_budgets
- list_goals
- list_categories
- list_people
- get_financial_distribution
- get_category_trends
- list_commitments
- create_transaction
- settle_transactions
- export_transactions${OPENMONETIS_MCP_TOKEN} é resolvido por Hermes a partir de ~/.hermes/.env; no container, esse
arquivo fica em hermes-data/.env.
4. Aplicar e verificar
hermes mcp test openmonetis # testa conexão e lista as ferramentas
# em uma sessão aberta:
/reload-mcpO Hermes registra cada ferramenta com o prefixo do servidor: list_transactions aparece como
mcp_openmonetis_list_transactions. O hermes gateway run também recarrega sozinho quando o
config.yaml muda (cerca de um minuto).
Escolha do filtro de ferramentas
Estratégia | Config | Quando usar |
Whitelist (acima) |
| Uso diário: menos schema por chamada, menos ruído |
Tudo liberado | omita | Exploração: as 75 ferramentas disponíveis |
Tudo menos destrutivas |
| Cobertura ampla sem |
tools:
exclude:
- delete_transaction
- delete_attachment
- delete_inbox_rule
- delete_import_batch
- revoke_person_connection
- delete_person_settlement
- delete_ai_chat
- undo_installment_anticipationMantenha OPENMONETIS_MCP_WRITES=confirm (padrão): o agente recebe dry-run e só aplica com
confirm: true, o que combina com a aprovação de comandos do Hermes.
Se o Hermes estiver fora do Docker (CLI/desktop nativo), use stdio como em qualquer cliente:
mcp_servers:
openmonetis:
command: "npx"
args: ["-y", "github:Welington98/openmonetis-mcp"]
env:
OPENMONETIS_URL: "http://localhost:7002/api-proxy"
OPENMONETIS_EMAIL: "demo@openmonetis.local"
OPENMONETIS_PASSWORD: "demo2026"
OPENMONETIS_ORIGIN: "http://localhost:7002"Transporte HTTP
OPENMONETIS_MCP_HTTP_HOST=0.0.0.0 \
OPENMONETIS_MCP_HTTP_PORT=7317 \
MCP_HTTP_TOKEN=um-token-longo-e-aleatorio \
OPENMONETIS_URL=https://financas.exemplo.com/api-proxy \
OPENMONETIS_EMAIL=voce@exemplo.com \
OPENMONETIS_PASSWORD=sua-senha \
node dist/http.jsEndpoint MCP:
POST http://host:7317/mcpcomAuthorization: Bearer <MCP_HTTP_TOKEN>.Health check:
GET http://host:7317/health.Modo stateless e single-user: um processo atende uma credencial. Para várias pessoas, rode um processo por conta (ou aguarde suporte a token de API por usuário no backend).
Docker
O Dockerfile gera uma imagem enxuta (multi-stage, node:22-alpine, usuário node) cujo entrypoint
é o transporte HTTP. Para subir como serviço, veja
Rodando como serviço (container).
Rodando como serviço (container)
O transporte stdio não faz sentido dentro de um container: o serviço expõe Streamable HTTP em
/mcp, com health check em /health e autenticação por [BEARER_REDACTED].
docker compose (recomendado)
cp .env.example .env # preencha OPENMONETIS_URL, credenciais e MCP_HTTP_TOKEN
docker compose pull && docker compose up -d # usa a imagem publicada
# ou, para construir localmente:
# docker compose up -d --build
docker compose logs -fO compose.yaml já traz restart: unless-stopped, healthcheck, read_only, no-new-privileges,
rotação de logs e publicação apenas em loopback (127.0.0.1:7317).
docker compose ps # status + healthy
docker compose pull && docker compose up -d # atualizar a imagem
docker compose down # parardocker run
docker build -t openmonetis-mcp .
docker run -d --name openmonetis-mcp \
--restart unless-stopped \
-p 127.0.0.1:7317:7317 \
--add-host=host.docker.internal:host-gateway \
-e MCP_HTTP_TOKEN=um-token-longo-e-aleatorio \
-e OPENMONETIS_URL=https://financas.exemplo.com/api-proxy \
-e OPENMONETIS_EMAIL=voce@exemplo.com \
-e OPENMONETIS_PASSWORD=sua-senha \
openmonetis-mcpImagem publicada
docker pull ghcr.io/welington98/openmonetis-mcp:latestImagem | Arquiteturas | Tags |
|
|
|
O pacote é público (pull anônimo funciona). A publicação é feita pelo workflow
.github/workflows/release-image.yml, disparado por tag vX.Y.Z ou execução manual. Tags SemVer só
aparecem quando a tag Git é criada; execuções manuais publicam apenas latest.
Para fixar uma versão em produção, use um digest ou a tag exata:
services:
openmonetis-mcp:
image: ghcr.io/welington98/openmonetis-mcp:0.1.0Container falando com OpenMonetis no mesmo host
Dentro do container, localhost é o próprio container. Aponte para o host com
host.docker.internal — e, como esse tráfego é http://, libere explicitamente:
OPENMONETIS_URL=http://host.docker.internal:7002/api-proxy
OPENMONETIS_ALLOW_INSECURE=1 # necessário: http:// não-loopback
OPENMONETIS_ORIGIN=http://localhost:7002 # precisa estar em trustedOrigins (WEB_URL)
MCP_HTTP_TOKEN=um-token-longo-e-aleatorioOPENMONETIS_ORIGIN é obrigatório nesse caso porque o default é a origem de OPENMONETIS_URL
(http://host.docker.internal:7002), que não consta em trustedOrigins do Better Auth. Se o
OpenMonetis for público em HTTPS, nenhum desses três ajustes é necessário.
Se o OpenMonetis também roda em Docker Compose, o mais limpo é colocar os dois na mesma rede e usar o nome do serviço:
services:
openmonetis-mcp:
networks: [openmonetis]
# ...
networks:
openmonetis:
external: trueCom OPENMONETIS_URL=http://api:7001 (ou http://web:7002/api-proxy) e OPENMONETIS_ALLOW_INSECURE=1.
Acesso remoto com reverse proxy
Mantenha a porta publicada em loopback e exponha via proxy com TLS:
location /mcp {
proxy_pass http://127.0.0.1:7317/mcp;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
proxy_read_timeout 3600s;
}O Authorization do cliente atravessa o proxy; o token do OpenMonetis nunca é exposto, porque vive
apenas na memória do container.
Iniciar com o host
restart: unless-stopped já cobre reboot desde que o Docker esteja habilitado no boot
(systemctl enable docker). Para amarrar explicitamente ao ciclo do systemd:
# /etc/systemd/system/openmonetis-mcp.service
[Unit]
Description=OpenMonetis MCP
Requires=docker.service
After=docker.service network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/openmonetis-mcp
ExecStart=/usr/bin/docker compose up -d --remove-orphans
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.targetsudo systemctl enable --now openmonetis-mcpReleases
O versionamento é automático, dirigido por Conventional Commits
via semantic-release. Cada push na main executa o workflow
release, que calcula a próxima versão, atualiza package.json e CHANGELOG.md, cria a tag
vX.Y.Z, publica o GitHub Release e então gera a imagem com as tags SemVer.
Commit | Efeito |
| minor ( |
| patch ( |
| major ( |
| nenhuma release |
Regras do fluxo:
Nunca edite a versão em
package.jsonnem crie tags à mão: ambas são derivadas dos commits.src/version.tslê a versão dopackage.jsonem tempo de build (definedo tsup), então/healthe o handshake MCP sempre reportam a versão publicada.O commit de release (
chore(release): x.y.z [skip ci]) não dispara a própria pipeline.A imagem recebe
<versão>,<major>.<minor>elatestna mesma execução.Para republicar a imagem sem novo release:
Actions → release image → Run workflow(opcionalmente informando a versão, ex.:0.1.0).
Repositório ainda sem tag? O semantic-release parte de 1.0.0 quando não existe tag anterior, por
isso a primeira tag (v0.1.0) precisa existir antes de automatizar.
Ferramentas
Leitura
Ferramenta | O que faz |
| Métricas do mês: receitas, despesas, saldo, projeção e histórico de 6 meses. |
| Todas as seções do dashboard em uma chamada. |
| Faturas, contas, orçamentos e metas que exigem atenção. |
| Transações paginadas com filtros por período, texto, tipo, pessoa, categoria, tag, conta, cartão e valor. |
| Todos os campos de uma transação. |
| Contas e saldos. |
| Fluxo de caixa diário e histórico mensal de uma conta. |
| Cartões de crédito. |
| Histórico de faturas de um cartão. |
| Faturas de todos os cartões no mês ( |
| Contas a pagar do mês, com rateio por pessoa ( |
| Orçamentos por categoria. |
| Metas, progresso e ritmo. |
| IDs e nomes para filtros e criação. |
| Pessoas e resumo financeiro individual. |
| Relatório mensal completo de uma pessoa. |
| Distribuição de receitas/despesas no mês. |
| Evolução por categoria entre dois meses. |
| Compromissos futuros (parcelas, recorrências). |
| Despesas recorrentes ativas no mês. |
| Preferências e notificações acionáveis. |
| list_inbox_items | Notificações capturadas, por status e app de origem. |
| get_inbox_snapshot | Contagens e últimos itens pendentes da caixa de entrada. |
| list_inbox_rules | Regras que categorizam capturas automaticamente. |
| suggest_inbox_item | Categoria/pessoa que as regras aplicariam a um item. |
| preview_transaction_import | Lê OFX/CSV/XLSX por caminho local e mostra o que seria importado. |
| export_transactions | Exporta CSV/XLSX para arquivo no host e devolve o caminho. |
| get_import_template | Baixa a planilha modelo de importação. |
| list_transaction_attachments / list_attachments | Anexos de uma transação ou do mês. |
| get_attachment_download_url | URL assinada e temporária de um anexo. |
| list_installments | Séries parceladas do mês com progresso e parcelas pendentes (detail: "compact" por padrão). |
| quote_installments | Cotação da antecipação de parcelas para uma fatura. |
| list_person_connections / list_person_invitations | Conexões e convites entre pessoas. |
| list_person_settlements / get_person_balance | Acertos e saldo com cada pessoa. |
| get_ai_status | Provedores de IA, ferramentas e escopos de dados compartilhados. |
| list_ai_diagnoses / get_ai_diagnosis | Diagnósticos financeiros gerados por IA. |
| list_ai_chats / get_ai_chat | Conversas com o assistente financeiro. |
Escrita
Ferramenta | O que faz |
| Cria receita, despesa, transferência, parcelamento ou recorrência. |
| Atualiza campos de uma transação. |
| Exclui uma transação (destrutivo). |
| Marca/desmarca transações como pagas ou recebidas. |
| Cria e atualiza contas. |
| Registra pagamento de fatura com rateio por pessoa. |
| Registra pagamento de conta a pagar. |
| Define orçamento de uma categoria no mês. |
| Cria meta manual ou vinculada a uma conta. |
| Converte um item da caixa de entrada em lançamento. |
| Descarta itens da caixa de entrada. |
| Cria e exclui regras de categorização automática. |
| Importa o extrato revisado e desfaz um lote. |
| Envia arquivo do host (prepare → upload → confirm) e exclui anexos. |
| Antecipa parcelas para uma fatura e desfaz. |
| Convida uma pessoa e cancela o convite. |
| Revoga o acesso de uma pessoa conectada. |
| Registra e exclui acertos entre pessoas. |
| Solicita e cancela um diagnóstico de IA. |
| Exclui uma conversa com a IA. |
Arquivos locais
export_transactions, get_import_template e upload_attachment leem/gravam no host onde o MCP
roda — no transporte stdio é a sua máquina; no modo HTTP é o container (por isso o volume em
compose.yaml e no exemplo do Hermes). Nesse caso, monte um
volume para o diretório de exportação:
volumes:
- ./exports:/home/node/Downloads/openmonetis-mcpe defina OPENMONETIS_EXPORT_DIR=/home/node/Downloads/openmonetis-mcp.
Modos de escrita
| Comportamento |
| Ferramentas de escrita retornam erro explicativo. |
| Sem |
| Executa direto. Use apenas em ambiente controlado. |
No dry-run de uma exclusão o servidor busca a transação antes, para mostrar nome, valor e data do
alvo. Ferramentas destrutivas também enviam destructiveHint: true ao cliente MCP, permitindo que
ele peça aprovação ao usuário.
Segurança
Credenciais: a senha é enviada apenas ao endpoint de login da sua instalação; o cookie de sessão fica em memória e nunca é gravado em disco ou logado. Prefira
op run(1Password), Keychain ou variáveis de ambiente do cliente MCP a arquivos.envversionados.Menor privilégio:
read-onlyouconfirmsão o padrão.fullé opt-in.Rede:
http://é aceito apenas para loopback; para host remoto o servidor exigehttps://(ouOPENMONETIS_ALLOW_INSECURE=1, desencorajado).HTTP remoto: sem
MCP_HTTP_TOKENo servidor só sobe em loopback. A comparação do token é feita em tempo constante.Sessão: a duração é a da instalação (
AUTH_SESSION_EXPIRES_IN_DAYS, padrão 30 dias). Revogar a sessão na web (Ajustes → Segurança) invalida o MCP imediatamente.
Desenvolvimento
pnpm install
pnpm dev # stdio via tsx
pnpm dev:http # HTTP via tsx
pnpm lint # Biome
pnpm typecheck # tsc --noEmit
pnpm test # node:test com API fake local
pnpm build # tsup → dist/
pnpm check # lint + typecheck + test + build
pnpm bench:tools # custo do tools/list nos perfis core e full (bytes e tokens aproximados)
# contrato: gera tipos + snapshot a partir da instância e valida as rotas usadas
OPENMONETIS_URL=http://localhost:7002/api-proxy pnpm gen:contract
pnpm check:contract # offline, contra contract/
OPENMONETIS_URL=http://localhost:7002/api-proxy pnpm check:contract # + instância vivaOs testes unitários sobem uma API fake em 127.0.0.1 (sem rede externa) e exercitam login,
renovação de sessão, envelope de erro, paginação, dry-run, gate de escrita e o cofre de credenciais.
O workflow e2e vai além: em cada push/PR ele sobe Postgres + migrações + a imagem oficial da API,
cria uma conta, popula 6 meses de dados e roda as 75 ferramentas de verdade (SMOKE_WRITES=1), além
de falhar se contract/ divergir do /openapi.json da versão usada. É o que pega mudanças de
contrato antes de chegarem ao usuário.
Contrato
contract/openapi.snapshot.json (especificação) e contract/openapi.d.ts (tipos) são gerados por
pnpm gen:contract e versionados. A lista de rotas em scripts/check-contract.ts é tipada por eles:
um path ou método que deixe de existir quebra o tsc. Quando a API mudar, rode pnpm gen:contract
e commite o diff.
Troubleshooting
Sintoma | Causa provável | Correção |
|
| Defina |
| Credenciais erradas | Revise |
| Rate limit de 5 tentativas/minuto | Aguarde um minuto; o servidor reaproveita a sessão nos dois transportes e só reautentica em |
|
| Em produção inclua |
Sessão expira e ferramentas falham | Uso de | Prefira |
Limitações
Single-user por processo; não há multi-tenancy nem OAuth por usuário.
Cobre 79 dos ~170 endpoints da API. Fora do escopo: configuração de provedores de IA (login OAuth), regras de vencimento, importação de despesas externas, antecipação de faturas, device tokens, releases, notificações individuais e o CRUD completo de preferências.
Chat com IA não é exposto:
/ai-chats/{id}/messagesresponde em SSE e o streaming não cabe bem no protocolo de ferramentas. Diagnósticos (create_ai_diagnosis) funcionam normalmente.Anexos exigem storage S3 configurado na instância; sem isso o upload retorna 503.
@openmonetis/*não é importado de propósito: este repositório é independente do monorepo, e o contrato é a API HTTP pública.
Contribuindo
A main tem histórico protegido por ruleset: force-push, deleção e recriação do branch são
bloqueados. Mudanças entram por pull request com os checks check (CI) e e2e verdes — o
semantic-release continua commitando direto na main porque o repositório é de usuário, onde o
GitHub não permite dar bypass ao Actions.
Para exigir PR de forma impositiva (e não por convenção), é preciso um token de release (PAT ou GitHub App) com bypass de administrador — o semantic-release passaria a usar esse token.
git switch -c feat/minha-mudanca
# ... commits em Conventional Commits ...
pnpm check # lint + typecheck + test + build
git push -u origin feat/minha-mudanca
gh pr create --fillRegras do fluxo:
Um PR = um assunto. Título em Conventional Commits, porque é ele que define a versão no squash.
Mudou endpoint ou schema? Rode
pnpm gen:contracte commitecontract/no mesmo PR — o jobe2efalha se o contrato divergir da API.Nova ferramenta de escrita precisa de
plan()com dry-run legível; sem isso o revisor humano não consegue avaliar o que o agente faria.Nunca inclua credenciais. Use
openmonetis-mcp auth setlocalmente, nunca no repositório.
Licença
MIT — veja LICENSE.
Available Tools
75 toolsadd_invoice_paymentRegistrar pagamento de faturaA
Registra o pagamento de uma fatura de cartão, com rateio por pessoa e conta de origem opcional. Exige confirm: true para executar; sem isso devolve o payload proposto.
Inputs: cardId (required), paidAt (required), period (required), allocations (required), +2 more.
anticipate_installmentsAntecipar parcelasB
Move parcelas futuras de uma série para uma fatura alvo, aplicando desconto opcional. Exige confirm: true.
Inputs: seriesId (required), targetPeriod (required), installmentIds (required), confirm, +1 more.
cancel_ai_diagnosisCancelar diagnóstico de IAADestructive
Cancela um diagnóstico em andamento. Exige confirm: true.
Inputs: id (required), confirm.
cancel_person_invitationCancelar conviteADestructive
Cancela um convite de conexão ainda não confirmado. Exige confirm: true.
Inputs: id (required), confirm.
confirm_inbox_itemConfirmar item do inbox como lançamentoB
Converte um item capturado em transação. Recebe os mesmos campos de create_transaction. Exige confirm: true; sem isso devolve o payload proposto.
Inputs: name (required), type (required), amount (required), personId (required), +22 more.
create_accountCriar contaA
Cria uma conta financeira. Sem confirm: true a ferramenta apenas devolve o payload que seria enviado.
Inputs: name (required), type (required), logo, note, +2 more.
create_ai_diagnosisSolicitar diagnóstico de IAA
Enfileira um diagnóstico financeiro do período no provedor escolhido. A geração é assíncrona: consulte com get_ai_diagnosis. Requer AI_ENABLED=true. Exige confirm: true.
Inputs: period (required), provider (required), model, voice, +1 more.
create_budgetCriar orçamentoB
Cria (ou atualiza) o orçamento de uma categoria em um mês. Exige confirm: true para executar.
Inputs: amount (required), period (required), categoryId (required), confirm.
create_goalCriar metaA
Cria uma meta financeira. Use trackingType: "manual" com currentAmount, ou trackingType: "account" com accountId para acompanhar o saldo de uma conta. Exige confirm: true para executar.
Inputs: name (required), targetDate (required), targetAmount (required), trackingType (required), +3 more.
create_inbox_ruleCriar regra do inboxB
Cria uma regra que categoriza automaticamente notificações capturadas. Informe ao menos categoria ou pessoa. Exige confirm: true.
Inputs: name (required), isActive (required), personId (required), priority (required), +4 more.
create_person_invitationConvidar pessoa para conectarA
Cria um convite de conexão para uma pessoa externa. O retorno inclui um token de uso único que dá acesso aos dados compartilhados — trate como segredo e não registre em log. Exige confirm: true.
Inputs: personId (required), confirm.
create_person_settlementRegistrar acerto com pessoaC
Registra um acerto (recebimento) de uma pessoa. Exige confirm: true.
Inputs: amount (required), personId (required), receivedAt (required), note, +1 more.
create_transactionCriar transaçãoA
Cria uma transação de receita, despesa, transferência, compra parcelada ou série recorrente. Transferências (type: 'transfer') só aceitam condition: 'single' e paymentMethod: 'bank_transfer' — a API do OpenMonetis não suporta transferência recorrente nem parcelada. A API valida todas as regras de domínio (categoria obrigatória em receita/despesa, cartão obrigatório no crédito, contas distintas em transferência, etc.). Sem confirm: true a ferramenta apenas devolve o payload que seria enviado.
Inputs: name (required), type (required), amount (required), personId (required), +21 more.
delete_ai_chatExcluir conversa com a IAADestructive
Exclui uma conversa e seu histórico. Exige confirm: true.
Inputs: id (required), confirm.
delete_attachmentExcluir anexoADestructive
Exclui definitivamente um anexo. Exige confirm: true.
Inputs: id (required), confirm.
delete_import_batchDesfazer importaçãoADestructive
Remove um lote de importação e as transações criadas por ele. Exige confirm: true.
Inputs: batchId (required), confirm.
delete_inbox_ruleExcluir regra do inboxADestructive
Exclui uma regra do inbox. A API exige a versão atual do registro em expectedVersion. Exige confirm: true.
Inputs: id (required), expectedVersion (required), confirm.
delete_person_settlementExcluir acertoBDestructive
Exclui um acerto registrado. Exige confirm: true.
Inputs: id (required), confirm.
delete_transactionExcluir transaçãoADestructive
Exclui definitivamente uma transação. A ferramenta busca a transação antes de excluir para mostrar nome, valor e data no dry-run. Exige confirm: true para executar.
Inputs: id (required), confirm.
discard_inbox_itemsDescartar itens do inboxC
Descarta um ou mais itens da caixa de entrada. Exige confirm: true.
Inputs: ids (required), confirm.
export_transactionsExportar transaçõesBRead-onlyIdempotent
Exporta as transações filtradas em CSV ou XLSX e grava o arquivo no diretório de exportação do host (padrão: ~/Downloads/openmonetis-mcp). Retorna o caminho absoluto e o número de linhas.
Inputs: q, type, format, period, +12 more.
get_accountDetalhar contaBRead-onlyIdempotent
Retorna os dados completos de uma conta, incluindo saldo e resumo do período.
Inputs: id (required), period.
get_account_cash_flowFluxo de caixa da contaBRead-onlyIdempotent
Retorna o fluxo de caixa diário de uma conta em um mês: saldo inicial, lançamentos do dia, valor fora do mês e histórico mensal.
Inputs: id (required), period.
get_ai_chatDetalhar conversa com a IABRead-onlyIdempotent
Retorna uma conversa com todo o histórico de mensagens.
Inputs: id (required).
get_ai_diagnosisDetalhar diagnóstico de IABRead-onlyIdempotent
Retorna um diagnóstico completo, incluindo status, resultado, pontos de atenção e falha quando houver.
Inputs: id (required).
get_ai_statusStatus da IAARead-onlyIdempotent
Mostra se o assistente de IA está habilitado na instalação, quais provedores estão conectados, as ferramentas permitidas e os escopos de dados compartilhados.
Inputs: no named parameters.
get_attachment_download_urlLink de download do anexoARead-onlyIdempotent
Gera uma URL assinada e temporária para baixar (ou visualizar) um anexo. Retorna a URL e o instante de expiração.
Inputs: id (required), disposition.
get_cardDetalhar cartãoBRead-onlyIdempotent
Retorna os dados de um cartão, incluindo limite, uso e fatura corrente.
Inputs: id (required).
get_category_trendsTendência por categoriaBRead-onlyIdempotent
Compara a evolução de gastos por categoria entre dois meses (inclusive). Útil para responder o que aumentou ou diminuiu no período.
Inputs: endPeriod (required), startPeriod (required), categoryIds, personScope.
get_dashboard_attentionItens que exigem atençãoARead-onlyIdempotent
Lista os itens que precisam de atenção no mês: faturas abertas, contas a pagar vencidas ou próximas do vencimento, orçamentos estourados ou perto do limite e metas em risco. Retorna também unavailableSources quando alguma fonte não pôde ser lida.
Inputs: period.
get_dashboard_overviewVisão geral do mêsARead-onlyIdempotent
Retorna as métricas do dashboard financeiro de um mês: receitas, despesas, saldo, valor projetado, comparação com o mês anterior e histórico dos últimos 6 meses. Use como primeira ferramenta para entender a situação financeira do período.
Inputs: period.
get_dashboard_snapshotSnapshot completo do dashboardARead-onlyIdempotent
Retorna de uma vez todas as seções do dashboard de um mês: métricas, saldos das contas, status de pagamentos, distribuição de despesas por condição/forma de pagamento, quebra por categoria e despesas por pessoa. Payload maior que get_dashboard_overview; use quando precisar de uma visão completa em uma única chamada.
Inputs: period.
get_financial_distributionDistribuição financeiraARead-onlyIdempotent
Retorna a distribuição das despesas e receitas de um mês por categoria, forma de pagamento e condição, no escopo do administrador ou de todas as pessoas. mode: "forecast" inclui valores previstos.
Inputs: period (required), mode, personScope.
get_import_templateBaixar modelo de importaçãoARead-onlyIdempotent
Baixa o modelo de planilha aceito pela importação e grava no diretório de exportação do host. Retorna o caminho do arquivo.
Inputs: no named parameters.
get_inbox_snapshotResumo da caixa de entradaBRead-onlyIdempotent
Resumo rápido do inbox: contagens por status e os últimos itens pendentes. Útil para saber se há capturas aguardando revisão.
Inputs: limit.
get_invoice_historyHistórico de faturas do cartãoBRead-onlyIdempotent
Retorna o histórico de faturas de um cartão, com totais e situação de pagamento por período.
Inputs: id (required), period.
get_person_balanceSaldo com uma pessoaBRead-onlyIdempotent
Retorna o saldo financeiro com uma pessoa no período: quanto ela deve ou tem de crédito, e os acertos registrados.
Inputs: personId (required), period.
get_person_reportRelatório mensal da pessoaARead-onlyIdempotent
Retorna o relatório mensal completo de uma pessoa externa em um período: linhas de despesas e reembolsos, totais e rateios — o mesmo conteúdo do PDF enviado por e-mail. O administrador não possui relatório (a API responde 400 nesse caso); para ele use get_person_summary.
Inputs: period (required), personId (required).
get_person_summaryResumo financeiro da pessoaARead-onlyIdempotent
Retorna o resumo financeiro de uma pessoa em um mês: total de despesas, histórico e distribuição por categoria.
Inputs: period (required), personId (required).
get_settingsConfigurações do usuárioARead-onlyIdempotent
Retorna as preferências da conta (defaults de transação, preferências do dashboard) e as configurações de segurança, em uma única chamada.
Inputs: no named parameters.
get_transactionDetalhar transaçãoARead-onlyIdempotent
Retorna todos os campos de uma transação: valores, rateio entre pessoas, cartão/conta, categoria, vencimento, parcelas, recorrência, reembolsos e anexos.
Inputs: id (required).
import_transactionsImportar transaçõesA
Grava no OpenMonetis as linhas já revisadas de uma importação de extrato. Use o sourceFingerprint e as linhas de preview_transaction_import, associando personId e categoryId a cada linha. Exige confirm: true.
Inputs: rows (required), destinationId (required), paymentMethod (required), destinationType (required), +3 more.
list_accountsListar contasBRead-onlyIdempotent
Lista as contas financeiras do usuário com tipo, saldo e indicação de exclusão do saldo consolidado.
Inputs: detail, period.
list_ai_chatsConversas com a IAARead-onlyIdempotent
Lista as conversas com o assistente financeiro (título, período, provedor e modelo).
Inputs: no named parameters.
list_ai_diagnosesDiagnósticos de IAARead-onlyIdempotent
Lista os diagnósticos financeiros gerados por IA, com período, provedor, status e saúde financeira.
Inputs: no named parameters.
list_attachmentsListar anexosBRead-onlyIdempotent
Lista os anexos do usuário em um mês, com filtros por texto, tipo (image/pdf) e pessoa, paginado.
Inputs: period (required), q, kind, page, +2 more.
list_billsListar contas a pagarARead-onlyIdempotent
Lista as contas a pagar de um mês com total em aberto, quantidade de vencidas, contas de origem e itens (com rateio por pessoa, vencimento e status). Os itens vêm em versão compacta por padrão; use detail: "full" para o objeto completo.
Inputs: period (required), detail.
list_budgetsListar orçamentosARead-onlyIdempotent
Lista os orçamentos de um mês por categoria, com valor planejado, gasto, restante e percentual de uso.
Inputs: period (required).
list_cardsListar cartõesARead-onlyIdempotent
Lista os cartões de crédito do usuário com limite, fatura atual e status. Aceita um período opcional para alinhar a fatura ao mês.
Inputs: period.
list_categoriesListar categoriasARead-onlyIdempotent
Lista as categorias de receita e despesa do usuário. Use os IDs retornados em filtros e ao criar transações ou orçamentos.
Inputs: detail.
list_commitmentsCompromissos futurosARead-onlyIdempotent
Projeta os compromissos financeiros entre dois meses (inclusive): parcelas, recorrências e faturas já contratadas. Limite de até 24 meses.
Inputs: endPeriod (required), startPeriod (required).
list_goalsListar metasBRead-onlyIdempotent
Lista as metas financeiras com valor alvo, valor atual, restante, progresso, prazo e ritmo (adiantado, no prazo, atrasado).
Inputs: status.
list_inbox_itemsCaixa de entradaARead-onlyIdempotent
Lista as notificações capturadas (inbox) por status, app de origem, data ou regra aplicada. Cada item traz o texto original, o nome/valor interpretado e o status.
Inputs: page, ruleId, status, pageSize, +2 more.
list_inbox_rulesRegras da caixa de entradaARead-onlyIdempotent
Lista as regras que categorizam automaticamente as notificações capturadas, com prioridade, condições e ação (categoria/pessoa).
Inputs: no named parameters.
list_installmentsParcelamentosBRead-onlyIdempotent
Lista as séries parceladas do usuário no mês: séries abertas/concluídas, parcelas pagas e pendentes, valores e progresso. As séries vêm em versão compacta por padrão; use detail: "full" para o objeto completo.
Inputs: period (required), q, detail, status.
list_invoicesListar faturas do períodoARead-onlyIdempotent
Lista as faturas de todos os cartões em um mês: total, fechamento, vencimento, pagamentos, ajustes e rateio por pessoa. Os itens vêm em versão compacta por padrão; use detail: "full" para o objeto completo.
Inputs: period (required), detail.
list_notificationsNotificaçõesARead-onlyIdempotent
Lista as notificações acionáveis do usuário, como faturas próximas do vencimento, orçamentos excedidos e metas em risco. Retorna itens, contagem de não lidas, ativas e arquivadas.
Inputs: no named parameters.
list_peopleListar pessoasBRead-onlyIdempotent
Lista as pessoas da instalação (administrador e pessoas externas) com papel, status e vínculo. Use os IDs em rateios e filtros.
Inputs: detail.
list_person_connectionsConexões entre pessoasBRead-onlyIdempotent
Lista as conexões ativas entre o titular e outras pessoas (perspectiva de dono ou destinatário), com status e data.
Inputs: no named parameters.
list_person_invitationsConvites entre pessoasBRead-onlyIdempotent
Lista os convites de conexão enviados, com status (pending, claimed, confirmed, cancelled, expired) e prazos.
Inputs: no named parameters.
list_person_settlementsAcertos entre pessoasBRead-onlyIdempotent
Resumo do que cada pessoa deve ao titular (ou tem de crédito) no período, com os acertos já registrados.
Inputs: period.
list_recurring_expensesDespesas recorrentes do mêsARead-onlyIdempotent
Lista as despesas recorrentes ativas em um mês, com regra, frequência, valor e ocorrências.
Inputs: period (required).
list_tagsListar tagsARead-onlyIdempotent
Lista as tags disponíveis para classificar transações.
Inputs: detail.
list_transaction_attachmentsAnexos da transaçãoBRead-onlyIdempotent
Lista os anexos (comprovantes, notas) vinculados a uma transação.
Inputs: transactionId (required).
list_transactionsListar transaçõesARead-onlyIdempotent
Lista transações paginadas com filtros por período, texto, tipo, condição, forma de pagamento, situação, pessoa, categoria, tag, conta, cartão e faixa de valor. Retorna o total e os itens (versão compacta por padrão). Use detail: "full" quando precisar de todos os campos de um item específico.
Inputs: q, page, sort, type, +16 more.
pay_billPagar conta a pagarB
Registra o pagamento de uma conta a pagar (lançamento recorrente) informando a conta de origem, a data e, opcionalmente, o valor pago. Exige confirm: true para executar.
Inputs: billId (required), paidAt (required), period (required), accountId (required), +2 more.
preview_transaction_importPré-visualizar importação de extratoARead-onlyIdempotent
Envia um arquivo de extrato (OFX, CSV ou XLSX) e retorna o que seria importado: conta/cartão detectado, período, transações com duplicatas e categoria sugerida. Nada é gravado. Aceita filePath (host do MCP) ou fileName + contentBase64.
Inputs: fileName, filePath, contentBase64.
quote_installmentsCotar antecipação de parcelasBRead-onlyIdempotent
Calcula quantidade e valor total das parcelas informadas — usado antes de antecipar para uma fatura.
Inputs: installmentIds (required).
revoke_person_connectionRevogar conexãoADestructive
Revoga o acesso de uma pessoa conectada. Exige confirm: true (ação destrutiva).
Inputs: id (required), confirm.
settle_transactionsMarcar transações como pagas/recebidasA
Marca ou desmarca uma ou mais transações como liquidadas, opcionalmente informando data, valor pago e conta usada. Exige confirm: true para executar.
Inputs: ids (required), isSettled (required), confirm, accountId, +2 more.
suggest_inbox_itemSugerir categoria para item do inboxBRead-onlyIdempotent
Mostra qual categoria e pessoa as regras aplicariam a um item da caixa de entrada, sem confirmar nada.
Inputs: inboxItemId (required).
undo_installment_anticipationDesfazer antecipaçãoBDestructive
Desfaz uma antecipação, devolvendo as parcelas ao período original. Exige confirm: true.
Inputs: seriesId (required), anticipationId (required), installmentIds (required), confirm.
update_accountAtualizar contaB
Atualiza uma conta existente (nome, tipo, logo, nota, exclusão do saldo consolidado, arquivamento). Envie apenas os campos que devem mudar.
Inputs: id (required), logo, name, note, +4 more.
update_transactionAtualizar transaçãoA
Atualiza campos de uma transação existente. Envie apenas os campos que devem mudar — campos omitidos são preservados (inclusive condition, installmentCount e recurrenceFrequency). Sem confirm: true a ferramenta devolve o payload que seria enviado.
Inputs: id (required), name, note, type, +22 more.
upload_attachmentAnexar arquivo à transaçãoA
Envia um arquivo do host (PDF ou imagem) para uma transação usando o fluxo de upload assinado: prepare → upload → confirm. Exige confirm: true.
Inputs: filePath (required), transactionId (required), confirm, mimeType.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 75 tools
Most tools have a clear resource+action target, but several clusters overlap: get_dashboard_overview vs get_dashboard_snapshot (one is explicitly a superset), get_dashboard_attention vs list_notifications (both surface overdue invoices, blown budgets and at-risk goals), and get_person_summary vs get_person_report vs get_person_balance vs list_person_settlements. The descriptions usually disambiguate the edge cases (e.g. 'para ele use get_person_summary'), but an agent must read carefully to pick the right one in the dashboard, notification and person-report families.
Names are uniformly snake_case verb_noun: get_*, list_*, create_*, update_*, delete_*, plus consistent domain verbs (confirm_, preview_, export_, import_, settle_, anticipate_, undo_). No camelCase mixing and no orphan/ambiguous names.
75 tools is very heavy even for a broad personal-finance app (transactions, accounts, cards, invoices, bills, budgets, goals, people, AI, inbox, import/export). Several tools are redundant supersets or thin variants (overview vs snapshot vs attention, list_*/get_* pairs, summary vs report vs balance) that could be consolidated or folded into parameters.
The surface covers the core lifecycle well: full transaction CRUD plus settle, account create/update (archive in place of delete), invoice/bill payment, attachment upload/download/delete, import/export, and the people/AI/inbox subdomains. However, there are notable gaps: goals are create-only (no update or delete), budgets support upsert but no delete, cards and categories/tags are read-only, and inbox rules lack an update operation.
Maintenance
Related MCP Connectors
Connect AI agents to bank accounts, transactions, balances, and investments.
Read-only personal finance for AI agents: budgets, receipts, net worth, bills. OAuth 2.1.
Read-only access to your own bank, card and brokerage accounts for Claude, ChatGPT and other AI agents: balances, transactions, spending, subscriptions, cashflow and investment holdings. It can never move money.
Ask your AI about your own accounts, debts, budgets and goals. OAuth sign-in, read-only by default.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceConnect AI agents to real bank accounts across 15,000+ financial institutions for transactions, balances, investments, and loans.2MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to access and manage personal financial data from US institutions and manual entries, including transactions, balances, liabilities, and investments.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to read and write a self-hosted portfolio tracker through 25 MCP tools, covering net worth, flows, forecasts, decisions, and audit.8 npm4Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants and other MCP clients to access and manage personal finance data, including transactions, categories, tags, budgets, recurring items, accounts, crypto, and balance history through the provider's API.41 npmMIT