2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIエージェントを専属FPに - Money Forward ME MCPサーバーを作ってみた

2
Last updated at Posted at 2026-07-20

AIエージェントに家計や資産配分を相談しようとして、最初に困るのは推論能力ではありません。自分の資産、負債、毎月の収支を、エージェントへ安全かつ構造化して渡す方法です。

そこで、Money Forward MEの情報をMCP経由で取得する非公式のMCPサーバー money-forward-mcp-community を作り、npmへ公開しました。

目指したのは、AIエージェントを資格や責任を持つ専門家に置き換えることではありません。エージェントを「自分の財務状況を整理し、次に考えるべきことを一緒に洗い出すフィナンシャル・プランナー」として使うための、情報取得層を作ることです。

money-forward-mcp-communityはMoney Forward ME向けです。法人向けのMoney Forward Cloud会計を対象とした公式MCPサーバーとは、対象サービスも用途も異なります。また、本プロジェクトはMoney Forward, Inc.およびMoney Forward Home, Inc.とは無関係の非公式プロジェクトです。

数年分の蓄積を、もう一度入力し直したくなかった

私は数年前からMoney Forward MEを使い続けています。銀行、証券、カードなどを連携し、日々の入出金を分類してきました。

家計簿は、使い始めた瞬間よりも、データがたまってから価値が出ます。単月の支出額だけでなく、固定費の変化、季節ごとの出費、一時的な大口支出、資産と負債の推移を振り返れるからです。

AIエージェントに相談するために、これを別のデータベースへ移し替えたり、毎回CSVを出力してアップロードしたりするのは避けたかった。Money Forward MEを記録の置き場所として使い続け、必要なときだけエージェントが取得できる形が自然だと考えました。

MCPはこの用途に合います。エージェントへ金融データをプロンプトとして常時埋め込むのではなく、用途ごとに名前とスキーマを持つツールとして公開できます。

ただし、MCPをつないだだけでは「専属フィナンシャル・プランナー」にはなりません。MCPが提供するのは事実です。その事実をどう読み、どの順番で考え、どんな形で計画にするかは、スキルとして分ける必要があります。

MCPとスキルを分ける

Claude Codeで使う場合、全体は次の構成になります。

利用者
  │ 「先月は何に使いすぎた?」
  ↓
Claude Code
  ├─ Skill
  │    目的の確認、分析手順、計画の作り方、安全上のルール
  │
  └─ money-forward-mcp-community
       認証、残高・負債・収支の取得、データの正規化
          ↓
       Money Forward ME

役割を表にすると、境界がはっきりします。

担当すること 担当しないこと
MCP 現在の資産・負債・収支を取得し、構造化して返す 家計の目標や優先順位を決める
Skill 何を確認するか、どの順番で分析するか、計画をどう提示するかを定める Cookieを保存する、Money Forward MEへ直接アクセスする
AIエージェント Skillに従ってMCPを呼び、利用者と対話しながら計画を更新する 根拠なくデータや利用者の意向を補う
利用者 目標、家族構成、期限、許容できるリスクを決め、行動を承認する 認証情報を会話へ貼り付ける

フィナンシャル・プランは、レポートを一度作って終わりではありません。実行と見直しまで含めると、次のループになります。

目標を決める
  ↓
MCPで現状を取得する
  ↓
Skillに従って計画と行動項目を作る
  ↓
利用者が承認し、実行する
  ↓
次の確認日にMCPで実績を取り直す
  ↓
Skillに従って計画を修正する

現在のmoney-forward-mcp-communityが担うのは、現状取得と実績確認です。行動項目の作成と見直しはSkillが担います。リマインダーやタスク登録まで自動化したければ、カレンダーやタスク管理のMCPを別に組み合わせられます。一方、送金や金融商品の売買は同じ流れに載せず、人の確認を残します。

私が想定するフィナンシャル・プランナー用Skillには、少なくとも次を含めます。

  1. 期間、目標、家族構成、予定している大きな支出を確認する
  2. 資産・負債と最近の家計を取得し、現状を一枚にまとめる
  3. 集計値を先に使い、理由の確認が必要な項目だけ明細を見る
  4. 資産と負債、毎月の余剰・不足、近い将来の資金需要を分けて評価する
  5. 「今月」「3か月以内」「1年以内」の行動案へ落とす
  6. 前提、確認できなかった情報、専門家へ相談すべき事項を明記する
  7. 次回の確認時に同じ手順で再取得し、計画との差を更新する

Claude CodeのSkillなら、たとえば.claude/skills/personal-financial-planner/SKILL.mdへ次のように書けます。

---
description: Money Forward MEのデータを使って家計と資産・負債を整理し、実行可能なフィナンシャル・プランを作るときに使用する。
---

# Workflow

1. 最初に、利用者の目標、期限、家族構成、今後の大きな支出を確認する。
2. `money_forward_get_account`で連携口座の資産・負債を確認する。
3. 家計は`money_forward_get_cashflow_summary`から確認し、必要な場合だけ明細を取得する。
4. 資産配分はPortfolio、借入の内訳はLiabilityを使う。AccountとPortfolioを重複して合算しない。
5. 現状、課題、優先順位、具体的な行動、次回確認日を分けて提示する。
6. 事実と推測を分け、不足情報は不足していると書く。

MCPは汎用のままにし、家計の考え方や計画の形式をSkillへ置く。この分離なら、同じMCPを使いながら、単身世帯、子育て世帯、住宅購入前などの状況に応じてSkillだけを調整できます。

取得できる情報

0.2.0では、認証関連を含めて14個のMCPツールを公開しています。主なデータ取得ツールは次のとおりです。

知りたいこと ツール 戻り値
連携口座ごとの資産・負債 money_forward_get_account 銀行、証券、ポイント、カード、ローンを統一した一覧
総資産と資産クラス別構成 money_forward_get_portfolio_summary 総額、カテゴリ別金額、割合
個別の保有資産 money_forward_get_portfolio_details 資産クラスごとの銘柄・口座明細
負債総額と構成 money_forward_get_liability_summary 総額、カテゴリ別金額、割合
ローンやカード残高 money_forward_get_liability_details 負債ごとの明細
月次の収入・支出・収支 money_forward_get_cashflow_summary 月間合計とカテゴリ別集計
月次の個別入出金 money_forward_get_cashflow_details 日付、内容、金額、カテゴリなど
手動管理している口座 money_forward_list_manual_accounts 手動口座の一覧
手動口座内の資産 money_forward_list_manual_assets 指定口座の資産一覧

このほかに、認証状態の確認、ブラウザログイン、Cookieの設定・削除を行うツールがあります。

月次収支はYYYY-MMで月を指定できます。

{
  "month": "2026-06"
}

個別明細では、収入・支出の方向や、Money Forward ME上で家計簿の計算対象になっているかどうかでも絞り込めます。

設計で重視した4つのこと

1. まず集計、必要なときだけ明細

エージェントが「先月は何に使いすぎたか」を考えるだけなら、最初から全明細を渡す必要はありません。データ量が増えるほど、処理時間、トークン消費、不要な個人情報の露出が増えます。

そのため、Portfolio、Liability、Cashflowはsummarydetailsを分けました。

  • summary: 合計やカテゴリ別集計を返す
  • details: 個別の保有資産、ローン、入出金を返す

ツールの説明にも「まずSummaryを使い、明細が必要な場合だけDetailsを呼ぶ」と書いています。MCPはツールを提供するだけでなく、エージェントが適切なツールを選べる説明まで含めて設計する必要があります。

2. 資産と負債をフラットな口座モデルにそろえる

Money Forward ME上の情報は、銀行口座、証券、ポイント、カード利用残高、ローンなど、意味も表示場所も異なります。これらを金融機関ごとの複雑な入れ子構造にすると、エージェントは毎回異なる階層を解釈しなければなりません。

money_forward_get_accountでは、1残高を1エントリとして返します。

最初は、金融機関を親にして、その下へ預金、ポイント、カード残高、ローンをsubAccountsとして入れていました。画面構造には近いものの、異なる種類の残高が一つの階層に混ざり、エージェント側では再帰的な走査と項目ごとの解釈が必要になります。実データで試したあと、この構造を捨ててフラットなモデルへ変更しました。

type MoneyForwardAccountEntry = {
  accountId: string | null;
  institution: string;
  name: string;
  kind: "asset" | "liability";
  category: string | null;
  balance: number;
  currency: "JPY";
  source:
    | "account_detail"
    | "portfolio"
    | "liability"
    | "account_summary";
  registeredAt: string | null;
  lastFetchedAt: string | null;
  status: string | null;
};

金額の符号は次の規則に統一しました。

  • 資産は0以上
  • 負債は0以下
  • 0円でもkindで資産か負債かを判別できる

汎用化したレスポンス例です。

[
  {
    "accountId": "opaque-account-id",
    "institution": "Example Bank",
    "name": "Savings",
    "kind": "asset",
    "category": null,
    "balance": 1500000,
    "currency": "JPY",
    "source": "account_detail",
    "registeredAt": null,
    "lastFetchedAt": null,
    "status": null
  },
  {
    "accountId": "opaque-account-id",
    "institution": "Example Bank",
    "name": "Home loan",
    "kind": "liability",
    "category": "Mortgage",
    "balance": -12000000,
    "currency": "JPY",
    "source": "liability",
    "registeredAt": null,
    "lastFetchedAt": null,
    "status": null
  }
]

連携口座分であれば、balanceを合計するだけで純残高を計算できます。sourceは、その行が口座詳細、Portfolio、Liability、または詳細を取得できない場合の口座合計のどこから来たかを表します。

PortfolioとAccountは重複する見方を含むため、両方の資産額を足してはいけません。資産配分を見たいときはPortfolio、金融機関やカード、ローンを横断して純残高を見たいときはAccount、という使い分けです。

3. エージェントが解釈できる出力とエラーを返す

すべてのツールにMCPのoutputSchemaを定義しました。成功時はテキスト形式のJSONに加えて、次の場所へ構造化データを返します。

response.structuredContent.result

認証切れや上流エラーも、文章だけではなくコード、再試行可否、次に使う候補ツールを持つ構造にしています。

{
  "code": "auth_required",
  "message": "Money Forward ME authentication is not configured.",
  "retryable": false,
  "suggestedTools": [
    "money_forward_auth_login",
    "money_forward_set_cookie"
  ]
}

人間には読めても、エージェントが次の行動を決められないエラーメッセージは、MCPでは不十分です。

4. 金融データを扱う以上、Cookieをプロンプトへ出さない

このMCPサーバーは、Money Forward MEの公開APIではなく、利用者が認証したWebページを読み取ります。そのため、認証Cookieはパスワードと同等の機密情報として扱う必要があります。

実装では次の境界を設けました。

  • ローカルではPlaywrightのブラウザでログインできる
  • 保存する設定ファイルは0600にする
  • 設定ファイル由来のCookieが更新された場合は、原子的に保存し直す
  • 環境変数で渡したCookieはディスクへ永続化しない
  • MCPの応答へCookie、Cookieの一部、ローカルの設定パスを返さない
  • データ取得ツールは金融記録を変更しない

CookieをAIとの会話へ貼り付ける使い方は想定していません。MCPホストや利用するモデルのデータ保持・学習設定も、接続前に確認すべきです。

Claude Codeで使う

ここでは、Claude Codeがインストール済みで、ログインも終わっている前提にします。Node.jsは20以降が必要です。最初にバージョンを確認します。

node --version

v20以上なら、そのまま進めます。

1. 専用フォルダを作る

個人の金融データを扱うので、普段の開発リポジトリへ設定するより、専用フォルダを一つ作る方が安全です。

mkdir money-forward-planner
cd money-forward-planner

2. Money Forward MEへログインする

次のコマンドを実行するとブラウザが開きます。

npx -y money-forward-mcp-community auth

Money Forward MEへ通常どおりログインし、MFAがあればブラウザ上で完了させます。Chromiumがないというエラーが出た場合は、次を一度実行してからログインをやり直します。

npx -p playwright playwright install chromium

ログイン情報が保存されたことを確認します。

npx -y money-forward-mcp-community auth --status

CookieをコピーしてClaude Codeの会話へ貼り付ける必要はありません。

3. Claude CodeへMCPを登録する

Claude Codeはローカルのstdio MCPサーバーをコマンドで登録できます。専用フォルダの中で次を実行します。

claude mcp add --scope local money-forward-me -- \
  npx -y money-forward-mcp-community

--scope localを指定しているため、このMCPは今いるフォルダだけで有効になります。すべての開発プロジェクトから金融データへアクセスできる状態にしないためです。

登録を確認します。

claude mcp list

4. フィナンシャル・プランナー用Skillを置く

Skill用のフォルダを作ります。

mkdir -p .claude/skills/personal-financial-planner

先ほどの例を、次のファイルへ保存します。

.claude/skills/personal-financial-planner/SKILL.md

Skillには認証情報や実際の残高を書きません。分析手順、MCPツールの使い分け、計画の形式、安全上の境界だけを書きます。descriptionに利用場面を書いておけば、Claude Codeは家計や資産計画の相談に応じてSkillを自動的に読み込みます。明示的に使いたい場合は/personal-financial-plannerでも呼び出せます。

5. Claude Codeから接続を確認する

Claude Codeを起動します。

claude

起動後に/mcpを入力すると、money-forward-meの接続状態を確認できます。続けて、普通の日本語で次のように頼めます。

Money Forwardに接続できているか確認して。
先月の収入と支出を整理して、使いすぎている項目があれば教えて。
今の資産と借入をまとめて、まず見直すべきことを3つ提案して。
最近6か月の支出を比べて、増え続けている項目を教えて。
1年後までに貯蓄を増やしたい。今の家計を確認して、今月からできる計画を作って。

利用者が英語のツール名を覚える必要はありません。Skillが分析の順番を決め、Claude Codeが必要なMCPツールを選びます。数年分の蓄積があれば、単月の節約提案だけでなく、生活の変化や支出の癖を踏まえた計画を作れます。

できないことと、割り切ったこと

money-forward-mcp-communityだけで、AIエージェントが正しい金融判断を保証するわけではありません。

  • 投資、保険、税務などの最終判断を代行しない
  • 金融商品の売買や送金をしない
  • Money Forward ME上の取引記録を変更しない
  • 将来の収益率や必要資金を自動的に正解として算出しない
  • 取得データが最新か、連携エラーがないかは別途確認する

また、非公式のHTMLと内部挙動に依存しているため、Money Forward ME側の変更で動かなくなる可能性があります。ページ構造を解釈できない場合は空配列でごまかさず、page_format_changedとして失敗を返す設計にしています。

外貨を含む残高は、Money Forward ME上で表示される円換算評価額をJPYとして返す場合があります。個別明細の丸めとカテゴリ合計が数円ずれることもあります。こうした違いをエージェントが過度に解釈しないよう、取得元と値の意味をREADMEに明記しました。

MCPを作って分かったこと

AIエージェントを個人向けのフィナンシャル・プランナーとして使ううえで、難しかったのは高度なプロンプトを書くことではありませんでした。

必要だったのは、既に蓄積されたデータへ安全に到達し、資産、負債、収支を混同せず、エージェントが扱いやすい形で返すことでした。さらに、取得した事実を計画へ変える手順をSkillとして持たせる必要があります。集計と明細を分けること、金額の符号を統一すること、取得元を残すこと、MCPとSkillの責務を混ぜないことは、金融以外のMCP活用にも使える設計だと思います。

まずは、自分のデータを自分のエージェントから読めるところまでを公開しました。ソースコードとセットアップ手順はGitHubにあります。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?