「kintoneで作った案件管理、もうExcelには戻れない。でも、あと一歩が届かない」——これは現場で何度も聞いたセリフです。
ある案件では、外注すると200万円の見積もりだった案件管理を kintoneで2週間・ライセンス月5万円 で構築し、案件の把握漏れを月5件からゼロにできました。ノーコードの費用対効果は圧倒的です。しかし運用が続くほど、標準機能では届かない「あと一歩」——複雑な集計、他システムとの横断、非定型な自動処理——が積み上がっていきます。
この記事では、その「あと一歩」を kintone REST API × MCPサーバー × Claude Code で埋める実装パターンを、実際に手を動かした手順・コード・ハマりどころ込みで解説します。「kintoneは好きだけど限界も感じている」人向けです。
kintoneの限界は「3つの壁」に現れる
kintoneを実務で使い込むと、限界はだいたい次の3つに集約されます。
| 壁 | 具体例 | 標準機能での対処 |
|---|---|---|
| 集計の壁 | 複数アプリを跨ぐ集計、条件が複雑なレポート | クロス集計表では表現しきれない |
| 連携の壁 | 会計・勤怠・SFAなど他システムとのデータ突合 | 手動CSVエクスポート→加工→取込 |
| 非定型処理の壁 | 「この条件のレコードだけ、こう変換して一括更新」 | 都度プラグイン開発 or 手作業 |
別の現場では、営業がSFA・経理がクラウド会計・CSがチャットとバラバラのSaaSを使い、同じ顧客に3回名前を聞くサイロ化が起きていました。APIで顧客IDをキーに横断させたら、顧客情報の確認が1件あたり 10分→30秒 に。kintoneも同じで、単体では優秀でも「繋がっていない」と全体最適になりません。
この3つの壁、実は共通の突破口があります。kintoneはREST APIをちゃんと持っている、という事実です。
突破口: REST API を Claude Code の「手足」にする
アーキテクチャはシンプルです。
Claude Code ──(自然言語の指示)──▶ MCPサーバー ──(REST API)──▶ kintone
「A社の未対応案件を一覧して」 認証・整形・検証 records.json
ポイントは MCPサーバーを間に挟む こと。以前、社内のREST APIを毎回curlで手入力していた時期があり、パラメータのミスが頻発していました。これをMCPツールとしてバリデーション付きでラップしたところ、「顧客ID 12345の情報を取得して」と自然言語で頼むだけで済むようになり、手動操作比で 約80%の時間削減 になりました。kintoneでも同じことをやります。
前提条件
- kintone環境(APIトークン発行権限があること)
- Node.js 18以上
- Claude Code(MCP対応版)
- 対象アプリの APIトークン(アプリ設定→APIトークン→「レコード閲覧・追加・編集」を付与)
Step 1: kintone REST API のチートシート
まずは素のAPIを叩いて感触を掴みます。認証はヘッダに X-Cybozu-API-Token を載せるだけです。よく使うエンドポイントを早見表にまとめました。
| 操作 | メソッド | エンドポイント | 主なパラメータ |
|---|---|---|---|
| レコード取得(複数) | GET | /k/v1/records.json |
app, query, fields
|
| レコード取得(単一) | GET | /k/v1/record.json |
app, id
|
| レコード追加 | POST | /k/v1/record.json |
app, record
|
| レコード更新 | PUT | /k/v1/record.json |
app, id, record
|
| レコード一括更新 | PUT | /k/v1/records.json |
app, records(最大100件) |
| アプリのフィールド定義 | GET | /k/v1/app/form/fields.json |
app |
query はSQLライクに書けます。これが強力で、標準の絞り込みより柔軟です。
# 「ステータス=未対応 かつ 金額>100万」の案件を10件取得
curl -s 'https://{subdomain}.cybozu.com/k/v1/records.json' \
-H 'X-Cybozu-API-Token: {API_TOKEN}' \
-G \
--data-urlencode 'app=12' \
--data-urlencode 'query=状態 in ("未対応") and 金額 > 1000000 order by 金額 desc limit 10'
fields=フィールドコードの配列 を付けると取得カラムを絞れ、レスポンスが軽くなります。大量レコードを扱うなら必ず指定しましょう。
Step 2: MCPサーバーで kintone を Claude Code に繋ぐ
APIの感触が掴めたら、MCPサーバーでラップします。TypeScriptで最小構成を書くと、こうなります。ツール定義の説明文(description)を丁寧に書くのがコツで、ここの質がClaude Codeの精度を左右します。
// kintone-mcp/src/index.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const BASE = `https://${process.env.KINTONE_SUBDOMAIN}.cybozu.com`;
const TOKEN = process.env.KINTONE_API_TOKEN!;
async function kintone(path: string, params: Record<string, string>) {
const url = new URL(`${BASE}/k/v1/${path}`);
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
const res = await fetch(url, { headers: { "X-Cybozu-API-Token": TOKEN } });
if (!res.ok) throw new Error(`kintone API ${res.status}: ${await res.text()}`);
return res.json();
}
const server = new McpServer({ name: "kintone", version: "1.0.0" });
// レコード検索ツール(queryはkintoneのクエリ構文で渡す)
server.tool(
"search_records",
"kintoneアプリからレコードを検索する。queryはkintoneクエリ構文(例: '状態 in (\"未対応\") order by 金額 desc limit 20')。fieldsは取得したいフィールドコードのカンマ区切り。",
{
app: z.string().describe("アプリID(数値の文字列)"),
query: z.string().describe("kintoneクエリ構文の絞り込み条件"),
fields: z.string().optional().describe("取得フィールドのカンマ区切り"),
},
async ({ app, query, fields }) => {
const params: Record<string, string> = { app, query };
if (fields) fields.split(",").forEach((f, i) => (params[`fields[${i}]`] = f.trim()));
const data = await kintone("records.json", params);
return { content: [{ type: "text", text: JSON.stringify(data.records, null, 2) }] };
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
Claude Code側の登録は、設定ファイルにサーバーを1つ追記するだけです。
{
"mcpServers": {
"kintone": {
"command": "node",
"args": ["/absolute/path/to/kintone-mcp/dist/index.js"],
"env": {
"KINTONE_SUBDOMAIN": "your-subdomain",
"KINTONE_API_TOKEN": "xxxxxxxxxxxx"
}
}
}
}
MCPサーバーの作り方そのものを深掘りしたい人は、別記事「自作MCPサーバーで社内APIをClaude Codeに繋ぐ実践ガイド」に一般化した手順をまとめています。
Step 3: 自然言語でkintoneを操作する
ここまで来ると、Claude Codeのプロンプトからこう頼めます。
案件管理アプリ(app=12)から、状態が「未対応」で金額100万円以上の案件を
金額の降順で取得して、担当者ごとに件数と合計金額を集計した表にして。
Claude Codeが search_records を呼び、返ってきたJSONを その場で集計してMarkdown表に整形 してくれます。kintone標準のクロス集計では手が届かなかった「複数条件×任意の切り口」の集計が、日本語の一文で終わります。「集計の壁」がここで崩れます。
さらに強力なのは 書き込み系 です。更新ツール(update_record)も同じ要領で足しておくと、こんな依頼ができます。
先月受注ステータスのまま残っている案件を洗い出して、
それぞれ「請求準備中」に一括更新して。件数と対象を先に見せてから実行して。
ここで大事なのが、いきなり全件更新させないこと。外部向けの変更(ここではデータの書き換え)は、ドラフト提示→人間の確認→実行 の順にするのが安全です。以前、AIエージェントに外部アクションを自律実行させて誤送信で冷や汗をかいた経験から、それ以降は書き込み系に必ず承認の一拍を挟むようにしています。誤操作はそれ以降ゼロです。
リアルタイム連携で「連携の壁」を崩す
もう一段進めるなら Webhook です。kintoneはレコード追加・更新をトリガーにWebhookを飛ばせます。あるECの現場では、注文情報を在庫システムに手動転記していてタイムラグで在庫切れ販売が月2〜3件起きていました。Webhookでリアルタイム連携に変えたら、在庫切れ販売は ゼロ、転記も不要で1日1時間削減。
kintone → Webhook → MCPサーバー(or 軽量なリスナー)→ 他システム、と繋げば、「kintoneでレコードが特定条件になったら会計システムに反映」といったイベント駆動の連携が組めます。別の現場で勤怠と給与ソフトをAPIで直結したときは、月末の手作業が 4時間→10分、加工ミス由来の給与誤支給もゼロになりました。「システムAのCSVをBに手動インポート」は、構造的に人的ミスを排除できる自動化の最優先ターゲットです。
ハマりどころトラブルシューティング
実装中に踏んだ地雷をまとめておきます。
| 症状 | 原因 | 対処 |
|---|---|---|
401 Unauthorized |
APIトークンの権限不足 | アプリ設定でトークンに必要な権限を付与し、アプリを更新(反映) する |
520 系エラー |
クエリ構文ミス(全角スペース等) |
query は半角で。フィールドコードの表記ゆれに注意 |
| 一括更新が途中で失敗 | 1リクエスト100件超 | 100件ずつチャンク分割。失敗時はリトライ |
| 取得が遅い | 全フィールド取得 |
fields で必要カラムのみに絞る |
| Claude Codeがツールを呼ばない | descriptionが曖昧 | ツールの説明文に「いつ使うか」「引数の具体例」を書く |
特に最後の「descriptionを丁寧に書く」は効きます。ツール定義の説明文は、AIにとっての取扱説明書です。
どこまでAIに任せ、どこを人が持つか
一通り運用してみて、線引きははっきりしました。
- AIに任せる: レコードの検索・集計・整形、非定型な一括変換の「下書き」、API仕様の把握
- 人が持つ: 書き込みの最終承認、アクセス権とAPIトークンの管理、業務ルールそのものの妥当性判断
kintoneのようなローコードは「とりあえず2週間で動くものを」に最強です。そこにClaude Code × APIを足すと、ノーコードの手軽さを保ったまま、コードの自由度を必要な部分だけ注入 できる。これが「kintoneの限界を超える」の実体だと感じています。
まとめ
- kintoneの限界は「集計・連携・非定型処理」の3つの壁に現れる
- 突破口は REST API。素のAPIをまずcurlで叩いて感触を掴む
- MCPサーバーでラップすれば、Claude Codeから 自然言語でkintone操作ができる
- 書き込み系は「ドラフト→確認→実行」で安全に
- Webhookでイベント駆動連携すれば「連携の壁」も崩せる
ノーコードを捨てる必要はありません。届かない「あと一歩」だけを、AI連携で埋めればいい。
この記事が参考になったら、いいね・ストック していただけると励みになります。
Claude Code・MCP・業務自動化の実装Tipsを継続的に発信しています。フォロー しておくと新着が届きます。
みなさんは、kintoneやローコードツールで「あと一歩届かない」と感じた場面はありますか? ぜひコメントで教えてください。