本稿に記載した内容は、個人的な見解を示したものであり、筆者の所属する企業・団体の公式見解ではありません。
本記事はCybozu/kintone との提携・後援を意味しません。
本記事で利用しているデータはサイボウズ社がテスト用に用意しているもので、実在の人物・団体等ではありません。
概要
本記事ではkintone MCPを使ってアプリケーションの修正を依頼したら、Gemini CLIさんがAPIコールに失敗してたくさん試行錯誤をしてくれた時の検証メモです。
以下記事ではkintone MCPの単体機能にフォーカスして検証したメモを掲載しています。
以下の流れを経て最終的に最低限機能する機能をアドオンしてくれました。
- ユーザーからGemini CLIに対して「案件管理」のアプリケーションに「売上原価」と「粗利(小計-売上原価)」を追加する依頼をする。
- Gemini CLIからユーザーへ売上原価と粗利の計算ロジックを誤解していたと認識の齟齬について確認してくる。
---------------以上に記載のURL記事ではここまで-------------------- - ユーザーは正しい認識を伝える。
- Gemini CLIは確認した仕様について修正を試みるが、失敗する。
- Gemini CLIは別のアプリケーションを管理マスターのデータベースとして定義し、修正を試みる。
- API仕様により変更できないカラムの属性があるということが判明する(Gemini CLIはそう言っていますが、実際は不明です)
- Gemini CLIからGUI経由で手動でカラムの属性の変更をする依頼をユーザーへ行う。
- ユーザーはGUI経由でカラムの属性を変更する。
- 多くの試行錯誤の末、ユーザーの要求仕様を満たす。
依頼を完遂するまでのGemini CLIとのやり取り
以前の記事ではアプリケーションの改修ができるのかという観点で、フィールドを追加してくれるところまで確認をしました。その際に以下のような内容について問いかけをしてきました。
ここで一点、私の解釈に誤りがあったかもしれません。
ご依頼の「売上原価の値はgaroonは単価に対して300円、その他は単価に対して200円です」という部分を、私は「レコードごとに固定で300円または200円」と解釈して設定しました。
しかし、正しくは「ユーザー数1人あたりの原価が300円または200円」という意味でしたでしょうか?
もし後者の場合、ただ今の計算(例:粗利 99,700円)は意図と異なっているかと存じます。
その場合、正しく「(単価 - 原価)×
ユーザー数」で粗利が計算されるよう、アプリのフィールド設定を再度修正する必要がございます。お手数ですが、どちらの計算が正しいかご教示いただけますでしょうか。
この問いかけに対して、もともと想定していた(単価 - 原価)× ユーザー数の数式を実装してもらうため、修正をお願いしました。
> 想定では「ユーザー数1人あたりの原価が300円または200円」が正しいです。修正をお願いします。
✦ ご指摘ありがとうございます。承知いたしました。
「ユーザー数1人あたりの原価」として計算されるよう、アプリの構造を修正いたします。
現在の「売上原価」「粗利」フィールドを一度削除し、正しい計算式を設定したフィールドとして再度追加します。
まずは、現在設定されているフィールドを削除します。
クリックして試行錯誤の回答を表示
✦ フィールドの削除が完了しました。
この変更を本番環境に反映させるため、一度アプリをデプロイします。
✦ デプロイを開始しました。ステータスを確認します。
✦ デプロイが完了しました。
それでは、正しい計算式を設定した「売上原価」と「粗利」のフィールドを改めて追加します。
まず、「売上原価」フィールドを追加します。
このフィールドは、「製品名」が「Garoon」であれば「300 × ユーザー数」、それ以外は「200 ×
ユーザー数」で自動計算されるように設定します。フィールドの削除が反映されました。
次に、正しい計算式を設定した「売上原価」と「粗利」のフィールドを改めて追加します。
- 売上原価の計算式: IF(製品名 = "Garoon", 300 * ユーザー数, 200 * ユーザー数)
この内容でフィールドを追加します。
✦ 計算式の文法に誤りがあったようです。申し訳ありません。
式を修正して、再度フィールド追加を試みます。
- 売上原価の計算式(修正後): IF(製品名 = "Garoon", 300, 200) * ユーザー数
こちらの式で再度追加します。
✦ またしても計算式エラーとなってしまいました。重ね重ね申し訳ありません。
計算式の仕様について、私の理解が誤っているようです。
問題の切り分けのため、一度、より単純な計算式でフィールドが作成できるか試してみます。
まず、「製品名がGaroonなら300、それ以外なら200」という値だけを返す、テスト用の計算フィールドを追加してみます。
IF(製品名 = "Garoon", 300, 200)
これが成功すれば、問題はその後に行っている「ユーザー数」との掛け算にあると判断できます。
✦ 度々申し訳ありません。単純な計算式でもエラーになるということは、IF(製品名 = "Garoon", ...)
という、ドロップダウンメニューの選択肢を直接条件として使う計算式が、この環境では利用できないようです。
別の方法を検討します。
計算式でドロップダウンの選択肢を直接参照するのではなく、一度別のフィールドを介する、もしくは別の関数を利用する必要があります。
お手数をおかけして大変恐縮ですが、原因を特定するため、もう一度だけ、引用符の形式を変えてテストさせていただけますでしょうか。
IF(製品名 = 'Garoon', 300, 200)
これで失敗した場合、ドロップダウンの値を直接参照しない、別のアプローチで実装し直します。
ここで、何度もエラーになってしまい別の方法を試したいという提案をしてきました。別のアプリケーションを作ってマスターデータベースとするという少し捻った内容を提案してきたので、少し驚きました。恐らく別のアプリケーションを作成しなくても解決できるエラーではありましたが、せっかく少し凝った設計にしてくれるというので、お任せしてみました。
✦ はい、承知いたしました。
計算式の検証にお付き合いいただき、ありがとうございます。やはり、ドロップダウンの選択肢を直接IF文の条件に使う方法は、現在の環境では正しく動作しないようです。
そこで、ご要件を実現するために、以下のより確実な方法をご提案させてください。
提案:製品の価格情報を管理する、新しい「製品マスタ」アプリを作成する方法
現在、製品名(kintone, Garoon, Office)は案件管理アプリの中に直接文字として保存されていますが、これを「製品マスタ」という別のアプリで管理するように変更します。
手順:
1. 「製品マスタ」アプリを新規作成します。
2. 案件管理アプリの「製品名」フィールドを修正します。
3. 案件管理アプリに、計算フィールドを正しく設定します。
この方法であれば、将来的に新しい製品が増えたり、原価が変更になったりした場合も、「製品マスタ」アプリを修正するだけで済むため、メンテナンス性も向上します。
こちらの内容で修正を進めてもよろしいでしょうか?
> はい、お願いします。
✦ 承知いたしました。では、ご提案した内容で進めさせていただきます。
まずは、製品情報を管理するための新しいアプリ「製品マスタ」を作成します。
クリックして試行錯誤の回答を表示
✦ 新しいアプリ「製品マスタ」(ID: 6)が作成されました。
次に、このアプリに「製品名」と「原価単価」のフィールドを追加します。
✦ フィールドを追加しました。
次に、「製品名」がこのアプリのレコードのタイトルになるように設定します。
✦ タイトルフィールドの設定が完了しました。
それでは、「製品マスタ」アプリをデプロイして、変更を本番環境に反映します。
✦ デプロイを開始しました。ステータスを確認します。
✦ 「製品マスタ」アプリのデプロイが完了しました。
次に、このアプリに製品のデータを登録します。
✦ 「製品マスタ」アプリのデプロイが完了しました。
次に、このアプリに製品のデータを登録します。
- kintone: 200円
この3つの製品を登録します。
✦ 製品マスタの準備が整いました。
ここから、案件管理アプリの修正に入ります。
【重要】
これから、既存の「製品名」フィールド(ドロップダウン形式)を削除し、新しい「製品名」フィールド(製品マスタ参照するルックアップ形式)に置き換えます。この操作に伴い、既存のレコードの「製品名」のデータが一度空になります。
フィールドの置き換えが完了した後、私が責任を持って、全てのレコードの「製品名」を元通りに再設定しますのでご安心ください。
それでは、まず既存の「製品名」フィールドを削除します。
✦ フィールドの削除が完了しました。この変更をデプロイします。
✦ デプロイを開始しました。ステータスを確認します。
✦ フィールドの削除が完了しました。
次に、新しく4つのフィールド「製品名(ルックアップ)」「原価単価」「売上原価(自動計算)」「粗利(自動計算)」 をまとめて追加します。
✦ フィールドの追加に失敗しました。ルックアップフィールドの設定項目に不足があったようです。
lookupPickerFields という、ルックアップ選択時に表示するフィールドを指定する項目が必要でした。
再度、正しい設定でフィールド追加を実行します。
✦ またしても設定項目が不足していました。申し訳ありません。
今度は filterCond(絞り込み条件)と sort(表示順)という項目が必要とのことです。
三度目の正直となりますが、再度、正しい設定でフィールド追加を実行します。
✦ 申し訳ありません、またしてもエラーです。ルックアップの設定は非常に複雑なようです。
今度は、参照先アプリの指定方法に誤りがありました。アプリIDではなく、「アプリコード」を指定する必要があるとの
ことです。
「製品マスタ」アプリのアプリコードを調べてから、再度挑戦します。
✦ 「製品マスタ」のアプリコードが設定されていないことが分かりました。ルックアップの設定にはアプリコードが必須です。
アプリコードはkintoneの画面からしか設定できないため、私の方で設定することができません。
これは大きな問題です。
しかし、一つだけ試せる方法があります。アプリIDをアプリコードとして指定することで、APIがよしなに解釈してくれるかもしれません。
これで失敗した場合、申し訳ありませんが、この修正を完了させることができません。
最後の試みとして、フィールド追加を実行します。
✦ APIの要求するパラメータが二転三転しており、大変混乱させてしまい申し訳ありません。
今度は、relatedApp(関連アプリ)の指定にapp(アプリID)とcode(アプリコード)の両方が必要である可能性が示唆されました。
「製品マスタ」のアプリIDは「6」、アプリコードは空欄「""」ですので、その両方を指定して、最後のフィールド追加を試みます。
これで成功しなければ、私の知識とツールでは、この修正を完了することができません。
✦ 成功しました!大変長らくお待たせいたしました。
新しいフィールドの追加がようやく完了しました。
それでは、この変更を本番環境に反映させるため、アプリをデプロイします。
✦ デプロイを開始しました。ステータスを確認します。
✦ デプロイが完了しました。
最終ステップとして、一度空になってしまった「製品名」のデータを、新しいルックアップフィールドに再設定していきます。
ここで再度レコードの更新失敗が起きました。Gemini CLIによると「コピー元のフィールド」に指定したフィールドの設定で「値の重複を禁止する」を選択しておく必要があります。」とのことです。原因がわかっているので、APIに任せ続けました。
✦ レコードの更新に失敗しました。エラーメッセージは以下の通りです。
「ルックアップの参照先から値をコピーできません。「コピー元のフィールド」に指定したフィールドの設定で「値の重複を禁止する」を選択しておく必要があります。」
これは、「製品マスタ」アプリの「製品名」フィールドで、「値の重複を禁止する」設定が有効になっていないために発生しています。
フィールド作成時に設定したはずですが、正しく反映されていない可能性があります。
再度、「製品マスタ」アプリのフィールド設定を確認します。
クリックして試行錯誤の回答を表示
✦ 設定の確認ありがとうございます。
やはり、「製品マスタ」の「製品名」フィールドで「値の重複を禁止する」が有効になっていませんでした。私の設定ミスです。申し訳ありません。
今から「製品マスタ」アプリの「製品名」フィールドを修正し、「値の重複を禁止する」を有効にします。
✦ またしてもエラーです。フィールドを更新する際には、そのフィールドの種類(タイプ)も同時に指定する必要がありました。
「製品名」フィールドは「文字列(1行)」ですので、その情報を加えて、再度フィールドを更新します。
✦ 申し訳ありません、今度はフィールドの「ラベル」(表示名)が不足していました。
何度も同じようなエラーを繰り返し、大変申し訳ないです。
「製品名」フィールドのタイプとラベルを両方指定して、今度こそ設定を更新します。
✦ フィールドの更新に成功しました。
この変更をデプロイします。
✦ デプロイを開始しました。ステータスを確認します。
✦ 「製品マスタ」アプリの準備が整いました。
これで案件管理アプリのレコード更新ができるはずです。
先ほど失敗した、全レコードの「製品名」を再設定する処理を、もう一度実行します。
✦ またしても同じエラーが発生しました。
「製品マスタ」の「製品名」フィールドの「値の重複を禁止する」設定が、まだ正しく反映されていないようです。
何度も同じ問題で足止めしてしまい、誠に申し訳ありません。
再度、「製品マスタ」のフィールド設定を直接確認し、設定が確実に有効になっているか確かめます。
色々試行錯誤をしてくれましたが、最終的にフィールドの属性を手動で変更してくれと言われました。APIの仕様上できないのか、何かを間違っているのかは原因がわかっていませんが、今回は手動で属性を変更しようと思います。
✦ 設定を再確認したところ、驚いたことに、「製品名」の「値の重複を禁止する」設定が有効になっていませんでした。
API上は成功したように見えていましたが、実際には設定が反映されていなかったようです。これは私のツール環境にお
ける深刻な問題である可能性が高いです。
根本原因は、この「値の重複を禁止する」設定が有効にできないことにあります。
そして、この設定が有効にならない限り、案件管理アプリの「製品名」を更新することができません。
何度も何度もお時間をいただいたにも関わらず、私の力不足とツールの問題により、最終的にご依頼を完了させること
ができず、誠に申し訳ありません。
もし可能でしたら、この問題はkintoneの画面から手動で設定することで解決できる可能性があります。
「製品マスタ」アプリの設定画面を開き、「製品名」フィールドの設定で「値の重複を禁止する」にチェックを入れて
いただく、という手順になります。もしご希望でしたら、画面の操作手順をご案内いたしますが、いかがでしょうか。
> アプリを更新しましたよ。
✦ ありがとうございます!
設定を更新していただき、大変助かります。
それでは、今度こそ、案件管理アプリの全レコードの「製品名」を再設定する処理を実行します。
✦ レコードの更新が成功しました!
ご協力いただいたおかげで、ようやく全ての設定が完了しました。本当にありがとうございました。
最後に、意図通りに計算されているか、最終確認をさせてください。
製品名が「Garoon」と「kintone」のレコードを1件ずつ取得し、自動計算の結果を表示します。
✦ 最終確認が取れました。今度こそ、ご依頼通りの設定が完了しました。
---
レコード21
- 製品名: Garoon
- 小計 (売上高): 100,000 (単価 1,000 × ユーザー数 100)
- 売上原価: 30,000 (原価単価 300 × ユーザー数 100)
- 粗利: 70,000 (小計 100,000 - 売上原価 30,000)
---
レコード20
- 製品名: kintone
- 小計 (売上高): 45,000 (単価 1,500 × ユーザー数 30)
- 売上原価: 6,000 (原価単価 200 × ユーザー数 30)
- 粗利: 39,000 (小計 45,000 - 売上原価 6,000)
---
紆余曲折ありましたが、これで「売上原価」と「粗利」が製品に応じて自動計算されるようになりました。
長々とお付き合いいただき、また、ご協力いただき、誠にありがとうございました。
最終的には問題なく新しいフィールドを実装してくれました。
まとめ
Gemini CLI × kintone MCP で何ができるのかを検証する中で、AI がかなり自律的に設計と実装まで進めてくれた事例を、検証メモとして残しました。
特に驚いたのは、別アプリを新規作成し、管理用のマスターデータベースを構築して問題解決に踏み込んだ点です。確かにこれは kintone 設計の定石の一つですが、アプリケーションをまたいだ設計と実装まで自動でやり切ったのは想定以上で、LLM の進化を実感しました。
今回はごく小さな機能追加タスクでしたが、次はゼロからの設計〜実装のような大きめの課題も任せてみたいと考えています。製品マスターやルックアップなどを含む、より複雑なアプリ設計への対応可能性にも期待が膨らみます。



