diff --git a/.changeset/clean-mcp-json.md b/.changeset/clean-mcp-json.md new file mode 100644 index 00000000000..8510a50073a --- /dev/null +++ b/.changeset/clean-mcp-json.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Write strict JSON when adding MCP servers to `kilo.json` configuration files. diff --git a/packages/opencode/src/cli/cmd/mcp.ts b/packages/opencode/src/cli/cmd/mcp.ts index 229f4ecb083..c430920642e 100644 --- a/packages/opencode/src/cli/cmd/mcp.ts +++ b/packages/opencode/src/cli/cmd/mcp.ts @@ -17,6 +17,7 @@ import { InstallationVersion } from "@opencode-ai/core/installation/version" import path from "path" import { Global } from "@opencode-ai/core/global" import { modify, applyEdits } from "jsonc-parser" +import { KilocodeMcpConfig } from "@/kilocode/cli/cmd/mcp" // kilocode_change import { Filesystem } from "@/util/filesystem" import { Bus } from "../../bus" import { Effect } from "effect" @@ -438,7 +439,7 @@ async function addMcpToConfig(name: string, mcpConfig: ConfigMCP.Info, configPat const edits = modify(text, ["mcp", name], mcpConfig, { formattingOptions: { tabSize: 2, insertSpaces: true }, }) - const result = applyEdits(text, edits) + const result = KilocodeMcpConfig.format(configPath, applyEdits(text, edits)) // kilocode_change await Filesystem.write(configPath, result) diff --git a/packages/opencode/src/kilocode/cli/cmd/mcp.ts b/packages/opencode/src/kilocode/cli/cmd/mcp.ts new file mode 100644 index 00000000000..1a630e35c87 --- /dev/null +++ b/packages/opencode/src/kilocode/cli/cmd/mcp.ts @@ -0,0 +1,8 @@ +import { ConfigParse } from "@/config/parse" + +export namespace KilocodeMcpConfig { + export function format(file: string, input: string) { + if (file.endsWith(".jsonc")) return input + return JSON.stringify(ConfigParse.jsonc(input, file), null, 2) + } +} diff --git a/packages/opencode/test/kilocode/cli/cmd/mcp.test.ts b/packages/opencode/test/kilocode/cli/cmd/mcp.test.ts new file mode 100644 index 00000000000..1c8b79f9118 --- /dev/null +++ b/packages/opencode/test/kilocode/cli/cmd/mcp.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, test } from "bun:test" +import { KilocodeMcpConfig } from "@/kilocode/cli/cmd/mcp" + +const added = `{ + "permission": { + "bash": "allow" + }, + "mcp": { + "linear": { + "type": "remote", + "url": "https://mcp.linear.app/mcp", + "oauth": {} + } + }, +}` + +describe("KilocodeMcpConfig.format", () => { + test("writes strict JSON for kilo.json", () => { + const output = KilocodeMcpConfig.format("/tmp/kilo.json", added) + + expect(JSON.parse(output)).toEqual({ + permission: { bash: "allow" }, + mcp: { + linear: { + type: "remote", + url: "https://mcp.linear.app/mcp", + oauth: {}, + }, + }, + }) + expect(output).not.toEndWith(",\n}") + }) + + test("preserves JSONC formatting for kilo.jsonc", () => { + expect(KilocodeMcpConfig.format("/tmp/kilo.jsonc", added)).toBe(added) + }) +})