The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the CDF Finance MCP listing page.
Conecte Claude, ChatGPT e qualquer client MCP (OAuth 2.1) à sua conta CDF Finance — consulte e registre sua vida financeira por linguagem natural.
Remoto: https://mcp.cdf.finance/mcp (Streamable HTTP) · Website: https://cdf.finance/mcp · Status: https://status.cdf.finance · Suporte: support@cdf.finance
MCP server stateless e isolado para o CDF Finance — app de controle financeiro pessoal (contas, cartões, transações, faturas, orçamentos, metas, dívidas, investimentos e insights).
backend-husk — só HTTP sobre a API pública que o app mobile já usa.Source-available sob BUSL-1.1: pode auditar, usar com o CDF Finance, contribuir. Uso em produção como produto concorrente exige licença comercial. Vira
Apache-2.0em2030-09-01.
| Você diz | O que acontece |
|---|---|
| "Quanto sobrou do meu salário esse mês?" | current_month_spending + categories_insights |
| "Minha próxima fatura vai caber no orçamento?" | list_pending_invoices + budget_comparison |
| "Lança um Uber de R$ 27,50 no Nubank como Transporte" | list_accounts + list_categories + create_transaction |
English: "How much is left of my salary?" / "Will my next bill fit the budget?" / "Log an Uber ride of R$27.50 on Nubank as Transportation."
Isolamento total do backend-husk — este serviço não importa código do backend.
Fluxo de login:
/register./authorize (form server-rendered, sem terceiros) → POST /api/mobile/auth/login com device_id=mcp-<sessionId>, platform=mcp.access/refresh do backend ficam criptografados em sessions; client MCP recebe apenas token opaco (oauth_tokens).access_token via refresh automaticamente (getValidAccessToken).GET /api/mobile/devices — revogável em DELETE /api/mobile/devices/:id.Por que isolado (README original): sem dependência circular, deploy/escala independentes (Railway vs Coolify no backend) e imune a troca de linguagem do backend — só fala HTTP.
Catálogo 100% declarativo em src/tools/catalog/ — cada tool é { name, method, path, input(zod) } executada por src/tools/register.ts. Nova rota no backend = nova entrada, sem handler.
| Domínio | Tools (exemplos) |
|---|---|
| User | get_profile, update_profile |
| Accounts / Cards | list_accounts, create_account, list_cards, current_invoice |
| Categories / Cost Centers | list_categories, create_category, list_cost_centers |
| Transactions | list_transactions, create_transaction, confirm_pending_transaction, upcoming_transactions |
| Recurring / Invoices | list_recurring_transactions, list_invoices, pay_invoice |
| Goals / Budgets / Debts | list_goals, budget_comparison, create_debt, debt_payoff_simulation |
| Equities / Investments | list_equities, add_equity_valuation, investments_workspace |
| Insights / Analytics | cashflow_forecast, spending_projection, networth_projection, categories_insights, behavior_insights, can_afford, analytics_history |
| Tags | list_tags, create_tag |
Fora de escopo de propósito (igual ao backend): admin, Stripe/pagamentos, webhooks, S3/anexos, /api/ai/*.
Modo somente leitura:
MCP_TOOLS_MODE=readonlyexpõe sóreadOnly:true— ideal para diretórios curados.
Teste com MCP Inspector:
| Var | Obrigatória | Descrição |
|---|---|---|
PUBLIC_URL | sim | URL pública deste serviço (entra nos metadados OAuth). Gere o domínio antes do primeiro deploy |
PORT | não | default 8090 |
BACKEND_API_URL | sim | https://api.vessell.app (ou staging) |
DATABASE_URL | sim | Postgres isolado deste serviço |
TOKEN_ENCRYPTION_KEY | sim | 32 bytes base64: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))" |
SESSION_SECRET | sim | string longa aleatória p/ cookies /authorize |
MCP_SERVICE_TOKEN | não | segredo serviço-a-serviço (backend-husk → MCP via X-CDF-User-Token). Se ausente, só OAuth |
MCP_TOOLS_MODE | não | full (default) ou readonly |
OPENAI_APPS_CHALLENGE_TOKEN | não | verificação de domínio OpenAI |
ALLOWED_ORIGINS | não | CORS do /authorize — default https://claude.ai,https://chatgpt.com |
Ver .env.example comentado.
railway init ou conecte o repo no dashboard.DATABASE_URL).Dockerfile → node dist/index.js (railway.json já configurado).railway run npm run db:migrate.https://<seu-dominio>.up.railway.app/mcp — DCR/OAuth é automático.authorization_code.SHA-256 persiste (oauth_tokens), bruto é entregue uma vez.AES-256-GCM em sessions — nunca exposto ao client (src/crypto.ts, src/mcp/http.ts).mcp-<id> (src/backend/client.ts:45) revogável sem afetar outros logins.redactLargeInlineData + redactFields (src/tools/register.ts:19) evita vazamento de data: URI e campos sensíveis pro LLM.Reporte vulnerabilidades em SECURITY.md — não abra issue pública: support@cdf.finance [SECURITY].
Este conector não transfere dinheiro/cripto/ativos e não executa pagamentos em nome do usuário — apenas lê e registra lançamentos no controle financeiro pessoal, igual ao app. Toda escrita é explícita e solicitada na conversa.
MCP_TOOLS_MODE=readonly.docs/4a-exception-request.md.joao@teste.com / 123456 (dados de amostra).Veja CONTRIBUTING.md — fork, branch feat/..., npm run build e PR com path validado no backend. Ao contribuir você licencia sob BUSL-1.1.
Source-available BUSL-1.1 — uso com o CDF Finance, pessoal, acadêmico e contribuições são livres. Proibido uso em produção como produto concorrente de gestão financeira (hosted/managed). Converte para Apache-2.0 em 2030-09-01.
Dúvidas comerciais: support@cdf.finance.
Construído com Model Context Protocol · Mantido por Vessell CDF Finance