Inspiration
I make close to 100 UPI, bank, and card payments in a typical week. By the end of the month, I often look at my balance and wonder, “Where did my salary go?”
Finding the answer is harder than it should be. My transactions are scattered across UPI histories, bank statements, and credit-card statements. Every provider uses a different format, merchant names are often unclear, and transfers or investments can easily look like regular spending.
I used to combine everything manually in Excel, clean up transaction names, and categorize payments one by one. Then I would repeat the same process the following month. That frustration inspired me to build Finora, a statement-first personal finance app that goes beyond an ordinary expense tracker.
I also use Codex extensively, so I did not want Finora to stop at a web dashboard. I wanted it to work naturally with AI agents through MCP, allowing people to understand and manage their finances from the tools they already use.
What it does
Finora turns bank, credit-card, and UPI statements into a clean financial ledger.
Users can upload PDFs, CSV or Excel files, screenshots, receipt images, and transaction histories. Finora then:
- extracts and normalizes transactions into one consistent format;
- cleans noisy merchant names;
- separates consumption, income, investments, and person-to-person transfers;
- categorizes transactions with confidence scores and explanations;
- detects subscriptions, possible duplicate charges, unusual transactions, and spending changes;
- calculates cash flow, savings rate, budgets, forecasts, and monthly comparisons;
- answers natural-language questions about the user’s finances;
- creates and incrementally updates a Google Sheets financial dashboard.
A major part of Finora is its MCP server. It exposes 35 focused, composable tools that Codex, Claude, and other compatible agents can use. An agent can import a statement, search transactions, analyze spending, explain why a budget was exceeded, forecast month-end spending, find realistic savings, generate reports, or sync reviewed transactions to Google Sheets.
The MCP server is not a single opaque “do everything” wrapper. Each tool represents a clear financial operation, so the agent can use only what it needs and stop before making a change. Finora also includes an authenticated Agent Skill that connects agents to a user’s cloud Finora account with a revocable token.
How we built it
I built Finora with Next.js, React, and TypeScript. It runs on Cloudflare Workers, while Cloudflare D1 stores accounts, sessions, normalized ledgers, budgets, report settings, chat history, and agent access data.
The statement pipeline uses different strategies for different file types:
- CSV and Excel files use deterministic parsers.
- Text-based PDFs are extracted before being divided along page and row boundaries.
- Scanned PDFs, screenshots, and unfamiliar layouts use a multimodal fallback.
- Large statements are processed in bounded parallel chunks, retried by failed section, merged in document order, validated, and deduplicated.
After extraction, every transaction passes through a shared finance engine. This engine handles summaries, comparisons, subscriptions, anomalies, budgets, forecasts, merchant cleanup, and financial reports.
I deliberately kept financial calculations deterministic. AI helps interpret messy statement formats and explain verified results, but it does not invent totals. The same transaction model and finance engine power the web app, Google Sheets integration, reports, MCP server, and Agent Skill. If a user corrects one transaction, every downstream view uses that corrected information.
The local MCP server is implemented in mcp/server.mjs. It includes high-level tools such as sync_statement, analyze_finances, find_savings, and financial_health_report, along with precise tools for parsing, categorizing, searching, and synchronizing transactions. The repository also includes Codex configuration so the MCP server can be discovered directly from the project.
GPT-5.6 and Codex played a major role throughout development. GPT-5.6 helped me challenge product and architecture decisions. Codex inspected the actual repository, implemented changes across the interface, API, finance engine, database, Google integrations, MCP server, and Agent Skill, then ran builds and tests. It was not a one-prompt workflow. I reviewed the output, shared problems or screenshots, and repeated the process until the feature worked as intended.
Challenges we ran into
The first major challenge was statement inconsistency. Different banks use different columns, date formats, debit and credit conventions, and transaction descriptions. Some PDFs contain selectable text, while others are essentially scanned images.
Large statements created another problem. Sending a complete document through a single model call was slow and sometimes produced incomplete structured output. I redesigned the pipeline to extract text once, create layout-aware chunks, process them with controlled concurrency, retry only failed sections, and merge everything in the correct order.
Financial classification was also more complicated than I expected. A debit is not always an expense. It might be an investment, a payment to a friend, or a transfer between the user’s own accounts. I had to make sure these distinctions stayed consistent across the dashboard, reports, questions, Google Sheets, MCP results, and tests.
Google Sheets synchronization presented a different challenge. Rewriting an entire workbook could duplicate transactions or overwrite corrections. I introduced identity-based reconciliation so unchanged rows remain untouched, corrected rows are updated, and only genuinely new transactions are appended.
Designing the MCP surface required careful thought too. One giant tool would have been easy to build, but difficult to inspect, control, and reuse. I instead created focused tools that agents can combine for different financial tasks. I also added safeguards around actions that write data, while keeping parsing and analysis available as read-only operations.
Accomplishments that we're proud of
I am proud that Finora became more than a statement parser or a collection of charts.
It now supports the complete journey from a messy statement to a reviewed ledger, understandable insights, natural-language answers, Google Sheets reports, and agent-driven workflows.
Some accomplishments I am especially proud of include:
- building a statement-first system that works without depending on a limited list of bank connections;
- supporting PDFs, spreadsheets, screenshots, receipts, card statements, and UPI histories;
- processing large statements without repeatedly sending the complete document;
- separating investments and personal transfers from actual consumption;
- showing confidence scores, explanations, and original evidence;
- identifying subscriptions, duplicate charges, anomalies, and spending trends;
- synchronizing corrections and new transactions to Google Sheets without duplicating rows;
- building 35 focused MCP tools instead of one monolithic agent action;
- making the MCP server directly discoverable by Codex from the repository;
- creating an authenticated Agent Skill for cloud-based Finora accounts;
- keeping raw uploads out of persistent storage.
Most importantly, Finora gives users results they can inspect and correct instead of asking them to blindly trust an AI-generated summary.
What we learned
The biggest lesson was that personal finance software is primarily a data-quality problem. A beautiful chart is not useful if the underlying transaction was parsed incorrectly or counted in the wrong category.
I also learned that AI and deterministic software work best together. Models are useful for understanding messy documents and explaining results. Calculations involving money should remain reproducible and testable.
Corrections also need to be a core part of the product. No categorization system will understand every user perfectly. Preserving the original evidence, showing uncertainty, and allowing users to correct the ledger makes the system much more trustworthy.
Building the MCP server taught me to design for composition. Focused tools are easier for agents to understand, safer to use, and more flexible than one large automation. An agent can parse a statement, inspect the result, ask for confirmation, and only then save or synchronize the data.
Finally, I learned how valuable a shared core can be. Using the same transaction contract and finance engine across the web app, reports, Google Sheets, MCP, and the Agent Skill prevents different surfaces from producing different answers.
What's next for Finora
Next, I want to make Finora work with an even wider range of real-world financial documents and everyday workflows.
Planned improvements include:
- support for password-protected statement PDFs;
- page-level OCR review for difficult scans;
- persistent user-defined merchant and category rules;
- bank and email ingestion with explicit, narrow permissions;
- shared household ledgers with role-based access;
- mobile receipt capture and offline review;
- more export and reporting destinations;
- stronger agent access controls and token management;
- additional MCP tools for recurring financial workflows.
My long-term goal is for Finora to become a reliable financial memory: one place where people can bring together their statements, understand where their money went, correct mistakes, and use MCP-enabled agents to take meaningful action on their own financial data.
Built With
- agent-skills
- better-auth
- cloudflare-d1
- cloudflare-workers
- codex
- drizzle-orm
- eslint
- gmail-api
- google-drive-api
- google-oauth
- google-sheets-api
- google-vertex-ai
- gpt-5.6
- groq
- mcp
- next.js
- node.js
- openai
- pdf.js
- react
- tailwind-css
- typescript
- vinext
- vitest
- wrangler
Log in or sign up for Devpost to join the conversation.