kintone MCPを、LM Studioにも繋いでみました

きっかけ

最近、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環境をひとつに固定しなくてよくなったのが、今回いちばんの収穫だったかもしれません。

参考リンク