Back to Projects

finance-mcp-server – Personal Finance as an AI Tool Surface

An open-source Model Context Protocol server that lets you ask an AI assistant real questions about your own money — spending, subscriptions, cash flow, debt payoff — without any of that data leaving your machine.

Architecture diagram: bank CSV exports and user-defined category rules feed a TypeScript parser and normalizer, which writes to a local SQLite database, exposed through MCP tools that Claude queries in plain English. Nothing leaves the device.

Project Details

Tags

TypeScript MCP AI Tooling SQLite Local-First Open Source

Repository

Challenge

Consumer finance apps answer the questions they were designed to answer. The moment you want something slightly off-script — how much a specific merchant has cost you over a year, whether a subscription quietly raised its price, what happens to your balance in thirty days if nothing changes — you are exporting a CSV and building a spreadsheet.

Handing that data to a general-purpose AI would answer the questions, but it means uploading a complete record of where you go, what you buy, and what you owe. For financial data specifically, that trade is not worth making. The interesting design problem was whether you could get the flexibility of natural-language querying while the data itself stays put.

Solution

Model Context Protocol inverts the usual arrangement. Instead of sending data to a model, you expose a set of tools the model may call, and the model asks for exactly what it needs. The database stays local; only the answer to the question you asked ever leaves.

Outcome

The project is public under an MIT license, and it is the thing I point at when someone asks what "builds AI tooling" actually means in practice.

The design lesson that transferred furthest was about tool granularity. Early versions exposed a few flexible tools that could do almost anything, and the model used them unpredictably. Narrower, sharper tools — each one answering a single well-formed question — produced better results than powerful general ones. Designing a tool surface for a language model turns out to be an interface design problem, with the same rules: name things for what the user wants, not for what the system does, and make the right call the obvious one.