@danainnovations/cortex-mcp 1.0.86 → 1.0.88
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/browser-AJPM6AK7.js +8 -0
- package/dist/{chunk-D4PD3E6J.js → chunk-3X6WPEWI.js} +10 -1
- package/dist/{chunk-D4PD3E6J.js.map → chunk-3X6WPEWI.js.map} +1 -1
- package/dist/{chunk-HXROEPYY.js → chunk-BAM6HEKA.js} +10 -2
- package/dist/chunk-BAM6HEKA.js.map +1 -0
- package/dist/cli.js +143 -37
- package/dist/cli.js.map +1 -1
- package/dist/{constants-QSLA3TAZ.js → constants-76SAPZ3D.js} +6 -4
- package/dist/index.d.ts +6 -6
- package/dist/index.js +85 -26
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/browser-RCYYNQJN.js +0 -8
- package/dist/chunk-HXROEPYY.js.map +0 -1
- /package/dist/{browser-RCYYNQJN.js.map → browser-AJPM6AK7.js.map} +0 -0
- /package/dist/{constants-QSLA3TAZ.js.map → constants-76SAPZ3D.js.map} +0 -0
|
@@ -97,6 +97,14 @@ var AVAILABLE_MCPS = [
|
|
|
97
97
|
authMode: "personal"
|
|
98
98
|
}
|
|
99
99
|
];
|
|
100
|
+
var SONANCE_BRAND_CONFIG = {
|
|
101
|
+
name: "sonance-brand",
|
|
102
|
+
displayName: "Sonance Brand",
|
|
103
|
+
description: "Brand guidelines, design tokens, component library, logos (28 tools)",
|
|
104
|
+
serverName: "sonance-brand",
|
|
105
|
+
command: "npx",
|
|
106
|
+
args: ["-y", "sonance-brand-mcp@latest"]
|
|
107
|
+
};
|
|
100
108
|
var MCP_NAMES = AVAILABLE_MCPS.map((m) => m.name);
|
|
101
109
|
var DEFAULT_MCPS = [...MCP_NAMES];
|
|
102
110
|
var DEFAULT_API_KEY = "ctx_07d37a81_9f7be06af38d04753090a4034f907a65ec06cd675ed26f65653898388e2d1709";
|
|
@@ -108,6 +116,7 @@ export {
|
|
|
108
116
|
DEFAULT_SERVER_URL,
|
|
109
117
|
PROTOCOL_VERSION,
|
|
110
118
|
AVAILABLE_MCPS,
|
|
119
|
+
SONANCE_BRAND_CONFIG,
|
|
111
120
|
MCP_NAMES,
|
|
112
121
|
DEFAULT_MCPS,
|
|
113
122
|
DEFAULT_API_KEY,
|
|
@@ -115,4 +124,4 @@ export {
|
|
|
115
124
|
CONFIG_FILE_NAME,
|
|
116
125
|
CREDENTIALS_FILE_NAME
|
|
117
126
|
};
|
|
118
|
-
//# sourceMappingURL=chunk-
|
|
127
|
+
//# sourceMappingURL=chunk-3X6WPEWI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts"],"sourcesContent":["/** Default Cortex server URL */\nexport const DEFAULT_SERVER_URL = \"https://cortex-bice.vercel.app\";\n\n/** MCP protocol version supported by Cortex (Streamable HTTP) */\nexport const PROTOCOL_VERSION = \"2025-03-26\";\n\n/** Available MCPs with their metadata */\nexport const AVAILABLE_MCPS = [\n {\n name: \"m365\",\n displayName: \"Microsoft 365\",\n description: \"Email, calendar, OneDrive, Teams, meetings, contacts, tasks, notes (33 tools)\",\n serverName: \"cortex-m365\",\n authMode: \"personal\" as const,\n },\n {\n name: \"asana\",\n displayName: \"Asana\",\n description: \"Projects, tasks, teams, workspaces (17 tools)\",\n serverName: \"cortex-asana\",\n authMode: \"personal\" as const,\n },\n {\n name: \"github\",\n displayName: \"GitHub\",\n description: \"Repos, PRs, issues, branches, code review (30 tools)\",\n serverName: \"cortex-github\",\n authMode: \"company\" as const,\n },\n {\n name: \"vercel\",\n displayName: \"Vercel\",\n description: \"Deployments, projects, env vars (15 tools)\",\n serverName: \"cortex-vercel\",\n authMode: \"company\" as const,\n },\n {\n name: \"supabase\",\n displayName: \"Supabase\",\n description: \"Database, migrations, edge functions (20+ tools)\",\n serverName: \"cortex-supabase\",\n authMode: \"company\" as const,\n },\n {\n name: \"bestbuy\",\n displayName: \"Best Buy\",\n description: \"Product search, pricing, reviews, store locations (7 tools)\",\n serverName: \"cortex-bestbuy\",\n authMode: \"company\" as const,\n },\n {\n name: \"mailchimp\",\n displayName: \"Mailchimp\",\n description: \"Audiences, contacts, campaigns, templates, analytics (28 tools)\",\n serverName: \"cortex-mailchimp\",\n authMode: \"personal\" as const,\n },\n {\n name: \"salesforce\",\n displayName: \"Salesforce\",\n description: \"CRM queries, records, reports, and org data (14 tools)\",\n serverName: \"cortex-salesforce\",\n authMode: \"personal\" as const,\n },\n {\n name: \"monday\",\n displayName: \"Monday.com\",\n description: \"Boards, items, groups, updates, workspaces (18 tools)\",\n serverName: \"cortex-monday\",\n authMode: \"personal\" as const,\n installUrl: \"https://auth.monday.com/oauth2/authorize?client_id=c8d2c70bd792a4c36c6f023c0b707517&response_type=install\",\n },\n {\n name: \"slack\",\n displayName: \"Slack\",\n description: \"Messaging, channels, search, reactions, bookmarks (22 tools)\",\n serverName: \"cortex-slack\",\n authMode: \"personal\" as const,\n },\n {\n name: \"powerbi\",\n displayName: \"Power BI\",\n description: \"Workspaces, datasets, push data, DAX queries, reports, dashboards (14 tools)\",\n serverName: \"cortex-powerbi\",\n authMode: \"personal\" as const,\n },\n {\n name: \"databricks\",\n displayName: \"Databricks\",\n description: \"Unity Catalog discovery, SQL queries, data dictionary, jobs (18 tools)\",\n serverName: \"cortex-databricks\",\n authMode: \"company\" as const,\n },\n {\n name: \"concur\",\n displayName: \"SAP Concur\",\n description: \"Expense reports, entries, receipts, approvals (16 tools)\",\n serverName: \"cortex-concur\",\n authMode: \"personal\" as const,\n },\n] as const;\n\n/** All available MCP names */\nexport const MCP_NAMES: string[] = AVAILABLE_MCPS.map((m) => m.name);\n\n/** Default MCPs enabled on fresh setup */\nexport const DEFAULT_MCPS: string[] = [...MCP_NAMES];\n\n/** Shared API key embedded in the package (no user prompt needed) */\nexport const DEFAULT_API_KEY =\n \"ctx_07d37a81_9f7be06af38d04753090a4034f907a65ec06cd675ed26f65653898388e2d1709\";\n\n/** Config directory name */\nexport const CONFIG_DIR_NAME = \".cortex-mcp\";\n\n/** Config file name */\nexport const CONFIG_FILE_NAME = \"config.json\";\n\n/** Credentials file name (stores personal API key from login) */\nexport const CREDENTIALS_FILE_NAME = \"credentials.json\";\n"],"mappings":";;;AACO,IAAM,qBAAqB;AAG3B,IAAM,mBAAmB;AAGzB,IAAM,iBAAiB;AAAA,EAC5B;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AACF;AAGO,IAAM,YAAsB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAG5D,IAAM,eAAyB,CAAC,GAAG,SAAS;AAG5C,IAAM,kBACX;AAGK,IAAM,kBAAkB;AAGxB,IAAM,mBAAmB;AAGzB,IAAM,wBAAwB;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"sourcesContent":["/** Default Cortex server URL */\nexport const DEFAULT_SERVER_URL = \"https://cortex-bice.vercel.app\";\n\n/** MCP protocol version supported by Cortex (Streamable HTTP) */\nexport const PROTOCOL_VERSION = \"2025-03-26\";\n\n/** Available MCPs with their metadata */\nexport const AVAILABLE_MCPS = [\n {\n name: \"m365\",\n displayName: \"Microsoft 365\",\n description: \"Email, calendar, OneDrive, Teams, meetings, contacts, tasks, notes (33 tools)\",\n serverName: \"cortex-m365\",\n authMode: \"personal\" as const,\n },\n {\n name: \"asana\",\n displayName: \"Asana\",\n description: \"Projects, tasks, teams, workspaces (17 tools)\",\n serverName: \"cortex-asana\",\n authMode: \"personal\" as const,\n },\n {\n name: \"github\",\n displayName: \"GitHub\",\n description: \"Repos, PRs, issues, branches, code review (30 tools)\",\n serverName: \"cortex-github\",\n authMode: \"company\" as const,\n },\n {\n name: \"vercel\",\n displayName: \"Vercel\",\n description: \"Deployments, projects, env vars (15 tools)\",\n serverName: \"cortex-vercel\",\n authMode: \"company\" as const,\n },\n {\n name: \"supabase\",\n displayName: \"Supabase\",\n description: \"Database, migrations, edge functions (20+ tools)\",\n serverName: \"cortex-supabase\",\n authMode: \"company\" as const,\n },\n {\n name: \"bestbuy\",\n displayName: \"Best Buy\",\n description: \"Product search, pricing, reviews, store locations (7 tools)\",\n serverName: \"cortex-bestbuy\",\n authMode: \"company\" as const,\n },\n {\n name: \"mailchimp\",\n displayName: \"Mailchimp\",\n description: \"Audiences, contacts, campaigns, templates, analytics (28 tools)\",\n serverName: \"cortex-mailchimp\",\n authMode: \"personal\" as const,\n },\n {\n name: \"salesforce\",\n displayName: \"Salesforce\",\n description: \"CRM queries, records, reports, and org data (14 tools)\",\n serverName: \"cortex-salesforce\",\n authMode: \"personal\" as const,\n },\n {\n name: \"monday\",\n displayName: \"Monday.com\",\n description: \"Boards, items, groups, updates, workspaces (18 tools)\",\n serverName: \"cortex-monday\",\n authMode: \"personal\" as const,\n installUrl: \"https://auth.monday.com/oauth2/authorize?client_id=c8d2c70bd792a4c36c6f023c0b707517&response_type=install\",\n },\n {\n name: \"slack\",\n displayName: \"Slack\",\n description: \"Messaging, channels, search, reactions, bookmarks (22 tools)\",\n serverName: \"cortex-slack\",\n authMode: \"personal\" as const,\n },\n {\n name: \"powerbi\",\n displayName: \"Power BI\",\n description: \"Workspaces, datasets, push data, DAX queries, reports, dashboards (14 tools)\",\n serverName: \"cortex-powerbi\",\n authMode: \"personal\" as const,\n },\n {\n name: \"databricks\",\n displayName: \"Databricks\",\n description: \"Unity Catalog discovery, SQL queries, data dictionary, jobs (18 tools)\",\n serverName: \"cortex-databricks\",\n authMode: \"company\" as const,\n },\n {\n name: \"concur\",\n displayName: \"SAP Concur\",\n description: \"Expense reports, entries, receipts, approvals (16 tools)\",\n serverName: \"cortex-concur\",\n authMode: \"personal\" as const,\n },\n] as const;\n\n/** Sonance Brand MCP — standalone stdio server, not proxied through Cortex */\nexport const SONANCE_BRAND_CONFIG = {\n name: \"sonance-brand\",\n displayName: \"Sonance Brand\",\n description: \"Brand guidelines, design tokens, component library, logos (28 tools)\",\n serverName: \"sonance-brand\",\n command: \"npx\",\n args: [\"-y\", \"sonance-brand-mcp@latest\"],\n} as const;\n\n/** All available MCP names */\nexport const MCP_NAMES: string[] = AVAILABLE_MCPS.map((m) => m.name);\n\n/** Default MCPs enabled on fresh setup */\nexport const DEFAULT_MCPS: string[] = [...MCP_NAMES];\n\n/** Shared API key embedded in the package (no user prompt needed) */\nexport const DEFAULT_API_KEY =\n \"ctx_07d37a81_9f7be06af38d04753090a4034f907a65ec06cd675ed26f65653898388e2d1709\";\n\n/** Config directory name */\nexport const CONFIG_DIR_NAME = \".cortex-mcp\";\n\n/** Config file name */\nexport const CONFIG_FILE_NAME = \"config.json\";\n\n/** Credentials file name (stores personal API key from login) */\nexport const CREDENTIALS_FILE_NAME = \"credentials.json\";\n"],"mappings":";;;AACO,IAAM,qBAAqB;AAG3B,IAAM,mBAAmB;AAGzB,IAAM,iBAAiB;AAAA,EAC5B;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AACF;AAGO,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM,CAAC,MAAM,0BAA0B;AACzC;AAGO,IAAM,YAAsB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAG5D,IAAM,eAAyB,CAAC,GAAG,SAAS;AAG5C,IAAM,kBACX;AAGK,IAAM,kBAAkB;AAGxB,IAAM,mBAAmB;AAGzB,IAAM,wBAAwB;","names":[]}
|
|
@@ -122,7 +122,15 @@ function openBrowser(url) {
|
|
|
122
122
|
return new Promise((resolve) => {
|
|
123
123
|
const platform2 = getPlatform();
|
|
124
124
|
const cmd = platform2 === "macos" ? `open "${url}"` : platform2 === "windows" ? `start "" "${url}"` : `xdg-open "${url}"`;
|
|
125
|
-
exec(cmd, () =>
|
|
125
|
+
exec(cmd, (err) => {
|
|
126
|
+
if (err) {
|
|
127
|
+
process.stderr.write(` Could not open browser automatically.
|
|
128
|
+
`);
|
|
129
|
+
process.stderr.write(` Please visit: ${url}
|
|
130
|
+
`);
|
|
131
|
+
}
|
|
132
|
+
resolve();
|
|
133
|
+
});
|
|
126
134
|
});
|
|
127
135
|
}
|
|
128
136
|
|
|
@@ -139,4 +147,4 @@ export {
|
|
|
139
147
|
getCodexConfigPath,
|
|
140
148
|
openBrowser
|
|
141
149
|
};
|
|
142
|
-
//# sourceMappingURL=chunk-
|
|
150
|
+
//# sourceMappingURL=chunk-BAM6HEKA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/browser.ts","../src/utils/platform.ts"],"sourcesContent":["import { exec } from \"node:child_process\";\nimport { getPlatform } from \"./platform.js\";\n\nexport function openBrowser(url: string): Promise<void> {\n return new Promise((resolve) => {\n const platform = getPlatform();\n const cmd =\n platform === \"macos\" ? `open \"${url}\"` :\n platform === \"windows\" ? `start \"\" \"${url}\"` :\n `xdg-open \"${url}\"`;\n exec(cmd, (err) => {\n if (err) {\n process.stderr.write(` Could not open browser automatically.\\n`);\n process.stderr.write(` Please visit: ${url}\\n`);\n }\n resolve();\n });\n });\n}\n","import { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync, readdirSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\n\n/** Get the user's home directory */\nexport function getHomeDir(): string {\n return homedir();\n}\n\n/** Get the current platform */\nexport function getPlatform(): \"macos\" | \"windows\" | \"linux\" {\n const p = platform();\n if (p === \"darwin\") return \"macos\";\n if (p === \"win32\") return \"windows\";\n return \"linux\";\n}\n\n/** Detect if running inside Windows Subsystem for Linux */\nexport function isWSL(): boolean {\n if (getPlatform() !== \"linux\") return false;\n try {\n const version = readFileSync(\"/proc/version\", \"utf-8\");\n return /microsoft|wsl/i.test(version);\n } catch {\n return false;\n }\n}\n\n/** Resolve the Windows user home directory from within WSL via /mnt/c */\nfunction getWindowsHomeFromWSL(): string | null {\n try {\n // Try cmd.exe to get the Windows USERNAME\n const raw = execSync(\"cmd.exe /c echo %USERNAME%\", {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n }).toString().trim().replace(/\\r/g, \"\");\n if (raw && raw !== \"%USERNAME%\") {\n return `/mnt/c/Users/${raw}`;\n }\n } catch {\n // cmd.exe may not be available — fall through\n }\n\n try {\n // Fallback: scan /mnt/c/Users for a single non-system user directory\n const dirs = readdirSync(\"/mnt/c/Users\").filter(\n (d) =>\n d !== \"Public\" &&\n d !== \"Default\" &&\n d !== \"Default User\" &&\n d !== \"All Users\" &&\n !d.startsWith(\".\")\n );\n if (dirs.length === 1) return `/mnt/c/Users/${dirs[0]}`;\n } catch {\n // /mnt/c not mounted\n }\n\n return null;\n}\n\n/**\n * Detect Microsoft Store Claude Desktop install path.\n * Store apps use a virtualized filesystem under LocalCache\\Roaming.\n */\nexport function getStoreClaudePath(): string | null {\n try {\n const localAppData = process.env.LOCALAPPDATA || join(homedir(), \"AppData\", \"Local\");\n const packagesDir = join(localAppData, \"Packages\");\n const dirs = readdirSync(packagesDir).filter((d) => d.startsWith(\"Claude_\"));\n if (dirs.length > 0) {\n return join(\n packagesDir,\n dirs[0],\n \"LocalCache\",\n \"Roaming\",\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n }\n } catch {\n // Not a Store install or can't read Packages dir\n }\n return null;\n}\n\n/**\n * Get the standard (non-Store) Claude Desktop config path on Windows.\n */\nexport function getStandardClaudeDesktopPath(): string {\n const home = homedir();\n return join(\n process.env.APPDATA || join(home, \"AppData\", \"Roaming\"),\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n}\n\n/**\n * Get the Claude Desktop config file path for the current platform.\n * On Windows, prefers the Microsoft Store virtualized path if detected.\n */\nexport function getClaudeDesktopConfigPath(): string {\n const home = getHomeDir();\n const p = getPlatform();\n\n // WSL: Claude Desktop is a Windows app — write to the Windows AppData path\n if (p === \"linux\" && isWSL()) {\n const winHome = getWindowsHomeFromWSL();\n if (winHome) {\n return join(winHome, \"AppData\", \"Roaming\", \"Claude\", \"claude_desktop_config.json\");\n }\n }\n\n switch (p) {\n case \"macos\":\n return join(\n home,\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n case \"windows\": {\n // Prefer Microsoft Store path if installed (virtualized filesystem)\n const storePath = getStoreClaudePath();\n if (storePath) return storePath;\n return getStandardClaudeDesktopPath();\n }\n case \"linux\":\n return join(home, \".config\", \"Claude\", \"claude_desktop_config.json\");\n }\n}\n\n/**\n * Get the Cursor MCP config file path for the current platform.\n */\nexport function getCursorConfigPath(): string {\n const home = getHomeDir();\n return join(home, \".cursor\", \"mcp.json\");\n}\n\n/**\n * Get the VS Code MCP config file path for the current platform.\n */\nexport function getVSCodeMcpConfigPath(): string {\n const home = getHomeDir();\n return join(home, \".vscode\", \"mcp.json\");\n}\n\n/**\n * Get the Antigravity MCP config file path for the current platform.\n */\nexport function getAntigravityConfigPath(): string {\n const home = getHomeDir();\n return join(home, \".gemini\", \"antigravity\", \"mcp_config.json\");\n}\n\n/**\n * Get the Codex (OpenAI) config file path.\n * Shared by both Codex CLI and Codex IDE extension.\n */\nexport function getCodexConfigPath(): string {\n const home = getHomeDir();\n return join(home, \".codex\", \"config.toml\");\n}\n"],"mappings":"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","names":["platform"]}
|
package/dist/cli.js
CHANGED
|
@@ -8,8 +8,9 @@ import {
|
|
|
8
8
|
DEFAULT_MCPS,
|
|
9
9
|
DEFAULT_SERVER_URL,
|
|
10
10
|
MCP_NAMES,
|
|
11
|
-
PROTOCOL_VERSION
|
|
12
|
-
|
|
11
|
+
PROTOCOL_VERSION,
|
|
12
|
+
SONANCE_BRAND_CONFIG
|
|
13
|
+
} from "./chunk-3X6WPEWI.js";
|
|
13
14
|
import {
|
|
14
15
|
getAntigravityConfigPath,
|
|
15
16
|
getClaudeDesktopConfigPath,
|
|
@@ -22,7 +23,7 @@ import {
|
|
|
22
23
|
getVSCodeMcpConfigPath,
|
|
23
24
|
isWSL,
|
|
24
25
|
openBrowser
|
|
25
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-BAM6HEKA.js";
|
|
26
27
|
|
|
27
28
|
// bin/cli.ts
|
|
28
29
|
import { Command } from "commander";
|
|
@@ -877,6 +878,7 @@ function getWizardHtml() {
|
|
|
877
878
|
powerbi: '<svg viewBox="0 0 16 16"><rect x="2" y="8" width="3" height="6" rx="1"/><rect x="6.5" y="5" width="3" height="9" rx="1"/><rect x="11" y="2" width="3" height="12" rx="1"/></svg>',
|
|
878
879
|
bestbuy: '<svg viewBox="0 0 16 16"><path d="M2 3h12a1 1 0 011 1v8a1 1 0 01-1 1H2a1 1 0 01-1-1V4a1 1 0 011-1zm3 3v4h2V6H5zm4 0v4h2V6H9z"/></svg>',
|
|
879
880
|
mailchimp: '<svg viewBox="0 0 16 16"><path d="M8 2a6 6 0 100 12A6 6 0 008 2zM6.5 10.5a1.5 1.5 0 110-3 1.5 1.5 0 010 3zm3 0a1.5 1.5 0 110-3 1.5 1.5 0 010 3z"/></svg>',
|
|
881
|
+
'sonance-brand': '<svg viewBox="0 0 16 16"><path d="M2 3a1 1 0 011-1h2a1 1 0 011 1v10a1 1 0 01-1 1H3a1 1 0 01-1-1V3zm5 2a1 1 0 011-1h2a1 1 0 011 1v8a1 1 0 01-1 1H8a1 1 0 01-1-1V5zm5-3a1 1 0 011-1h1a1 1 0 011 1v11a1 1 0 01-1 1h-1a1 1 0 01-1-1V2z"/></svg>',
|
|
880
882
|
};
|
|
881
883
|
|
|
882
884
|
// \u2500\u2500 Client Icons (inline SVG) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
@@ -900,6 +902,8 @@ function getWizardHtml() {
|
|
|
900
902
|
state.availableMcps = data.availableMcps || [];
|
|
901
903
|
state.enabledMcps = data.enabledMcps || ['m365'];
|
|
902
904
|
state.selectedMcps = (data.enabledMcps || ['m365']).slice();
|
|
905
|
+
state.sonanceBrand = data.sonanceBrand || null;
|
|
906
|
+
state.includeSonanceBrand = true;
|
|
903
907
|
state.detectedClients = data.detectedClients || [];
|
|
904
908
|
state.configuredClients = (data.config && data.config.configuredClients) || [];
|
|
905
909
|
} catch (err) {
|
|
@@ -1066,6 +1070,7 @@ function getWizardHtml() {
|
|
|
1066
1070
|
powerbi: 'Build dashboards and run data queries on your reports',
|
|
1067
1071
|
bestbuy: 'Search products, compare prices, and find store locations',
|
|
1068
1072
|
databricks: 'Query data warehouses, explore Unity Catalog, and manage jobs',
|
|
1073
|
+
'sonance-brand': 'Brand guidelines, design tokens, component library, and logo assets for Sonance, IPORT, and Blaze Audio',
|
|
1069
1074
|
};
|
|
1070
1075
|
|
|
1071
1076
|
function renderMcpList(container) {
|
|
@@ -1098,6 +1103,28 @@ function getWizardHtml() {
|
|
|
1098
1103
|
html += '</div></div>';
|
|
1099
1104
|
}
|
|
1100
1105
|
|
|
1106
|
+
// Sonance Brand \u2014 internal design system MCP (always available)
|
|
1107
|
+
if (state.sonanceBrand) {
|
|
1108
|
+
var sbChecked = state.includeSonanceBrand !== false;
|
|
1109
|
+
html += '<div class="mcp-section">';
|
|
1110
|
+
html += '<div class="mcp-section-title">Internal Tools</div>';
|
|
1111
|
+
html += '<div class="mcp-section-subtitle">Standalone tools bundled with setup</div>';
|
|
1112
|
+
html += '<div class="mcp-list">';
|
|
1113
|
+
html += '<label class="mcp-item' + (sbChecked ? ' checked' : '') + '" data-mcp="sonance-brand">' +
|
|
1114
|
+
(MCP_TOOLTIPS['sonance-brand'] ? '<span class="mcp-tooltip">' + MCP_TOOLTIPS['sonance-brand'] + '</span>' : '') +
|
|
1115
|
+
'<input type="checkbox" value="sonance-brand"' + (sbChecked ? ' checked' : '') + '>' +
|
|
1116
|
+
(MCP_ICONS['sonance-brand'] ? '<div class="mcp-icon">' + MCP_ICONS['sonance-brand'] + '</div>' : '') +
|
|
1117
|
+
'<div class="mcp-check"><span class="mcp-check-icon">✓</span></div>' +
|
|
1118
|
+
'<div class="mcp-info">' +
|
|
1119
|
+
'<span class="mcp-name">' + escapeHtml(state.sonanceBrand.displayName) +
|
|
1120
|
+
'<span class="mcp-badge company">internal</span>' +
|
|
1121
|
+
'</span>' +
|
|
1122
|
+
'<span class="mcp-desc">' + escapeHtml(state.sonanceBrand.description) + '</span>' +
|
|
1123
|
+
'</div>' +
|
|
1124
|
+
'</label>';
|
|
1125
|
+
html += '</div></div>';
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1101
1128
|
if (disabledMcps.length > 0) {
|
|
1102
1129
|
html += '<div class="mcp-section">';
|
|
1103
1130
|
html += '<div class="mcp-section-title">Coming Soon</div>';
|
|
@@ -1176,8 +1203,18 @@ function getWizardHtml() {
|
|
|
1176
1203
|
|
|
1177
1204
|
function saveMcps() {
|
|
1178
1205
|
var checkboxes = document.querySelectorAll('.mcp-item:not(.disabled) input[type="checkbox"]');
|
|
1179
|
-
var selected =
|
|
1206
|
+
var selected = [];
|
|
1207
|
+
var includeBrand = false;
|
|
1208
|
+
Array.from(checkboxes).forEach(function(cb) {
|
|
1209
|
+
if (!cb.checked) return;
|
|
1210
|
+
if (cb.value === 'sonance-brand') {
|
|
1211
|
+
includeBrand = true;
|
|
1212
|
+
} else {
|
|
1213
|
+
selected.push(cb.value);
|
|
1214
|
+
}
|
|
1215
|
+
});
|
|
1180
1216
|
state.selectedMcps = selected;
|
|
1217
|
+
state.includeSonanceBrand = includeBrand;
|
|
1181
1218
|
goToStep('clients');
|
|
1182
1219
|
}
|
|
1183
1220
|
|
|
@@ -1228,6 +1265,8 @@ function getWizardHtml() {
|
|
|
1228
1265
|
el.innerHTML = html;
|
|
1229
1266
|
|
|
1230
1267
|
el.querySelectorAll('.client-item:not(.disabled):not(.already-configured)').forEach(function(item) {
|
|
1268
|
+
// Auto-select all detected clients on first setup
|
|
1269
|
+
item.classList.add('checked');
|
|
1231
1270
|
item.addEventListener('click', function(e) {
|
|
1232
1271
|
e.preventDefault();
|
|
1233
1272
|
item.classList.toggle('checked');
|
|
@@ -1235,6 +1274,10 @@ function getWizardHtml() {
|
|
|
1235
1274
|
.map(function(i) { return i.dataset.client; });
|
|
1236
1275
|
});
|
|
1237
1276
|
});
|
|
1277
|
+
|
|
1278
|
+
// Sync selectedClients with all checked items (auto-selected + previously configured)
|
|
1279
|
+
state.selectedClients = Array.from(el.querySelectorAll('.client-item.checked'))
|
|
1280
|
+
.map(function(i) { return i.dataset.client; });
|
|
1238
1281
|
}
|
|
1239
1282
|
|
|
1240
1283
|
async function configureClients() {
|
|
@@ -1260,7 +1303,7 @@ function getWizardHtml() {
|
|
|
1260
1303
|
var resp = await fetch('/api/clients/configure', {
|
|
1261
1304
|
method: 'POST',
|
|
1262
1305
|
headers: { 'Content-Type': 'application/json' },
|
|
1263
|
-
body: JSON.stringify({ clients: state.selectedClients, mcps: state.selectedMcps }),
|
|
1306
|
+
body: JSON.stringify({ clients: state.selectedClients, mcps: state.selectedMcps, includeSonanceBrand: state.includeSonanceBrand !== false }),
|
|
1264
1307
|
});
|
|
1265
1308
|
var data = await resp.json();
|
|
1266
1309
|
|
|
@@ -1553,7 +1596,8 @@ function detectClients() {
|
|
|
1553
1596
|
});
|
|
1554
1597
|
let claudeCodeDetected = false;
|
|
1555
1598
|
try {
|
|
1556
|
-
|
|
1599
|
+
const whichCmd = getPlatform() === "windows" ? "where claude" : "which claude";
|
|
1600
|
+
execSync(whichCmd, { stdio: "pipe" });
|
|
1557
1601
|
claudeCodeDetected = true;
|
|
1558
1602
|
} catch {
|
|
1559
1603
|
}
|
|
@@ -1590,7 +1634,8 @@ function detectClients() {
|
|
|
1590
1634
|
let codexDetected = existsSync(join(home, ".codex"));
|
|
1591
1635
|
if (!codexDetected) {
|
|
1592
1636
|
try {
|
|
1593
|
-
|
|
1637
|
+
const whichCmd = getPlatform() === "windows" ? "where codex" : "which codex";
|
|
1638
|
+
execSync(whichCmd, { stdio: "pipe" });
|
|
1594
1639
|
codexDetected = true;
|
|
1595
1640
|
} catch {
|
|
1596
1641
|
}
|
|
@@ -1616,6 +1661,10 @@ function detectClients() {
|
|
|
1616
1661
|
});
|
|
1617
1662
|
return clients;
|
|
1618
1663
|
}
|
|
1664
|
+
function buildSonanceBrandEntry() {
|
|
1665
|
+
const isWindowsTarget = getPlatform() === "windows" || isWSL();
|
|
1666
|
+
return isWindowsTarget ? { command: "cmd", args: ["/c", ...SONANCE_BRAND_CONFIG.args] } : { command: SONANCE_BRAND_CONFIG.command, args: [...SONANCE_BRAND_CONFIG.args] };
|
|
1667
|
+
}
|
|
1619
1668
|
function buildHttpEntries(serverUrl, apiKey, mcps) {
|
|
1620
1669
|
const entries = {};
|
|
1621
1670
|
for (const mcp of AVAILABLE_MCPS) {
|
|
@@ -1627,13 +1676,21 @@ function buildHttpEntries(serverUrl, apiKey, mcps) {
|
|
|
1627
1676
|
}
|
|
1628
1677
|
return entries;
|
|
1629
1678
|
}
|
|
1630
|
-
function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
|
|
1679
|
+
function configureClaudeDesktop(_serverUrl, apiKey, _mcps, includeSonanceBrand = true) {
|
|
1631
1680
|
const configPath = getClaudeDesktopConfigPath();
|
|
1632
1681
|
const dir = dirname(configPath);
|
|
1633
1682
|
if (!existsSync(dir)) {
|
|
1634
1683
|
mkdirSync(dir, { recursive: true });
|
|
1635
1684
|
}
|
|
1636
1685
|
const isWindowsTarget = getPlatform() === "windows" || isWSL();
|
|
1686
|
+
try {
|
|
1687
|
+
const whichCmd = isWindowsTarget ? "where npx" : "which npx";
|
|
1688
|
+
execSync(whichCmd, { stdio: "pipe" });
|
|
1689
|
+
} catch {
|
|
1690
|
+
throw new Error(
|
|
1691
|
+
"Node.js is required but 'npx' was not found in your system PATH. Please install Node.js from https://nodejs.org and re-run setup."
|
|
1692
|
+
);
|
|
1693
|
+
}
|
|
1637
1694
|
const cortexEntry = isWindowsTarget ? {
|
|
1638
1695
|
command: "cmd",
|
|
1639
1696
|
args: ["/c", "npx", "-y", "@danainnovations/cortex-mcp@latest", "serve"]
|
|
@@ -1655,11 +1712,14 @@ function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
|
|
|
1655
1712
|
}
|
|
1656
1713
|
const servers = config.mcpServers;
|
|
1657
1714
|
for (const key of Object.keys(servers)) {
|
|
1658
|
-
if (key.startsWith("cortex-") || key === "cortex") {
|
|
1715
|
+
if (key.startsWith("cortex-") || key === "cortex" || key === SONANCE_BRAND_CONFIG.name) {
|
|
1659
1716
|
delete servers[key];
|
|
1660
1717
|
}
|
|
1661
1718
|
}
|
|
1662
1719
|
servers["cortex"] = cortexEntry;
|
|
1720
|
+
if (includeSonanceBrand) {
|
|
1721
|
+
servers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
|
|
1722
|
+
}
|
|
1663
1723
|
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
1664
1724
|
if (getPlatform() === "windows") {
|
|
1665
1725
|
const storePath = getStoreClaudePath();
|
|
@@ -1683,9 +1743,12 @@ function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
|
|
|
1683
1743
|
}
|
|
1684
1744
|
const altServers = altConfig.mcpServers;
|
|
1685
1745
|
for (const key of Object.keys(altServers)) {
|
|
1686
|
-
if (key.startsWith("cortex-") || key === "cortex") delete altServers[key];
|
|
1746
|
+
if (key.startsWith("cortex-") || key === "cortex" || key === SONANCE_BRAND_CONFIG.name) delete altServers[key];
|
|
1687
1747
|
}
|
|
1688
1748
|
altServers["cortex"] = cortexEntry;
|
|
1749
|
+
if (includeSonanceBrand) {
|
|
1750
|
+
altServers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
|
|
1751
|
+
}
|
|
1689
1752
|
writeFileSync(altPath, JSON.stringify(altConfig, null, 2) + "\n");
|
|
1690
1753
|
} catch {
|
|
1691
1754
|
}
|
|
@@ -1693,7 +1756,7 @@ function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
|
|
|
1693
1756
|
}
|
|
1694
1757
|
if (isWindowsTarget) {
|
|
1695
1758
|
const start = Date.now();
|
|
1696
|
-
while (Date.now() - start <
|
|
1759
|
+
while (Date.now() - start < 1500) {
|
|
1697
1760
|
}
|
|
1698
1761
|
try {
|
|
1699
1762
|
const verify = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
@@ -1720,7 +1783,7 @@ function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
|
|
|
1720
1783
|
`Failed to write config to ${configPath}. Claude Desktop may be overwriting the file. Please close Claude Desktop completely (quit from the system tray), then re-run setup.`
|
|
1721
1784
|
);
|
|
1722
1785
|
}
|
|
1723
|
-
function configureClaudeCode(serverUrl, apiKey, mcps) {
|
|
1786
|
+
function configureClaudeCode(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
|
|
1724
1787
|
for (const mcp of AVAILABLE_MCPS) {
|
|
1725
1788
|
if (!mcps.includes(mcp.name)) continue;
|
|
1726
1789
|
const url = `${serverUrl}/mcp/${mcp.name}`;
|
|
@@ -1733,8 +1796,18 @@ function configureClaudeCode(serverUrl, apiKey, mcps) {
|
|
|
1733
1796
|
{ stdio: "pipe" }
|
|
1734
1797
|
);
|
|
1735
1798
|
}
|
|
1799
|
+
if (includeSonanceBrand) {
|
|
1800
|
+
try {
|
|
1801
|
+
execSync(`claude mcp remove ${SONANCE_BRAND_CONFIG.name}`, { stdio: "pipe" });
|
|
1802
|
+
} catch {
|
|
1803
|
+
}
|
|
1804
|
+
execSync(
|
|
1805
|
+
`claude mcp add ${SONANCE_BRAND_CONFIG.name} -- ${SONANCE_BRAND_CONFIG.command} ${SONANCE_BRAND_CONFIG.args.join(" ")}`,
|
|
1806
|
+
{ stdio: "pipe" }
|
|
1807
|
+
);
|
|
1808
|
+
}
|
|
1736
1809
|
}
|
|
1737
|
-
function configureCursor(serverUrl, apiKey, mcps) {
|
|
1810
|
+
function configureCursor(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
|
|
1738
1811
|
const configPath = getCursorConfigPath();
|
|
1739
1812
|
const dir = dirname(configPath);
|
|
1740
1813
|
if (!existsSync(dir)) {
|
|
@@ -1752,15 +1825,18 @@ function configureCursor(serverUrl, apiKey, mcps) {
|
|
|
1752
1825
|
}
|
|
1753
1826
|
const servers = config.mcpServers;
|
|
1754
1827
|
for (const key of Object.keys(servers)) {
|
|
1755
|
-
if (key.startsWith("cortex-")) {
|
|
1828
|
+
if (key.startsWith("cortex-") || key === SONANCE_BRAND_CONFIG.name) {
|
|
1756
1829
|
delete servers[key];
|
|
1757
1830
|
}
|
|
1758
1831
|
}
|
|
1759
1832
|
const entries = buildHttpEntries(serverUrl, apiKey, mcps);
|
|
1760
1833
|
Object.assign(servers, entries);
|
|
1834
|
+
if (includeSonanceBrand) {
|
|
1835
|
+
servers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
|
|
1836
|
+
}
|
|
1761
1837
|
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
1762
1838
|
}
|
|
1763
|
-
function configureVSCode(serverUrl, apiKey, mcps) {
|
|
1839
|
+
function configureVSCode(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
|
|
1764
1840
|
const configPath = getVSCodeMcpConfigPath();
|
|
1765
1841
|
const dir = dirname(configPath);
|
|
1766
1842
|
if (!existsSync(dir)) {
|
|
@@ -1778,15 +1854,18 @@ function configureVSCode(serverUrl, apiKey, mcps) {
|
|
|
1778
1854
|
}
|
|
1779
1855
|
const servers = config.mcpServers;
|
|
1780
1856
|
for (const key of Object.keys(servers)) {
|
|
1781
|
-
if (key.startsWith("cortex-")) {
|
|
1857
|
+
if (key.startsWith("cortex-") || key === SONANCE_BRAND_CONFIG.name) {
|
|
1782
1858
|
delete servers[key];
|
|
1783
1859
|
}
|
|
1784
1860
|
}
|
|
1785
1861
|
const entries = buildHttpEntries(serverUrl, apiKey, mcps);
|
|
1786
1862
|
Object.assign(servers, entries);
|
|
1863
|
+
if (includeSonanceBrand) {
|
|
1864
|
+
servers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
|
|
1865
|
+
}
|
|
1787
1866
|
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
1788
1867
|
}
|
|
1789
|
-
function configureAntigravity(serverUrl, apiKey, mcps) {
|
|
1868
|
+
function configureAntigravity(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
|
|
1790
1869
|
const configPath = getAntigravityConfigPath();
|
|
1791
1870
|
const dir = dirname(configPath);
|
|
1792
1871
|
if (!existsSync(dir)) {
|
|
@@ -1804,15 +1883,18 @@ function configureAntigravity(serverUrl, apiKey, mcps) {
|
|
|
1804
1883
|
}
|
|
1805
1884
|
const servers = config.mcpServers;
|
|
1806
1885
|
for (const key of Object.keys(servers)) {
|
|
1807
|
-
if (key.startsWith("cortex-")) {
|
|
1886
|
+
if (key.startsWith("cortex-") || key === SONANCE_BRAND_CONFIG.name) {
|
|
1808
1887
|
delete servers[key];
|
|
1809
1888
|
}
|
|
1810
1889
|
}
|
|
1811
1890
|
const entries = buildHttpEntries(serverUrl, apiKey, mcps);
|
|
1812
1891
|
Object.assign(servers, entries);
|
|
1892
|
+
if (includeSonanceBrand) {
|
|
1893
|
+
servers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
|
|
1894
|
+
}
|
|
1813
1895
|
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
1814
1896
|
}
|
|
1815
|
-
function configureCodex(serverUrl, apiKey, mcps) {
|
|
1897
|
+
function configureCodex(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
|
|
1816
1898
|
const configPath = getCodexConfigPath();
|
|
1817
1899
|
const dir = dirname(configPath);
|
|
1818
1900
|
if (!existsSync(dir)) {
|
|
@@ -1826,7 +1908,7 @@ function configureCodex(serverUrl, apiKey, mcps) {
|
|
|
1826
1908
|
}
|
|
1827
1909
|
}
|
|
1828
1910
|
const cleaned = existingContent.replace(
|
|
1829
|
-
/\[mcp_servers\.cortex-[^\]]
|
|
1911
|
+
/\[mcp_servers\.(?:cortex-[^\]]*|sonance-brand)\][^[]*(?=\[|$)/g,
|
|
1830
1912
|
""
|
|
1831
1913
|
).trim();
|
|
1832
1914
|
const tomlEntries = [];
|
|
@@ -1838,10 +1920,17 @@ url = "${serverUrl}/mcp/${mcp.name}"
|
|
|
1838
1920
|
http_headers = { "x-api-key" = "${apiKey}" }`
|
|
1839
1921
|
);
|
|
1840
1922
|
}
|
|
1923
|
+
if (includeSonanceBrand) {
|
|
1924
|
+
tomlEntries.push(
|
|
1925
|
+
`[mcp_servers.${SONANCE_BRAND_CONFIG.name}]
|
|
1926
|
+
command = "${SONANCE_BRAND_CONFIG.command}"
|
|
1927
|
+
args = [${SONANCE_BRAND_CONFIG.args.map((a) => `"${a}"`).join(", ")}]`
|
|
1928
|
+
);
|
|
1929
|
+
}
|
|
1841
1930
|
const newContent = (cleaned ? cleaned + "\n\n" : "") + tomlEntries.join("\n\n") + "\n";
|
|
1842
1931
|
writeFileSync(configPath, newContent);
|
|
1843
1932
|
}
|
|
1844
|
-
function configurePerplexity(serverUrl, _apiKey, mcps) {
|
|
1933
|
+
function configurePerplexity(serverUrl, _apiKey, mcps, _includeSonanceBrand = true) {
|
|
1845
1934
|
const lines = [
|
|
1846
1935
|
"Add each MCP as a separate connector in Perplexity:",
|
|
1847
1936
|
" Settings \u2192 Connectors \u2192 Add custom connector",
|
|
@@ -1858,9 +1947,11 @@ function configurePerplexity(serverUrl, _apiKey, mcps) {
|
|
|
1858
1947
|
lines.push(` Transport: Streamable HTTP`);
|
|
1859
1948
|
lines.push("");
|
|
1860
1949
|
}
|
|
1950
|
+
lines.push("Note: Sonance Brand MCP requires stdio transport (npx sonance-brand-mcp).");
|
|
1951
|
+
lines.push("Perplexity may not support stdio \u2014 use Claude Desktop or Claude Code for brand tools.");
|
|
1861
1952
|
return lines.join("\n");
|
|
1862
1953
|
}
|
|
1863
|
-
function generateStdioSnippet(_apiKey) {
|
|
1954
|
+
function generateStdioSnippet(_apiKey, includeSonanceBrand = true) {
|
|
1864
1955
|
const isWindowsTarget = getPlatform() === "windows" || isWSL();
|
|
1865
1956
|
const config = {
|
|
1866
1957
|
mcpServers: {
|
|
@@ -1873,6 +1964,9 @@ function generateStdioSnippet(_apiKey) {
|
|
|
1873
1964
|
}
|
|
1874
1965
|
}
|
|
1875
1966
|
};
|
|
1967
|
+
if (includeSonanceBrand) {
|
|
1968
|
+
config.mcpServers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
|
|
1969
|
+
}
|
|
1876
1970
|
return JSON.stringify(config, null, 2);
|
|
1877
1971
|
}
|
|
1878
1972
|
function resetClaudeDesktop() {
|
|
@@ -1884,7 +1978,7 @@ function resetClaudeDesktop() {
|
|
|
1884
1978
|
const servers = config.mcpServers;
|
|
1885
1979
|
let removed = false;
|
|
1886
1980
|
for (const key of Object.keys(servers)) {
|
|
1887
|
-
if (key.startsWith("cortex-") || key === "cortex") {
|
|
1981
|
+
if (key.startsWith("cortex-") || key === "cortex" || key === SONANCE_BRAND_CONFIG.name) {
|
|
1888
1982
|
delete servers[key];
|
|
1889
1983
|
removed = true;
|
|
1890
1984
|
}
|
|
@@ -1906,7 +2000,7 @@ function resetCursor() {
|
|
|
1906
2000
|
const servers = config.mcpServers;
|
|
1907
2001
|
let removed = false;
|
|
1908
2002
|
for (const key of Object.keys(servers)) {
|
|
1909
|
-
if (key.startsWith("cortex-") || key === "cortex") {
|
|
2003
|
+
if (key.startsWith("cortex-") || key === "cortex" || key === SONANCE_BRAND_CONFIG.name) {
|
|
1910
2004
|
delete servers[key];
|
|
1911
2005
|
removed = true;
|
|
1912
2006
|
}
|
|
@@ -1928,6 +2022,11 @@ function resetClaudeCode() {
|
|
|
1928
2022
|
} catch {
|
|
1929
2023
|
}
|
|
1930
2024
|
}
|
|
2025
|
+
try {
|
|
2026
|
+
execSync(`claude mcp remove ${SONANCE_BRAND_CONFIG.name}`, { stdio: "pipe" });
|
|
2027
|
+
removed = true;
|
|
2028
|
+
} catch {
|
|
2029
|
+
}
|
|
1931
2030
|
return removed;
|
|
1932
2031
|
}
|
|
1933
2032
|
function resetCodex() {
|
|
@@ -1936,7 +2035,7 @@ function resetCodex() {
|
|
|
1936
2035
|
try {
|
|
1937
2036
|
const content = readFileSync(configPath, "utf-8");
|
|
1938
2037
|
const cleaned = content.replace(
|
|
1939
|
-
/\[mcp_servers\.cortex-[^\]]
|
|
2038
|
+
/\[mcp_servers\.(?:cortex-[^\]]*|sonance-brand)\][^[]*(?=\[|$)/g,
|
|
1940
2039
|
""
|
|
1941
2040
|
).trim();
|
|
1942
2041
|
if (cleaned !== content.trim()) {
|
|
@@ -1948,31 +2047,31 @@ function resetCodex() {
|
|
|
1948
2047
|
return false;
|
|
1949
2048
|
}
|
|
1950
2049
|
}
|
|
1951
|
-
function configureClient(clientType, serverUrl, apiKey, mcps) {
|
|
2050
|
+
function configureClient(clientType, serverUrl, apiKey, mcps, includeSonanceBrand = true) {
|
|
1952
2051
|
switch (clientType) {
|
|
1953
2052
|
case "claude-desktop": {
|
|
1954
|
-
const path = configureClaudeDesktop(serverUrl, apiKey, mcps);
|
|
2053
|
+
const path = configureClaudeDesktop(serverUrl, apiKey, mcps, includeSonanceBrand);
|
|
1955
2054
|
return `Claude Desktop configured (${path})`;
|
|
1956
2055
|
}
|
|
1957
2056
|
case "claude-code":
|
|
1958
|
-
configureClaudeCode(serverUrl, apiKey, mcps);
|
|
2057
|
+
configureClaudeCode(serverUrl, apiKey, mcps, includeSonanceBrand);
|
|
1959
2058
|
return "Claude Code configured";
|
|
1960
2059
|
case "cursor":
|
|
1961
|
-
configureCursor(serverUrl, apiKey, mcps);
|
|
2060
|
+
configureCursor(serverUrl, apiKey, mcps, includeSonanceBrand);
|
|
1962
2061
|
return "Cursor configured";
|
|
1963
2062
|
case "vscode":
|
|
1964
|
-
configureVSCode(serverUrl, apiKey, mcps);
|
|
2063
|
+
configureVSCode(serverUrl, apiKey, mcps, includeSonanceBrand);
|
|
1965
2064
|
return "VS Code configured";
|
|
1966
2065
|
case "antigravity":
|
|
1967
|
-
configureAntigravity(serverUrl, apiKey, mcps);
|
|
2066
|
+
configureAntigravity(serverUrl, apiKey, mcps, includeSonanceBrand);
|
|
1968
2067
|
return "Antigravity configured";
|
|
1969
2068
|
case "codex":
|
|
1970
|
-
configureCodex(serverUrl, apiKey, mcps);
|
|
2069
|
+
configureCodex(serverUrl, apiKey, mcps, includeSonanceBrand);
|
|
1971
2070
|
return "Codex configured";
|
|
1972
2071
|
case "perplexity":
|
|
1973
|
-
return configurePerplexity(serverUrl, apiKey, mcps);
|
|
2072
|
+
return configurePerplexity(serverUrl, apiKey, mcps, includeSonanceBrand);
|
|
1974
2073
|
case "stdio":
|
|
1975
|
-
return "Add this to your client config:\n\n" + generateStdioSnippet(apiKey);
|
|
2074
|
+
return "Add this to your client config:\n\n" + generateStdioSnippet(apiKey, includeSonanceBrand);
|
|
1976
2075
|
}
|
|
1977
2076
|
}
|
|
1978
2077
|
|
|
@@ -2114,6 +2213,11 @@ async function handleApiRoute(path, searchParams, req, res, options, onComplete)
|
|
|
2114
2213
|
description: m.description,
|
|
2115
2214
|
authMode: m.authMode
|
|
2116
2215
|
})),
|
|
2216
|
+
sonanceBrand: {
|
|
2217
|
+
name: SONANCE_BRAND_CONFIG.name,
|
|
2218
|
+
displayName: SONANCE_BRAND_CONFIG.displayName,
|
|
2219
|
+
description: SONANCE_BRAND_CONFIG.description
|
|
2220
|
+
},
|
|
2117
2221
|
detectedClients: clients
|
|
2118
2222
|
});
|
|
2119
2223
|
return true;
|
|
@@ -2207,6 +2311,7 @@ async function handleApiRoute(path, searchParams, req, res, options, onComplete)
|
|
|
2207
2311
|
const body = await parseBody(req);
|
|
2208
2312
|
const clients = body.clients || [];
|
|
2209
2313
|
const mcps = body.mcps || [...DEFAULT_MCPS];
|
|
2314
|
+
const includeSonanceBrand = body.includeSonanceBrand !== false;
|
|
2210
2315
|
const apiKey = getState().apiKey;
|
|
2211
2316
|
const results = [];
|
|
2212
2317
|
for (const clientType of clients) {
|
|
@@ -2215,7 +2320,8 @@ async function handleApiRoute(path, searchParams, req, res, options, onComplete)
|
|
|
2215
2320
|
clientType,
|
|
2216
2321
|
options.serverUrl,
|
|
2217
2322
|
apiKey,
|
|
2218
|
-
mcps
|
|
2323
|
+
mcps,
|
|
2324
|
+
includeSonanceBrand
|
|
2219
2325
|
);
|
|
2220
2326
|
results.push({ client: clientType, success: true, message: msg });
|
|
2221
2327
|
} catch (err2) {
|
|
@@ -4239,8 +4345,8 @@ program.command("disconnect <provider>").description("Remove your personal OAuth
|
|
|
4239
4345
|
}
|
|
4240
4346
|
});
|
|
4241
4347
|
program.command("connect-mobile").description("Connect Cortex to Claude on mobile \u2014 opens setup page in browser").action(async () => {
|
|
4242
|
-
const { DEFAULT_SERVER_URL: DEFAULT_SERVER_URL3 } = await import("./constants-
|
|
4243
|
-
const { openBrowser: openBrowser2 } = await import("./browser-
|
|
4348
|
+
const { DEFAULT_SERVER_URL: DEFAULT_SERVER_URL3 } = await import("./constants-76SAPZ3D.js");
|
|
4349
|
+
const { openBrowser: openBrowser2 } = await import("./browser-AJPM6AK7.js");
|
|
4244
4350
|
const url = `${DEFAULT_SERVER_URL3}/connect`;
|
|
4245
4351
|
console.log("\nOpening Cortex connect page...");
|
|
4246
4352
|
console.log(` ${url}
|