1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeで銀行APIを実行する(準備編)

1
Last updated at Posted at 2026-08-29

この記事でできること

GMOあおぞらネット銀行の口座を持っていれば、審査なし・無料で銀行のAPIを実行できます。さらにこの銀行は2026年7月にMCPサーバーを公開したので、Claude Code に「口座の残高を確認して」と話しかけるだけで実行できます。

口座を開いた翌日にゼロから触って、curl とClaude Codeの両方で残高照会が返るまでを書きました。curl が通ったあと、エージェント登録と .mcp.json の書き足しは20分ほどで済み、Claude Code に話しかけてから残高が返るまでは数秒でした。

  • 対象読者.mcp.json を自分で書いてみたい方/銀行のAPIを触ってみたい方
  • かかるお金:0円。口座の開設も維持も、APIの実行も無料です
  • 試した日:2026年8月29日

先に3つだけ

# 押さえること 中身
1 触るのは仮想の口座 sunabar が配ってくれる練習用の口座です。名義も架空の人の名前が入っています。自分の本物の口座の残高は動きません(公式サイトにそう書かれています。リクエストを送る先のホストも本番とは別です)
2 APIの実行に審査はない ただし詳しい仕様書を読むには、別のサイトへの登録がもう1本要ります(無料)。この記事の範囲では要りません
3 本番と同じとは限らない sunabar は試すための場所です。本番環境と同じ動きをすることは保証されていません

ログインするサイトは3つあります

先に全体像を出しておきます。似た名前が並ぶので、私はここで一度混乱しました。

# サイト 何をするところ この記事で使うか
1 銀行のサービスサイト sso.gmo-aozora.com いつも使う銀行のサイト。ここで sunabar 用のIDとパスワードをもらう ✅ 3章
2 sunabar ポータル portal.sunabar.gmo-aozora.com 仮想口座・アクセストークン・エージェント登録・入出金シミュレーター ✅ 4・5・8章
3 開発者ポータル api.gmo-aozora.com/ganb/developer/ APIの詳しい仕様書。無料だが別に登録が要る ❌ 使いません

1. 銀行APIは法人契約が要る、と思い込んでいた

私が銀行のAPIに対して持っていたイメージは、「事業者として契約して、審査を通して、それからやっと開発が始まる」というものでした。個人が思いつきで触れるものだとは考えていませんでした。

これは私の思い込みで、少なくともGMOあおぞらネット銀行については違いました。sunabar(スナバー)という実験場が2020年4月から公開されていて、口座を持っている人なら誰でも無料で使えます。

2. sunabar なら口座があれば審査なし・無料

公式サイトに書かれている条件はこれだけです。

# 項目 内容
1 費用 無料
2 審査 審査なしで利用が可能
3 対象 個人・法人の両方(法人口座は要りません)
4 使えるAPIの数 20種類
5 開始 2020年4月7日

APIのカテゴリは6つに分かれています。

# カテゴリ 中身
1 口座 残高照会・入出金明細照会
2 デビット参照 デビットカードの利用明細
3 振込/振替 振込依頼・振替指示
4 総合振込 まとめて振り込む
5 振込入金口座 入金専用の口座
6 認可 アクセストークンを取る

ここでいう「審査なし」は、sunabar でAPIを実行することに審査が要らないという意味です。銀行口座そのものの開設には、ふつうどおり本人確認があります。私は2026年8月28日に口座を開き、翌日には sunabar を触れていました。

各APIの細かい仕様(パラメータや戻り値の一覧)は、上の表3番の開発者ポータルにあります。無料ですが登録が別に要ります。この記事は公開ページと自分で実行した結果だけで書いているので、仕様書を読まなくても残高照会までは進めます。

守っておきたい線

sunabar には利用規約があります。読んだうえで、私は次の2つを守ることにしました。

  • 繰り返し実行する仕掛けを作らない(規約に「システムの負荷を著しく増加させる行為」の禁止があります)
  • 開発者ポータルの仕様書を書き写さない(同じく「システム等の内容に関する情報」の第三者への開示が禁止されています)

3. IDとパスワードを取る(画面2つ)

sunabar には、銀行のサイトとは別のログインIDとパスワードがあります。これが最初のつまずきどころでした。銀行にログインするIDでは、sunabar のポータルには入れません。

取り方は2画面です。

  1. 銀行のサービスサイト https://sso.gmo-aozora.com/b2c/login にいつもどおりログインする
  2. 「お客様情報(申込・設定)」を開き、「開発者向け」タブをクリックする

このタブに、sunabar 用のIDとパスワードがそのまま表示されます。申し込みのような操作は要りません。口座を開いた翌日には、もう表示されていました。

この画面には本物の口座の情報も一緒に写ります。ブログに載せるつもりでスクリーンショットを撮るときは、口座番号・支店名・名義が入っていないか確認してから撮ってください。

4. 仮想の口座を見る(ここのお金は本物ではない)

取ったIDとパスワードで、今度は sunabar ポータル https://portal.sunabar.gmo-aozora.com/login にログインします。

中の「sunabarサービスサイトで使える銀行口座」を開くと、最初から2口座(個人用と法人用)が用意されています。最大10口座まで足せます。

私の個人用の口座に入っていたのは、架空の支店名と、架空の人の名義でした。自分の名前ではありません。振込限度額は500,000円が入っていました。

この口座のお金は本物ではありません。ここに振込を出しても、自分の本物の残高は1円も動きません。この記事の後半で実行するAPIも、api.sunabar.gmo-aozora.com という sunabar 専用のホストに向かっていて、本番のAPI(api.gmo-aozora.com)とは別の場所です。ここが安心して試せる理由です。

5. アクセストークンをコピーする

同じ画面に、口座ごとのアクセストークンが並んでいます。コピーボタンが付いているので、押すだけです。個人用と法人用で口座が2つあるので、トークンも2つ並びます。この記事では個人用のほうを使います。

OAuth 2.0 のフローを組む必要がありません。トークンはもう発行されていて、コピーしてHTTPヘッダに載せるだけでAPIが動きます。

OAuth 2.0 と OpenID Connect は2023年6月に「API認可機能」として後から追加されたもので、法人口座で「認可利用」を設定したときに使う道です。個人口座でトークンを直接コピーするなら、そちらは通らなくて済みます。

トークンには期限があります。ポータルサイトへの最終ログインから30日たつと失効します(失効の処理は毎日1時に走ります)。しばらく空けてから再開したら、まずポータルにログインし直してください。

6. curl で2本実行する

いきなりMCPに行かず、まず curl で動くことを確かめました。ここは2本必要です。残高照会には口座を指すIDが要るのですが、そのIDは口座一覧照会の戻り値だからです。

URLの形はこうなっています。

https://api.sunabar.gmo-aozora.com/{type}/v1/{api}

{type}personal(個人)か corporation(法人)です。個人用の口座のトークンを使うので、personal を選びます。

まずコピーしたトークンを環境変数に入れます。

export TOKEN='<ポータルからコピーしたアクセストークン>'

1本目:口座一覧照会

curl -X GET "https://api.sunabar.gmo-aozora.com/personal/v1/accounts" \
  -H "accept: application/json;charset=UTF-8" \
  -H "x-access-token: $TOKEN"

HTTP 200 で返ってきました。次は返り値の一部を抜き出したものです(口座を指すIDと支店の情報は伏せています)。

{
  "baseDate": "2026-08-29",
  "baseTime": "12:39:18+09:00",
  "accounts": [
    {
      "accountId": "3010100XXXXX",
      "branchCode": "XXX",
      "branchName": "(架空の支店名)",
      "accountTypeCode": "01",
      "accountTypeName": "普通預金(有利息)",
      "accountNumber": "00XXXXX",
      "accountName": "(架空の名義)",
      "currencyCode": "JPY",
      "transferLimitAmount": "500000"
    }
  ]
}

このほかに、代表口座かどうかを示す項目と、spAccounts という「つかいわけ口座」の配列が付いてきます。

2本目:残高照会

1本目で返ってきた accountId を、クエリ文字列で渡します。

curl -X GET "https://api.sunabar.gmo-aozora.com/personal/v1/accounts/balances?accountId=3010100XXXXX" \
  -H "accept: application/json;charset=UTF-8" \
  -H "x-access-token: $TOKEN"
# 項目 返ってきた値
1 balance(残高) 0
2 withdrawableAmount(出金可能額) 0
3 previousDayBalance(前日残高) 0
4 baseDate / baseTime 2026-08-29 / 12:39:33+09:00

残高0円は失敗ではありません。はじめてガイドに「初期時 sunabar 用銀行口座残高は0円の為、入出金シミュレータを利用して入金を行ってください」と書かれています。お金を入れるのはポータルの「入出金シミュレーター」から「ATM入金」で、これも仮想のお金なので、自分の本物の口座からは引かれません。

7. 銀行がMCPサーバーを出していた

ポータルのお知らせで知りました。sunabar は2026年7月17日にMCPサーバーを公開していて、公式のチュートリアルが「Claude Code編」として書かれています。目的もそのまま「AIエージェントからAPI操作を利用しやすくするため」と説明されています。

つなぐと、Claude Code から12個のツールが見えるようになります。

# 種類 ツール
1 照会系(8個) 口座一覧/残高/入出金明細/Visaデビット明細/デビット情報/デビット明細/振込結果/振込ステータス
2 実行系(4個) 振込依頼/振込取消/セーフティ口座間振替/振込手数料照会

ツールの名前は mcp__sunabar__ で始まります。たとえば残高照会は mcp__sunabar__get_personal_accounts_balances でした。どのツールが呼ばれたかは Claude Code の画面に出るので、意図しないものが動いていないか確かめられます。

2章の「20種類」はAPIの数、ここの「12個」はMCPサーバーが公開しているツールの数です。数が違うのは、MCP側が全部のAPIを出しているわけではないためです。

8. エージェントを登録する(ここでIDとポリシーを作る)

MCPサーバーにつなぐには、ポータルでエージェントを1つ登録して、そのIDをもらう必要があります。次の章の .mcp.json に書くので、先にこちらを済ませます。

登録するのは sunabar ポータルの「エージェント管理」の画面です。入れるのは名前とポリシーです。このポリシーが面白いところで、150文字までの日本語で書きます。画面に出ている例はこうでした。

振込操作は19時から21時の間のみ受け付け、1回あたりの振込上限は10,000円までとする。

時間帯も金額の上限も、言葉で書けるわけです。私はこう入れました。

残高照会と入出金明細照会のみ許可する。振込・振替・総合振込は一切受け付けない。

登録するとエージェントIDが発行されます。実行の結果は「API実行履歴」に、ポリシーの判定結果つきで残る作りになっています。

今回はここまでです。このポリシーで実際に振込が止まるかどうかは、まだ試していません。断られたときにどんなメッセージが返るのかは、次の記事で実物を確かめてから書きます。

9. .mcp.json を書く(公式どおりだとトークンが平文で残る)

.mcp.json作業フォルダの直下に置きます。そのフォルダで Claude Code を起動したときだけ読まれます。私はここで一度つまずきました。ファイルを置いたフォルダと、Claude Code を起動していたフォルダが1つずれていて、いつまでもつながらなかったのです。

公式チュートリアルに載っている形はこうです。

{
  "mcpServers": {
    "sunabar": {
      "type": "http",
      "url": "https://mcp.sunabar.gmo-aozora.com/mcp",
      "headers": {
        "x-access-token": "<ポータルから取得したアクセストークン>",
        "x-api-type": "<personal または corporation>",
        "x-agent-id": "<ポータルから取得したエージェントID>"
      }
    }
  }
}

npx でローカルのプログラムを起動する形(commandargs を書くタイプ)を見慣れていると、この書き方は新鮮でした。"type": "http" は、手元で何も起動せずURLへ直接つなぐという意味です。認証は headers に載せます。5章でコピーしたトークンを、curl-H に書いたのと同じ名前でここへ置くわけです。

curl のときは要らなかった x-api-typex-agent-id が増えています。8章で登録したエージェントを、ここで結びつけているわけです。

この形だとトークンがファイルに平文で残ります

この形のまま保存すると、アクセストークンがファイルに平文で残ります。私は作業フォルダをクラウドストレージの中に置いていたので、書いた瞬間に同期されていました。GitHubへ入れれば、そのまま公開されます。

Claude Code は .mcp.json の中で ${…} を環境変数として展開してくれるので、そこへ移します。全文はこうなります。

{
  "mcpServers": {
    "sunabar": {
      "type": "http",
      "url": "https://mcp.sunabar.gmo-aozora.com/mcp",
      "headers": {
        "x-access-token": "${SUNABAR_TOKEN}",
        "x-api-type": "personal",
        "x-agent-id": "${SUNABAR_AGENT_ID}"
      }
    }
  }
}

実体は ~/.zshrc に置きます。クラウドストレージの外です。

export SUNABAR_TOKEN='<トークン>'
export SUNABAR_AGENT_ID='<エージェントID>'

書いたあとに2つやることがあります。

  1. source ~/.zshrc を打つか、ターミナルを開き直す(そうしないと、いま開いているターミナルには値が入りません)
  2. ターミナルから Claude Code を起動し直す(${…} の展開は起動時に効きます。すでに起動していれば /exit してから入り直します)

30日たってトークンが失効したら、~/.zshrc の値を書き替えてこの2つをやり直します。.mcp.json のほうは触らなくて済みます。これも環境変数へ移しておく利点でした。

10. 「残高を確認して」と言うだけで動いた

作業フォルダで Claude Code を起動すると、承認を聞かれます。選択肢は3つです。

# 選択肢 意味
1 1. Use this MCP server sunabar だけを許可する。私はこれを選びました
2 2. Use this and all future MCP servers in this project このフォルダに今後入るMCPサーバーも全部自動で許可する
3 3. Continue without using つながずに進む

2番は選ばないほうがいいと思います。銀行につながるフォルダで、これから増えるものまで白紙で許可することになるからです。

つながったかどうかは claude mcp get sunabar で見られます。承認前は Pending approval、承認後は Connected と出ます。

あとは日本語で頼むだけでした。

> 口座の残高を確認して

mcp__sunabar__get_personal_accounts_balances が呼ばれ、残高が返ってきました。口座を指すIDは私からは渡していません。curl では2本必要だったところが、MCPだと口座の指定なしで全口座ぶんが返ってきます。

中身は curl のときと同じ0円です。同じ値が両方の道で返ったので、環境変数へ移したあとも正しくつながっていると確かめられました。

残高が0円なので、これ以上の見せ場はここにはありません。入出金シミュレーターで入金してからが本番です。

11. 気づいたこと3つ

1. ホスト名が3つあって紛らわしい

# ホスト 何のため
1 api.sunabar.gmo-aozora.com sunabar のAPIへリクエストを送る先。これが今回使うもの
2 api.gmo-aozora.com 本番のAPIと、開発者ポータルのある側
3 mcp.sunabar.gmo-aozora.com sunabar のMCPサーバー

私は最初、2023年に書かれた他の方の記事から api.gmo-aozora.com を拾ってメモしていました。公式の開発者ガイドと突き合わせて、送る前に気づけました。古い記事のURLをそのまま写さないほうがいいです

2. accept ヘッダの区切り文字

公式ガイドの curl の例は application/json:charset=UTF-8 とコロンで書かれています。私は見慣れたセミコロンの application/json;charset=UTF-8 で送って、200が返りました。コロンのほうを試していないので、どちらでも通るのか、セミコロンだけが正しいのかは分かりません。

3. 承認が3か所にあって、どれのことか迷う

sunabar と Claude Code を一緒に使うと、「承認」という言葉が別のものを指して3回出てきます。

# どこの承認 何を承認するか 私の場合
1 Claude Code の起動時 このMCPサーバーを使ってよいか 3択が出た(10章)
2 Claude Code のツール実行時 個々のツール呼び出しを実行してよいか 聞かれなかった
3 銀行のサービスサイト 振込を実行してよいか 今回は振込をしていないので未確認

3つ目について補足すると、公式ガイドによれば振込依頼APIは送っただけでは完了しません。銀行のサービスサイトの取引内容承認ページでボタンを押して、初めて振込が動く作りです。仮想口座の話なので、本物の口座の取引明細に出るわけではありません。

引っかかったのは2つ目です。起動時の案内には All tool calls require approval(すべてのツール呼び出しに承認が要る)と出るのに、実際には聞かれずに実行されました。私の Claude Code の設定によるものかもしれないので、環境によると思います。

ただ、この一件で8章のポリシーの意味がはっきりしました。手元の承認が必ず出るとは限らないなら、銀行の側で「振込は受け付けない」と決めておく道が要ります。守りを手元だけに置かない、という考え方です。実際にそれが効くかどうかは、次に確かめます。

まとめ

  • GMOあおぞらネット銀行の口座があれば、審査なし・無料で銀行のAPIを実行できます(詳しい仕様書を読むときだけ、無料の登録がもう1本要ります)
  • OAuth 2.0 の実装は要りません。ポータルからトークンをコピーしてヘッダに載せるだけです
  • 銀行が公式のMCPサーバーを出しているので、Claude Code から日本語で頼むだけで動きます
  • ただし公式チュートリアルどおりに .mcp.json を書くとトークンが平文で残るので、環境変数へ移してください
  • 銀行側にエージェントを登録して、150文字の日本語でポリシーを書けます。効き目はこれから確かめます

次は入出金シミュレーターで入金して、入出金明細照会と振込依頼を試します。そのときに、ポリシーが本当に振込を止めるのかも確かめます。

出典

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?