@posthog/wizard 1.16.1 → 1.17.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/dist/bin.js.map +1 -1
- package/dist/src/mcp.d.ts +1 -0
- package/dist/src/mcp.js +4 -0
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.d.ts +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js +112 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +3 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js +143 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +61 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +77 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.js +17 -2
- package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
- package/package.json +1 -1
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { satisfies } from 'semver';\nimport { red } from './src/utils/logging';\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport chalk from 'chalk';\n\nconst NODE_VERSION_RANGE = '>=18.17.0';\n\n// Have to run this above the other imports because they are importing clack that\n// has the problematic imports.\nif (!satisfies(process.version, NODE_VERSION_RANGE)) {\n red(\n `PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`,\n );\n process.exit(1);\n}\n\nimport { runMCPInstall, runMCPRemove } from './src/mcp';\nimport type { CloudRegion, WizardOptions } from './src/utils/types';\nimport { runWizard } from './src/run';\nimport { runEventSetupWizard } from './src/nextjs/event-setup';\nimport {\n readEnvironment,\n isNonInteractiveEnvironment,\n} from './src/utils/environment';\nimport path from 'path';\nimport clack from './src/utils/clack';\n\nif (isNonInteractiveEnvironment()) {\n clack.intro(chalk.inverse(`PostHog Wizard`));\n\n clack.log.error(\n 'This installer requires an interactive terminal (TTY) to run.\\n' +\n 'It appears you are running in a non-interactive environment.\\n' +\n 'Please run the wizard in an interactive terminal.',\n );\n process.exit(1);\n}\n\nif (process.env.NODE_ENV === 'test') {\n void (async () => {\n try {\n const { server } = await import('./e2e-tests/mocks/server.js');\n server.listen({\n onUnhandledRequest: 'bypass',\n });\n } catch (error) {\n // Mock server import failed - this can happen during non-E2E tests\n }\n })();\n}\n\nyargs(hideBin(process.argv))\n .env('POSTHOG_WIZARD')\n // global options\n .options({\n debug: {\n default: false,\n describe: 'Enable verbose logging\\nenv: POSTHOG_WIZARD_DEBUG',\n type: 'boolean',\n },\n region: {\n describe: 'PostHog cloud region\\nenv: POSTHOG_WIZARD_REGION',\n choices: ['us', 'eu'],\n type: 'string',\n },\n default: {\n default: true,\n describe:\n 'Use default options for all prompts\\nenv: POSTHOG_WIZARD_DEFAULT',\n type: 'boolean',\n },\n signup: {\n default: false,\n describe:\n 'Create a new PostHog account during setup\\nenv: POSTHOG_WIZARD_SIGNUP',\n type: 'boolean',\n },\n })\n .command(\n ['$0'],\n 'Run the PostHog setup wizard',\n (yargs) => {\n return yargs.options({\n 'force-install': {\n default: false,\n describe:\n 'Force install packages even if peer dependency checks fail\\nenv: POSTHOG_WIZARD_FORCE_INSTALL',\n type: 'boolean',\n },\n 'install-dir': {\n describe:\n 'Directory to install PostHog in\\nenv: POSTHOG_WIZARD_INSTALL_DIR',\n type: 'string',\n },\n integration: {\n describe: 'Integration to set up',\n choices: ['nextjs', 'astro', 'react', 'svelte', 'react-native'],\n type: 'string',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runWizard(options as unknown as WizardOptions);\n },\n )\n .command(\n 'event-setup',\n 'Run the event setup wizard',\n (yargs) => {\n return yargs.options({\n 'install-dir': {\n describe:\n 'Directory to run the wizard in\\nenv: POSTHOG_WIZARD_INSTALL_DIR',\n type: 'string',\n },\n });\n },\n (argv) => {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n } as any;\n\n let resolvedInstallDir: string;\n if (finalArgs.installDir) {\n if (path.isAbsolute(finalArgs.installDir)) {\n resolvedInstallDir = finalArgs.installDir;\n } else {\n resolvedInstallDir = path.join(process.cwd(), finalArgs.installDir);\n }\n } else {\n resolvedInstallDir = process.cwd();\n }\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n installDir: resolvedInstallDir,\n cloudRegion: finalArgs.region as CloudRegion | undefined,\n default: finalArgs.default ?? false,\n signup: finalArgs.signup ?? false,\n forceInstall: false,\n };\n\n void runEventSetupWizard(wizardOptions);\n },\n )\n .command('mcp <command>', 'MCP server management commands', (yargs) => {\n return yargs\n .command(\n 'add',\n 'Install PostHog MCP server to supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Add local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runMCPInstall(\n options as unknown as {\n signup: boolean;\n region?: CloudRegion;\n local?: boolean;\n debug?: boolean;\n },\n );\n },\n )\n .command(\n 'remove',\n 'Remove PostHog MCP server from supported clients',\n (yargs) => {\n return yargs.options({\n local: {\n default: false,\n describe:\n 'Remove local development MCP server (http://localhost:8787)',\n type: 'boolean',\n },\n });\n },\n (argv) => {\n const options = { ...argv };\n void runMCPRemove(options as { local?: boolean });\n },\n )\n .demandCommand(1, 'You must specify a subcommand (add or remove)')\n .help();\n })\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'v')\n .wrap(process.stdout.isTTY ? yargs.terminalWidth() : 80).argv;\n"]}
|
package/dist/src/mcp.d.ts
CHANGED
package/dist/src/mcp.js
CHANGED
|
@@ -11,7 +11,11 @@ const clack_utils_1 = require("./utils/clack-utils");
|
|
|
11
11
|
const opn_1 = __importDefault(require("opn"));
|
|
12
12
|
const urls_1 = require("./utils/urls");
|
|
13
13
|
const helper_functions_1 = require("./lib/helper-functions");
|
|
14
|
+
const debug_1 = require("./utils/debug");
|
|
14
15
|
const runMCPInstall = async (options) => {
|
|
16
|
+
if (options.debug) {
|
|
17
|
+
(0, debug_1.enableDebugLogs)();
|
|
18
|
+
}
|
|
15
19
|
clack_1.default.intro(chalk_1.default.bgGreenBright(`Installing the PostHog MCP server ${options.local && '(local)'}`));
|
|
16
20
|
await (0, add_mcp_server_to_clients_1.addMCPServerToClientsStep)({
|
|
17
21
|
cloudRegion: options.region,
|
package/dist/src/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,iFAG2C;AAC3C,0DAAkC;AAClC,qDAA4C;AAE5C,8CAAsB;AACtB,uCAAqD;AACrD,6DAA+C;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport {\n addMCPServerToClientsStep,\n removeMCPServerFromClientsStep,\n} from './steps/add-mcp-server-to-clients';\nimport clack from './utils/clack';\nimport { abort } from './utils/clack-utils';\nimport type { CloudRegion } from './utils/types';\nimport opn from 'opn';\nimport { getCloudUrlFromRegion } from './utils/urls';\nimport { sleep } from './lib/helper-functions';\nimport { enableDebugLogs } from './utils/debug';\n\nexport const runMCPInstall = async (options: {\n signup: boolean;\n region?: CloudRegion;\n local?: boolean;\n debug?: boolean;\n}) => {\n if (options.debug) {\n enableDebugLogs();\n }\n clack.intro(\n chalk.bgGreenBright(\n `Installing the PostHog MCP server ${options.local && '(local)'}`,\n ),\n );\n\n await addMCPServerToClientsStep({\n cloudRegion: options.region,\n askPermission: false,\n local: options.local,\n });\n\n clack.log.message(\n `${chalk.greenBright(\n 'You might need to restart your MCP clients to see the changes.',\n )}`,\n );\n\n clack.log.message(`Get started with some prompts like:\n- What feature flags do I have active?\n- Add a new feature flag for our homepage redesign\n- What are my most common errors?`);\n\n clack.log.message(`Check out our MCP Server documentation:\n${chalk.blueBright(`https://posthog.com/docs/model-context-protocol`)}`);\n};\n\nexport const runMCPRemove = async (options?: { local?: boolean }) => {\n clack.intro(chalk.bgRed('Removing the PostHog MCP server'));\n const results = await removeMCPServerFromClientsStep({\n local: options?.local,\n });\n\n if (results.length === 0) {\n clack.outro(`No PostHog MCP servers found to remove.`);\n return;\n }\n\n clack.log.success(`PostHog MCP server removed from:`);\n results.map((c) => clack.log.message(`- ${c}`));\n clack.outro(\n `${chalk.green(\n 'You might need to restart your MCP clients to see the changes.\\n\\n',\n )}`,\n );\n};\n\nexport const getPersonalApiKey = async (options: {\n cloudRegion: CloudRegion;\n}): Promise<string> => {\n const cloudUrl = getCloudUrlFromRegion(options.cloudRegion);\n\n const urlToOpen = `${cloudUrl}/settings/user-api-keys?preset=mcp_server`;\n\n const spinner = clack.spinner();\n spinner.start(\n `Opening your project settings so you can get a Personal API key...`,\n );\n\n await sleep(1500);\n\n spinner.stop(\n `Opened your project settings. If the link didn't open automatically, open the following URL in your browser to get a Personal API key: \\n\\n${chalk.cyan(\n urlToOpen,\n )}`,\n );\n\n opn(urlToOpen, { wait: false }).catch(() => {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n });\n\n const personalApiKey = await clack.password({\n message: 'Paste in your Personal API key:',\n validate(value) {\n if (value.length === 0) return `Value is required!`;\n\n if (!value.startsWith('phx_')) {\n return `That doesn't look right, are you sure you copied the right key? It should start with 'phx_'`;\n }\n },\n });\n\n if (!personalApiKey) {\n await abort('Unable to proceed without a personal API key.');\n return '';\n }\n\n return personalApiKey as string;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const codex_1 = require("../codex");
|
|
4
|
+
const defaults_1 = require("../../defaults");
|
|
5
|
+
jest.mock('node:child_process', () => ({
|
|
6
|
+
execSync: jest.fn(),
|
|
7
|
+
spawnSync: jest.fn(),
|
|
8
|
+
}));
|
|
9
|
+
jest.mock('../../defaults', () => ({
|
|
10
|
+
getDefaultServerConfig: jest.fn(),
|
|
11
|
+
}));
|
|
12
|
+
jest.mock('../../../../utils/analytics', () => ({
|
|
13
|
+
analytics: {
|
|
14
|
+
captureException: jest.fn(),
|
|
15
|
+
},
|
|
16
|
+
}));
|
|
17
|
+
describe('CodexMCPClient', () => {
|
|
18
|
+
const { execSync, spawnSync } = require('node:child_process');
|
|
19
|
+
const analytics = require('../../../../utils/analytics').analytics;
|
|
20
|
+
const getDefaultServerConfigMock = defaults_1.getDefaultServerConfig;
|
|
21
|
+
const spawnSyncMock = spawnSync;
|
|
22
|
+
const execSyncMock = execSync;
|
|
23
|
+
const mockConfig = {
|
|
24
|
+
command: 'npx',
|
|
25
|
+
args: ['-y', 'mcp-remote@latest', 'https://example.com'],
|
|
26
|
+
env: {
|
|
27
|
+
POSTHOG_AUTH_HEADER: 'Bearer phx_example',
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
jest.clearAllMocks();
|
|
32
|
+
getDefaultServerConfigMock.mockReturnValue(mockConfig);
|
|
33
|
+
});
|
|
34
|
+
describe('isClientSupported', () => {
|
|
35
|
+
it('returns true when codex binary is available', async () => {
|
|
36
|
+
execSyncMock.mockReturnValue(undefined);
|
|
37
|
+
const client = new codex_1.CodexMCPClient();
|
|
38
|
+
await expect(client.isClientSupported()).resolves.toBe(true);
|
|
39
|
+
expect(execSyncMock).toHaveBeenCalledWith('codex --version', {
|
|
40
|
+
stdio: 'ignore',
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
it('returns false when codex binary is missing', async () => {
|
|
44
|
+
execSyncMock.mockImplementation(() => {
|
|
45
|
+
throw new Error('not found');
|
|
46
|
+
});
|
|
47
|
+
const client = new codex_1.CodexMCPClient();
|
|
48
|
+
await expect(client.isClientSupported()).resolves.toBe(false);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('isServerInstalled', () => {
|
|
52
|
+
it('returns true when posthog server exists', async () => {
|
|
53
|
+
spawnSyncMock.mockReturnValue({
|
|
54
|
+
status: 0,
|
|
55
|
+
stdout: JSON.stringify([{ name: 'posthog' }, { name: 'other' }]),
|
|
56
|
+
});
|
|
57
|
+
const client = new codex_1.CodexMCPClient();
|
|
58
|
+
await expect(client.isServerInstalled()).resolves.toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('returns false when command fails', async () => {
|
|
61
|
+
spawnSyncMock.mockReturnValue({ status: 1, stdout: '' });
|
|
62
|
+
const client = new codex_1.CodexMCPClient();
|
|
63
|
+
await expect(client.isServerInstalled()).resolves.toBe(false);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('addServer', () => {
|
|
67
|
+
it('invokes codex mcp add with expected arguments', async () => {
|
|
68
|
+
spawnSyncMock.mockReturnValue({ status: 0 });
|
|
69
|
+
const client = new codex_1.CodexMCPClient();
|
|
70
|
+
const result = await client.addServer('phx_example');
|
|
71
|
+
expect(result).toEqual({ success: true });
|
|
72
|
+
expect(spawnSyncMock).toHaveBeenCalledWith('codex', [
|
|
73
|
+
'mcp',
|
|
74
|
+
'add',
|
|
75
|
+
'posthog',
|
|
76
|
+
'--env',
|
|
77
|
+
'POSTHOG_AUTH_HEADER=Bearer phx_example',
|
|
78
|
+
'--',
|
|
79
|
+
'npx',
|
|
80
|
+
'-y',
|
|
81
|
+
'mcp-remote@latest',
|
|
82
|
+
'https://example.com',
|
|
83
|
+
], { stdio: 'ignore' });
|
|
84
|
+
});
|
|
85
|
+
it('returns false and captures exception on failure', async () => {
|
|
86
|
+
spawnSyncMock.mockReturnValue({ status: 1 });
|
|
87
|
+
const client = new codex_1.CodexMCPClient();
|
|
88
|
+
const result = await client.addServer('phx_example');
|
|
89
|
+
expect(result).toEqual({ success: false });
|
|
90
|
+
expect(analytics.captureException).toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('removeServer', () => {
|
|
94
|
+
it('invokes codex mcp remove and returns success', async () => {
|
|
95
|
+
spawnSyncMock.mockReturnValue({ status: 0 });
|
|
96
|
+
const client = new codex_1.CodexMCPClient();
|
|
97
|
+
const result = await client.removeServer();
|
|
98
|
+
expect(result).toEqual({ success: true });
|
|
99
|
+
expect(spawnSyncMock).toHaveBeenCalledWith('codex', ['mcp', 'remove', 'posthog'], {
|
|
100
|
+
stdio: 'ignore',
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
it('returns false and captures exception on failure', async () => {
|
|
104
|
+
spawnSyncMock.mockReturnValue({ status: 1 });
|
|
105
|
+
const client = new codex_1.CodexMCPClient();
|
|
106
|
+
const result = await client.removeServer();
|
|
107
|
+
expect(result).toEqual({ success: false });
|
|
108
|
+
expect(analytics.captureException).toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=codex.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.test.js","sourceRoot":"","sources":["../../../../../../src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { CodexMCPClient } from '../codex';\nimport { getDefaultServerConfig } from '../../defaults';\n\njest.mock('node:child_process', () => ({\n execSync: jest.fn(),\n spawnSync: jest.fn(),\n}));\n\njest.mock('../../defaults', () => ({\n getDefaultServerConfig: jest.fn(),\n}));\n\njest.mock('../../../../utils/analytics', () => ({\n analytics: {\n captureException: jest.fn(),\n },\n}));\n\ndescribe('CodexMCPClient', () => {\n const { execSync, spawnSync } = require('node:child_process');\n const analytics = require('../../../../utils/analytics').analytics;\n const getDefaultServerConfigMock = getDefaultServerConfig as jest.Mock;\n\n const spawnSyncMock = spawnSync as jest.Mock;\n const execSyncMock = execSync as jest.Mock;\n\n const mockConfig = {\n command: 'npx',\n args: ['-y', 'mcp-remote@latest', 'https://example.com'],\n env: {\n POSTHOG_AUTH_HEADER: 'Bearer phx_example',\n },\n };\n\n beforeEach(() => {\n jest.clearAllMocks();\n getDefaultServerConfigMock.mockReturnValue(mockConfig);\n });\n\n describe('isClientSupported', () => {\n it('returns true when codex binary is available', async () => {\n execSyncMock.mockReturnValue(undefined);\n\n const client = new CodexMCPClient();\n await expect(client.isClientSupported()).resolves.toBe(true);\n expect(execSyncMock).toHaveBeenCalledWith('codex --version', {\n stdio: 'ignore',\n });\n });\n\n it('returns false when codex binary is missing', async () => {\n execSyncMock.mockImplementation(() => {\n throw new Error('not found');\n });\n\n const client = new CodexMCPClient();\n await expect(client.isClientSupported()).resolves.toBe(false);\n });\n });\n\n describe('isServerInstalled', () => {\n it('returns true when posthog server exists', async () => {\n spawnSyncMock.mockReturnValue({\n status: 0,\n stdout: JSON.stringify([{ name: 'posthog' }, { name: 'other' }]),\n });\n\n const client = new CodexMCPClient();\n await expect(client.isServerInstalled()).resolves.toBe(true);\n });\n\n it('returns false when command fails', async () => {\n spawnSyncMock.mockReturnValue({ status: 1, stdout: '' });\n\n const client = new CodexMCPClient();\n await expect(client.isServerInstalled()).resolves.toBe(false);\n });\n });\n\n describe('addServer', () => {\n it('invokes codex mcp add with expected arguments', async () => {\n spawnSyncMock.mockReturnValue({ status: 0 });\n\n const client = new CodexMCPClient();\n const result = await client.addServer('phx_example');\n\n expect(result).toEqual({ success: true });\n expect(spawnSyncMock).toHaveBeenCalledWith(\n 'codex',\n [\n 'mcp',\n 'add',\n 'posthog',\n '--env',\n 'POSTHOG_AUTH_HEADER=Bearer phx_example',\n '--',\n 'npx',\n '-y',\n 'mcp-remote@latest',\n 'https://example.com',\n ],\n { stdio: 'ignore' },\n );\n });\n\n it('returns false and captures exception on failure', async () => {\n spawnSyncMock.mockReturnValue({ status: 1 });\n\n const client = new CodexMCPClient();\n const result = await client.addServer('phx_example');\n\n expect(result).toEqual({ success: false });\n expect(analytics.captureException).toHaveBeenCalled();\n });\n });\n\n describe('removeServer', () => {\n it('invokes codex mcp remove and returns success', async () => {\n spawnSyncMock.mockReturnValue({ status: 0 });\n\n const client = new CodexMCPClient();\n const result = await client.removeServer();\n\n expect(result).toEqual({ success: true });\n expect(spawnSyncMock).toHaveBeenCalledWith(\n 'codex',\n ['mcp', 'remove', 'posthog'],\n {\n stdio: 'ignore',\n },\n );\n });\n\n it('returns false and captures exception on failure', async () => {\n spawnSyncMock.mockReturnValue({ status: 1 });\n\n const client = new CodexMCPClient();\n const result = await client.removeServer();\n\n expect(result).toEqual({ success: false });\n expect(analytics.captureException).toHaveBeenCalled();\n });\n });\n});\n"]}
|
|
@@ -47,13 +47,16 @@ export declare const ClaudeCodeMCPConfig: z.ZodObject<{
|
|
|
47
47
|
export type ClaudeCodeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;
|
|
48
48
|
export declare class ClaudeCodeMCPClient extends DefaultMCPClient {
|
|
49
49
|
name: string;
|
|
50
|
+
private claudeBinaryPath;
|
|
50
51
|
constructor();
|
|
52
|
+
private findClaudeBinary;
|
|
51
53
|
isClientSupported(): Promise<boolean>;
|
|
52
54
|
isServerInstalled(local?: boolean): Promise<boolean>;
|
|
53
55
|
getConfigPath(): Promise<string>;
|
|
54
56
|
addServer(apiKey: string, selectedFeatures?: string[], local?: boolean): Promise<{
|
|
55
57
|
success: boolean;
|
|
56
58
|
}>;
|
|
59
|
+
private buildClaudeCodeConfig;
|
|
57
60
|
removeServer(local?: boolean): Promise<{
|
|
58
61
|
success: boolean;
|
|
59
62
|
}>;
|
|
@@ -1,29 +1,113 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.ClaudeCodeMCPClient = exports.ClaudeCodeMCPConfig = void 0;
|
|
4
37
|
const MCPClient_1 = require("../MCPClient");
|
|
5
38
|
const defaults_1 = require("../defaults");
|
|
6
39
|
const child_process_1 = require("child_process");
|
|
7
40
|
const analytics_1 = require("../../../utils/analytics");
|
|
41
|
+
const debug_1 = require("../../../utils/debug");
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
8
45
|
exports.ClaudeCodeMCPConfig = defaults_1.DefaultMCPClientConfig;
|
|
9
46
|
class ClaudeCodeMCPClient extends MCPClient_1.DefaultMCPClient {
|
|
10
47
|
name = 'Claude Code';
|
|
48
|
+
claudeBinaryPath = null;
|
|
11
49
|
constructor() {
|
|
12
50
|
super();
|
|
13
51
|
}
|
|
52
|
+
findClaudeBinary() {
|
|
53
|
+
if (this.claudeBinaryPath) {
|
|
54
|
+
return this.claudeBinaryPath;
|
|
55
|
+
}
|
|
56
|
+
// Common installation paths for Claude Code CLI
|
|
57
|
+
const possiblePaths = [
|
|
58
|
+
path.join(os.homedir(), '.claude', 'local', 'claude'),
|
|
59
|
+
'/usr/local/bin/claude',
|
|
60
|
+
'/opt/homebrew/bin/claude',
|
|
61
|
+
];
|
|
62
|
+
for (const claudePath of possiblePaths) {
|
|
63
|
+
if (fs.existsSync(claudePath)) {
|
|
64
|
+
(0, debug_1.debug)(` Found claude binary at: ${claudePath}`);
|
|
65
|
+
this.claudeBinaryPath = claudePath;
|
|
66
|
+
return claudePath;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Try PATH as fallback
|
|
70
|
+
try {
|
|
71
|
+
(0, child_process_1.execSync)('command -v claude', { stdio: 'pipe' });
|
|
72
|
+
(0, debug_1.debug)(' Found claude in PATH');
|
|
73
|
+
this.claudeBinaryPath = 'claude';
|
|
74
|
+
return 'claude';
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Not in PATH
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
14
81
|
isClientSupported() {
|
|
15
82
|
try {
|
|
16
|
-
(0,
|
|
83
|
+
(0, debug_1.debug)(' Checking for Claude Code...');
|
|
84
|
+
const claudeBinary = this.findClaudeBinary();
|
|
85
|
+
if (!claudeBinary) {
|
|
86
|
+
(0, debug_1.debug)(' Claude Code not found. Installation paths checked:');
|
|
87
|
+
(0, debug_1.debug)(` - ${path.join(os.homedir(), '.claude', 'local', 'claude')}`);
|
|
88
|
+
(0, debug_1.debug)(` - /usr/local/bin/claude`);
|
|
89
|
+
(0, debug_1.debug)(` - /opt/homebrew/bin/claude`);
|
|
90
|
+
(0, debug_1.debug)(` - PATH`);
|
|
91
|
+
return Promise.resolve(false);
|
|
92
|
+
}
|
|
93
|
+
const output = (0, child_process_1.execSync)(`${claudeBinary} --version`, { stdio: 'pipe' });
|
|
94
|
+
const version = output.toString().trim();
|
|
95
|
+
(0, debug_1.debug)(` Claude Code detected: ${version}`);
|
|
17
96
|
return Promise.resolve(true);
|
|
18
97
|
}
|
|
19
|
-
catch {
|
|
98
|
+
catch (error) {
|
|
99
|
+
(0, debug_1.debug)(` Claude Code check failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
20
100
|
return Promise.resolve(false);
|
|
21
101
|
}
|
|
22
102
|
}
|
|
23
103
|
isServerInstalled(local) {
|
|
24
104
|
try {
|
|
105
|
+
const claudeBinary = this.findClaudeBinary();
|
|
106
|
+
if (!claudeBinary) {
|
|
107
|
+
return Promise.resolve(false);
|
|
108
|
+
}
|
|
25
109
|
// check if specific server name exists in output
|
|
26
|
-
const output = (0, child_process_1.execSync)(
|
|
110
|
+
const output = (0, child_process_1.execSync)(`${claudeBinary} mcp list`, {
|
|
27
111
|
stdio: 'pipe',
|
|
28
112
|
});
|
|
29
113
|
const outputStr = output.toString();
|
|
@@ -41,9 +125,15 @@ class ClaudeCodeMCPClient extends MCPClient_1.DefaultMCPClient {
|
|
|
41
125
|
throw new Error('Not implemented');
|
|
42
126
|
}
|
|
43
127
|
addServer(apiKey, selectedFeatures, local) {
|
|
44
|
-
const
|
|
128
|
+
const claudeBinary = this.findClaudeBinary();
|
|
129
|
+
if (!claudeBinary) {
|
|
130
|
+
return Promise.resolve({ success: false });
|
|
131
|
+
}
|
|
132
|
+
// Build Claude Code-specific config
|
|
133
|
+
// Based on getDefaultServerConfig() but with fixes for Claude Code bugs
|
|
134
|
+
const config = this.buildClaudeCodeConfig(apiKey, selectedFeatures, local);
|
|
45
135
|
const serverName = local ? 'posthog-local' : 'posthog';
|
|
46
|
-
const command =
|
|
136
|
+
const command = `${claudeBinary} mcp add-json ${serverName} -s user '${JSON.stringify(config)}'`;
|
|
47
137
|
try {
|
|
48
138
|
(0, child_process_1.execSync)(command);
|
|
49
139
|
}
|
|
@@ -53,9 +143,56 @@ class ClaudeCodeMCPClient extends MCPClient_1.DefaultMCPClient {
|
|
|
53
143
|
}
|
|
54
144
|
return Promise.resolve({ success: true });
|
|
55
145
|
}
|
|
146
|
+
buildClaudeCodeConfig(apiKey, selectedFeatures, local) {
|
|
147
|
+
// Replicate getDefaultServerConfig() logic but with Claude Code fixes:
|
|
148
|
+
// 1. Add https:// protocol (mcp-remote requires valid URLs)
|
|
149
|
+
// 2. Embed token directly in Authorization header (env var expansion broken)
|
|
150
|
+
//
|
|
151
|
+
// Claude Code bugs:
|
|
152
|
+
// - https://github.com/anthropics/claude-code/issues/6204
|
|
153
|
+
// - https://github.com/anthropics/claude-code/issues/9427
|
|
154
|
+
// - https://github.com/anthropics/claude-code/issues/10955
|
|
155
|
+
const protocol = local ? 'http://' : 'https://';
|
|
156
|
+
const host = local ? 'localhost:8787' : 'mcp.posthog.com';
|
|
157
|
+
const baseUrl = `${protocol}${host}/sse`;
|
|
158
|
+
const ALL_FEATURE_VALUES = [
|
|
159
|
+
'dashboards',
|
|
160
|
+
'insights',
|
|
161
|
+
'experiments',
|
|
162
|
+
'llm-analytics',
|
|
163
|
+
'error-tracking',
|
|
164
|
+
'flags',
|
|
165
|
+
'workspace',
|
|
166
|
+
'docs',
|
|
167
|
+
];
|
|
168
|
+
const isAllFeaturesSelected = selectedFeatures &&
|
|
169
|
+
selectedFeatures.length === ALL_FEATURE_VALUES.length &&
|
|
170
|
+
ALL_FEATURE_VALUES.every((feature) => selectedFeatures.includes(feature));
|
|
171
|
+
const urlWithFeatures = selectedFeatures && selectedFeatures.length > 0 && !isAllFeaturesSelected
|
|
172
|
+
? `${baseUrl}?features=${selectedFeatures.join(',')}`
|
|
173
|
+
: baseUrl;
|
|
174
|
+
return {
|
|
175
|
+
command: 'npx',
|
|
176
|
+
args: [
|
|
177
|
+
'-y',
|
|
178
|
+
'mcp-remote@latest',
|
|
179
|
+
urlWithFeatures,
|
|
180
|
+
'--header',
|
|
181
|
+
`Authorization:Bearer ${apiKey}`, // Embed token directly (not ${VAR})
|
|
182
|
+
],
|
|
183
|
+
// Keep env block for backward compatibility if bugs get fixed
|
|
184
|
+
env: {
|
|
185
|
+
POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
56
189
|
removeServer(local) {
|
|
190
|
+
const claudeBinary = this.findClaudeBinary();
|
|
191
|
+
if (!claudeBinary) {
|
|
192
|
+
return Promise.resolve({ success: false });
|
|
193
|
+
}
|
|
57
194
|
const serverName = local ? 'posthog-local' : 'posthog';
|
|
58
|
-
const command =
|
|
195
|
+
const command = `${claudeBinary} mcp remove --scope user ${serverName}`;
|
|
59
196
|
try {
|
|
60
197
|
(0, child_process_1.execSync)(command);
|
|
61
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/claude-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefaultMCPClient } from '../MCPClient';\nimport { DefaultMCPClientConfig, getDefaultServerConfig } from '../defaults';\nimport { z } from 'zod';\nimport { execSync } from 'child_process';\nimport { analytics } from '../../../utils/analytics';\n\nexport const ClaudeCodeMCPConfig = DefaultMCPClientConfig;\n\nexport type ClaudeCodeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class ClaudeCodeMCPClient extends DefaultMCPClient {\n name = 'Claude Code';\n\n constructor() {\n super();\n }\n\n isClientSupported(): Promise<boolean> {\n try {\n execSync('claude --version', { stdio: 'ignore' });\n return Promise.resolve(true);\n } catch {\n return Promise.resolve(false);\n }\n }\n\n isServerInstalled(local?: boolean): Promise<boolean> {\n try {\n // check if specific server name exists in output\n const output = execSync('claude mcp list', {\n stdio: 'pipe',\n });\n\n const outputStr = output.toString();\n const serverName = local ? 'posthog-local' : 'posthog';\n\n if (outputStr.includes(serverName)) {\n return Promise.resolve(true);\n }\n } catch {\n //\n }\n\n return Promise.resolve(false);\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n addServer(\n apiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }> {\n const config = getDefaultServerConfig(\n apiKey,\n 'sse',\n selectedFeatures,\n local,\n );\n const serverName = local ? 'posthog-local' : 'posthog';\n\n const command = `claude mcp add-json ${serverName} -s user '${JSON.stringify(\n config,\n )}'`;\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to add server to Claude Code: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n\n removeServer(local?: boolean): Promise<{ success: boolean }> {\n const serverName = local ? 'posthog-local' : 'posthog';\n const command = `claude mcp remove --scope user ${serverName}`;\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to remove server from Claude Code: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/claude-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefaultMCPClient } from '../MCPClient';\nimport { DefaultMCPClientConfig } from '../defaults';\nimport { z } from 'zod';\nimport { execSync } from 'child_process';\nimport { analytics } from '../../../utils/analytics';\nimport { debug } from '../../../utils/debug';\nimport * as os from 'os';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport const ClaudeCodeMCPConfig = DefaultMCPClientConfig;\n\nexport type ClaudeCodeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class ClaudeCodeMCPClient extends DefaultMCPClient {\n name = 'Claude Code';\n private claudeBinaryPath: string | null = null;\n\n constructor() {\n super();\n }\n\n private findClaudeBinary(): string | null {\n if (this.claudeBinaryPath) {\n return this.claudeBinaryPath;\n }\n\n // Common installation paths for Claude Code CLI\n const possiblePaths = [\n path.join(os.homedir(), '.claude', 'local', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ];\n\n for (const claudePath of possiblePaths) {\n if (fs.existsSync(claudePath)) {\n debug(` Found claude binary at: ${claudePath}`);\n this.claudeBinaryPath = claudePath;\n return claudePath;\n }\n }\n\n // Try PATH as fallback\n try {\n execSync('command -v claude', { stdio: 'pipe' });\n debug(' Found claude in PATH');\n this.claudeBinaryPath = 'claude';\n return 'claude';\n } catch {\n // Not in PATH\n }\n\n return null;\n }\n\n isClientSupported(): Promise<boolean> {\n try {\n debug(' Checking for Claude Code...');\n const claudeBinary = this.findClaudeBinary();\n\n if (!claudeBinary) {\n debug(' Claude Code not found. Installation paths checked:');\n debug(` - ${path.join(os.homedir(), '.claude', 'local', 'claude')}`);\n debug(` - /usr/local/bin/claude`);\n debug(` - /opt/homebrew/bin/claude`);\n debug(` - PATH`);\n return Promise.resolve(false);\n }\n\n const output = execSync(`${claudeBinary} --version`, { stdio: 'pipe' });\n const version = output.toString().trim();\n debug(` Claude Code detected: ${version}`);\n return Promise.resolve(true);\n } catch (error) {\n debug(\n ` Claude Code check failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return Promise.resolve(false);\n }\n }\n\n isServerInstalled(local?: boolean): Promise<boolean> {\n try {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve(false);\n }\n\n // check if specific server name exists in output\n const output = execSync(`${claudeBinary} mcp list`, {\n stdio: 'pipe',\n });\n\n const outputStr = output.toString();\n const serverName = local ? 'posthog-local' : 'posthog';\n\n if (outputStr.includes(serverName)) {\n return Promise.resolve(true);\n }\n } catch {\n //\n }\n\n return Promise.resolve(false);\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n addServer(\n apiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }> {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve({ success: false });\n }\n\n // Build Claude Code-specific config\n // Based on getDefaultServerConfig() but with fixes for Claude Code bugs\n const config = this.buildClaudeCodeConfig(apiKey, selectedFeatures, local);\n const serverName = local ? 'posthog-local' : 'posthog';\n\n const command = `${claudeBinary} mcp add-json ${serverName} -s user '${JSON.stringify(\n config,\n )}'`;\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to add server to Claude Code: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n\n private buildClaudeCodeConfig(\n apiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n ) {\n // Replicate getDefaultServerConfig() logic but with Claude Code fixes:\n // 1. Add https:// protocol (mcp-remote requires valid URLs)\n // 2. Embed token directly in Authorization header (env var expansion broken)\n //\n // Claude Code bugs:\n // - https://github.com/anthropics/claude-code/issues/6204\n // - https://github.com/anthropics/claude-code/issues/9427\n // - https://github.com/anthropics/claude-code/issues/10955\n\n const protocol = local ? 'http://' : 'https://';\n const host = local ? 'localhost:8787' : 'mcp.posthog.com';\n const baseUrl = `${protocol}${host}/sse`;\n\n const ALL_FEATURE_VALUES = [\n 'dashboards',\n 'insights',\n 'experiments',\n 'llm-analytics',\n 'error-tracking',\n 'flags',\n 'workspace',\n 'docs',\n ];\n\n const isAllFeaturesSelected =\n selectedFeatures &&\n selectedFeatures.length === ALL_FEATURE_VALUES.length &&\n ALL_FEATURE_VALUES.every((feature) => selectedFeatures.includes(feature));\n\n const urlWithFeatures =\n selectedFeatures && selectedFeatures.length > 0 && !isAllFeaturesSelected\n ? `${baseUrl}?features=${selectedFeatures.join(',')}`\n : baseUrl;\n\n return {\n command: 'npx',\n args: [\n '-y',\n 'mcp-remote@latest',\n urlWithFeatures,\n '--header',\n `Authorization:Bearer ${apiKey}`, // Embed token directly (not ${VAR})\n ],\n // Keep env block for backward compatibility if bugs get fixed\n env: {\n POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,\n },\n };\n }\n\n removeServer(local?: boolean): Promise<{ success: boolean }> {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve({ success: false });\n }\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const command = `${claudeBinary} mcp remove --scope user ${serverName}`;\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to remove server from Claude Code: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n}\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { DefaultMCPClient } from '../MCPClient';
|
|
3
|
+
import { DefaultMCPClientConfig } from '../defaults';
|
|
4
|
+
export declare const CodexMCPConfig: z.ZodObject<{
|
|
5
|
+
mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
6
|
+
command: z.ZodOptional<z.ZodString>;
|
|
7
|
+
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
8
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
command?: string | undefined;
|
|
11
|
+
args?: string[] | undefined;
|
|
12
|
+
env?: Record<string, string> | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
command?: string | undefined;
|
|
15
|
+
args?: string[] | undefined;
|
|
16
|
+
env?: Record<string, string> | undefined;
|
|
17
|
+
}>>;
|
|
18
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
19
|
+
mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
20
|
+
command: z.ZodOptional<z.ZodString>;
|
|
21
|
+
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
22
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
command?: string | undefined;
|
|
25
|
+
args?: string[] | undefined;
|
|
26
|
+
env?: Record<string, string> | undefined;
|
|
27
|
+
}, {
|
|
28
|
+
command?: string | undefined;
|
|
29
|
+
args?: string[] | undefined;
|
|
30
|
+
env?: Record<string, string> | undefined;
|
|
31
|
+
}>>;
|
|
32
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
33
|
+
mcpServers: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
34
|
+
command: z.ZodOptional<z.ZodString>;
|
|
35
|
+
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
36
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
command?: string | undefined;
|
|
39
|
+
args?: string[] | undefined;
|
|
40
|
+
env?: Record<string, string> | undefined;
|
|
41
|
+
}, {
|
|
42
|
+
command?: string | undefined;
|
|
43
|
+
args?: string[] | undefined;
|
|
44
|
+
env?: Record<string, string> | undefined;
|
|
45
|
+
}>>;
|
|
46
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
47
|
+
export type CodexMCPConfig = z.infer<typeof DefaultMCPClientConfig>;
|
|
48
|
+
export declare class CodexMCPClient extends DefaultMCPClient {
|
|
49
|
+
name: string;
|
|
50
|
+
constructor();
|
|
51
|
+
isClientSupported(): Promise<boolean>;
|
|
52
|
+
getConfigPath(): Promise<string>;
|
|
53
|
+
isServerInstalled(local?: boolean): Promise<boolean>;
|
|
54
|
+
addServer(apiKey: string, selectedFeatures?: string[], local?: boolean): Promise<{
|
|
55
|
+
success: boolean;
|
|
56
|
+
}>;
|
|
57
|
+
removeServer(local?: boolean): Promise<{
|
|
58
|
+
success: boolean;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
export default CodexMCPClient;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CodexMCPClient = exports.CodexMCPConfig = void 0;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const MCPClient_1 = require("../MCPClient");
|
|
6
|
+
const defaults_1 = require("../defaults");
|
|
7
|
+
const analytics_1 = require("../../../utils/analytics");
|
|
8
|
+
exports.CodexMCPConfig = defaults_1.DefaultMCPClientConfig;
|
|
9
|
+
class CodexMCPClient extends MCPClient_1.DefaultMCPClient {
|
|
10
|
+
name = 'Codex CLI';
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
}
|
|
14
|
+
isClientSupported() {
|
|
15
|
+
try {
|
|
16
|
+
(0, node_child_process_1.execSync)('codex --version', { stdio: 'ignore' });
|
|
17
|
+
return Promise.resolve(true);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return Promise.resolve(false);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
getConfigPath() {
|
|
24
|
+
throw new Error('Not implemented');
|
|
25
|
+
}
|
|
26
|
+
isServerInstalled(local) {
|
|
27
|
+
const serverName = local ? 'posthog-local' : 'posthog';
|
|
28
|
+
try {
|
|
29
|
+
const result = (0, node_child_process_1.spawnSync)('codex', ['mcp', 'list', '--json'], {
|
|
30
|
+
encoding: 'utf-8',
|
|
31
|
+
});
|
|
32
|
+
if (result.error || result.status !== 0) {
|
|
33
|
+
return Promise.resolve(false);
|
|
34
|
+
}
|
|
35
|
+
const stdout = result.stdout?.trim();
|
|
36
|
+
if (!stdout) {
|
|
37
|
+
return Promise.resolve(false);
|
|
38
|
+
}
|
|
39
|
+
const servers = JSON.parse(stdout);
|
|
40
|
+
return Promise.resolve(servers.some((server) => server.name === serverName));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return Promise.resolve(false);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
addServer(apiKey, selectedFeatures, local) {
|
|
47
|
+
const config = (0, defaults_1.getDefaultServerConfig)(apiKey, 'sse', selectedFeatures, local);
|
|
48
|
+
const serverName = local ? 'posthog-local' : 'posthog';
|
|
49
|
+
const args = ['mcp', 'add', serverName];
|
|
50
|
+
if (config.env) {
|
|
51
|
+
for (const [key, value] of Object.entries(config.env)) {
|
|
52
|
+
args.push('--env', `${key}=${value}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
args.push('--', config.command, ...(config.args ?? []));
|
|
56
|
+
const result = (0, node_child_process_1.spawnSync)('codex', args, { stdio: 'ignore' });
|
|
57
|
+
if (result.error || result.status !== 0) {
|
|
58
|
+
analytics_1.analytics.captureException(new Error('Failed to add server to Codex CLI.'));
|
|
59
|
+
return Promise.resolve({ success: false });
|
|
60
|
+
}
|
|
61
|
+
return Promise.resolve({ success: true });
|
|
62
|
+
}
|
|
63
|
+
removeServer(local) {
|
|
64
|
+
const serverName = local ? 'posthog-local' : 'posthog';
|
|
65
|
+
const result = (0, node_child_process_1.spawnSync)('codex', ['mcp', 'remove', serverName], {
|
|
66
|
+
stdio: 'ignore',
|
|
67
|
+
});
|
|
68
|
+
if (result.error || result.status !== 0) {
|
|
69
|
+
analytics_1.analytics.captureException(new Error('Failed to remove server from Codex CLI.'));
|
|
70
|
+
return Promise.resolve({ success: false });
|
|
71
|
+
}
|
|
72
|
+
return Promise.resolve({ success: true });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.CodexMCPClient = CodexMCPClient;
|
|
76
|
+
exports.default = CodexMCPClient;
|
|
77
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../src/steps/add-mcp-server-to-clients/clients/codex.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport { execSync, spawnSync } from 'node:child_process';\n\nimport { DefaultMCPClient } from '../MCPClient';\nimport { DefaultMCPClientConfig, getDefaultServerConfig } from '../defaults';\n\nimport { analytics } from '../../../utils/analytics';\n\nexport const CodexMCPConfig = DefaultMCPClientConfig;\n\nexport type CodexMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CodexMCPClient extends DefaultMCPClient {\n name = 'Codex CLI';\n\n constructor() {\n super();\n }\n\n isClientSupported(): Promise<boolean> {\n try {\n execSync('codex --version', { stdio: 'ignore' });\n return Promise.resolve(true);\n } catch {\n return Promise.resolve(false);\n }\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n isServerInstalled(local?: boolean): Promise<boolean> {\n const serverName = local ? 'posthog-local' : 'posthog';\n\n try {\n const result = spawnSync('codex', ['mcp', 'list', '--json'], {\n encoding: 'utf-8',\n });\n\n if (result.error || result.status !== 0) {\n return Promise.resolve(false);\n }\n\n const stdout = result.stdout?.trim();\n if (!stdout) {\n return Promise.resolve(false);\n }\n\n const servers = JSON.parse(stdout) as Array<{ name: string }>;\n return Promise.resolve(\n servers.some((server) => server.name === serverName),\n );\n } catch {\n return Promise.resolve(false);\n }\n }\n\n addServer(\n apiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }> {\n const config = getDefaultServerConfig(\n apiKey,\n 'sse',\n selectedFeatures,\n local,\n );\n const serverName = local ? 'posthog-local' : 'posthog';\n\n const args = ['mcp', 'add', serverName];\n\n if (config.env) {\n for (const [key, value] of Object.entries(config.env)) {\n args.push('--env', `${key}=${value}`);\n }\n }\n\n args.push('--', config.command, ...(config.args ?? []));\n\n const result = spawnSync('codex', args, { stdio: 'ignore' });\n\n if (result.error || result.status !== 0) {\n analytics.captureException(\n new Error('Failed to add server to Codex CLI.'),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n\n removeServer(local?: boolean): Promise<{ success: boolean }> {\n const serverName = local ? 'posthog-local' : 'posthog';\n const result = spawnSync('codex', ['mcp', 'remove', serverName], {\n stdio: 'ignore',\n });\n\n if (result.error || result.status !== 0) {\n analytics.captureException(\n new Error('Failed to remove server from Codex CLI.'),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n}\n\nexport default CodexMCPClient;\n"]}
|
|
@@ -62,7 +62,7 @@ exports.ALL_FEATURE_VALUES = Object.values(exports.AVAILABLE_FEATURES)
|
|
|
62
62
|
.flat()
|
|
63
63
|
.map((feature) => feature.value);
|
|
64
64
|
const getDefaultServerConfig = (apiKey, type, selectedFeatures, local) => {
|
|
65
|
-
const host = local ? 'localhost:8787' : 'mcp.posthog.com';
|
|
65
|
+
const host = local ? 'http://localhost:8787' : 'https://mcp.posthog.com';
|
|
66
66
|
const baseUrl = `${host}/${type === 'sse' ? 'sse' : 'mcp'}`;
|
|
67
67
|
const isAllFeaturesSelected = selectedFeatures &&
|
|
68
68
|
selectedFeatures.length === exports.ALL_FEATURE_VALUES.length &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/defaults.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEP,QAAA,sBAAsB,GAAG,aAAC;KACpC,MAAM,CAAC;IACN,UAAU,EAAE,aAAC,CAAC,MAAM,CAClB,aAAC,CAAC,MAAM,EAAE,EACV,aAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,IAAI,EAAE,aAAC,CAAC,KAAK,CAAC,aAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACpC,GAAG,EAAE,aAAC,CAAC,MAAM,CAAC,aAAC,CAAC,MAAM,EAAE,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACjD,CAAC,CACH;CACF,CAAC;KACD,WAAW,EAAE,CAAC;AAEJ,QAAA,kBAAkB,GAAG;IAChC,kBAAkB,EAAE;QAClB;YACE,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,mCAAmC;SAC1C;QACD;YACE,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,oCAAoC;SAC3C;QACD;YACE,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,yBAAyB;SAChC;QACD;YACE,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,6BAA6B;SACpC;KACF;IACD,mBAAmB,EAAE;QACnB;YACE,KAAK,EAAE,gBAAgB;YACvB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,gCAAgC;SACvC;QACD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB,EAAE;KAC5E;IACD,uBAAuB,EAAE;QACvB;YACE,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,qCAAqC;SAC5C;QACD;YACE,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,8BAA8B;SACrC;KACF;CACF,CAAC;AAEW,QAAA,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,0BAAkB,CAAC;KAChE,IAAI,EAAE;KACN,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAI5B,MAAM,sBAAsB,GAAG,CACpC,MAAc,EACd,IAAmB,EACnB,gBAA2B,EAC3B,KAAe,EACf,EAAE;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/defaults.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEP,QAAA,sBAAsB,GAAG,aAAC;KACpC,MAAM,CAAC;IACN,UAAU,EAAE,aAAC,CAAC,MAAM,CAClB,aAAC,CAAC,MAAM,EAAE,EACV,aAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,IAAI,EAAE,aAAC,CAAC,KAAK,CAAC,aAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACpC,GAAG,EAAE,aAAC,CAAC,MAAM,CAAC,aAAC,CAAC,MAAM,EAAE,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACjD,CAAC,CACH;CACF,CAAC;KACD,WAAW,EAAE,CAAC;AAEJ,QAAA,kBAAkB,GAAG;IAChC,kBAAkB,EAAE;QAClB;YACE,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,mCAAmC;SAC1C;QACD;YACE,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,oCAAoC;SAC3C;QACD;YACE,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,yBAAyB;SAChC;QACD;YACE,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,6BAA6B;SACpC;KACF;IACD,mBAAmB,EAAE;QACnB;YACE,KAAK,EAAE,gBAAgB;YACvB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,gCAAgC;SACvC;QACD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB,EAAE;KAC5E;IACD,uBAAuB,EAAE;QACvB;YACE,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,qCAAqC;SAC5C;QACD;YACE,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,8BAA8B;SACrC;KACF;CACF,CAAC;AAEW,QAAA,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,0BAAkB,CAAC;KAChE,IAAI,EAAE;KACN,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAI5B,MAAM,sBAAsB,GAAG,CACpC,MAAc,EACd,IAAmB,EACnB,gBAA2B,EAC3B,KAAe,EACf,EAAE;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,yBAAyB,CAAC;IACzE,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,MAAM,qBAAqB,GACzB,gBAAgB;QAChB,gBAAgB,CAAC,MAAM,KAAK,0BAAkB,CAAC,MAAM;QACrD,0BAAkB,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5E,MAAM,eAAe,GACnB,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB;QACvE,CAAC,CAAC,GAAG,OAAO,aAAa,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACrD,CAAC,CAAC,OAAO,CAAC;IAEd,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE;YACJ,IAAI;YACJ,mBAAmB;YACnB,eAAe;YACf,UAAU;YACV,uCAAuC;SACxC;QACD,GAAG,EAAE;YACH,mBAAmB,EAAE,UAAU,MAAM,EAAE;SACxC;KACF,CAAC;AACJ,CAAC,CAAC;AAhCW,QAAA,sBAAsB,0BAgCjC","sourcesContent":["import z from 'zod';\n\nexport const DefaultMCPClientConfig = z\n .object({\n mcpServers: z.record(\n z.string(),\n z.object({\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n ),\n })\n .passthrough();\n\nexport const AVAILABLE_FEATURES = {\n 'Data & Analytics': [\n {\n value: 'dashboards',\n label: 'Dashboards',\n hint: 'Dashboard creation and management',\n },\n {\n value: 'insights',\n label: 'Insights',\n hint: 'Analytics insights and SQL queries',\n },\n {\n value: 'experiments',\n label: 'Experiments',\n hint: 'A/B testing experiments',\n },\n {\n value: 'llm-analytics',\n label: 'LLM Analytics',\n hint: 'LLM usage and cost tracking',\n },\n ],\n 'Development Tools': [\n {\n value: 'error-tracking',\n label: 'Error Tracking',\n hint: 'Error monitoring and debugging',\n },\n { value: 'flags', label: 'Feature Flags', hint: 'Feature flag management' },\n ],\n 'Platform & Management': [\n {\n value: 'workspace',\n label: 'Workspace',\n hint: 'Organization and project management',\n },\n {\n value: 'docs',\n label: 'Documentation',\n hint: 'PostHog documentation search',\n },\n ],\n};\n\nexport const ALL_FEATURE_VALUES = Object.values(AVAILABLE_FEATURES)\n .flat()\n .map((feature) => feature.value);\n\ntype MCPServerType = 'sse' | 'streamable-http';\n\nexport const getDefaultServerConfig = (\n apiKey: string,\n type: MCPServerType,\n selectedFeatures?: string[],\n local?: boolean,\n) => {\n const host = local ? 'http://localhost:8787' : 'https://mcp.posthog.com';\n const baseUrl = `${host}/${type === 'sse' ? 'sse' : 'mcp'}`;\n\n const isAllFeaturesSelected =\n selectedFeatures &&\n selectedFeatures.length === ALL_FEATURE_VALUES.length &&\n ALL_FEATURE_VALUES.every((feature) => selectedFeatures.includes(feature));\n\n const urlWithFeatures =\n selectedFeatures && selectedFeatures.length > 0 && !isAllFeaturesSelected\n ? `${baseUrl}?features=${selectedFeatures.join(',')}`\n : baseUrl;\n\n return {\n command: 'npx',\n args: [\n '-y',\n 'mcp-remote@latest',\n urlWithFeatures,\n '--header',\n `Authorization:\\${POSTHOG_AUTH_HEADER}`,\n ],\n env: {\n POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,\n },\n };\n};\n"]}
|
|
@@ -15,7 +15,9 @@ const mcp_1 = require("../../mcp");
|
|
|
15
15
|
const claude_code_1 = require("./clients/claude-code");
|
|
16
16
|
const visual_studio_code_1 = require("./clients/visual-studio-code");
|
|
17
17
|
const zed_1 = require("./clients/zed");
|
|
18
|
+
const codex_1 = require("./clients/codex");
|
|
18
19
|
const defaults_1 = require("./defaults");
|
|
20
|
+
const debug_1 = require("../../utils/debug");
|
|
19
21
|
const getSupportedClients = async () => {
|
|
20
22
|
const allClients = [
|
|
21
23
|
new cursor_1.CursorMCPClient(),
|
|
@@ -23,13 +25,20 @@ const getSupportedClients = async () => {
|
|
|
23
25
|
new claude_code_1.ClaudeCodeMCPClient(),
|
|
24
26
|
new visual_studio_code_1.VisualStudioCodeClient(),
|
|
25
27
|
new zed_1.ZedClient(),
|
|
28
|
+
new codex_1.CodexMCPClient(),
|
|
26
29
|
];
|
|
27
30
|
const supportedClients = [];
|
|
31
|
+
(0, debug_1.debug)('Checking for supported MCP clients...');
|
|
28
32
|
for (const client of allClients) {
|
|
29
|
-
|
|
33
|
+
const isSupported = await client.isClientSupported();
|
|
34
|
+
(0, debug_1.debug)(`${client.name}: ${isSupported ? '✓ supported' : '✗ not supported'}`);
|
|
35
|
+
if (isSupported) {
|
|
30
36
|
supportedClients.push(client);
|
|
31
37
|
}
|
|
32
38
|
}
|
|
39
|
+
(0, debug_1.debug)(`Found ${supportedClients.length} supported client(s): ${supportedClients
|
|
40
|
+
.map((c) => c.name)
|
|
41
|
+
.join(', ')}`);
|
|
33
42
|
return supportedClients;
|
|
34
43
|
};
|
|
35
44
|
exports.getSupportedClients = getSupportedClients;
|
|
@@ -68,7 +77,13 @@ const addMCPServerToClientsStep = async ({ integration, cloudRegion, askPermissi
|
|
|
68
77
|
required: true,
|
|
69
78
|
}), integration);
|
|
70
79
|
const clients = supportedClients.filter((client) => selectedClientNames.includes(client.name));
|
|
71
|
-
|
|
80
|
+
// Only check for existing installations in the clients the user selected
|
|
81
|
+
const installedClients = [];
|
|
82
|
+
for (const client of clients) {
|
|
83
|
+
if (await client.isServerInstalled(local)) {
|
|
84
|
+
installedClients.push(client);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
72
87
|
if (installedClients.length > 0) {
|
|
73
88
|
clack_1.default.log.warn(`The MCP server is already configured for:
|
|
74
89
|
${installedClients.map((c) => `- ${c.name}`).join('\n ')}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Integration } from '../../lib/constants';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport clack from '../../utils/clack';\nimport chalk from 'chalk';\nimport { abortIfCancelled, askForCloudRegion } from '../../utils/clack-utils';\nimport { MCPClient } from './MCPClient';\nimport { CursorMCPClient } from './clients/cursor';\nimport { ClaudeMCPClient } from './clients/claude';\nimport { getPersonalApiKey } from '../../mcp';\nimport type { CloudRegion } from '../../utils/types';\nimport { ClaudeCodeMCPClient } from './clients/claude-code';\nimport { VisualStudioCodeClient } from './clients/visual-studio-code';\nimport { ZedClient } from './clients/zed';\nimport { AVAILABLE_FEATURES, ALL_FEATURE_VALUES } from './defaults';\n\nexport const getSupportedClients = async (): Promise<MCPClient[]> => {\n const allClients = [\n new CursorMCPClient(),\n new ClaudeMCPClient(),\n new ClaudeCodeMCPClient(),\n new VisualStudioCodeClient(),\n new ZedClient(),\n ];\n const supportedClients: MCPClient[] = [];\n\n for (const client of allClients) {\n if (await client.isClientSupported()) {\n supportedClients.push(client);\n }\n }\n\n return supportedClients;\n};\n\nexport const addMCPServerToClientsStep = async ({\n integration,\n cloudRegion,\n askPermission = true,\n local = false,\n}: {\n integration?: Integration;\n cloudRegion?: CloudRegion;\n askPermission?: boolean;\n local?: boolean;\n}): Promise<string[]> => {\n const region = cloudRegion ?? (await askForCloudRegion());\n\n const hasPermission = askPermission\n ? await abortIfCancelled(\n clack.select({\n message: local\n ? 'Would you like to install the local development MCP server?'\n : 'Would you like to install the MCP server to use PostHog in your editor?',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ],\n }),\n integration,\n )\n : true;\n\n if (!hasPermission) {\n return [];\n }\n\n const { groupMultiselect } = await import('@clack/prompts');\n const selectedFeatures = await abortIfCancelled(\n groupMultiselect({\n message: `Select which PostHog features to enable as tools: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: AVAILABLE_FEATURES,\n initialValues: [...ALL_FEATURE_VALUES],\n required: false,\n }),\n integration,\n );\n\n const supportedClients = await getSupportedClients();\n\n const { multiselect } = await import('@clack/prompts');\n const selectedClientNames = await abortIfCancelled(\n multiselect({\n message: `Select which MCP clients to install the MCP server to: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: supportedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: supportedClients.map((client) => client.name),\n required: true,\n }),\n integration,\n );\n\n const clients = supportedClients.filter((client) =>\n selectedClientNames.includes(client.name),\n );\n\n const installedClients = await getInstalledClients(local);\n\n if (installedClients.length > 0) {\n clack.log.warn(\n `The MCP server is already configured for:\n ${installedClients.map((c) => `- ${c.name}`).join('\\n ')}`,\n );\n\n const reinstall = await abortIfCancelled(\n clack.select({\n message: 'Would you like to reinstall it?',\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Reinstall the MCP server',\n },\n {\n value: false,\n label: 'No',\n hint: 'Keep the existing installation',\n },\n ],\n }),\n integration,\n );\n\n if (!reinstall) {\n analytics.capture('wizard interaction', {\n action: 'declined to reinstall mcp servers',\n clients: installedClients.map((c) => c.name),\n integration,\n });\n\n return [];\n }\n\n await removeMCPServer(installedClients, local);\n clack.log.info('Removed existing installation.');\n }\n\n const personalApiKey = await getPersonalApiKey({ cloudRegion: region });\n\n await traceStep('adding mcp servers', async () => {\n await addMCPServer(clients, personalApiKey, selectedFeatures, local);\n });\n\n clack.log.success(\n `Added the MCP server to:\n ${clients.map((c) => `- ${c.name}`).join('\\n ')} `,\n );\n\n analytics.capture('wizard interaction', {\n action: 'added mcp servers',\n clients: clients.map((c) => c.name),\n integration,\n });\n\n return clients.map((c) => c.name);\n};\n\nexport const removeMCPServerFromClientsStep = async ({\n integration,\n local = false,\n}: {\n integration?: Integration;\n local?: boolean;\n}): Promise<string[]> => {\n const installedClients = await getInstalledClients(local);\n if (installedClients.length === 0) {\n analytics.capture('wizard interaction', {\n action: 'no mcp servers to remove',\n integration,\n });\n return [];\n }\n\n const { multiselect } = await import('@clack/prompts');\n const selectedClientNames = await abortIfCancelled(\n multiselect({\n message: `Select which clients to remove the MCP server from: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: installedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: installedClients.map((client) => client.name),\n }),\n integration,\n );\n\n const clientsToRemove = installedClients.filter((client) =>\n selectedClientNames.includes(client.name),\n );\n\n if (clientsToRemove.length === 0) {\n analytics.capture('wizard interaction', {\n action: 'no mcp servers selected for removal',\n integration,\n });\n return [];\n }\n\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(clientsToRemove, local);\n return clientsToRemove.map((c) => c.name);\n });\n\n analytics.capture('wizard interaction', {\n action: 'removed mcp servers',\n clients: results,\n integration,\n });\n\n return results;\n};\n\nexport const getInstalledClients = async (\n local?: boolean,\n): Promise<MCPClient[]> => {\n const clients = await getSupportedClients();\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled(local)) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey, selectedFeatures, local);\n }\n};\n\nexport const removeMCPServer = async (\n clients: MCPClient[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.removeServer(local);\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Integration } from '../../lib/constants';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport clack from '../../utils/clack';\nimport chalk from 'chalk';\nimport { abortIfCancelled, askForCloudRegion } from '../../utils/clack-utils';\nimport { MCPClient } from './MCPClient';\nimport { CursorMCPClient } from './clients/cursor';\nimport { ClaudeMCPClient } from './clients/claude';\nimport { getPersonalApiKey } from '../../mcp';\nimport type { CloudRegion } from '../../utils/types';\nimport { ClaudeCodeMCPClient } from './clients/claude-code';\nimport { VisualStudioCodeClient } from './clients/visual-studio-code';\nimport { ZedClient } from './clients/zed';\nimport { CodexMCPClient } from './clients/codex';\nimport { AVAILABLE_FEATURES, ALL_FEATURE_VALUES } from './defaults';\nimport { debug } from '../../utils/debug';\n\nexport const getSupportedClients = async (): Promise<MCPClient[]> => {\n const allClients = [\n new CursorMCPClient(),\n new ClaudeMCPClient(),\n new ClaudeCodeMCPClient(),\n new VisualStudioCodeClient(),\n new ZedClient(),\n new CodexMCPClient(),\n ];\n const supportedClients: MCPClient[] = [];\n\n debug('Checking for supported MCP clients...');\n for (const client of allClients) {\n const isSupported = await client.isClientSupported();\n debug(`${client.name}: ${isSupported ? '✓ supported' : '✗ not supported'}`);\n if (isSupported) {\n supportedClients.push(client);\n }\n }\n debug(\n `Found ${supportedClients.length} supported client(s): ${supportedClients\n .map((c) => c.name)\n .join(', ')}`,\n );\n\n return supportedClients;\n};\n\nexport const addMCPServerToClientsStep = async ({\n integration,\n cloudRegion,\n askPermission = true,\n local = false,\n}: {\n integration?: Integration;\n cloudRegion?: CloudRegion;\n askPermission?: boolean;\n local?: boolean;\n}): Promise<string[]> => {\n const region = cloudRegion ?? (await askForCloudRegion());\n\n const hasPermission = askPermission\n ? await abortIfCancelled(\n clack.select({\n message: local\n ? 'Would you like to install the local development MCP server?'\n : 'Would you like to install the MCP server to use PostHog in your editor?',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ],\n }),\n integration,\n )\n : true;\n\n if (!hasPermission) {\n return [];\n }\n\n const { groupMultiselect } = await import('@clack/prompts');\n const selectedFeatures = await abortIfCancelled(\n groupMultiselect({\n message: `Select which PostHog features to enable as tools: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: AVAILABLE_FEATURES,\n initialValues: [...ALL_FEATURE_VALUES],\n required: false,\n }),\n integration,\n );\n\n const supportedClients = await getSupportedClients();\n\n const { multiselect } = await import('@clack/prompts');\n const selectedClientNames = await abortIfCancelled(\n multiselect({\n message: `Select which MCP clients to install the MCP server to: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: supportedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: supportedClients.map((client) => client.name),\n required: true,\n }),\n integration,\n );\n\n const clients = supportedClients.filter((client) =>\n selectedClientNames.includes(client.name),\n );\n\n // Only check for existing installations in the clients the user selected\n const installedClients = [];\n for (const client of clients) {\n if (await client.isServerInstalled(local)) {\n installedClients.push(client);\n }\n }\n\n if (installedClients.length > 0) {\n clack.log.warn(\n `The MCP server is already configured for:\n ${installedClients.map((c) => `- ${c.name}`).join('\\n ')}`,\n );\n\n const reinstall = await abortIfCancelled(\n clack.select({\n message: 'Would you like to reinstall it?',\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Reinstall the MCP server',\n },\n {\n value: false,\n label: 'No',\n hint: 'Keep the existing installation',\n },\n ],\n }),\n integration,\n );\n\n if (!reinstall) {\n analytics.capture('wizard interaction', {\n action: 'declined to reinstall mcp servers',\n clients: installedClients.map((c) => c.name),\n integration,\n });\n\n return [];\n }\n\n await removeMCPServer(installedClients, local);\n clack.log.info('Removed existing installation.');\n }\n\n const personalApiKey = await getPersonalApiKey({ cloudRegion: region });\n\n await traceStep('adding mcp servers', async () => {\n await addMCPServer(clients, personalApiKey, selectedFeatures, local);\n });\n\n clack.log.success(\n `Added the MCP server to:\n ${clients.map((c) => `- ${c.name}`).join('\\n ')} `,\n );\n\n analytics.capture('wizard interaction', {\n action: 'added mcp servers',\n clients: clients.map((c) => c.name),\n integration,\n });\n\n return clients.map((c) => c.name);\n};\n\nexport const removeMCPServerFromClientsStep = async ({\n integration,\n local = false,\n}: {\n integration?: Integration;\n local?: boolean;\n}): Promise<string[]> => {\n const installedClients = await getInstalledClients(local);\n if (installedClients.length === 0) {\n analytics.capture('wizard interaction', {\n action: 'no mcp servers to remove',\n integration,\n });\n return [];\n }\n\n const { multiselect } = await import('@clack/prompts');\n const selectedClientNames = await abortIfCancelled(\n multiselect({\n message: `Select which clients to remove the MCP server from: ${chalk.dim(\n '(Toggle: Space, Confirm: Enter, Toggle All: A, Cancel: CTRL + C)',\n )}`,\n options: installedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: installedClients.map((client) => client.name),\n }),\n integration,\n );\n\n const clientsToRemove = installedClients.filter((client) =>\n selectedClientNames.includes(client.name),\n );\n\n if (clientsToRemove.length === 0) {\n analytics.capture('wizard interaction', {\n action: 'no mcp servers selected for removal',\n integration,\n });\n return [];\n }\n\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(clientsToRemove, local);\n return clientsToRemove.map((c) => c.name);\n });\n\n analytics.capture('wizard interaction', {\n action: 'removed mcp servers',\n clients: results,\n integration,\n });\n\n return results;\n};\n\nexport const getInstalledClients = async (\n local?: boolean,\n): Promise<MCPClient[]> => {\n const clients = await getSupportedClients();\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled(local)) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey: string,\n selectedFeatures?: string[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey, selectedFeatures, local);\n }\n};\n\nexport const removeMCPServer = async (\n clients: MCPClient[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.removeServer(local);\n }\n};\n"]}
|
package/package.json
CHANGED