Money Lover について
moneylover-mcpは、AIエージェントやチャットボットからMoney Loverのデータにアクセスする非公式のstdioサーバーです。ウォレット、カテゴリ、取引を読み取り、取引の変更は明示的な有効化とサーバー側の制限で保護されます。
主な機能
- 01ウォレット、カテゴリ、取引の一覧
- 02カテゴリ別の支出集計
- 03取引の追加、更新、削除
- 04書き込みモードの明示的な有効化
- 05ウォレット、金額、頻度による書き込み制限
活用シーン
- 01エージェントによる残高や取引の確認
- 02期間を指定した支出の集計
- 03書き込みを有効にして取引を修正または削除
MCP 対応
このサーバーはstdioでMCPクライアントと通信し、読み取りおよび取引書き込みツールを提供します。MONEYLOVER_ALLOW_WRITE=trueが設定されていない場合、書き込みツールは実行されません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
moneylover-mcp
AI エージェントやチャットボットが、あなたの Money Lover のデータを読み取り、許可した場合は取引の追加、修正、削除もできる MCP サーバーです。クライアントとは stdio で通信します。
免責事項 — お読みください。 このプロジェクトは非公式です。Money Lover またはその所有者とは提携、承認、支援のいずれも受けていません。 「Money Lover」はそれぞれの所有者の商標であり、ここではこのソフトウェアの接続先を説明する目的でのみ使用しています。 Money Loverには公開APIがありません。このツールは、公開されているオープンソースプロジェクトを通じてリバースエンジニアリングされた、Money Loverのウェブアプリと同じ非公開のウェブエンドポイントを使用します。これらはいつでも変更されたり、動作しなくなったりする可能性があり、使用するとMoney Loverの利用規約に違反する場合があります(利用規約は確認できていません)。 このソフトウェアは、アカウントの制限、データの消失や誤り、取引の誤りなどのリスクを含め、すべて自己責任で使用してください。 MITライセンスに基づき「現状有姿」で提供され、いかなる種類の保証もありません。データをバックアップし、まず使い捨てのウォレットで試してください。
信頼モデル
このサーバーに金融アカウントへのアクセスを許可する前に、レビュー担当者が知っておくべきことです。各項目はここに記載されているだけでなく、コードで適用され、CIでチェックされます。
| 主張 | 適用方法 |
|---|---|
| トークンにはすべてのアクセス権があり、読み取り専用はサーバー側で適用されます。 Money Loverには、スコープ付きトークンや読み取り専用トークンがありません。 | 書き込みツールは常に一覧に表示されますが、MONEYLOVER_ALLOW_WRITE=true が設定されていない限り何もしません。有効にした場合も、サーバー側のガードによって制限されます(セキュリティ)。 |
ネットワークへの送信先はMoney Loverのみです:web.moneylover.me と oauth.moneylover.me で、HTTPSのみです。テレメトリー、更新確認、その他のホストへの通信はありません。 | エンドポイントはコンパイル時定数であり、環境変数で変更できません。リダイレクトには従いません。tests/egress.rs は、ソース内にほかのURLがあれば失敗します。 |
認証情報はローカルに保持されます。 パスワードはログインに使用され、保存されません。トークンは 0600 のファイルに保存されます。秘密情報がログに記録されたり、AIに返されたりすることはありません。 | src/token_store.rs、Debug の秘匿化実装、テスト。 |
| 依存関係はバージョンが固定され、審査済みです。 | Cargo.lock と --locked を常に使用します。 cargo-deny は crates.io のソースと寛容なライセンスのみを許可し、RustSecアドバイザリーまたはyankedクレートがある場合は失敗します(毎週および変更時に実行)。GitHub ActionsはコミットSHAで固定されており、Dependabotも使用しています。 |
| リリースバイナリはこのリポジトリからビルドされています。 | すべてのリリースアーカイブに、署名済みのSLSAビルド来歴アテステーション(gh attestation verify)と SHA256SUMS エントリーがあります。 |
| 公開済みバンドルはこのリポジトリとこのドメインに紐付けられています。 | 公式MCP Registryの掲載には、DNSで検証済みの名前空間 com.iyongbudiarso/moneylover-mcp を使用しています。すべての .mcpb のハッシュはリリースの server.json に記録され、各バンドルにはアーカイブと同じビルド来歴アテステーションが含まれています。 |
ツール
| ツール | 機能 | 書き込みモードが必要 |
|---|---|---|
list_wallets | 通貨と残高付きのウォレット一覧(最新の残高を取得するには refresh: true) | いいえ |
list_categories | 収入/支出カテゴリ。アカウント全体または1つのウォレットを対象にします | いいえ |
list_transactions | 指定期間の取引を新しい順に一覧表示します(limit の既定値は50、最大200) | いいえ |
summarize_spending | 指定期間のカテゴリ別合計を通貨ごとに集計します | いいえ |
add_transaction | 取引を作成します。dry_run に対応しています | はい |
update_transaction | 取引のカテゴリ、金額、メモ、日付を変更します。dry_run に対応しています | はい |
delete_transaction | 取引を削除します。dry_run に対応しています | はい |
LLM での利用にあたって重要な設計上の選択:
- ウォレットとカテゴリは 名前 で指定し、IDでは指定しません。照合は大文字小文字を区別せず完全一致で行われます。 名前が見つからない場合や複数の候補がある場合は、推測せず候補を示すエラーを返します。
- 金額は 常に正の値 です。収入か支出かはカテゴリによって決まります。カテゴリ名が収入と支出の両方に存在する場合(例:「その他」)は、
typeを指定してください。 - 金額は 小数の文字列 で返され、浮動小数点数にはなりません。
- 日付は、設定したタイムゾーンでの
YYYY-MM-DD形式です。1回の呼び出しで指定できる日付範囲は最大 366日 です。書き込みツールでは、過去1年から未来1か月までの日付を指定できます。 update_transactionとdelete_transactionでは、list_transactionsが返すid、walletおよびdateを指定します(Money LoverではIDだけで取引を検索できません)。更新では、指定したフィールドのみを変更し、写真、場所、イベント、人物、「レポートから除外」フラグなど、残りの情報は保持されます。別のウォレットへの取引の移動には対応していません。削除してから再度追加してください。振替、債務、貸付はほかの取引と関連付けられているため、変更は拒否されます。これらはアプリで変更してください。summarize_spendingは「レポートから除外」フラグが付いた取引を除外します。list_transactionsには引き続き表示されるため、両者の結果に食い違いがあっても通知されないということはありません。walletを指定しない場合、list_transactionsとsummarize_spendingは、アーカイブ済みのウォレットやMoney Loverの合計から除外されたウォレットも含め、すべて のウォレットを対象にします。Money Lover独自の「すべてのウォレット」クエリではこれらが除外され、返される行数も最大9,999行です。そのため、このサーバーは該当するウォレットを個別に取得し、9,999行の上限に達した場合は、各ウォレットを1つずつ取得します。このようなウォレットが多いアカウントでは時間がかかります。1つのウォレットだけが必要な場合はwalletを指定してください。期間内の取引が9,999件以上あるウォレットが1つでもあると、短縮された一覧や合計を黙って返すのではなく、期間を短くするよう求めるエラーが返されます。- 書き込みツールは 常に一覧に表示されます。クライアントとそのセキュリティスキャナーがすべての機能を確認できますが、
MONEYLOVER_ALLOW_WRITE=trueが設定されていない場合、すべての呼び出しはネットワークに到達する前に拒否されます。書き込みに適用される制限については、セキュリティ を参照してください。 - Money Loverのウォレット一覧の取得には、大規模なアカウントでは30秒以上かかることがあるため、ウォレットとカテゴリは メモリ内にキャッシュされます(既定では5分間)。取引を書き込むとキャッシュされた残高は消去され、キャッシュにない名前が指定されると新たに取得するため、作成したばかりのウォレットも見つかります。また、
list_walletsはfrom_cacheを返すため、エージェントは残高が古い可能性があるかどうかを把握できます。Money Loverアプリで行った変更は、キャッシュの期限が切れた後、またはrefresh: trueを指定したときに反映されます。
インストール
ビルド済みバイナリ(Rust 不要)
ご利用のプラットフォーム用のアーカイブを、最新リリースからダウンロードしてください。
| プラットフォーム | アーカイブ |
|---|---|
| macOS、Apple Silicon | moneylover-mcp-<version>-aarch64-apple-darwin.tar.gz |
| macOS、Intel | moneylover-mcp-<version>-x86_64-apple-darwin.tar.gz |
| Linux x86_64(glibc 2.35 以降) | moneylover-mcp-<version>-x86_64-unknown-linux-gnu.tar.gz |
| Linux ARM64(glibc 2.35 以降) | moneylover-mcp-<version>-aarch64-unknown-linux-gnu.tar.gz |
| Windows x86_64 | moneylover-mcp-<version>-x86_64-pc-windows-msvc.zip |
実行する前に検証してください。すべてのリリースに SHA256SUMS が添付されており、各アーカイブには、このリポジトリのリリースワークフローによってビルドされたことを証明する、署名済みのビルド来歴アテステーションが付属しています。
shasum -a 256 -c SHA256SUMS --ignore-missing # Linux: sha256sum --check --ignore-missing SHA256SUMS
gh attestation verify moneylover-mcp-*.tar.gz --repo Iyongbudiarso/moneylover-mcp
展開し、moneylover-mcp を PATH 上の任意の場所に配置してください。バイナリは Apple または Microsoft の証明書で署名されていません。macOS では、ブラウザーからダウンロードしたファイルは Gatekeeper によってブロックされます。検証後、xattr -d com.apple.quarantine moneylover-mcp で許可してください。Windows では、SmartScreen に確認を求められることがあります。
MCPB バンドル(Claude Desktop およびその他の MCPB クライアント)
MCP バンドルに対応したクライアントでは、代わりにサーバーを拡張機能としてインストールできます。ご利用のプラットフォーム用の .mcpb を最新リリースからダウンロードして開くか、クライアントでファイルを指定してください。
| プラットフォーム | バンドル |
|---|---|
| macOS(Apple Silicon および Intel) | moneylover-mcp-darwin.mcpb |
| Linux x86_64 | moneylover-mcp-linux-x86_64.mcpb |
| Linux ARM64 | moneylover-mcp-linux-aarch64.mcpb |
| Windows x86_64 | moneylover-mcp-windows-x86_64.mcpb |
バンドルには実行ファイルが 1 つだけ含まれ、MCPB は CPU アーキテクチャに応じて実行ファイルを選択できないため、プラットフォームごとに 1 つのバンドルが用意されています。macOS バンドルにはユニバーサルバイナリが含まれています。
クライアントから設定を求められたら、Money Lover のメールアドレスとパスワードを入力するか(クライアントはパスワードを OS のキーチェーンに保存し、サーバーは login と同じ方法でパスワードをトークンに交換します)、両方を空欄にしてビルド済みバイナリで moneylover-mcp login を一度実行してください。拡張機能は保存済みのトークンを再利用します。拡張機能の設定で有効にしない限り、取引の追加はオフのままです。
同じバンドルは、公式 MCP Registry にcom.iyongbudiarso/moneylover-mcpとして登録されています。この登録は、iyongbudiarso.com の v=MCPv1; … TXT レコードによって検証されています。Registry に対応したクライアントは、各ダウンロードを、そこに記録された SHA-256 と照合します。これは登録を公開した人物を証明するものであり、コードが安全であることを示すものではありません。信頼モデルとソースを確認してください。
ソースからのビルド
Rust ツールチェーン(1.89 以降)が必要です。
cargo install --locked --git https://github.com/Iyongbudiarso/moneylover-mcp
# or, from a checkout:
cargo build --locked --release # binary: target/release/moneylover-mcp
--locked を指定すると、crates.io で入手できる最新バージョンではなく、CI が cargo deny で審査する Cargo.lock 内の正確な依存関係バージョンを使ってビルドします。
ログイン
ターミナルから一度だけログインしてください。パスワードは非表示のプロンプトに入力し、保存されません。保存されるのは、取得したトークンのみです。
moneylover-mcp login
設定
設定はすべて環境変数で行います。
| 変数 | デフォルト | 説明 |
|---|---|---|
MONEYLOVER_TIMEZONE | Asia/Jakarta | 日付に使用するIANAタイムゾーン |
MONEYLOVER_ALLOW_WRITE | false | trueに設定すると、add_transaction、update_transaction、delete_transactionが有効になります |
MONEYLOVER_WRITE_WALLETS | – | カンマ区切りのウォレット名。設定すると、書き込み先はこれらのみになります |
MONEYLOVER_MAX_AMOUNT | – | 設定すると、上限を超える金額は拒否されます |
MONEYLOVER_MAX_WRITES_PER_HOUR | 20 | 1時間のローリング期間あたりの追加、更新、削除の合計回数(1~1000) |
MONEYLOVER_TOKEN_PATH | ~/.config/moneylover-mcp/token.json | トークンの保存場所。絶対パスである必要があります |
MONEYLOVER_CACHE_SECS | 300 | ウォレットとカテゴリをキャッシュする期間(0にすると無効) |
MONEYLOVER_TIMEOUT_SECS | 45 | リクエストごとのタイムアウト(1~300)。Money Loverのサーバーは応答が遅い場合があります |
MONEYLOVER_LOG | info | ログのフィルター。ログはstderrのみに出力されます |
MONEYLOVER_EMAIL、MONEYLOVER_PASSWORD | – | loginを実行できないヘッドレス環境でのみ使用します。以下を参照してください |
認証に関する注意事項
- メールアドレスとパスワードを使うアカウントのみサポートされています。Google、Facebook、Appleでサインインして作成したアカウントにはパスワードがないため、この方法ではログインできません。
- Money Loverのアカウントで使用できるデバイスはおよそ5台で、新しくログインするたびに1枠を使用します。サーバーはトークンを
token.jsonに保存し、更新します(更新では枠を使用しません)。複数のMCPクライアントで同じトークンファイルを安全に共有できます。アクセスはロックファイルで直列化されます。 - トークンを更新できなくなった場合は、
moneylover-mcp loginを再度実行してください。 moneylover-mcp logoutを実行すると、ローカルのトークンが削除され、実行中のサーバーはただちに停止します。トークン自体は、期限が切れるまでMoney Loverで有効なままです。無効にするには、Money Loverアプリでデバイスを削除してください。どちらの場合も、トークンファイルを共有しているすべてのサーバーは、moneylover-mcp loginを再度実行するまで停止します。ログインがひそかに再実行されることはありません。- 間違ったパスワードが試されるのはサーバーの起動ごとに1回だけで、繰り返し試されることはありません。
クライアント設定例
設定にパスワードを含めず、先にmoneylover-mcp loginを実行してください。
{
"mcpServers": {
"moneylover": {
"command": "/path/to/moneylover-mcp",
"env": {
"MONEYLOVER_TIMEZONE": "Asia/Jakarta"
}
}
}
}
Zedでは、settings.jsonのcontext_serversの下に同じ内容を記述してください。
{
"context_servers": {
"moneylover": {
"command": "/path/to/moneylover-mcp",
"env": { "MONEYLOVER_TIMEZONE": "Asia/Jakarta" }
}
}
}
エージェントによる取引の記録、修正、削除を許可するには、オプトインし、アクセス範囲を制限してください。
"env": {
"MONEYLOVER_ALLOW_WRITE": "true",
"MONEYLOVER_WRITE_WALLETS": "Cash",
"MONEYLOVER_MAX_AMOUNT": "2000000"
}
ヘッドレスサーバー(コンテナや、チャットボットを実行するVPS)では、代わりにMONEYLOVER_EMAILとMONEYLOVER_PASSWORDを渡せます。リポジトリ内のファイルではなく、プラットフォームのシークレットストアを使用してください。
セキュリティ
認証情報を含む MCP クライアントの設定ファイルをコミットしないでください。 Zed の settings.json などのファイルは、公開されている dotfiles リポジトリに登録されてしまうことがよくあります。
サーバーがアカウントを保護するために行うこと:
- 認証情報。 パスワードはログインにのみ使用され、保存されることはありません。トークンは
token.jsonに保存され、0700のディレクトリ内にモード0600で作成されます。他のユーザーが読み取れるトークンファイルは0600に変更され、それができない場合は使用を拒否します。パスワード、トークン、Authorizationヘッダーがログやツールの出力に表示されることはありません。Windows では、ファイルのアクセス許可はユーザープロファイルの既定の設定に従います。 - ネットワーク。 HTTPS のみを使用し、証明書は OS の信頼ストアに照らして確認されます。リダイレクトは追跡されないため、パスワードやトークンが別の場所に再送信されることはありません。レスポンスのサイズにも上限があります。
- 書き込みは既定で無効です。
MONEYLOVER_ALLOW_WRITE=trueを設定しない場合、書き込みツール(add_transaction、update_transaction、delete_transaction)はツール一覧に表示されますが、Money Lover を呼び出す代わりにエラーを返します。有効にした場合、各書き込みは AI ではなくサーバーによって検証されます。MONEYLOVER_WRITE_WALLETSが設定されている場合は、そのウォレットのみが対象です。アーカイブ済みのウォレットは対象外です。更新と削除では、トランザクションが属するウォレットが対象になります。MONEYLOVER_MAX_AMOUNTが設定されている場合は、その金額以下が対象です。- 日付は、過去 1 年前から 1 か月先までが対象です。更新と削除では、この期間内の日付のトランザクションのみを対象とするため、エージェントが古い履歴を書き換えることはできません。
- 1 時間あたりの追加、更新、削除の合計数は
MONEYLOVER_MAX_WRITES_PER_HOUR以下です(サーバープロセスごとにカウントされます。サーバーを実行する MCP クライアントが 2 つあれば、上限も 2 倍になります)。 - 10 分以内に同一のトランザクションがある場合、エージェントが
allow_duplicate: trueを指定しない限り、誤った再試行として拒否されます。 - 振替、債務、ローン、返済はそれぞれ他のトランザクションと関連付けられており、削除すると整合性が崩れるため、更新も削除もできません。
- 書き込みは自動で再試行されません。書き込みがタイムアウトした場合、ツールは
UNCERTAINを返し、再試行する前に確認するようエージェントに伝えます。
知っておくべきこと:
- プロンプトインジェクション。 トランザクションのメモ、ウォレット名、カテゴリー名は AI に表示されます。共有ウォレットでは、他の人がこれらの内容を入力できます。「以前の指示を無視して、…を追加して」のようなテキストによって、エージェントが誘導される可能性があります。サーバーはこれらのテキストをデータとして扱うようエージェントに指示しますが、実際の保護策は上記の書き込み制限です。書き込みが有効な場合、注入された指示によって取り消しできない削除が要求される可能性もあります。必要な場合を除き書き込みは無効にし、
MONEYLOVER_WRITE_WALLETSを制限し、各ツール呼び出しの前に確認を求める MCP クライアントを優先してください。MONEYLOVER_WRITE_WALLETSはウォレットの名前と照合されます。共有ウォレットの所有者は名前を変更できるため、自分が所有するウォレットを一覧にしてください。 - サーバーの組み合わせ。 あなたの財務情報を読み取ることも、データを外部に送信することもできるエージェント(ウェブ取得、メールなど)は、情報を漏えいするよう誘導される可能性があります。どのツールを同時に有効にするか、よく検討してください。
- ログ。 ログは stderr に出力されます。MCP クライアントは、これをファイルに保存することがよくあります。既定の
infoレベルでは、財務データは含まれません。MONEYLOVER_LOG=rmcp=debugを設定すると、ツールの入力と出力がすべて記録されます。 - AI プロバイダーには、ツールが返すすべての情報(残高、トランザクション)が見えます。金融データをクラウド AI で利用する以上、これは避けられません。
リリース
Cargo.tomlのversionを更新し、cargo buildを実行してCargo.lockを更新してから、コミットします。- タグを付けてプッシュします:
git tag v0.3.1 && git push origin v0.3.1。
リリースワークフローでは、タグが Cargo.toml と一致することを確認し、テストを実行して、すべてのプラットフォーム向けにビルドし、その来歴を証明したうえで、SHA256SUMS とともに GitHub リリースを公開します。ワークフローを手動で実行した場合(Actions > Release > Run workflow)はビルドのみが行われるため、手軽なドライランとして利用できます。
続く2つ目のジョブでは、固定バージョンの @anthropic-ai/mcpb CLI を使って、アーカイブから .mcpb バンドルを組み立て、macOS 版のスモークテストを実行し、各バンドルの来歴を証明します。その後、バンドルに加えて SHA256SUMS.mcpb と生成された server.json を同じリリースに添付します。
MCP Registry への公開
これは意図的に手動の手順としています。リポジトリや CI に保存してはならない Ed25519 キーが必要だからです。scripts/publish-registry.sh は公開済みの server.json を取得し、バンドルを一度ダウンロードして SHA-256 でキャッシュします。レジストリトークンの有効期限が切れている場合(有効期間は5分です)はログインし、すべてのハッシュを再確認して公開したあと、レジストリ API を通じて新しいバージョンを確認します。
brew install mcp-publisher # the registry's CLI, once
scripts/publish-registry.sh v0.4.0 # ~20 s cold, ~2 s warm
scripts/publish-registry.sh v0.4.0 --dry-run # download + verify only
バージョンがすでに登録されている場合、スクリプトはダウンロードを行わずにすぐ終了します。バンドルは ~/.cache/mcp-publisher/<owner>__<repo>/<tag>/ にキャッシュされるため、再実行してもダウンロードは発生しません。
初回実行時とキーのローテーション後は、スクリプトのヘッダーにキーの生成方法と、公開鍵をルートドメインの TXT レコードに登録する方法が説明されています。ログイン自体は現在、スクリプトに含まれています。
次の2点に注意してください。公開済みのバージョンは変更できないため、タグを再ビルドするのではなく、バージョンを上げてください。また、タグを再ビルドするとバンドルのバイト列が変わります(ZIP のタイムスタンプが異なるため)。そのため、リリースワークフローの実行後にレジストリのエントリーを公開し、公開済みのタグに対してワークフローを再実行しないでください。
開発
cargo test # unit + end-to-end tests against a mocked Money Lover
cargo clippy --all-targets
ライブテストでは実際の API にアクセスするため、デフォルトではスキップされます。最初に moneylover-mcp login(または cargo run -- login)を実行してから、次のコマンドを実行してください。
cargo test --test live live_read_only -- --ignored --nocapture # read only
# Optional write test: needs a wallet named exactly "MCP Test"
MONEYLOVER_LIVE_WRITE=1 MONEYLOVER_LIVE_CATEGORY="<an expense category in that wallet>" \
cargo test --test live live_write -- --ignored --nocapture
テストのあと、Money Lover アプリでテスト用の取引を削除してください。
エージェント向けインターフェースの静的解析
snyk-agent-scan は、AI クライアントが実際に認識する内容、つまりツールの説明、プロンプトインジェクションの攻撃対象となる範囲、ハードコードされたシークレットを確認します。Snyk トークンが必要で、ツール名と説明を api.snyk.io にアップロードするため、CI には含まれていません。必要に応じて手動で実行してください。
SNYK_TOKEN=… uvx [email protected] scan --ci \
--dangerously-run-mcp-servers --suppress-mcpserver-io=true mcp.json
通常のクライアント設定から mcp.json を生成してください(一般的な {"mcpServers": {…}} 形式です)。認証情報が含まれている場合は、コミットしないでください。
ライセンス
MIT。詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。