Skip to content

Commit 6a0c4e7

Browse files
authored
Add support for Gemini CLI (#11)
1 parent e6992ba commit 6a0c4e7

File tree

3 files changed

+31
-20
lines changed

3 files changed

+31
-20
lines changed

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
![Iterable MCP Server Setup](images/iterable-mcp-setup.png)
44

55

6-
With the new Iterable MCP server, you can now connect Iterable to your favorite AI tools like Cursor, Claude Desktop, and Claude Code!
6+
With the new Iterable MCP server, you can now connect Iterable to your favorite AI tools like Cursor, Claude Desktop, Claude Code, and Gemini CLI!
77

88
## What is MCP?
99

@@ -58,7 +58,7 @@ Throughout this guide, commands are shown as `iterable-mcp` for brevity. If not
5858
```bash
5959
git clone https://github.com/iterable/mcp-server.git
6060
cd mcp-server
61-
pnpm install-dev:cursor # or install-dev:claude-desktop or install-dev:claude-code
61+
pnpm install-dev:cursor # or install-dev:claude-desktop, install-dev:claude-code, or install-dev:gemini-cli
6262
```
6363

6464
### Claude Code
@@ -94,11 +94,14 @@ claude mcp add-from-claude-desktop
9494

9595
For more information, see the [Claude Code MCP documentation](https://docs.claude.com/en/docs/claude-code/mcp).
9696

97-
### Manual configuration (Cursor & Claude Desktop)
97+
### Manual configuration (Cursor, Claude Desktop & Gemini CLI)
9898

9999
The above commands will automatically configure your AI tool to use the MCP server by editing the appropriate configuration file, but you can also manually edit the appropriate configuration file:
100100
- **Claude Desktop:** `~/Library/Application Support/Claude/claude_desktop_config.json`
101101
- **Cursor:** `~/.cursor/mcp.json`
102+
- **Gemini CLI:** `~/.gemini/settings.json`
103+
104+
All three use the same configuration format:
102105

103106
**Recommended: Using key manager:**
104107
```bash

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@
5656
"install-dev:claude-code:debug": "pnpm install-dev && node dist/index.js setup --claude-code --debug --local",
5757
"install-dev:cursor": "pnpm install-dev && node dist/index.js setup --cursor --local",
5858
"install-dev:cursor:debug": "pnpm install-dev && node dist/index.js setup --cursor --debug --local",
59+
"install-dev:gemini-cli": "pnpm install-dev && node dist/index.js setup --gemini-cli --local",
60+
"install-dev:gemini-cli:debug": "pnpm install-dev && node dist/index.js setup --gemini-cli --debug --local",
5961
"lint:fix": "eslint \"src/**/*.ts\" \"tests/**/*.ts\" --fix --quiet",
6062
"prepublishOnly": "pnpm build",
6163
"prestart": "pnpm build",

src/install.ts

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,6 @@ const { dirname, join } = path;
1919
const LOCAL_BINARY_NAME = "iterable-mcp";
2020
const NPX_PACKAGE_NAME = "@iterable/mcp";
2121

22-
// Tool display names
23-
const TOOL_NAMES = {
24-
cursor: "Cursor",
25-
"claude-desktop": "Claude Desktop",
26-
"claude-code": "Claude Code",
27-
manual: "Manual Setup",
28-
} as const;
29-
3022
// Get package version
3123
const packageJson = JSON.parse(
3224
readFileSync(
@@ -35,6 +27,17 @@ const packageJson = JSON.parse(
3527
)
3628
) as { version: string };
3729

30+
// Tool display names
31+
type ToolName = keyof typeof TOOL_NAMES;
32+
const TOOL_NAMES = {
33+
cursor: "Cursor",
34+
"claude-desktop": "Claude Desktop",
35+
"claude-code": "Claude Code",
36+
"gemini-cli": "Gemini CLI",
37+
manual: "Manual Setup",
38+
} as const;
39+
40+
type FileBasedToolName = keyof typeof TOOL_CONFIGS;
3841
const TOOL_CONFIGS = {
3942
"claude-desktop": (() => {
4043
switch (process.platform) {
@@ -61,7 +64,8 @@ const TOOL_CONFIGS = {
6164
}
6265
})(),
6366
cursor: path.join(os.homedir(), ".cursor", "mcp.json"),
64-
} as const;
67+
"gemini-cli": path.join(os.homedir(), ".gemini", "settings.json"),
68+
} as const satisfies Record<string, string>;
6569

6670
const execFileAsync = promisify(execFile);
6771

@@ -221,10 +225,11 @@ export const setupMcpServer = async (): Promise<void> => {
221225
const showHelp = args.includes("--help") || args.includes("-h");
222226
const advanced = args.includes("--advanced");
223227
const autoUpdate = args.includes("--auto-update");
224-
let tools = [
228+
let tools: ToolName[] = [
225229
...(args.includes("--claude-desktop") ? ["claude-desktop" as const] : []),
226230
...(args.includes("--cursor") ? ["cursor" as const] : []),
227231
...(args.includes("--claude-code") ? ["claude-code" as const] : []),
232+
...(args.includes("--gemini-cli") ? ["gemini-cli" as const] : []),
228233
...(args.includes("--manual") ? ["manual" as const] : []),
229234
];
230235

@@ -254,6 +259,7 @@ export const setupMcpServer = async (): Promise<void> => {
254259
[`${commandName} setup --claude-desktop`, "Configure for Claude Desktop"],
255260
[`${commandName} setup --cursor`, "Configure for Cursor"],
256261
[`${commandName} setup --claude-code`, "Configure for Claude Code"],
262+
[`${commandName} setup --gemini-cli`, "Configure for Gemini CLI"],
257263
[`${commandName} setup --manual`, "Show manual config instructions"],
258264
[
259265
`${commandName} setup --cursor --claude-desktop`,
@@ -359,9 +365,7 @@ export const setupMcpServer = async (): Promise<void> => {
359365
showIterableLogo(packageJson.version);
360366

361367
const { selectedTools } = await inquirer.prompt<{
362-
selectedTools: Array<
363-
"cursor" | "claude-desktop" | "claude-code" | "manual"
364-
>;
368+
selectedTools: ToolName[];
365369
}>([
366370
{
367371
type: "checkbox",
@@ -371,6 +375,7 @@ export const setupMcpServer = async (): Promise<void> => {
371375
{ name: "Cursor", value: "cursor" },
372376
{ name: "Claude Desktop", value: "claude-desktop" },
373377
{ name: "Claude Code (CLI)", value: "claude-code" },
378+
{ name: "Gemini CLI", value: "gemini-cli" },
374379
{ name: "Other / Manual Setup", value: "manual" },
375380
],
376381
validate: (arr: any) =>
@@ -898,17 +903,16 @@ export const setupMcpServer = async (): Promise<void> => {
898903
}
899904

900905
const fileBasedTools = tools.filter(
901-
(tool) => tool === "claude-desktop" || tool === "cursor"
902-
) as Array<"claude-desktop" | "cursor">;
906+
(tool): tool is FileBasedToolName => tool in TOOL_CONFIGS
907+
);
903908
const needsClaudeCode = tools.includes("claude-code");
904909
const needsManual = tools.includes("manual");
905910

906911
if (fileBasedTools.length > 0) {
907912
const { updateToolConfig } = await import("./utils/tool-config.js");
908913
for (const tool of fileBasedTools) {
909914
const configPath = TOOL_CONFIGS[tool];
910-
const toolName =
911-
tool === "claude-desktop" ? "Claude Desktop" : "Cursor";
915+
const toolName = TOOL_NAMES[tool];
912916
spinner.start(`Configuring ${toolName}...`);
913917
try {
914918
await updateToolConfig(configPath, iterableMcpConfig);
@@ -1004,6 +1008,8 @@ export const setupMcpServer = async (): Promise<void> => {
10041008
if (fileBasedTools.includes("cursor")) configuredTools.push("Cursor");
10051009
if (fileBasedTools.includes("claude-desktop"))
10061010
configuredTools.push("Claude Desktop");
1011+
if (fileBasedTools.includes("gemini-cli"))
1012+
configuredTools.push("Gemini CLI");
10071013
if (needsClaudeCode) configuredTools.push("Claude Code");
10081014
if (needsManual) configuredTools.push("your AI tool");
10091015

0 commit comments

Comments
 (0)