[{"data":1,"prerenderedAt":530},["ShallowReactive",2],{"content-/2026-03-26-diary":3,"all-pages-for-dir":528,"og-image-/2026-03-26-diary":529},{"id":4,"title":5,"body":6,"category":508,"description":509,"extension":510,"meta":511,"navigation":450,"path":512,"project_name":513,"published":514,"publishedAt":515,"seo":516,"stem":517,"tags":518,"todo":526,"updatedAt":526,"__hash__":527},"pages/2026-03/2026-03-26/diary-2026-03-26.md","2026年3月26日の開発日記 - 会計API認証3段階突破・StreamDeckペイン制御・インポート機能構築",{"type":7,"value":8,"toc":492},"minimark",[9,14,23,27,32,35,41,57,68,71,75,78,82,106,114,116,120,123,127,141,149,151,155,158,162,176,184,186,190,193,201,203,206,409,411,414,434,436,439,465,467,470],[10,11,13],"h1",{"id":12},"_2026年3月26日の開発日記","2026年3月26日の開発日記",[15,16,17,18,22],"p",{},"朝、Claude Codeの許可プロンプトにマウスで応答する往復に嫌気がさしてStreamDeck連携を組み、昼から会計サービスのAPIキーをターミナルに叩き込んだら",[19,20,21],"code",{},"services: [\"conac\"]","が返ってきて手が止まった。認証手段を3回乗り換え、Chrome拡張のUIを2回作り直し、公開APIにないエンドポイントをDevToolsで掘り当てた一日。",[24,25,26],"h2",{"id":26},"今日やったこと",[28,29,31],"h3",{"id":30},"_1-会計サービスapioauth認証の試行錯誤","1. 会計サービスAPI・OAuth認証の試行錯誤",[15,33,34],{},"APIキーで連結会計スコープしか取れず、公式MCPを経由してOAuthトークンを取得、そのトークンでREST APIを直接叩けることを発見した。最終的に自前OAuthアプリを登録し、refresh_token（540日有効）を手に入れた。",[15,36,37],{},[38,39,40],"strong",{},"主な成果:",[42,43,44,48,51,54],"ul",{},[45,46,47],"li",{},"APIキー → MCP OAuth → 自前OAuthアプリと3段階で認証手段を切り替え",[45,49,50],{},"会計サービスAPI (v3) で仕訳の取得・登録・削除に成功",[45,52,53],{},"refresh_tokenで自動化の土台が整った",[45,55,56],{},"Chrome拡張 vs APIの速度感比較 → エクスポートはChrome拡張、インポート・削除はAPIに移行",[15,58,59,62,63],{},[38,60,61],{},"詳細:"," ",[64,65,67],"a",{"href":66},"/mf-api-oauth-authentication-journey","会計API・OAuth認証の試行錯誤ログ",[69,70],"hr",{},[28,72,74],{"id":73},"_2-chrome拡張エクスポートインポート機能改善","2. Chrome拡張エクスポート・インポート機能改善",[15,76,77],{},"エクスポートデータの整合性検証関数を3つ追加し、テストを162→200に拡充。一括インポート機能を組み上げ、UIを「使い捨てURL方式」に2回作り直した。",[15,79,80],{},[38,81,40],{},[42,83,84,97,100,103],{},[45,85,86,89,90,89,93,96],{},[19,87,88],{},"validateJournalRow"," / ",[19,91,92],{},"validateJournalBlock",[19,94,95],{},"validateExportData"," を lib.js に追加",[45,98,99],{},"事業者データ一括取得にN/M形式の進捗表示を追加",[45,101,102],{},"インポートパネルUIを全事業者一覧 + 年度ラジオボタンに再設計",[45,104,105],{},"仕訳インポートCSVサンプルフォーマットへのリンクを追加",[15,107,108,62,110],{},[38,109,61],{},[64,111,113],{"href":112},"/mf-extension-export-import-enhancements","Chrome拡張 - エクスポート整合性検証と一括インポート機能",[69,115],{},[28,117,119],{"id":118},"_3-公開apiの棚卸しと自動仕訳ルール戦略","3. 公開APIの棚卸しと自動仕訳ルール戦略",[15,121,122],{},"公開APIに未登録明細・連携明細・自動仕訳ルールのエンドポイントが存在しないことを確認。DevToolsで内部APIを掘り当て、ルールをローカルGitで管理する構想をまとめた。",[15,124,125],{},[38,126,40],{},[42,128,129,132,135,138],{},[45,130,131],{},"未登録明細 / 連携明細 / 自動仕訳ルール → 公開APIに全て存在しない",[45,133,134],{},"内部APIからルール取得可能なエンドポイントを発見",[45,136,137],{},"自動仕訳ルールをサービス側に置かずローカルGit管理する方針を決定",[45,139,140],{},"仮勘定消し込みフローの構想を策定",[15,142,143,62,145],{},[38,144,61],{},[64,146,148],{"href":147},"/mf-api-inventory-and-journal-rules","公開APIの棚卸しと自動仕訳ルール戦略",[69,150],{},[28,152,154],{"id":153},"_4-autohotkey-streamdeckによるclaude-codeマルチペイン制御","4. AutoHotKey + StreamDeckによるClaude Codeマルチペイン制御",[15,156,157],{},"Claude Codeを4ペインで並行実行する環境で、許可プロンプトへの応答をStreamDeck化した。最初は自動フォーカス方式（AHK + PreToolUseフック）を試したが、WTが2つ開いているとフォーカスの奪い合いが発生して断念。StreamDeck + AHKの半自動方式に転換した。",[15,159,160],{},[38,161,40],{},[42,163,164,167,170,173],{},[45,165,166],{},"launch-4pane.ps1で4ペイン分割 + PANE_POS環境変数の自動設定",[45,168,169],{},"claude-approve-pane.ahk: 「CC:」タイトルのWTを特定し指定ペインにEnter送信",[45,171,172],{},"StreamDeck XLに4ペイン分のbatファイルを登録",[45,174,175],{},"Chromeを見ながらStreamDeckで許可プロンプトに応答可能に",[15,177,178,62,180],{},[38,179,61],{},[64,181,183],{"href":182},"/autohotkey-streamdeck-claude-code-pane-control","AutoHotKey + Stream DeckでClaude Codeマルチペイン制御",[69,185],{},[28,187,189],{"id":188},"_5-mcpの価値判断の整理","5. MCPの価値判断の整理",[15,191,192],{},"会計APIの認証試行錯誤を通じて「CLI環境でMCPは必要か？」という問いに答えを出した。ステートフルなプロトコル（CDP等）にはMCPが有利、REST APIには直接叩いた方が柔軟という整理。",[15,194,195,62,197],{},[38,196,61],{},[64,198,200],{"href":199},"/when-mcp-is-worth-it-in-claude-code","Claude Code CLI環境でMCPは必要か？",[69,202],{},[24,204,205],{"id":205},"今日の試行錯誤",[207,208,209,231],"table",{},[210,211,212],"thead",{},[213,214,215,219,222,225,228],"tr",{},[216,217,218],"th",{},"#",[216,220,221],{},"テーマ",[216,223,224],{},"試したこと",[216,226,227],{},"結果",[216,229,230],{},"気づき",[232,233,234,252,268,283,298,315,331,347,362,378,394],"tbody",{},[213,235,236,240,243,246,249],{},[237,238,239],"td",{},"1",[237,241,242],{},"API認証",[237,244,245],{},"APIキーでトークン取得",[237,247,248],{},"失敗",[237,250,251],{},"conac（連結会計）スコープのみ。確定申告にAPI自体がない",[213,253,254,257,259,262,265],{},[237,255,256],{},"2",[237,258,242],{},[237,260,261],{},"公式MCP経由でOAuth認証",[237,263,264],{},"成功",[237,266,267],{},"トークンは取れるがrefresh_tokenがなく1時間制限",[213,269,270,273,275,278,280],{},[237,271,272],{},"3",[237,274,242],{},[237,276,277],{},"MCPのトークンで直接REST API",[237,279,264],{},[237,281,282],{},"MCPは薄いラッパー。トークンは共通",[213,284,285,288,290,293,295],{},[237,286,287],{},"4",[237,289,242],{},[237,291,292],{},"自前OAuthアプリ登録",[237,294,264],{},[237,296,297],{},"refresh_token 540日有効。自動化の土台が整った",[213,299,300,303,306,309,312],{},[237,301,302],{},"5",[237,304,305],{},"インポートUI",[237,307,308],{},"URL永続化方式で実装",[237,310,311],{},"使いづらい",[237,313,314],{},"URLは毎回変わる。永続化する意味がない",[213,316,317,320,322,325,328],{},[237,318,319],{},"6",[237,321,305],{},[237,323,324],{},"使い捨てURL方式に変更",[237,326,327],{},"採用",[237,329,330],{},"プロトタイプを触って初めて気づいた",[213,332,333,336,339,342,344],{},[237,334,335],{},"7",[237,337,338],{},"スプレッドシート書き込み",[237,340,341],{},"94件のJSONを1コマンドで送信",[237,343,248],{},[237,345,346],{},"Windowsコマンドライン長制限（約8,191文字）",[213,348,349,352,354,357,359],{},[237,350,351],{},"8",[237,353,338],{},[237,355,356],{},"バッチ分割で送信",[237,358,264],{},[237,360,361],{},"10〜20件ずつに分割して解決",[213,363,364,367,370,373,375],{},[237,365,366],{},"9",[237,368,369],{},"内部API調査",[237,371,372],{},"DevToolsで自動仕訳ルールAPI発見",[237,374,264],{},[237,376,377],{},"JSON/CSV両方で取得可能",[213,379,380,383,386,389,391],{},[237,381,382],{},"10",[237,384,385],{},"ペイン制御",[237,387,388],{},"PreToolUseフック+AHKで自動フォーカス",[237,390,248],{},[237,392,393],{},"WT2つ開くとフォーカス奪い合い",[213,395,396,399,401,404,406],{},[237,397,398],{},"11",[237,400,385],{},[237,402,403],{},"StreamDeck+AHKの半自動方式",[237,405,264],{},[237,407,408],{},"Chromeから目を離さず許可応答できる",[69,410],{},[24,412,413],{"id":413},"今日の学び",[42,415,416,419,422,425,428,431],{},[45,417,418],{},"クラウド確定申告サービスには公開APIがない。法人向けクラウド会計のみAPIが存在する",[45,420,421],{},"MCPのOAuthトークンはREST API直叩きに流用できる。MCPはプロトコルの抽象化であり、認証は同一基盤",[45,423,424],{},"自前OAuthアプリのrefresh_tokenは540日。MCPの1時間制限を回避できる唯一のルート",[45,426,427],{},"UIの設計は机上で考え続けるより、プロトタイプを触って壊して作り直す方が正解に速くたどり着く",[45,429,430],{},"WindowsのCLIでJSON大量データを扱うときは、コマンドライン長制限を常に念頭に置く",[45,432,433],{},"全自動（フォーカス奪取）より半自動（StreamDeck）の方が、マルチペイン環境では確実に動く。人間がどのペインに応答するか判断する余地を残す設計が正解",[69,435],{},[24,437,438],{"id":438},"明日やること",[42,440,443,453,459],{"className":441},[442],"contains-task-list",[45,444,447,452],{"className":445},[446],"task-list-item",[448,449],"input",{"disabled":450,"type":451},true,"checkbox"," 自動仕訳ルール取得をChrome拡張に実装し、JSONをリポジトリにコミット",[45,454,456,458],{"className":455},[446],[448,457],{"disabled":450,"type":451}," インポート機能の実機テスト（実際に仕訳を投入して検証）",[45,460,462,464],{"className":461},[446],[448,463],{"disabled":450,"type":451}," api-inventory-and-roadmap.md の未実装項目に優先度を付ける",[69,466],{},[24,468,469],{"id":469},"関連記事",[42,471,472,476,480,484,488],{},[45,473,474],{},[64,475,67],{"href":66},[45,477,478],{},[64,479,113],{"href":112},[45,481,482],{},[64,483,148],{"href":147},[45,485,486],{},[64,487,183],{"href":182},[45,489,490],{},[64,491,200],{"href":199},{"title":493,"searchDepth":494,"depth":494,"links":495},"",2,[496,504,505,506,507],{"id":26,"depth":494,"text":26,"children":497},[498,500,501,502,503],{"id":30,"depth":499,"text":31},3,{"id":73,"depth":499,"text":74},{"id":118,"depth":499,"text":119},{"id":153,"depth":499,"text":154},{"id":188,"depth":499,"text":189},{"id":205,"depth":494,"text":205},{"id":413,"depth":494,"text":413},{"id":438,"depth":494,"text":438},{"id":469,"depth":494,"text":469},"diary","APIキーからOAuth→MCP→自前OAuthアプリへと認証手段を3回乗り換えて会計サービスAPIを開通。StreamDeck+AHKでClaude Codeマルチペインの許可プロンプト応答を自動化。Chrome拡張のインポートUIを2回作り直した一日","md",{},"/2026-03-26-diary","daily-log",false,"2026-03-26T00:00:00.000Z",{"title":5,"description":509},"2026-03/2026-03-26/diary-2026-03-26",[519,520,521,522,523,524,525],"日記","OAuth","API","Chrome拡張機能","MCP","AutoHotKey","Stream Deck",null,"6h4b0qzQuzZEejVU_pvD-cA5CfjZXSJTPcMIt7xiDyk",[],"https://log.eurekapu.com/favicon.svg",1778379977484]