Skip to content

Commit 05fb022

Browse files
authored
Google Antigravity support in the installer (#20)
* Support Google Antigravity in the installer * Updates README
1 parent 4bcded6 commit 05fb022

File tree

5 files changed

+71
-3
lines changed

5 files changed

+71
-3
lines changed

README.md

Lines changed: 24 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, Claude Code, Windsurf, and Gemini CLI!
6+
With the new Iterable MCP server, you can now connect Iterable to your favorite AI tools like Cursor, Claude Desktop, Claude Code, Windsurf, Gemini CLI, and Antigravity!
77

88
## What is MCP?
99

@@ -94,15 +94,16 @@ 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, Windsurf & Gemini CLI)
97+
### Manual configuration (Cursor, Claude Desktop, Windsurf, Gemini CLI & Antigravity)
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`
102102
- **Windsurf:** `~/.codeium/windsurf/mcp_config.json`
103+
- **Antigravity:** `~/.gemini/antigravity/mcp_config.json`
103104
- **Gemini CLI:** `~/.gemini/settings.json`
104105

105-
All four use the same configuration format:
106+
All five use the same configuration format:
106107

107108
**Recommended: Using key manager:**
108109
```bash
@@ -330,6 +331,26 @@ iterable-mcp keys update <key-name> --advanced
330331

331332
**Process persistence:** After switching API keys with `keys activate`, you must **fully restart Windsurf** (quit and reopen the application). Windsurf keeps MCP server processes running in the background, and they don't automatically reload when you switch keys.
332333

334+
#### Antigravity
335+
336+
**Tool limit:** Antigravity has a maximum limit of 100 tools per MCP server. When all permissions are enabled (`ITERABLE_USER_PII=true`, `ITERABLE_ENABLE_WRITES=true`, `ITERABLE_ENABLE_SENDS=true`), the Iterable MCP server exposes **104 tools**, which exceeds this limit.
337+
338+
**Workaround:** Use restricted permissions to stay under the 100-tool limit:
339+
- With default permissions (all disabled): 26 tools ✅
340+
- With PII only: 37 tools ✅
341+
- With PII + writes: 86 tools ✅
342+
- With all permissions: 104 tools ❌ (exceeds Antigravity limit)
343+
344+
You can configure permissions when adding a key:
345+
```bash
346+
iterable-mcp keys add --advanced
347+
```
348+
349+
Or update an existing key's permissions:
350+
```bash
351+
iterable-mcp keys update <key-name> --advanced
352+
```
353+
333354
## Beta Feature Reminder
334355
Iterable's MCP server is currently in beta. MCP functionality may change, be
335356
suspended, or be discontinued at any time without notice. This software is

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@
5858
"install-dev:cursor:debug": "pnpm install-dev && node dist/index.js setup --cursor --debug --local",
5959
"install-dev:gemini-cli": "pnpm install-dev && node dist/index.js setup --gemini-cli --local",
6060
"install-dev:gemini-cli:debug": "pnpm install-dev && node dist/index.js setup --gemini-cli --debug --local",
61+
"install-dev:windsurf": "pnpm install-dev && node dist/index.js setup --windsurf --local",
62+
"install-dev:windsurf:debug": "pnpm install-dev && node dist/index.js setup --windsurf --debug --local",
63+
"install-dev:antigravity": "pnpm install-dev && node dist/index.js setup --antigravity --local",
64+
"install-dev:antigravity:debug": "pnpm install-dev && node dist/index.js setup --antigravity --debug --local",
6165
"lint:fix": "eslint \"src/**/*.ts\" \"tests/**/*.ts\" --fix --quiet",
6266
"prepublishOnly": "pnpm build",
6367
"prestart": "pnpm build",

src/install.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const TOOL_NAMES = {
3737
"claude-code": "Claude Code",
3838
"gemini-cli": "Gemini CLI",
3939
windsurf: "Windsurf",
40+
antigravity: "Antigravity",
4041
manual: "Manual Setup",
4142
} as const;
4243

@@ -66,6 +67,12 @@ const TOOL_CONFIGS = {
6667
);
6768
}
6869
})(),
70+
antigravity: path.join(
71+
os.homedir(),
72+
".gemini",
73+
"antigravity",
74+
"mcp_config.json"
75+
),
6976
cursor: path.join(os.homedir(), ".cursor", "mcp.json"),
7077
windsurf: path.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json"),
7178
"gemini-cli": path.join(os.homedir(), ".gemini", "settings.json"),
@@ -207,6 +214,7 @@ export const setupMcpServer = async (): Promise<void> => {
207214
...(args.includes("--claude-code") ? ["claude-code" as const] : []),
208215
...(args.includes("--gemini-cli") ? ["gemini-cli" as const] : []),
209216
...(args.includes("--windsurf") ? ["windsurf" as const] : []),
217+
...(args.includes("--antigravity") ? ["antigravity" as const] : []),
210218
...(args.includes("--manual") ? ["manual" as const] : []),
211219
];
212220

@@ -235,6 +243,7 @@ export const setupMcpServer = async (): Promise<void> => {
235243
[`${COMMAND_NAME} setup --claude-code`, "Configure for Claude Code"],
236244
[`${COMMAND_NAME} setup --gemini-cli`, "Configure for Gemini CLI"],
237245
[`${COMMAND_NAME} setup --windsurf`, "Configure for Windsurf"],
246+
[`${COMMAND_NAME} setup --antigravity`, "Configure for Antigravity"],
238247
[`${COMMAND_NAME} setup --manual`, "Show manual config instructions"],
239248
[
240249
`${COMMAND_NAME} setup --cursor --claude-desktop`,
@@ -568,6 +577,7 @@ export const setupMcpServer = async (): Promise<void> => {
568577
{ name: "Claude Code (CLI)", value: "claude-code" },
569578
{ name: "Gemini CLI", value: "gemini-cli" },
570579
{ name: "Windsurf", value: "windsurf" },
580+
{ name: "Antigravity", value: "antigravity" },
571581
{ name: "Other / Manual Setup", value: "manual" },
572582
],
573583
validate: (arr) =>
@@ -709,6 +719,8 @@ export const setupMcpServer = async (): Promise<void> => {
709719
if (fileBasedTools.includes("gemini-cli"))
710720
configuredTools.push("Gemini CLI");
711721
if (fileBasedTools.includes("windsurf")) configuredTools.push("Windsurf");
722+
if (fileBasedTools.includes("antigravity"))
723+
configuredTools.push("Antigravity");
712724
if (needsManual) configuredTools.push("your AI tool");
713725

714726
const toolsList =

src/utils/tool-config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ export function getWindsurfConfigPath(): string {
1010
return path.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
1111
}
1212

13+
export function getAntigravityConfigPath(): string {
14+
return path.join(os.homedir(), ".gemini", "antigravity", "mcp_config.json");
15+
}
16+
1317
export function getClaudeDesktopConfigPath(): string {
1418
switch (process.platform) {
1519
case "darwin":

tests/unit/tool-config-paths.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,37 @@ import os from "os";
33
import path from "path";
44

55
import {
6+
getAntigravityConfigPath,
67
getClaudeDesktopConfigPath,
78
getCursorConfigPath,
89
getWindsurfConfigPath,
910
} from "../../src/utils/tool-config.js";
1011

1112
describe("tool-config paths", () => {
13+
describe("getAntigravityConfigPath", () => {
14+
it("returns path in home directory .gemini/antigravity folder", () => {
15+
const configPath = getAntigravityConfigPath();
16+
expect(configPath).toBe(
17+
path.join(os.homedir(), ".gemini", "antigravity", "mcp_config.json")
18+
);
19+
});
20+
21+
it("returns a path ending with mcp_config.json", () => {
22+
const configPath = getAntigravityConfigPath();
23+
expect(configPath).toMatch(/mcp_config\.json$/);
24+
});
25+
26+
it("returns a path containing .gemini", () => {
27+
const configPath = getAntigravityConfigPath();
28+
expect(configPath).toContain(".gemini");
29+
});
30+
31+
it("returns a path containing antigravity", () => {
32+
const configPath = getAntigravityConfigPath();
33+
expect(configPath).toContain("antigravity");
34+
});
35+
});
36+
1237
describe("getCursorConfigPath", () => {
1338
it("returns path in home directory .cursor folder", () => {
1439
const configPath = getCursorConfigPath();
@@ -76,12 +101,14 @@ describe("tool-config paths", () => {
76101
expect(path.isAbsolute(getCursorConfigPath())).toBe(true);
77102
expect(path.isAbsolute(getWindsurfConfigPath())).toBe(true);
78103
expect(path.isAbsolute(getClaudeDesktopConfigPath())).toBe(true);
104+
expect(path.isAbsolute(getAntigravityConfigPath())).toBe(true);
79105
});
80106

81107
it("all config paths end with .json", () => {
82108
expect(getCursorConfigPath()).toMatch(/\.json$/);
83109
expect(getWindsurfConfigPath()).toMatch(/\.json$/);
84110
expect(getClaudeDesktopConfigPath()).toMatch(/\.json$/);
111+
expect(getAntigravityConfigPath()).toMatch(/\.json$/);
85112
});
86113
});
87114
});

0 commit comments

Comments
 (0)