redash-mcp 3.1.7 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md CHANGED
@@ -5,10 +5,14 @@
5
5
  [![Node](https://img.shields.io/node/v/redash-mcp.svg)](https://nodejs.org)
6
6
  [![smithery badge](https://smithery.ai/badge/dev-seob717/redash-mcp)](https://smithery.ai/servers/dev-seob717/redash-mcp)
7
7
  [![Glama](https://glama.ai/mcp/servers/seob717/redash-mcp/badges/score.svg)](https://glama.ai/mcp/servers/seob717/redash-mcp)
8
+ [![Claude](https://img.shields.io/badge/Claude-Compatible-D97757?logo=claude&logoColor=white)](https://github.com/seob717/redash-mcp#installation)
9
+ [![Cursor](https://img.shields.io/badge/Cursor-Compatible-111111)](https://github.com/seob717/redash-mcp#installation)
10
+ [![Gemini CLI](https://img.shields.io/badge/Gemini_CLI-Compatible-4285F4?logo=googlegemini&logoColor=white)](https://github.com/seob717/redash-mcp#installation)
11
+ [![Codex CLI](https://img.shields.io/badge/Codex_CLI-Compatible-412991?logo=openai&logoColor=white)](https://github.com/seob717/redash-mcp#installation)
8
12
 
9
13
  [English](README.md) | [한국어](README.ko.md) | 日本語
10
14
 
11
- > [Redash](https://redash.io) を Claude AI に接続する MCP サーバー — 自然言語でデータを照会し、SQL を実行し、ダッシュボードを管理します。
15
+ > [Redash](https://redash.io) を Claude・Cursor・Gemini CLI・Codex などあらゆる MCP クライアントに接続する MCP サーバー — 自然言語でデータを照会し、ダッシュボードを管理し、SQL を実行します。
12
16
 
13
17
  [なぜ redash-mcp か](#なぜ-redash-mcp-か) · [機能](#機能) · [インストール](#インストール) · [環境変数](#環境変数) · [使用例](#使用例) · [Privacy](#privacy-policy)
14
18
 
@@ -24,7 +28,7 @@ Redash MCP サーバーは複数あります。このサーバーは、LLM に *
24
28
 
25
29
  - **🛡️ SQL セーフティガード** — `DROP`/`TRUNCATE`/`ALTER`、`WHERE` なしの `DELETE`/`UPDATE` をブロック。`strict`/`warn`/`off` モード、PII 検出、自動 `LIMIT` まで備え、実際の Redash を安心して Claude に任せられます。
26
30
  - **🧠 BIRD スマートクエリ** — 質問を解析して適切なテーブルを自動選択し、SQL 生成をガイドします([BIRD text-to-SQL](https://bird-bench.github.io/) 手法ベース)。テーブル選択用の Claude Haiku フォールバックもオプションで利用できます。
27
- - **⚡ ワンコマンドでセットアップ** — `npx redash-mcp setup` が Claude Desktop / Claude Code の設定を代わりに行います。JSON を手で編集する必要はありません。
31
+ - **⚡ ワンコマンドでセットアップ** — `npx redash-mcp setup` が Claude Desktop / Claude Code / Cursor / Gemini CLI / Codex CLI の設定を代わりに行います。JSON を手で編集する必要はありません。
28
32
  - **🔒 完全ローカル** — Redash インスタンスと直接通信し、API キーとクエリ結果が端末から外に出ることはありません。
29
33
  - **📊 エンドツーエンド** — 照会・保存・複製、ダッシュボード、ウィジェット、アラートまで、6 カテゴリ・20 以上のツール。
30
34
 
@@ -86,7 +90,7 @@ API 呼び出しの重複を減らすため、結果をメモリにキャッシ
86
90
  npx redash-mcp setup
87
91
  ```
88
92
 
89
- セットアップウィザードが起動し、Claude DesktopClaude Code (CLI)、またはその両方を設定できます。
93
+ セットアップウィザードが Claude DesktopClaude Code (CLI)・Cursor・Gemini CLI・Codex CLI を任意の組み合わせで設定します。
90
94
 
91
95
  ### シェルスクリプトでインストール
92
96
 
@@ -125,7 +129,16 @@ Redash → 右上のプロフィール → **Edit Profile** → **API Key** を
125
129
 
126
130
  #### 2-B. Claude Code (CLI)
127
131
 
128
- `~/.claude/settings.json` を開き、以下を追加します:
132
+ ```bash
133
+ claude mcp add --scope user redash-mcp \
134
+ -e REDASH_URL=https://your-redash-instance.com \
135
+ -e REDASH_API_KEY=your_api_key_here \
136
+ -- npx -y redash-mcp
137
+ ```
138
+
139
+ #### 2-C. Cursor
140
+
141
+ `~/.cursor/mcp.json` を開き(なければ作成)、以下を追加します:
129
142
 
130
143
  ```json
131
144
  {
@@ -142,6 +155,24 @@ Redash → 右上のプロフィール → **Edit Profile** → **API Key** を
142
155
  }
143
156
  ```
144
157
 
158
+ #### 2-D. Gemini CLI
159
+
160
+ ```bash
161
+ gemini mcp add -s user \
162
+ -e REDASH_URL=https://your-redash-instance.com \
163
+ -e REDASH_API_KEY=your_api_key_here \
164
+ redash-mcp npx -y redash-mcp
165
+ ```
166
+
167
+ #### 2-E. Codex CLI
168
+
169
+ ```bash
170
+ codex mcp add redash-mcp \
171
+ --env REDASH_URL=https://your-redash-instance.com \
172
+ --env REDASH_API_KEY=your_api_key_here \
173
+ -- npx -y redash-mcp
174
+ ```
175
+
145
176
  > **macOS**: `npx` が見つからない場合は `which npx` でフルパスを確認して置き換えてください。
146
177
 
147
178
  ---
package/README.ko.md CHANGED
@@ -5,10 +5,14 @@
5
5
  [![Node](https://img.shields.io/node/v/redash-mcp.svg)](https://nodejs.org)
6
6
  [![smithery badge](https://smithery.ai/badge/dev-seob717/redash-mcp)](https://smithery.ai/servers/dev-seob717/redash-mcp)
7
7
  [![Glama](https://glama.ai/mcp/servers/seob717/redash-mcp/badges/score.svg)](https://glama.ai/mcp/servers/seob717/redash-mcp)
8
+ [![Claude](https://img.shields.io/badge/Claude-Compatible-D97757?logo=claude&logoColor=white)](https://github.com/seob717/redash-mcp#installation)
9
+ [![Cursor](https://img.shields.io/badge/Cursor-Compatible-111111)](https://github.com/seob717/redash-mcp#installation)
10
+ [![Gemini CLI](https://img.shields.io/badge/Gemini_CLI-Compatible-4285F4?logo=googlegemini&logoColor=white)](https://github.com/seob717/redash-mcp#installation)
11
+ [![Codex CLI](https://img.shields.io/badge/Codex_CLI-Compatible-412991?logo=openai&logoColor=white)](https://github.com/seob717/redash-mcp#installation)
8
12
 
9
13
  [English](README.md) | 한국어 | [日本語](README.ja.md)
10
14
 
11
- > [Redash](https://redash.io)를 Claude AI에 연결하는 MCP 서버 — 자연어로 데이터를 조회하고, SQL을 실행하고, 대시보드를 관리하세요.
15
+ > [Redash](https://redash.io)를 Claude, Cursor, Gemini CLI, Codex 등 모든 MCP 클라이언트에 연결하는 MCP 서버 — 자연어로 데이터를 조회하고, 대시보드를 관리하고, SQL을 실행합니다.
12
16
 
13
17
  [왜 redash-mcp인가](#왜-redash-mcp인가) · [기능](#기능) · [설치](#설치) · [환경 변수](#환경-변수) · [사용 예시](#사용-예시) · [Privacy](#privacy-policy)
14
18
 
@@ -24,7 +28,7 @@ Redash MCP 서버는 여러 개 있습니다. 이 서버는 LLM이 **운영(prod
24
28
 
25
29
  - **🛡️ SQL 안전 가드** — `DROP`/`TRUNCATE`/`ALTER`, `WHERE` 없는 `DELETE`/`UPDATE`를 차단합니다. `strict`/`warn`/`off` 모드, PII 감지, 자동 `LIMIT`까지 지원해 실제 Redash를 Claude에 안심하고 맡길 수 있습니다.
26
30
  - **🧠 BIRD 스마트 쿼리** — 질문을 분석해 적절한 테이블을 자동 선택하고 SQL 생성을 가이드합니다([BIRD text-to-SQL](https://bird-bench.github.io/) 방법론 기반). 테이블 선택용 Claude Haiku 폴백도 선택적으로 지원합니다.
27
- - **⚡ 한 번의 명령으로 설치** — `npx redash-mcp setup`이 Claude Desktop / Claude Code 설정을 대신 잡아줍니다. JSON을 직접 손댈 필요가 없습니다.
31
+ - **⚡ 한 번의 명령으로 설치** — `npx redash-mcp setup`이 Claude Desktop / Claude Code / Cursor / Gemini CLI / Codex CLI 설정을 대신 잡아줍니다. JSON을 직접 손댈 필요가 없습니다.
28
32
  - **🔒 완전 로컬** — Redash 인스턴스와 직접 통신하며, API 키와 쿼리 결과가 기기를 벗어나지 않습니다.
29
33
  - **📊 처음부터 끝까지** — 조회·저장·복제, 대시보드, 위젯, 알림까지 6개 카테고리에 걸친 20개 이상의 툴.
30
34
 
@@ -86,7 +90,7 @@ Redash MCP 서버는 여러 개 있습니다. 이 서버는 LLM이 **운영(prod
86
90
  npx redash-mcp setup
87
91
  ```
88
92
 
89
- 설치 마법사가 실행되며 Claude Desktop, Claude Code(CLI), 또는 선택하여 설정할 있습니다.
93
+ 설정 마법사가 Claude Desktop, Claude Code (CLI), Cursor, Gemini CLI, Codex CLI 원하는 조합을 골라 설정해줍니다.
90
94
 
91
95
  ### 셸 스크립트로 설치
92
96
 
@@ -123,9 +127,18 @@ Redash → 우측 상단 프로필 → **Edit Profile** → **API Key** 복사
123
127
 
124
128
  저장 후 Claude Desktop을 완전히 종료했다가 다시 시작합니다.
125
129
 
126
- #### 2-B. Claude Code (CLI) 설정
130
+ #### 2-B. Claude Code (CLI)
127
131
 
128
- `~/.claude/settings.json` 파일을 열고 아래 내용을 추가합니다:
132
+ ```bash
133
+ claude mcp add --scope user redash-mcp \
134
+ -e REDASH_URL=https://your-redash-instance.com \
135
+ -e REDASH_API_KEY=your_api_key_here \
136
+ -- npx -y redash-mcp
137
+ ```
138
+
139
+ #### 2-C. Cursor
140
+
141
+ `~/.cursor/mcp.json` 파일을 열고(없으면 생성) 다음을 추가합니다:
129
142
 
130
143
  ```json
131
144
  {
@@ -142,6 +155,24 @@ Redash → 우측 상단 프로필 → **Edit Profile** → **API Key** 복사
142
155
  }
143
156
  ```
144
157
 
158
+ #### 2-D. Gemini CLI
159
+
160
+ ```bash
161
+ gemini mcp add -s user \
162
+ -e REDASH_URL=https://your-redash-instance.com \
163
+ -e REDASH_API_KEY=your_api_key_here \
164
+ redash-mcp npx -y redash-mcp
165
+ ```
166
+
167
+ #### 2-E. Codex CLI
168
+
169
+ ```bash
170
+ codex mcp add redash-mcp \
171
+ --env REDASH_URL=https://your-redash-instance.com \
172
+ --env REDASH_API_KEY=your_api_key_here \
173
+ -- npx -y redash-mcp
174
+ ```
175
+
145
176
  > **macOS**: `npx`를 못 찾는 경우 `which npx` 명령어로 전체 경로를 확인 후 대체하세요.
146
177
 
147
178
  ---
package/README.md CHANGED
@@ -5,10 +5,14 @@
5
5
  [![Node](https://img.shields.io/node/v/redash-mcp.svg)](https://nodejs.org)
6
6
  [![smithery badge](https://smithery.ai/badge/dev-seob717/redash-mcp)](https://smithery.ai/servers/dev-seob717/redash-mcp)
7
7
  [![Glama](https://glama.ai/mcp/servers/seob717/redash-mcp/badges/score.svg)](https://glama.ai/mcp/servers/seob717/redash-mcp)
8
+ [![Claude](https://img.shields.io/badge/Claude-Compatible-D97757?logo=claude&logoColor=white)](https://github.com/seob717/redash-mcp#installation)
9
+ [![Cursor](https://img.shields.io/badge/Cursor-Compatible-111111)](https://github.com/seob717/redash-mcp#installation)
10
+ [![Gemini CLI](https://img.shields.io/badge/Gemini_CLI-Compatible-4285F4?logo=googlegemini&logoColor=white)](https://github.com/seob717/redash-mcp#installation)
11
+ [![Codex CLI](https://img.shields.io/badge/Codex_CLI-Compatible-412991?logo=openai&logoColor=white)](https://github.com/seob717/redash-mcp#installation)
8
12
 
9
13
  English | [한국어](README.ko.md) | [日本語](README.ja.md)
10
14
 
11
- > MCP server that connects [Redash](https://redash.io) to Claude AI — query data, manage dashboards, and run SQL with natural language.
15
+ > MCP server that connects [Redash](https://redash.io) to Claude, Cursor, Gemini CLI, Codex, and any MCP client — query data, manage dashboards, and run SQL with natural language.
12
16
 
13
17
  [Why](#why-redash-mcp) · [Features](#features) · [Install](#installation) · [Env](#environment-variables) · [Examples](#usage-examples) · [Privacy](#privacy-policy)
14
18
 
@@ -22,7 +26,7 @@ There are several Redash MCP servers. This one is built for letting an LLM touch
22
26
 
23
27
  - **🛡️ SQL Safety Guard** — blocks `DROP`/`TRUNCATE`/`ALTER` and `DELETE`/`UPDATE` without `WHERE`; `strict`/`warn`/`off` modes, PII detection, and auto-`LIMIT`. Hand Claude your real Redash without flinching.
24
28
  - **🧠 BIRD Smart Query** — analyzes the question, auto-selects the right tables, and guides SQL generation (based on the [BIRD text-to-SQL](https://bird-bench.github.io/) methodology). Optional Claude Haiku fallback for table selection.
25
- - **⚡ One-command setup** — `npx redash-mcp setup` configures Claude Desktop / Claude Code for you. No hand-editing JSON.
29
+ - **⚡ One-command setup** — `npx redash-mcp setup` configures Claude Desktop / Claude Code / Cursor / Gemini CLI / Codex CLI for you. No hand-editing JSON.
26
30
  - **🔒 Fully local** — talks directly to your Redash instance. API key and query results never leave your machine.
27
31
  - **📊 End-to-end** — query, save, fork, dashboards, widgets, and alerts — 20+ tools across 6 categories.
28
32
 
@@ -84,7 +88,7 @@ Results are cached in-memory to reduce redundant API calls:
84
88
  npx redash-mcp setup
85
89
  ```
86
90
 
87
- The setup wizard will guide you through configuring Claude Desktop, Claude Code (CLI), or both.
91
+ The setup wizard will guide you through configuring Claude Desktop, Claude Code (CLI), Cursor, Gemini CLI, and Codex CLI — pick any combination.
88
92
 
89
93
  ### Shell Script Install
90
94
 
@@ -123,7 +127,16 @@ Fully quit and restart Claude Desktop after saving.
123
127
 
124
128
  #### 2-B. Claude Code (CLI)
125
129
 
126
- Open `~/.claude/settings.json` and add:
130
+ ```bash
131
+ claude mcp add --scope user redash-mcp \
132
+ -e REDASH_URL=https://your-redash-instance.com \
133
+ -e REDASH_API_KEY=your_api_key_here \
134
+ -- npx -y redash-mcp
135
+ ```
136
+
137
+ #### 2-C. Cursor
138
+
139
+ Open `~/.cursor/mcp.json` (create it if missing) and add:
127
140
 
128
141
  ```json
129
142
  {
@@ -140,6 +153,24 @@ Open `~/.claude/settings.json` and add:
140
153
  }
141
154
  ```
142
155
 
156
+ #### 2-D. Gemini CLI
157
+
158
+ ```bash
159
+ gemini mcp add -s user \
160
+ -e REDASH_URL=https://your-redash-instance.com \
161
+ -e REDASH_API_KEY=your_api_key_here \
162
+ redash-mcp npx -y redash-mcp
163
+ ```
164
+
165
+ #### 2-E. Codex CLI
166
+
167
+ ```bash
168
+ codex mcp add redash-mcp \
169
+ --env REDASH_URL=https://your-redash-instance.com \
170
+ --env REDASH_API_KEY=your_api_key_here \
171
+ -- npx -y redash-mcp
172
+ ```
173
+
143
174
  > **macOS**: If `npx` is not found, run `which npx` to get the full path and use that instead.
144
175
 
145
176
  ---
package/dist/index.js CHANGED
@@ -8355,7 +8355,7 @@ import V2 from "node:process";
8355
8355
  function ee() {
8356
8356
  return V2.platform !== "win32" ? V2.env.TERM !== "linux" : !!V2.env.CI || !!V2.env.WT_SESSION || !!V2.env.TERMINUS_SUBLIME || V2.env.ConEmuTask === "{cmd::Cmder}" || V2.env.TERM_PROGRAM === "Terminus-Sublime" || V2.env.TERM_PROGRAM === "vscode" || V2.env.TERM === "xterm-256color" || V2.env.TERM === "alacritty" || V2.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
8357
8357
  }
8358
- var import_sisteransi2, tt, ot2, w2, Tt, at2, ut2, H, lt, $, x2, _t, xt, z3, U, et2, K2, Y2, Et, st, ct, Gt, $t, dt, Mt, ht2, pt, mt, gt, P, yt, Ot, F, me, ge, ye, Q2, ve, Te, ft, jt, Nt, Pe;
8358
+ var import_sisteransi2, tt, ot2, w2, Tt, at2, ut2, H, lt, $, x2, _t, xt, z3, U, et2, K2, Y2, Et, st, ct, Gt, $t, dt, Mt, ht2, pt, mt, gt, P, yt, Ot, F, R2, me, ge, ye, Q2, ve, Te, ft, jt, Nt, Pe;
8359
8359
  var init_dist4 = __esm({
8360
8360
  "node_modules/@clack/prompts/dist/index.mjs"() {
8361
8361
  init_dist3();
@@ -8449,6 +8449,32 @@ var init_dist4 = __esm({
8449
8449
  for (const b2 of m2) for (const G2 of b2) S.push(G2);
8450
8450
  return h2 && S.push(l), S;
8451
8451
  };
8452
+ R2 = { message: (t = [], { symbol: i = e("gray", $), secondarySymbol: s = e("gray", $), output: r = process.stdout, spacing: u = 1, withGuide: n } = {}) => {
8453
+ const a = [], c = n ?? h.withGuide, o = c ? s : "", l = c ? `${i} ` : "", d = c ? `${s} ` : "";
8454
+ for (let p2 = 0; p2 < u; p2++) a.push(o);
8455
+ const g = Array.isArray(t) ? t : t.split(`
8456
+ `);
8457
+ if (g.length > 0) {
8458
+ const [p2, ...f2] = g;
8459
+ p2.length > 0 ? a.push(`${l}${p2}`) : a.push(c ? i : "");
8460
+ for (const h2 of f2) h2.length > 0 ? a.push(`${d}${h2}`) : a.push(c ? s : "");
8461
+ }
8462
+ r.write(`${a.join(`
8463
+ `)}
8464
+ `);
8465
+ }, info: (t, i) => {
8466
+ R2.message(t, { ...i, symbol: e("blue", ht2) });
8467
+ }, success: (t, i) => {
8468
+ R2.message(t, { ...i, symbol: e("green", pt) });
8469
+ }, step: (t, i) => {
8470
+ R2.message(t, { ...i, symbol: e("green", H) });
8471
+ }, warn: (t, i) => {
8472
+ R2.message(t, { ...i, symbol: e("yellow", mt) });
8473
+ }, warning: (t, i) => {
8474
+ R2.warn(t, i);
8475
+ }, error: (t, i) => {
8476
+ R2.message(t, { ...i, symbol: e("red", gt) });
8477
+ } };
8452
8478
  me = (t = "", i) => {
8453
8479
  const s = i?.output ?? process.stdout, r = i?.withGuide ?? h.withGuide ? `${e("gray", x2)} ` : "";
8454
8480
  s.write(`${r}${e("red", t)}
@@ -8612,7 +8638,12 @@ var setup_exports = {};
8612
8638
  __export(setup_exports, {
8613
8639
  buildClaudeMcpAddArgs: () => buildClaudeMcpAddArgs,
8614
8640
  buildClaudeMcpRemoveArgs: () => buildClaudeMcpRemoveArgs,
8615
- main: () => main
8641
+ buildCodexMcpAddArgs: () => buildCodexMcpAddArgs,
8642
+ buildCodexMcpRemoveArgs: () => buildCodexMcpRemoveArgs,
8643
+ buildGeminiMcpAddArgs: () => buildGeminiMcpAddArgs,
8644
+ buildGeminiMcpRemoveArgs: () => buildGeminiMcpRemoveArgs,
8645
+ main: () => main,
8646
+ writeJsonConfig: () => writeJsonConfig
8616
8647
  });
8617
8648
  import * as fs from "fs";
8618
8649
  import * as path3 from "path";
@@ -8644,6 +8675,35 @@ function getDesktopConfigPath() {
8644
8675
  return path3.join(os2.homedir(), ".config", "Claude", "claude_desktop_config.json");
8645
8676
  }
8646
8677
  }
8678
+ function buildGeminiMcpAddArgs(mcpEntry) {
8679
+ return [
8680
+ "mcp",
8681
+ "add",
8682
+ "-s",
8683
+ "user",
8684
+ ...Object.entries(mcpEntry.env).flatMap(([key, value]) => ["-e", `${key}=${value}`]),
8685
+ "redash-mcp",
8686
+ mcpEntry.command,
8687
+ ...mcpEntry.args
8688
+ ];
8689
+ }
8690
+ function buildGeminiMcpRemoveArgs() {
8691
+ return ["mcp", "remove", "-s", "user", "redash-mcp"];
8692
+ }
8693
+ function buildCodexMcpAddArgs(mcpEntry) {
8694
+ return [
8695
+ "mcp",
8696
+ "add",
8697
+ "redash-mcp",
8698
+ ...Object.entries(mcpEntry.env).flatMap(([key, value]) => ["--env", `${key}=${value}`]),
8699
+ "--",
8700
+ mcpEntry.command,
8701
+ ...mcpEntry.args
8702
+ ];
8703
+ }
8704
+ function buildCodexMcpRemoveArgs() {
8705
+ return ["mcp", "remove", "redash-mcp"];
8706
+ }
8647
8707
  function buildClaudeMcpAddArgs(mcpEntry) {
8648
8708
  return [
8649
8709
  "mcp",
@@ -8663,7 +8723,10 @@ async function main() {
8663
8723
  message: "Select installation targets (space to select, enter to confirm)",
8664
8724
  options: [
8665
8725
  { value: "desktop", label: "Claude Desktop" },
8666
- { value: "cli", label: "Claude Code (CLI)" }
8726
+ { value: "cli", label: "Claude Code (CLI)" },
8727
+ { value: "cursor", label: "Cursor" },
8728
+ { value: "gemini", label: "Gemini CLI" },
8729
+ { value: "codex", label: "Codex CLI" }
8667
8730
  ],
8668
8731
  required: true
8669
8732
  });
@@ -8704,28 +8767,51 @@ async function main() {
8704
8767
  REDASH_API_KEY: apiKey
8705
8768
  }
8706
8769
  };
8707
- const s = ft();
8708
- if (targets.includes("desktop")) {
8709
- s.start("Configuring Claude Desktop...");
8710
- setupDesktop(mcpEntry);
8711
- s.stop("Claude Desktop configured");
8770
+ const registrars = {
8771
+ desktop: { label: "Claude Desktop", run: (entry) => writeJsonConfig(getDesktopConfigPath(), entry) },
8772
+ cli: {
8773
+ label: "Claude Code (CLI)",
8774
+ run: (entry) => registerViaCli("claude", buildClaudeMcpRemoveArgs(), buildClaudeMcpAddArgs(entry))
8775
+ },
8776
+ cursor: { label: "Cursor", run: (entry) => writeJsonConfig(getCursorConfigPath(), entry) },
8777
+ gemini: {
8778
+ label: "Gemini CLI",
8779
+ run: (entry) => registerViaCli("gemini", buildGeminiMcpRemoveArgs(), buildGeminiMcpAddArgs(entry))
8780
+ },
8781
+ codex: {
8782
+ label: "Codex CLI",
8783
+ run: (entry) => registerViaCli("codex", buildCodexMcpRemoveArgs(), buildCodexMcpAddArgs(entry))
8784
+ }
8785
+ };
8786
+ const failed = [];
8787
+ for (const target of targets) {
8788
+ const { label, run } = registrars[target];
8789
+ const s = ft();
8790
+ s.start(`Configuring ${label}...`);
8791
+ try {
8792
+ run(mcpEntry);
8793
+ s.stop(`${label} configured`);
8794
+ } catch (e2) {
8795
+ s.error(`${label} failed`);
8796
+ R2.error(e2?.message ?? String(e2));
8797
+ failed.push(label);
8798
+ }
8712
8799
  }
8713
- if (targets.includes("cli")) {
8714
- s.start("Configuring Claude Code (CLI)...");
8715
- setupClaudeCode(mcpEntry);
8716
- s.stop("Claude Code (CLI) configured");
8800
+ if (failed.length > 0) {
8801
+ process.exitCode = 1;
8802
+ ye(`Setup finished with errors \u2014 failed: ${failed.join(", ")}`);
8803
+ } else {
8804
+ ye("Setup complete. Restart to start using redash-mcp.");
8717
8805
  }
8718
- ye("Setup complete. Restart to start using redash-mcp.");
8719
8806
  }
8720
- function setupDesktop(mcpEntry) {
8721
- const configPath = getDesktopConfigPath();
8807
+ function writeJsonConfig(configPath, mcpEntry) {
8722
8808
  let config2 = { mcpServers: {} };
8723
8809
  if (fs.existsSync(configPath)) {
8724
8810
  try {
8725
8811
  config2 = JSON.parse(fs.readFileSync(configPath, "utf8"));
8726
8812
  config2.mcpServers ??= {};
8727
8813
  } catch {
8728
- throw new Error(`Failed to read claude_desktop_config.json: ${configPath}`);
8814
+ throw new Error(`Failed to read config: ${configPath}`);
8729
8815
  }
8730
8816
  } else {
8731
8817
  fs.mkdirSync(path3.dirname(configPath), { recursive: true });
@@ -8733,22 +8819,24 @@ function setupDesktop(mcpEntry) {
8733
8819
  config2.mcpServers["redash-mcp"] = mcpEntry;
8734
8820
  fs.writeFileSync(configPath, JSON.stringify(config2, null, 2), "utf8");
8735
8821
  }
8822
+ function getCursorConfigPath() {
8823
+ return path3.join(os2.homedir(), ".cursor", "mcp.json");
8824
+ }
8736
8825
  function buildClaudeMcpRemoveArgs() {
8737
8826
  return ["mcp", "remove", "--scope", "user", "redash-mcp"];
8738
8827
  }
8739
- function setupClaudeCode(mcpEntry) {
8828
+ function registerViaCli(bin, removeArgs, addArgs) {
8740
8829
  try {
8741
- execFileSync("claude", buildClaudeMcpRemoveArgs(), { stdio: "pipe" });
8830
+ execFileSync(bin, removeArgs, { stdio: "pipe" });
8742
8831
  } catch {
8743
8832
  }
8744
- const args = buildClaudeMcpAddArgs(mcpEntry);
8745
8833
  try {
8746
- execFileSync("claude", args, { stdio: "pipe" });
8834
+ execFileSync(bin, addArgs, { stdio: "pipe" });
8747
8835
  } catch (e2) {
8748
8836
  const stderr = e2?.stderr?.toString().trim();
8749
8837
  throw new Error(
8750
- `Failed to run "claude mcp add".${stderr ? ` (${stderr})` : ""} Make sure the Claude Code CLI is installed, or run manually:
8751
- claude ${args.join(" ")}`
8838
+ `Failed to run "${bin} mcp add".${stderr ? ` (${stderr})` : ""} Make sure the ${bin} CLI is installed, or run manually:
8839
+ ${bin} ${addArgs.join(" ")}`
8752
8840
  );
8753
8841
  }
8754
8842
  }
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": "0.3",
3
3
  "name": "redash-mcp",
4
- "version": "3.1.7",
4
+ "version": "3.2.0",
5
5
  "description": "MCP server for Redash -- query data, manage dashboards, and run SQL with natural language. 24 tools including BIRD SQL methodology.",
6
6
  "long_description": "Connects an MCP client to a Redash instance: list data sources, inspect schemas, run SQL, manage saved queries / dashboards / alerts, and use BIRD SQL helpers (smart_query, keyword maps, few-shot examples, feedback, evaluation). Built-in SQL safety guards flag PII access and expensive scans; safety mode can be tuned per install. **Third-party data flow:** if you also set ANTHROPIC_API_KEY in the shell environment, the BIRD smart_query tool may send table-name lists (never query results or row data) to the Anthropic API as a fallback for table selection. Leave ANTHROPIC_API_KEY unset to disable this entirely.",
7
7
  "icon": "icon.png",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "redash-mcp",
3
3
  "mcpName": "io.github.seob717/redash-mcp",
4
- "version": "3.1.7",
4
+ "version": "3.2.0",
5
5
  "description": "MCP server that connects Redash to Claude AI — query data, manage dashboards, and run SQL with natural language, with built-in SQL safety guards.",
6
6
  "license": "MIT",
7
7
  "author": "seob717",
@@ -22,7 +22,10 @@
22
22
  "business-intelligence",
23
23
  "dashboard",
24
24
  "data-analytics",
25
- "natural-language"
25
+ "natural-language",
26
+ "cursor",
27
+ "gemini-cli",
28
+ "codex"
26
29
  ],
27
30
  "engines": {
28
31
  "node": ">=20"