fin-app-mcp 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/docs/guia.md +70 -14
  2. package/index.mjs +146 -16
  3. package/package.json +1 -1
package/docs/guia.md CHANGED
@@ -61,27 +61,29 @@ Cada cartão de crédito tem:
61
61
 
62
62
  O ciclo de uma fatura vai do fechamento anterior até o fechamento atual. Transações dentro desse período pertencem a essa fatura.
63
63
 
64
- ### `reference_month` — ATENÇÃO
64
+ ### `reference_month`
65
65
 
66
- O FIN usa `reference_month` baseado no **mês do vencimento**, NÃO no mês dos gastos.
66
+ O FIN usa `reference_month` baseado no **mês dos gastos / mês de fechamento do ciclo**, NÃO no mês do vencimento. Geralmente coincide com o label que o banco usa para a fatura (quando o banco rotula pelo mês dos gastos).
67
67
 
68
- **Isso é diferente de como os bancos nomeiam faturas.**
69
-
70
- Exemplo concreto — cartão com `closing_day=1` e `due_day=9`:
68
+ **Exemplo concreto cartão com `closing_day=1` e `due_day=9`:**
71
69
  - Ciclo: 1 de março a 1 de abril
72
70
  - Vencimento: 9 de abril
73
- - **Banco chama:** "Fatura de Março" (mês dos gastos)
74
- - **FIN chama:** `reference_month: 2026-04` (mês do vencimento)
71
+ - `reference_month: 2026-04` (o mês onde o ciclo fecha)
72
+
73
+ **Exemplo concreto — cartão com `closing_day=19` e `due_day=26`:**
74
+ - Ciclo: 20 de março a 19 de abril
75
+ - Vencimento: 26 de abril
76
+ - `reference_month: 2026-04` (o mês onde o ciclo fecha — abril)
75
77
 
76
- **Regra prática:** quando o banco diz "Fatura de Março", no FIN é `reference_month` do mês seguinte. Ou seja:
77
- - Fatura Março (banco) → `reference_month: 2026-04` (FIN)
78
- - Fatura Abril (banco) `reference_month: 2026-05` (FIN)
78
+ **Regra prática:** o `reference_month` é o mês em que a fatura **fecha** (atinge o `closing_day`). Não é o mês da compra mais antiga da fatura, e não é o mês do vencimento quando o cartão fecha e vence em meses diferentes.
79
+
80
+ Se o banco rotula a fatura pelo mês de vencimento (raro), some -1 para chegar ao `reference_month`.
79
81
 
80
82
  ### Em qual fatura cai uma transação?
81
83
 
82
84
  Uma transação cai na fatura cujo ciclo contém a `tx_date`:
83
- - Compra em 15/03 com ciclo 01/03–01/04 → fatura de `reference_month: 2026-04`
84
- - Compra em 31/03 com ciclo 01/03–01/04 → fatura de `reference_month: 2026-04`
85
+ - Cartão fecha dia 1: compra em 15/03 com ciclo 01/03–01/04 → fatura que fecha em abril → `reference_month: 2026-04`
86
+ - Cartão fecha dia 19: compra em 25/03 com ciclo 20/03–19/04 → fatura que fecha em abril → `reference_month: 2026-04`
85
87
 
86
88
  **Detalhe:** transação feita exatamente no dia do fechamento (`closing_day`) é empurrada para o **próximo** ciclo.
87
89
 
@@ -221,8 +223,8 @@ Resultado: refund + ajuste se anulam → líquido bate com o banco.
221
223
 
222
224
  ### `cycle_end` vs `reference_month`
223
225
 
224
- - **`cycle_end`** é a data de fechamento do ciclo (ex: `2026-04-01` para um cartão que fecha dia 1). É o identificador usado internamente pelo FIN e na tool `fin_ajuste_fatura`.
225
- - **`reference_month`** é o mês do vencimento (ex: `2026-04` para uma fatura que vence em abril). É usado nas tools `fin_fatura_cartao` e `fin_fatura_transacoes`.
226
+ - **`cycle_end`** é a data exata de fechamento do ciclo (ex: `2026-04-01` para um cartão que fecha dia 1). É o identificador usado internamente pelo FIN e na tool `fin_ajuste_fatura`.
227
+ - **`reference_month`** é o mês em que o ciclo fecha (ex: `2026-04` para uma fatura com `cycle_end: 2026-04-01`). É usado nas tools `fin_fatura_cartao` e `fin_fatura_transacoes`. Ver seção 4 para a regra completa.
226
228
 
227
229
  Para descobrir o `cycle_end` de uma fatura, use `fin_fatura_transacoes` — a resposta inclui o `cycle_end`.
228
230
 
@@ -269,3 +271,57 @@ As ocorrências são geradas **lazily**: ao consultar um mês (`fin_bills_do_mes
269
271
 
270
272
  - `fixed`: valor fixo todo mês (ex: condomínio R$1.383). O `amount` da ocorrência já vem preenchido.
271
273
  - `variable`: valor muda (ex: Light). O `amount` da ocorrência vem `null` até ser definido no momento do pagamento.
274
+
275
+ ## 10. Câmbio USD/BRL e ajuste de saldo
276
+
277
+ O FIN tem suporte para contas cash em USD (carteira física, Wise, conta no exterior). No v0, contas em USD trabalham com **saldo manual** — você não lança despesas/receitas categorizadas em dólar. Em vez disso, usa duas operações:
278
+
279
+ ### `fin_cambio` — comprar ou vender dólar
280
+
281
+ O FIN não usa cotação automática para câmbio — **você informa a taxa praticada** na operação, porque a taxa real varia por banco/spread/operação. A tool cria atomicamente 2 transações vinculadas (`exchange_pair_id` compartilhado):
282
+
283
+ - **Vender dólar:** `from = conta USD`, `to = conta BRL`
284
+ - **Comprar dólar:** `from = conta BRL`, `to = conta USD`
285
+
286
+ Cada transação fica na sua conta respectiva, com a moeda da conta. A categoria "Câmbio" é criada automaticamente no primeiro uso.
287
+
288
+ **Exemplo — vendi $100 e recebi R$540 no Itaú:**
289
+ ```json
290
+ fin_cambio({
291
+ "from_account_name": "Wise USD",
292
+ "to_account_name": "Itaú",
293
+ "amount_from_cents": 10000,
294
+ "amount_to_cents": 54000,
295
+ "description": "Venda de dólar"
296
+ })
297
+ ```
298
+
299
+ Resultado: despesa de $100 na Wise USD + receita de R$540 no Itaú. Ambas com `exchange_pair_id` igual.
300
+
301
+ ### `fin_ajustar_saldo_conta` — atualizar saldo manualmente
302
+
303
+ Para casos onde o saldo USD muda **sem motivo categórico** (ex: você achou mais $50 na carteira, ou simplesmente quer atualizar pra refletir o saldo real), use `fin_ajustar_saldo_conta`. Ele atualiza o `initial_balance` da conta diretamente, **sem criar transação**.
304
+
305
+ **Importante:** o valor é o **saldo absoluto**, não um delta. Se a conta tinha $400 e você quer somar $50, passe `45000` (não `5000`).
306
+
307
+ ```json
308
+ fin_ajustar_saldo_conta({
309
+ "account_name": "Wise USD",
310
+ "amount_cents": 45000
311
+ })
312
+ ```
313
+
314
+ Funciona para qualquer conta cash (BRL ou USD). Não funciona para cartão de crédito.
315
+
316
+ ### Restrições no v0
317
+
318
+ - ❌ Lançar despesa/receita categorizada em USD via `fin_criar_despesa`/`fin_criar_receita` (continua bloqueado — mensagem: "use fin_cambio ou fin_ajustar_saldo_conta")
319
+ - ❌ Cotação automática (você sempre informa a taxa)
320
+ - ❌ Cartão de crédito em USD
321
+ - ❌ Filtros nos relatórios mensais por moeda (transações de câmbio aparecem no relatório como categoria "Câmbio" — visualmente identificadas)
322
+
323
+ ### Para "comprei algo no exterior por $20"
324
+
325
+ No v0, a recomendação é **registrar como ajuste de saldo**: subtrair $20 do saldo atual da conta USD via `fin_ajustar_saldo_conta`. A categorização (que tipo de gasto foi) pode ser feita depois manualmente pela UI, ou simplesmente ignorada se não for crítica para o seu controle.
326
+
327
+ Lançar despesas categorizadas em USD pode entrar em uma versão futura se virar uma dor real.
package/index.mjs CHANGED
@@ -182,17 +182,16 @@ CAMPOS:
182
182
  - reference_month: string YYYY-MM — mês de referência da fatura.
183
183
 
184
184
  REGRAS DE NEGÓCIO:
185
- - ATENÇÃO: reference_month = mês do VENCIMENTO da fatura, NÃO o mês dos gastos.
186
- - Bancos nomeiam faturas pelo mês dos gastos. O FIN nomeia pelo mês do vencimento. ~1 mês de diferença.
187
- - Exemplo: "Fatura de Março" do banco = reference_month 2026-04 no FIN (se vence em abril).
188
- - Regra prática: some +1 ao mês que o banco informa.
185
+ - reference_month = mês dos GASTOS / mês de fechamento do ciclo da fatura (NÃO é o mês do vencimento).
186
+ - Exemplo: uma fatura com ciclo 20/03–19/04 e vencimento 26/04 está em reference_month "2026-04". Normalmente coincide com o label que o banco usa (ex: "Fatura de Abril" quando o banco rotula pelo mês dos gastos).
187
+ - Se o banco rotula pelo mês de vencimento, some -1 mês para chegar ao reference_month.
189
188
  - net_total já desconta estornos.
190
189
  - Valores em centavos.`,
191
190
  inputSchema: {
192
191
  type: "object",
193
192
  properties: {
194
193
  card_name: { type: "string", description: "Nome do cartão" },
195
- reference_month: { type: "string", description: "YYYY-MM" },
194
+ reference_month: { type: "string", description: "YYYY-MM (mês dos gastos / fechamento)" },
196
195
  },
197
196
  },
198
197
  },
@@ -303,14 +302,14 @@ CAMPOS:
303
302
  - reference_month: string YYYY-MM — mês de referência (default: mês atual).
304
303
 
305
304
  REGRAS DE NEGÓCIO:
306
- - ATENÇÃO: reference_month segue a mesma regra de fin_fatura_cartao é o mês do VENCIMENTO, não dos gastos. Some +1 ao mês que o banco informa.
305
+ - reference_month = mês dos GASTOS / mês de fechamento do ciclo (NÃO é o mês do vencimento). Ver fin_fatura_cartao para exemplos.
307
306
  - Estornos aparecem com kind: 'refund' e signedAmount negativo.
308
307
  - Valores em centavos.`,
309
308
  inputSchema: {
310
309
  type: "object",
311
310
  properties: {
312
311
  card_name: { type: "string", description: "Nome do cartão (obrigatório)" },
313
- reference_month: { type: "string", description: "YYYY-MM (default: mês atual)" },
312
+ reference_month: { type: "string", description: "YYYY-MM (mês dos gastos / fechamento; default: mês atual)" },
314
313
  },
315
314
  required: ["card_name"],
316
315
  },
@@ -365,7 +364,7 @@ CAMPOS:
365
364
  - tx_date: string YYYY-MM-DD — data (default: hoje, timezone America/Sao_Paulo).
366
365
  - essential: boolean — se é despesa essencial.
367
366
  - installments: number — número de parcelas (2-48). Gera N transações separadas automaticamente.
368
- - current_installment: number — parcela inicial (default: 1). Útil para entrar no meio de um parcelamento.
367
+ - current_installment: number — parcela inicial (default: 1). Passar 1 é equivalente ao default o sistema cria todas as N parcelas começando da primeira. Use valores > 1 APENAS quando registrando uma compra parcelada que já está em andamento e você quer criar apenas as parcelas futuras (ex: installments=10, current_installment=3 cria 8 transações, da parcela 3 à 10).
369
368
  - reversal_of_id: string UUID — ID da transação original para estorno.
370
369
  - reversal_kind: string — 'full' ou 'partial' (obrigatório quando reversal_of_id é informado).
371
370
 
@@ -621,6 +620,92 @@ EXEMPLO — anular estorno que não abate (GitHub R$38,63):
621
620
  required: ["card_name", "cycle_end", "amount_cents"],
622
621
  },
623
622
  },
623
+ // ── Câmbio USD/BRL e ajuste manual de saldo ─────────────────────
624
+ {
625
+ name: "fin_cambio",
626
+ description: `Registra uma operação de câmbio (compra ou venda de dólar) entre uma conta BRL e uma conta USD. Cria 2 transações vinculadas com a categoria "Câmbio".
627
+
628
+ QUANDO USAR:
629
+ - Vender dólar: from = conta USD, to = conta BRL. Ex: "vendi $100 por R$540".
630
+ - Comprar dólar: from = conta BRL, to = conta USD. Ex: "comprei $50 por R$280".
631
+
632
+ NÃO USAR QUANDO:
633
+ - Quiser apenas atualizar o saldo de uma conta sem registrar a operação (use fin_ajustar_saldo_conta).
634
+ - Quiser lançar despesa em USD (não suportado no v0 — só câmbio).
635
+ - Quiser transferir entre contas da mesma moeda (use fin_criar_transferencia).
636
+
637
+ CAMPOS:
638
+ - from_account_name: string — conta de origem (a que fica negativa). Match parcial.
639
+ - to_account_name: string — conta de destino (a que fica positiva). Match parcial.
640
+ - amount_from_cents: number — valor que SAI da from_account, em centavos da moeda da conta. Ex: $100 = 10000 (centavos USD).
641
+ - amount_to_cents: number — valor que ENTRA na to_account, em centavos da moeda da conta. Ex: R$540 = 54000 (centavos BRL).
642
+ - tx_date: string YYYY-MM-DD — data (default: hoje).
643
+ - description: string — descrição livre (opcional).
644
+
645
+ REGRAS DE NEGÓCIO:
646
+ - As contas DEVEM ter moedas diferentes (uma BRL, outra USD).
647
+ - Cria 2 transações: uma despesa na from_account, uma receita na to_account.
648
+ - Ambas transações ficam linkadas via exchange_pair_id.
649
+ - A categoria "Câmbio" é criada automaticamente no primeiro uso.
650
+ - A taxa de câmbio é INFORMADA por você — não usa cotação automática.
651
+ - Operação atômica: se uma transação falhar, a outra é desfeita.
652
+
653
+ EXEMPLO — vender $100 por R$540:
654
+ { "from_account_name": "Wise USD", "to_account_name": "Itaú", "amount_from_cents": 10000, "amount_to_cents": 54000, "description": "Venda de dólar" }
655
+
656
+ EXEMPLO — comprar $50 por R$280:
657
+ { "from_account_name": "Itaú", "to_account_name": "Wise USD", "amount_from_cents": 28000, "amount_to_cents": 5000 }`,
658
+ inputSchema: {
659
+ type: "object",
660
+ properties: {
661
+ from_account_name: { type: "string", description: "Nome da conta de origem" },
662
+ to_account_name: { type: "string", description: "Nome da conta de destino" },
663
+ amount_from_cents: { type: "number", description: "Valor que SAI da origem, em centavos da moeda da conta" },
664
+ amount_to_cents: { type: "number", description: "Valor que ENTRA no destino, em centavos da moeda da conta" },
665
+ tx_date: { type: "string", description: "YYYY-MM-DD (default: hoje)" },
666
+ description: { type: "string", description: "Descrição livre (opcional)" },
667
+ },
668
+ required: ["from_account_name", "to_account_name", "amount_from_cents", "amount_to_cents"],
669
+ },
670
+ },
671
+ {
672
+ name: "fin_ajustar_saldo_conta",
673
+ description: `Atualiza o saldo de uma conta cash (BRL ou USD) diretamente, sem criar transação. Útil para correções e contas em USD que mudam sem motivo categórico.
674
+
675
+ QUANDO USAR:
676
+ - Conta USD: registrar quanto dólar você tem agora (ex: "achei mais $50 na carteira", "agora tenho $537").
677
+ - Conta BRL: corrigir saldo inicial após verificar extrato bancário.
678
+ - Onboarding: definir saldo inicial de uma conta recém-criada.
679
+
680
+ NÃO USAR QUANDO:
681
+ - Quiser registrar uma despesa ou receita categorizada (use fin_criar_despesa / fin_criar_receita).
682
+ - Quiser registrar câmbio entre contas (use fin_cambio).
683
+ - For uma conta de cartão de crédito (não suportado — cartão tem fatura).
684
+
685
+ CAMPOS:
686
+ - account_name: string — nome da conta (match parcial).
687
+ - amount_cents: number — novo saldo ABSOLUTO, em centavos da moeda da conta. Ex: $487 = 48700 (centavos USD); R$1.234,00 = 123400 (centavos BRL).
688
+
689
+ REGRAS DE NEGÓCIO:
690
+ - O valor é o SALDO ABSOLUTO, não um delta. Se a conta tinha $400 e você quer somar $50, passe 45000 (não 5000).
691
+ - Funciona para qualquer conta cash (BRL ou USD).
692
+ - Não cria transação — atualiza diretamente o initial_balance da conta.
693
+ - Não suportado para cartão de crédito.
694
+
695
+ EXEMPLO — atualizar saldo USD pra $537:
696
+ { "account_name": "Wise USD", "amount_cents": 53700 }
697
+
698
+ EXEMPLO — corrigir saldo BRL pra R$1.234,56:
699
+ { "account_name": "Itaú", "amount_cents": 123456 }`,
700
+ inputSchema: {
701
+ type: "object",
702
+ properties: {
703
+ account_name: { type: "string", description: "Nome da conta (match parcial)" },
704
+ amount_cents: { type: "number", description: "Novo saldo absoluto em centavos da moeda da conta" },
705
+ },
706
+ required: ["account_name", "amount_cents"],
707
+ },
708
+ },
624
709
  // ── Bills (Contas a Pagar) ──────────────────────────────────────
625
710
  {
626
711
  name: "fin_listar_bills",
@@ -786,7 +871,9 @@ CAMPOS:
786
871
  - name: string — nome da conta (obrigatório, ex: "Nubank", "Inter", "Carteira").
787
872
  - institution: string — nome da instituição financeira.
788
873
  - type: string — 'cash' (corrente/carteira/poupança) ou 'credit' (cartão de crédito) (obrigatório).
789
- - initial_balance_cents: number — saldo inicial em centavos (default: 0).
874
+ - initial_balance_cents: number — saldo inicial em centavos (default: 0). Para cartão credit, é o valor de uma fatura preexistente (use com initial_invoice_date).
875
+ - initial_invoice_date: string YYYY-MM-DD — data da fatura inicial (cutoff histórico). OMITIR é o comportamento recomendado para cartões novos — significa "sem cutoff", ou seja, transações com qualquer tx_date (inclusive anteriores à criação) contam no total da fatura.
876
+ - initial_invoice_amount_cents: number — alias de initial_balance_cents quando se refere a fatura inicial de cartão. Use junto com initial_invoice_date.
790
877
  - closing_day: number — dia de fechamento da fatura, 1-28 (obrigatório para type 'credit').
791
878
  - due_day: number — dia de vencimento da fatura, 1-28 (obrigatório para type 'credit').
792
879
  - credit_limit_cents: number — limite de crédito em centavos (para type 'credit').
@@ -794,7 +881,14 @@ CAMPOS:
794
881
  REGRAS DE NEGÓCIO:
795
882
  - Cartão de crédito (type 'credit') EXIGE closing_day e due_day.
796
883
  - closing_day e due_day devem estar entre 1 e 28.
797
- - Valores em centavos.`,
884
+ - Valores em centavos.
885
+ - **Para cartão de crédito**: por padrão (quando initial_invoice_date é omitido), o cartão é criado SEM cutoff histórico. Transações com qualquer tx_date contam no total da fatura. Use initial_invoice_date + initial_invoice_amount_cents apenas se o usuário tem um saldo de fatura preexistente vindo de outro sistema.
886
+
887
+ EXEMPLO — cartão novo (sem fatura preexistente):
888
+ { "name": "Nubank", "type": "credit", "closing_day": 19, "due_day": 26, "credit_limit_cents": 500000 }
889
+
890
+ EXEMPLO — cartão migrado com fatura já aberta:
891
+ { "name": "Itaú", "type": "credit", "closing_day": 1, "due_day": 9, "initial_invoice_date": "2026-03-15", "initial_invoice_amount_cents": 350000 }`,
798
892
  inputSchema: {
799
893
  type: "object",
800
894
  properties: {
@@ -802,6 +896,8 @@ REGRAS DE NEGÓCIO:
802
896
  institution: { type: "string", description: "Nome da instituição financeira" },
803
897
  type: { type: "string", description: "'cash' ou 'credit'" },
804
898
  initial_balance_cents: { type: "number", description: "Saldo inicial em centavos (default: 0)" },
899
+ initial_invoice_date: { type: "string", description: "YYYY-MM-DD — data da fatura inicial. Omitir para cartão sem cutoff histórico (recomendado)." },
900
+ initial_invoice_amount_cents: { type: "number", description: "Valor da fatura inicial em centavos. Use com initial_invoice_date." },
805
901
  closing_day: { type: "number", description: "Dia de fechamento da fatura (1-28, obrigatório para credit)" },
806
902
  due_day: { type: "number", description: "Dia de vencimento da fatura (1-28, obrigatório para credit)" },
807
903
  credit_limit_cents: { type: "number", description: "Limite de crédito em centavos (para credit)" },
@@ -813,21 +909,27 @@ REGRAS DE NEGÓCIO:
813
909
  name: "fin_editar_conta",
814
910
  description: `Edita uma conta bancária existente. Campos omitidos permanecem inalterados.
815
911
 
816
- QUANDO USAR: corrigir nome, instituição, limites ou dias de fechamento/vencimento.
912
+ QUANDO USAR: corrigir nome, instituição, limites, dias de fechamento/vencimento, OU corrigir a data/valor da fatura inicial em cartões criados com cutoff errado.
817
913
 
818
914
  CAMPOS:
819
915
  - account_id: string UUID — ID da conta (obrigatório).
820
916
  - name: string — novo nome.
821
917
  - institution: string — nova instituição.
822
918
  - type: string — 'cash' ou 'credit'.
823
- - initial_balance_cents: number — novo saldo inicial em centavos.
919
+ - initial_balance_cents: number — novo saldo inicial / fatura inicial em centavos.
920
+ - initial_invoice_date: string YYYY-MM-DD ou null — data da fatura inicial (cutoff histórico). Passe null para remover o cutoff (transações antigas voltam a contar no total).
921
+ - initial_invoice_amount_cents: number — alias de initial_balance_cents quando se refere a fatura inicial de cartão.
824
922
  - closing_day: number — novo dia de fechamento (1-28).
825
923
  - due_day: number — novo dia de vencimento (1-28).
826
924
  - credit_limit_cents: number — novo limite de crédito em centavos.
827
925
 
828
926
  REGRAS DE NEGÓCIO:
829
927
  - Valores em centavos.
830
- - Campos omitidos não são alterados.`,
928
+ - Campos omitidos não são alterados.
929
+ - Use initial_invoice_date: null para remover o cutoff histórico de um cartão (caso transações antigas estejam aparecendo fora da fatura no app).
930
+
931
+ EXEMPLO — remover cutoff de um cartão criado errado:
932
+ { "account_id": "uuid-do-cartao", "initial_invoice_date": null, "initial_invoice_amount_cents": 0 }`,
831
933
  inputSchema: {
832
934
  type: "object",
833
935
  properties: {
@@ -836,6 +938,8 @@ REGRAS DE NEGÓCIO:
836
938
  institution: { type: "string", description: "Nova instituição" },
837
939
  type: { type: "string", description: "'cash' ou 'credit'" },
838
940
  initial_balance_cents: { type: "number", description: "Novo saldo inicial em centavos" },
941
+ initial_invoice_date: { type: "string", description: "YYYY-MM-DD ou null — data da fatura inicial (cutoff histórico)" },
942
+ initial_invoice_amount_cents: { type: "number", description: "Valor da fatura inicial em centavos" },
839
943
  closing_day: { type: "number", description: "Novo dia de fechamento (1-28)" },
840
944
  due_day: { type: "number", description: "Novo dia de vencimento (1-28)" },
841
945
  credit_limit_cents: { type: "number", description: "Novo limite de crédito em centavos" },
@@ -1041,6 +1145,15 @@ async function handleTool(name, args) {
1041
1145
  case "fin_ajuste_fatura": {
1042
1146
  return ok(await api("POST", `/api/genius/card-invoice-adjustments`, args));
1043
1147
  }
1148
+ case "fin_cambio": {
1149
+ return ok(await api("POST", `/api/genius/exchange`, args));
1150
+ }
1151
+ case "fin_ajustar_saldo_conta": {
1152
+ const { account_name, amount_cents } = args;
1153
+ return ok(
1154
+ await api("POST", `/api/genius/accounts/${encodeURIComponent(account_name)}/balance`, { amount_cents })
1155
+ );
1156
+ }
1044
1157
  case "fin_listar_bills": {
1045
1158
  return ok(await api("GET", `/api/genius/bills`));
1046
1159
  }
@@ -1063,10 +1176,27 @@ async function handleTool(name, args) {
1063
1176
  return ok(await api("GET", `/api/genius/accounts`));
1064
1177
  }
1065
1178
  case "fin_criar_conta": {
1066
- return ok(await api("POST", `/api/genius/accounts`, args));
1179
+ // Map user-friendly names to Genius API field names.
1180
+ // initial_invoice_date / initial_invoice_amount_cents → initial_balance_date / initial_balance_cents
1181
+ const { initial_invoice_date, initial_invoice_amount_cents, ...rest } = args;
1182
+ const mapped = { ...rest };
1183
+ if (initial_invoice_date !== undefined) {
1184
+ mapped.initial_balance_date = initial_invoice_date;
1185
+ }
1186
+ if (initial_invoice_amount_cents !== undefined) {
1187
+ mapped.initial_balance_cents = initial_invoice_amount_cents;
1188
+ }
1189
+ return ok(await api("POST", `/api/genius/accounts`, mapped));
1067
1190
  }
1068
1191
  case "fin_editar_conta": {
1069
- const { account_id, ...body } = args;
1192
+ const { account_id, initial_invoice_date, initial_invoice_amount_cents, ...rest } = args;
1193
+ const body = { ...rest };
1194
+ if (initial_invoice_date !== undefined) {
1195
+ body.initial_balance_date = initial_invoice_date;
1196
+ }
1197
+ if (initial_invoice_amount_cents !== undefined) {
1198
+ body.initial_balance_cents = initial_invoice_amount_cents;
1199
+ }
1070
1200
  return ok(await api("PATCH", `/api/genius/accounts/${account_id}`, body));
1071
1201
  }
1072
1202
  case "fin_listar_categorias": {
@@ -1094,7 +1224,7 @@ async function handleTool(name, args) {
1094
1224
  // ── Server ──────────────────────────────────────────────────────────
1095
1225
 
1096
1226
  const server = new Server(
1097
- { name: "fin-app", version: "2.0.0" },
1227
+ { name: "fin-app", version: "2.3.0" },
1098
1228
  { capabilities: { tools: {}, resources: {} } }
1099
1229
  );
1100
1230
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fin-app-mcp",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "MCP server para o FIN App — finanças pessoais. Expõe tools para agents LLM operarem contas, despesas, faturas de cartão, bills recorrentes e mais.",
5
5
  "type": "module",
6
6
  "main": "index.mjs",