きっかけ
最近、kintoneまわりの調べものや動作確認は、だいたいClaude Desktopに聞いて済ませています。「このアプリのフィールド構成を教えて」とか「レコードを10件取ってきて」と頼めば返ってくるので、管理画面を開く回数がずいぶん減りました。
これを支えているのがMCP(Model Context Protocol)です。AIが外部のツールを操作するための共通規格で、うちのClaude Desktopにはkintone MCPが2つ入っています。
ひとつはkintone MCPサーバー。実際のkintone環境につないで、アプリ一覧やフォーム設定、レコードの取得などをやってくれます。もうひとつがkintone Documentation MCPサーバーで、こちらはcybozu developer networkの公式ドキュメントを検索して読みに行くだけのもの。kintone環境そのものには触りません。
役割がきれいに分かれているので、両方入れておくと「最新の公式仕様を見ながら、手元のアプリの話をする」という使い方ができます。カスタマイズのコードを書かせるときは、これがあるとないとで精度がだいぶ違います。
で、あるときふと思いました。MCPはベンダーに依存しない規格なので、対応しているクライアントなら他でも動くはずです。LM Studioでも同じことができるなら、ローカルLLMで完結させられる。社内のデータを扱うときに気が楽になります。試してみました。
LM StudioのMCP設定はどこか
LM Studioは右サイドバーの「Program」タブから Install > Edit mcp.json を選ぶと、設定ファイルが内蔵のエディタで開きます。ターミナルでファイルを探しに行かなくていいのは助かりました。
書き方は公式に「Cursorの mcp.json 記法に従う」と書かれていて、見慣れた形式です。リモートのMCPなら、
{
"mcpServers": {
"example": {
"url": "https://example.com/mcp"
}
}
}
ローカルのMCPなら、
{
"mcpServers": {
"example-local": {
"command": "npx",
"args": ["-y", "パッケージ名"]
}
}
}
あとはClaude Desktopで使っている設定を、この形に置き換えてやるだけです。
書いた設定
2つとも1つのファイルにまとめて書けます。
{
"mcpServers": {
"kintone-docs": {
"url": "https://mcp.cybozu.dev/mcp"
},
"kintone": {
"command": "npx",
"args": ["-y", "@kintone/mcp-server"],
"env": {
"KINTONE_BASE_URL": "https://sample.cybozu.com",
"KINTONE_USERNAME": "ユーザー名",
"KINTONE_PASSWORD": "パスワード"
}
}
}
}
ドキュメント側の kintone-docs は、https://mcp.cybozu.dev/mcp を書くだけで終わりでした。認証情報もインストールも要りません。Claude Desktopでは拡張機能(MCPB)としてインストールしていたので身構えていたのですが、あれも中身はリモートのサーバーを呼んでいるだけなので、URLを直接書けば同じことでした。
kintone本体側は、npmパッケージの @kintone/mcp-server をローカルで起動する形になります。接続情報は env で渡します。APIトークンを使いたい場合は、env の中身をこちらに差し替えてください。
"env": {
"KINTONE_BASE_URL": "https://sample.cybozu.com",
"KINTONE_API_TOKEN": "トークン1,トークン2"
}
トークンはカンマ区切りで最大9個まで指定できます。ユーザー名・パスワードとトークンを両方書くとパスワード認証のほうが優先されるので、トークンで試したいときは併記しないようにしてください。
この内容で保存して、ひとまず動くはず……と思ったのですが、kintone本体側だけが起動しませんでした。
繋がらないときは、Nodeのバージョンを疑う
LM Studioのログを見ると、こう出ていました。
SyntaxError: Invalid regular expression flags
Node.js v18.17.1
正規表現の v フラグ(unicodeSets)はNode 20以降の構文なので、18で読み込むと構文エラーになります。@kintone/mcp-server は node >= 22 を要求していて、依存している file-type が新しい構文を使っていました。ドキュメント側が問題なく動いていたのは、あちらがリモート実行でNodeを介さないからです。切り分けとしても分かりやすい形でした。
手元にはnvmでv23.11.0が入っていたので、そちらを使えば済む話なのですが、ここでもう一段あります。nvmのnpmを絶対パスで呼んでも、
current: { node: 'v18.17.1', npm: '10.9.2' }
と表示されました。npmやnpxのスクリプトは #!/usr/bin/env node で始まっていて、nodeをPATHから探します。PATHの先頭には /usr/local/bin/node(18系)がいたので、そちらが使われていたわけです。グローバルインストールが /usr/local/lib/node_modules を掘ろうとして権限エラーで止まったのも同じ理由で、npmは動いているnodeの場所を基準にインストール先を決めます。ここで sudo を付けて押し通すと、Node 18の領域に入って結局動きません。
PATHを差し替えてから入れ直します。
export PATH="/Users/ユーザー名/.nvm/versions/node/v23.11.0/bin:$PATH"
node -v
ここで v23.11.0 と返ることを確認してから、
npm i -g @kintone/mcp-server
which kintone-mcp-server
nvm配下に入るので管理者権限は要りません。あとは mcp.json でそのパスを直接指定します。npxを経由しないぶん、起動も速くなります。
json
{
"mcpServers": {
"kintone-docs": {
"url": "https://mcp.cybozu.dev/mcp"
},
"kintone": {
"command": "/Users/ユーザー名/.nvm/versions/node/v23.11.0/bin/kintone-mcp-server",
"env": {
"PATH": "/Users/ユーザー名/.nvm/versions/node/v23.11.0/bin:/usr/bin:/bin:/usr/sbin:/sbin",
"KINTONE_BASE_URL": "https://sample.cybozu.com",
"KINTONE_USERNAME": "ユーザー名",
"KINTONE_PASSWORD": "パスワード"
}
}
}
}
env に PATH を書いているのが肝で、これがないとLM Studioから起動されたときに再び古いNodeを掴みます。ここまでやって、無事に繋がりました。
MCPサーバーの多くはNode製なので、起動しないときはまずNodeのバージョンを確認するというのは、kintoneに限らず効く話だと思います。
使ってみて

ドキュメント側のMCPは、思っていた以上に効きます。生成AIは学習した時点の知識で答えるので、kintoneのAPIについて聞くと、非推奨の書き方や存在しないAPIを平気で出してくることがあります。公式ドキュメントを引きに行かせるだけで、この手のハズレがだいぶ減りました。
一方、kintone本体につなぐほうは、権限をきちんと整理してから使いたいところです。AIが触れる範囲は、そのまま渡した認証情報の権限範囲になります。本番環境で使うなら、APIトークンをアプリ単位・操作単位で絞って渡すのが無難でしょう。パスワード認証は手軽ですが、そのユーザーにできることは全部できてしまいます。

ローカルLLMで動かせるようになったのは、やはり大きいです。クラウドのAIに投げたくないデータを扱うときの選択肢が増えました。ただモデルの性能はクラウドのものには及ばないので、用途は選びます。込み入ったカスタマイズの設計はClaude、定型的なレコード操作や社内データの確認はLM Studio、というあたりで今は落ち着いています。トークンを気にせず気軽に叩けるのも、思ったより快適でした。
MCPは規格なので、一度書き方を覚えてしまえば他のクライアントにも使い回せます。手元のAI環境をひとつに固定しなくてよくなったのが、今回いちばんの収穫だったかもしれません。
