moneybags
Moneybags
自分でホストする個人財務台帳。話しかけることができます。
明細をインポートするか、銀行と同期します。取引はまずルール、次にモデルによってカテゴリ分けされ、あなたが修正するたびにルールが学習されるため、同じ加盟店が二度誤分類されることはありません。そして、お金について平易な言葉で質問できます — Moneybags は MCP サーバーを実行するので、Claude が台帳を直接読み取ります。
"How much did I spend on groceries in August?"
"I just bought coffee, about six dollars"
"That Venmo payment was for tree work, not uncategorized"デプロイは1つ、所有者は1人。取引は自分のデータベースに保存され、API キーは自分のもの。間にサービスはありません。
これが何であるか、何でないか
これは、自分が管理するデータベースに財務データを置きたい人のための台帳であり、修正可能な分類器と、ダッシュボードにチャットボットを貼り付けたものではない会話型インターフェースを備えています。
これは、モバイルクライアントとサポートチームを備えた予算管理アプリではありません。サインアップも、マルチテナントも、ホスト型バージョンもありません。家族がスマートフォンでログインできるアプリが必要なら、Monarch か YNAB を使ってください — 本当に、それらはその用途に優れており、これはそれを目指していません。
実行にかかるコストは、データベースと API キーのコストだけです。Neon の無料枠で明細アップロードのみの個人台帳なら、それはゼロです。
Related MCP server: OpenCoffer
なぜこの設計なのか
このコードベースのほぼすべての難しい決定は、お金を静かに失わないことに関するものです。クラッシュではなく、失うことです。カテゴリが消える台帳は迷惑ですが、6,000ドルが消えても残高が合う台帳は危険です。正しく見えるからです。
以下は、そこから導かれるルールです。
お金は整数のセントです。 スキーマでは bigint、TypeScript では number。浮動小数点数はフォーマットの境界でのみ現れます。浮動小数点数を合計することは決してありません。
負はお金が出て行ったことを意味します。 解析、保存、台帳計算、UI に適用されるため、期間の純キャッシュフローは単純な SUM(amount_cents) であり、行ごとの分岐はありません。これを逆に理解するインポートアダプターは、内部的には一貫しているが完全に間違った台帳を生成します。そのため、アダプターに2回伝えられる唯一の事項です。
is_transfer はカテゴリではありません。 これは、この正確なドルがこの台帳の他の場所ですでに数えられていることを意味します — 他の口座を指定する内部振替、または購入もインポートされているクレジットカードの支払いです。Venmo、Zelle、Cash App、ATM 引き出し、貯蓄への振替には絶対に使いません。出て行ったお金は支出であり、どの経路で運ばれたかは関係ありません。
支払い経路は加盟店ではありません。 「Venmo」はお金がどのように移動したかを示すだけで、何を買ったかは何も示しません。それらの行は即座に支出として計上され — 未回答の質問が静かに月の合計を減らすことがないように — ラベル付けのためにキューに入れられます。1つの回答が、相手先をキーとするルールを学習します。
手動分類は決して上書きされません。 すべての自動パスは classification_source <> 'manual' でフィルタリングします。あなたの回答は、どのルールやモデルよりも優先されます。
重複排除は明細ではなくフィンガープリントに基づきます。 sha256(account, date, amount, normalized description) に一意インデックス。重複する明細を任意の順序でアップロードできます。すでに存在する行はスキップされます。アカウントはフィンガープリントの一部であるため、アカウントが複数ある場合、未分類のインポートは拒否されます。
収入が失われる方法は1つだけです。 合計は符号で分割されるため、正の金額はどのカテゴリに入っても収入としてカウントされます — 不完全なカテゴリでもカウントされ、分類の失敗はコストゼロです。is_transfer が唯一の失敗点なので、ルールが流入にそれを設定できるのは、パターンが支払いを明示的に指定するか、他の口座を指定する場合のみです。pnpm db:audit-income は、すべての流入と、現在それを除外できるすべてのルールを一覧表示します。
分類器は推測を拒否します。 ルールが最初に実行されます。残りはモデルに渡されます。それでも未解決のものは、自信満々の誤った答えではなく、レビューキューに入ります — そして、構造的に目的を伝えられない説明はモデルを完全にスキップします。毎回「不明」と答えるだけなのにコストがかかるからです。
セットアップ
Node 20+、pnpm、Postgres データベース。
git clone https://github.com/YOUR-USERNAME/moneybags && cd moneybags
pnpm install
cp .env.example .env.local3つを記入します:
# 1. Your database
DATABASE_URL="postgresql://..."
# 2. A session secret
node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
# 3. A password
pnpm auth:hash 'the password you want' # prints APP_PASSWORD_HASH=...次に:
pnpm db:migrate
pnpm db:seed # idempotent; seeds the category taxonomy
pnpm devこれで、CSV 明細インポートが機能する台帳が完成です。以下はすべてオプションであり、アプリはそれぞれが何を追加するかを正直に示します。
オプション: モデル
AI_API_KEY を設定します。ルールが認識しない加盟店のモデル支援による分類、文章化されたインサイト、PDF/画像明細の読み取りが得られます。
これがない場合でも、ルールは分類し、一致しない行はレビューキューに行き、CSV インポートは影響を受けません。これはサポートされている実行方法であり、壊れた方法ではありません。
任意のプロバイダーが機能します — Anthropic、OpenAI、OpenRouter、Groq、またはローカルの Ollama や LM Studio。docs/ai.md を参照してください。PDF 読み取りには Anthropic が必要です。他のすべての機能はどこでも機能します。
オプション: 銀行同期
明細をアップロードする代わりに、Plaid を通じて口座を接続します。Plaid の無料枠は10接続をカバーし、取引を含みます。
これは必要ありません。 明細アップロードはアプリを完全に使用する方法であり、Plaid をスキップすると、銀行の認証情報を保持する第三者機関が1つ減ります。docs/plaid.md を参照してください。開始する前に知っておくべき無料枠の落とし穴についても説明しています。
オプション: 話しかける
設定 → MCP トークンを発行し、任意の MCP クライアントをそのベアラートークンで https://your-host/api/mcp に向けます。読み取り、記録、修正のための14のツールがあります。削除ツールは意図的にありません — 聞き間違えた指示がレコードを破壊できないようにするためです。
デプロイ
2つの文書化されたパスがあり、どちらも特権はありません:
Docker Compose — アプリと Postgres、他には何も必要ありません:
cp .env.example .env # set APP_PASSWORD_HASH and SESSION_SECRET
docker compose up -dVercel + Neon — 無料枠、実行するサーバーはありません。
どちらも docs/deploy.md にあります。Authelia や Tailscale の背後に置きたい場合のリバースプロキシ設定も含まれます。
認証
3つの方法。少なくとも1つを設定しないと、アプリは URL を見つけた人に財務情報を提供するのではなく、起動を拒否します。
方法 | 対象 |
パスワード | デフォルト。 |
OIDC | 標準準拠の任意のプロバイダー — Google、Authentik、Keycloak、Zitadel、Okta。許可リストが必須です。空の場合は全員を拒否します。 |
信頼できるヘッダー | すでに Authelia、oauth2-proxy、Cloudflare Access、Tailscale の背後にある場合。プロキシ経由でのみアプリに到達できる場合にのみ安全です。 |
ログインはレート制限され、パスワードは定数時間で比較され、セッションは署名付き JWT で SESSION_VERSION で一括失効でき、Plaid アクセストークンは AES-256-GCM で保存時に暗号化されます。脅威モデルとそれが保護しないものについては、docs/security.md を参照してください。
構成可能性
取引は1つの境界、src/lib/sources を通じて入ります。下流のすべて — 重複排除、照合、分類、台帳 — は ParsedTransaction[] のみを認識し、行がアップロードで来たのか同期で来たのかを区別できません。
銀行、アグリゲーター、または扱いにくい CSV 方言を追加することは、アダプターであり、それ以外の何ものでもありません:
registerFileSource({
id: "my-bank",
label: "My Bank CSV",
accepts: ({ filename }) => filename.startsWith("mybank-"),
parse: ({ bytes }) => ({ transactions: parseMyBank(bytes), warnings: [] }),
});モデルプロバイダーも同じ種類のシームの背後にあります — src/lib/ai の外でベンダー SDK はインポートされません。docs/extending.md は、分類法、ルール、ソース、同期プロバイダー、MCP ツールをカバーしています。
コマンド
| 通常のもの |
|
|
| スキーマ、次に分類法 |
| 手動行をスキップして、台帳上でパイプラインを再実行 |
| 収入から除外されている流入がないことを確認 |
| リンクされているものと、各口座の同期境界 |
スタック
Next.js 15 (App Router)、Drizzle 経由の Postgres、Tailwind。Anthropic SDK と Plaid SDK はどちらも実行時にはオプションであり、インターフェースの背後に分離されています。
貢献
CLAUDE.md は、物事がなぜそうなっているのかを文書化しており、通常はそれらを引き起こしたバグを挙げています。src/lib/classify または src/lib/reconcile に触れる前に読んでください — いくつかの回帰はテストで固定されており、コメントはそれらを元に戻すと何が壊れるかを示しています。
分類器を変更するときの一般的なルール: 過剰マッチングよりも過少マッチングを優先します。 二度と発火しないルールは、1回の再修正で済みます。過剰マッチングするルールは、すでに確認した履歴を静かに書き換えます。
ライセンス
MIT — LICENSE を参照してください。
これは実際の財務データを扱います。保証はなく、デプロイ、キー、バックアップはあなたの責任です。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables users to track personal expenses through natural language interactions with comprehensive category support and financial summaries. Provides both local and remote MCP server options with SQLite storage for fast expense management operations.
- AlicenseNot gradedqualityCmaintenanceEnables querying personal finance data including accounts, transactions, spending, holdings, net worth, and budgets from your self-hosted OpenCoffer instance. Supports natural language queries through any MCP-compatible client.14MIT
- AlicenseAqualityDmaintenancePersonal expense tracker MCP server that enables tracking expenses, income, budgets, and savings goals through natural language.10MIT
- FlicenseNot gradedqualityCmaintenanceExposes personal-finance tools like accounts, transactions, spending analysis, budgets, bills, reminders, portfolio, and goals via MCP, enabling any MCP client to query financial data.
Related MCP Connectors
Personal finance by conversation: expenses, receipts, statement import, budgets, net worth.
Log, query, and edit expenses, budgets, and accounts in Ledgy from any MCP-compatible AI assistant.
Ask your AI about bank accounts, spending, debts, holdings, and investment activity.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/aroesec/moneybags'
If you have feedback or need assistance with the MCP directory API, please join our Discord server