@danainnovations/cortex-mcp 1.0.98 → 1.0.100

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/cli.js CHANGED
@@ -822,7 +822,18 @@ function getWizardHtml() {
822
822
  </div>
823
823
  </div>
824
824
 
825
- <!-- Step 5: Connect Accounts -->
825
+ <!-- Step 5: Manual Setup Walkthrough -->
826
+ <div id="step-manual-setup" class="step">
827
+ <div class="card">
828
+ <div id="manual-setup-content"></div>
829
+ <div class="btn-row">
830
+ <button class="btn btn-secondary" id="btn-manual-skip" onclick="skipManualSetup()">Skip for now</button>
831
+ <button class="btn btn-primary" id="btn-manual-done" onclick="completeManualSetup()">I've done this</button>
832
+ </div>
833
+ </div>
834
+ </div>
835
+
836
+ <!-- Step 6: Connect Accounts -->
826
837
  <div id="step-connect" class="step">
827
838
  <div class="card">
828
839
  <h2>Connect Accounts</h2>
@@ -868,10 +879,12 @@ function getWizardHtml() {
868
879
  configuredClients: [],
869
880
  connections: [],
870
881
  serverUrl: '',
882
+ manualQueue: [],
883
+ currentManualIndex: 0,
871
884
  };
872
885
 
873
886
  // \u2500\u2500 Step Index Map \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
874
- var STEP_ORDER = ['welcome', 'signin', 'mcps', 'clients', 'connect', 'done'];
887
+ var STEP_ORDER = ['welcome', 'signin', 'mcps', 'clients', 'manual-setup', 'connect', 'done'];
875
888
  var currentStepIndex = 0;
876
889
 
877
890
  // \u2500\u2500 MCP Icons (inline SVG) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
@@ -906,6 +919,14 @@ function getWizardHtml() {
906
919
  stdio: '<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-1zm1 2v6h10V5H3z"/></svg>',
907
920
  };
908
921
 
922
+ // \u2500\u2500 Manual Client Display Names \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
923
+ var MANUAL_CLIENT_NAMES = {
924
+ 'claude-cowork': 'Claude CoWork',
925
+ 'claude-ai': 'Claude.ai & Mobile',
926
+ 'perplexity': 'Perplexity',
927
+ 'stdio': 'OpenClaw / Stdio',
928
+ };
929
+
909
930
  // \u2500\u2500 Init \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
910
931
  async function init() {
911
932
  try {
@@ -961,6 +982,7 @@ function getWizardHtml() {
961
982
  if (step === 'signin') renderSignin();
962
983
  if (step === 'mcps') renderMcps();
963
984
  if (step === 'clients') renderClients();
985
+ if (step === 'manual-setup') renderManualSetup();
964
986
  if (step === 'connect') renderConnect();
965
987
  if (step === 'done') renderDone();
966
988
  }
@@ -1213,7 +1235,7 @@ function getWizardHtml() {
1213
1235
  function renderClientItem(client) {
1214
1236
  var detected = client.detected;
1215
1237
  var icon = CLIENT_ICONS[client.type] || '';
1216
- var isManual = client.type === 'perplexity' || client.type === 'stdio' || client.type === 'claude-ai' || client.type === 'claude-cowork';
1238
+ var isManual = client.type === 'perplexity' || client.type === 'stdio' || client.type === 'claude-ai';
1217
1239
  var alreadyConfigured = !isManual && state.configuredClients.indexOf(client.type) !== -1;
1218
1240
  var statusText = alreadyConfigured ? 'Configured' : (detected ? 'Detected' : 'Not found');
1219
1241
  return (
@@ -1234,17 +1256,17 @@ function getWizardHtml() {
1234
1256
  document.getElementById('btn-configure').textContent = 'Configure';
1235
1257
 
1236
1258
  // Pre-select already-configured clients (exclude manual/additional ones)
1237
- var nonAutoTypes = ['perplexity', 'stdio', 'claude-ai', 'claude-cowork'];
1259
+ var nonAutoTypes = ['perplexity', 'stdio', 'claude-ai'];
1238
1260
  state.selectedClients = state.configuredClients.filter(function(c) {
1239
1261
  return nonAutoTypes.indexOf(c) === -1;
1240
1262
  });
1241
1263
 
1242
1264
  // Split into auto-configured, web/mobile/cowork, and manual-setup clients
1243
1265
  var autoClients = state.detectedClients.filter(function(c) {
1244
- return c.type !== 'perplexity' && c.type !== 'stdio' && c.type !== 'claude-ai' && c.type !== 'claude-cowork';
1266
+ return c.type !== 'perplexity' && c.type !== 'stdio' && c.type !== 'claude-ai';
1245
1267
  });
1246
1268
  var webClients = state.detectedClients.filter(function(c) {
1247
- return c.type === 'claude-ai' || c.type === 'claude-cowork';
1269
+ return c.type === 'claude-ai';
1248
1270
  });
1249
1271
  var manualClients = state.detectedClients.filter(function(c) {
1250
1272
  return c.type === 'perplexity' || c.type === 'stdio';
@@ -1255,7 +1277,7 @@ function getWizardHtml() {
1255
1277
  if (webClients.length > 0) {
1256
1278
  html += '<div class="client-section-divider">' +
1257
1279
  '<div class="client-section-title">Web & Mobile</div>' +
1258
- '<div class="client-section-subtitle">Use Cortex tools on claude.ai, Claude mobile, and Claude CoWork</div>' +
1280
+ '<div class="client-section-subtitle">Use Cortex tools on claude.ai and the Claude mobile app</div>' +
1259
1281
  '</div>';
1260
1282
  html += webClients.map(renderClientItem).join('');
1261
1283
  }
@@ -1270,7 +1292,7 @@ function getWizardHtml() {
1270
1292
 
1271
1293
  el.innerHTML = html;
1272
1294
 
1273
- var manualTypes = ['perplexity', 'stdio', 'claude-ai', 'claude-cowork'];
1295
+ var manualTypes = ['perplexity', 'stdio', 'claude-ai'];
1274
1296
  el.querySelectorAll('.client-item:not(.disabled):not(.already-configured)').forEach(function(item) {
1275
1297
  // Auto-select detected clients, but NOT manual/additional/web ones
1276
1298
  if (manualTypes.indexOf(item.dataset.client) === -1) {
@@ -1318,66 +1340,37 @@ function getWizardHtml() {
1318
1340
 
1319
1341
  state.configuredClients = data.results.filter(function(r) { return r.success; }).map(function(r) { return r.client; });
1320
1342
 
1343
+ // Separate manual-setup clients from auto-configured ones
1344
+ var manualClientTypes = ['claude-cowork', 'claude-ai', 'perplexity', 'stdio'];
1345
+
1321
1346
  // Update per-client status inline
1322
1347
  data.results.forEach(function(r) {
1323
1348
  var item = document.querySelector('[data-client="' + r.client + '"]');
1324
1349
  if (item) {
1325
1350
  var statusSpan = item.querySelector('.client-status');
1326
1351
  if (r.success) {
1327
- statusSpan.innerHTML = '<span style="color: #4CAF50;">&#10003; Done</span>';
1352
+ var isManual = manualClientTypes.indexOf(r.client) !== -1;
1353
+ statusSpan.innerHTML = isManual
1354
+ ? '<span style="color: #00A3E1;">Setup required \u2192</span>'
1355
+ : '<span style="color: #4CAF50;">&#10003; Done</span>';
1328
1356
  } else {
1329
1357
  statusSpan.innerHTML = '<span style="color: #EF5350;">&#10007; Failed</span>';
1330
1358
  }
1331
1359
  }
1332
1360
  });
1361
+ state.manualQueue = data.results.filter(function(r) {
1362
+ return r.success && manualClientTypes.indexOf(r.client) !== -1;
1363
+ });
1364
+ state.currentManualIndex = 0;
1333
1365
 
1334
1366
  var resultEl = document.getElementById('client-result');
1335
1367
  resultEl.className = '';
1336
1368
  resultEl.innerHTML = data.results.map(function(r) {
1369
+ var isManualClient = manualClientTypes.indexOf(r.client) !== -1;
1337
1370
  var html = '<div class="status ' + (r.success ? 'status-success' : 'status-error') + '">' +
1338
1371
  '<span>' + (r.success ? '&#10003;' : '&#10007;') + '</span>' +
1339
- '<span>' + (r.success ? escapeHtml(r.message || 'Configured') : escapeHtml(r.client) + ': ' + (r.error || 'Failed')) + '</span>' +
1372
+ '<span>' + (r.success ? escapeHtml(isManualClient ? (MANUAL_CLIENT_NAMES[r.client] || r.client) + ' \u2014 setup instructions on next page' : (r.message || 'Configured')) : escapeHtml(r.client) + ': ' + (r.error || 'Failed')) + '</span>' +
1340
1373
  '</div>';
1341
- // Show Claude CoWork instructions with copyable URL
1342
- if (r.client === 'claude-cowork' && r.success && r.message) {
1343
- var coworkUrl = (state.serverUrl || 'https://cortex-bice.vercel.app') + '/mcp/cortex';
1344
- html += '<div class="stdio-snippet" style="text-align: left;">' +
1345
- '<ol style="margin: 0 0 12px 0; padding-left: 20px; line-height: 1.8;">' +
1346
- '<li>Open Claude Desktop \u2192 <strong>Settings</strong> \u2192 <strong>Connectors</strong></li>' +
1347
- '<li>Click <strong>Add connector</strong> \u2192 <strong>Custom connector</strong></li>' +
1348
- '<li>Paste this URL and click Add:</li>' +
1349
- '</ol>' +
1350
- '<div style="display: flex; align-items: center; gap: 8px; background: rgba(0,163,225,0.08); border: 1px solid rgba(0,163,225,0.2); border-radius: 6px; padding: 8px 12px;">' +
1351
- '<code style="flex: 1; font-size: 12px; word-break: break-all;">' + escapeHtml(coworkUrl) + '</code>' +
1352
- '<button class="copy-btn" onclick="copySnippet(this)">Copy</button>' +
1353
- '</div>' +
1354
- '<p style="margin: 10px 0 0 0; font-size: 12px; opacity: 0.7;">Sign in via Okta when prompted. Tools are available in all CoWork sessions.</p>' +
1355
- '</div>';
1356
- }
1357
- // Show Claude.ai instructions with copyable URL
1358
- if (r.client === 'claude-ai' && r.success && r.message) {
1359
- var mcpUrl = (state.serverUrl || 'https://cortex-bice.vercel.app') + '/mcp/cortex';
1360
- html += '<div class="stdio-snippet" style="text-align: left;">' +
1361
- '<ol style="margin: 0 0 12px 0; padding-left: 20px; line-height: 1.8;">' +
1362
- '<li>Open <a href="https://claude.ai/settings/integrations" target="_blank" style="color: #00A3E1;">claude.ai/settings/integrations</a></li>' +
1363
- '<li>Click <strong>Add custom integration</strong></li>' +
1364
- '<li>Paste this URL and click Add:</li>' +
1365
- '</ol>' +
1366
- '<div style="display: flex; align-items: center; gap: 8px; background: rgba(0,163,225,0.08); border: 1px solid rgba(0,163,225,0.2); border-radius: 6px; padding: 8px 12px;">' +
1367
- '<code style="flex: 1; font-size: 12px; word-break: break-all;">' + escapeHtml(mcpUrl) + '</code>' +
1368
- '<button class="copy-btn" onclick="copySnippet(this)">Copy</button>' +
1369
- '</div>' +
1370
- '<p style="margin: 10px 0 0 0; font-size: 12px; opacity: 0.7;">Claude handles SSO authentication automatically. Tools sync to mobile.</p>' +
1371
- '</div>';
1372
- }
1373
- // Show copyable snippet for stdio/OpenClaw and Perplexity instructions
1374
- if ((r.client === 'stdio' || r.client === 'perplexity') && r.success && r.message) {
1375
- var snippet = r.message.replace(/^Add this to your client config:\\n\\n/, '');
1376
- html += '<div class="stdio-snippet">' +
1377
- '<button class="copy-btn" onclick="copySnippet(this)">Copy</button>' +
1378
- '<pre>' + escapeHtml(snippet) + '</pre>' +
1379
- '</div>';
1380
- }
1381
1374
  return html;
1382
1375
  }).join('');
1383
1376
 
@@ -1390,7 +1383,13 @@ function getWizardHtml() {
1390
1383
 
1391
1384
  btn.textContent = 'Continue';
1392
1385
  btn.disabled = false;
1393
- btn.onclick = function() { goToStep('connect'); };
1386
+ btn.onclick = function() {
1387
+ if (state.manualQueue.length > 0) {
1388
+ goToStep('manual-setup');
1389
+ } else {
1390
+ goToStep('connect');
1391
+ }
1392
+ };
1394
1393
  } catch (err) {
1395
1394
  btn.disabled = false;
1396
1395
  btn.textContent = 'Retry';
@@ -1400,7 +1399,106 @@ function getWizardHtml() {
1400
1399
  }
1401
1400
  }
1402
1401
 
1403
- // \u2500\u2500 Step 5: Connect Accounts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1402
+ // \u2500\u2500 Step 5: Manual Setup Walkthrough \u2500\u2500\u2500\u2500\u2500\u2500
1403
+ function getManualSetupContent(clientType) {
1404
+ var mcpUrl = (state.serverUrl || 'https://cortex-bice.vercel.app') + '/mcp/cortex';
1405
+
1406
+ if (clientType === 'claude-cowork') {
1407
+ return '<ol style="margin: 0 0 20px 0; padding-left: 20px; line-height: 2; font-size: 15px;">' +
1408
+ '<li>Open <strong>Claude Desktop</strong> \u2192 <strong>Settings</strong> \u2192 <strong>Connectors</strong></li>' +
1409
+ '<li>Click <strong>Add custom connector</strong></li>' +
1410
+ '<li>Enter the name: <strong>Cortex CoWork</strong></li>' +
1411
+ '<li>Paste the URL below into <strong>Remote MCP server URL</strong></li>' +
1412
+ '<li>Click <strong>Add</strong> \u2014 sign in via <strong>Okta</strong> when prompted</li>' +
1413
+ '</ol>' +
1414
+ '<div style="display: flex; align-items: center; gap: 8px; background: rgba(0,163,225,0.08); border: 1px solid rgba(0,163,225,0.2); border-radius: 8px; padding: 12px 16px; margin-bottom: 16px;">' +
1415
+ '<code style="flex: 1; font-size: 13px; word-break: break-all;">' + escapeHtml(mcpUrl) + '</code>' +
1416
+ '<button class="copy-btn" onclick="copySnippet(this)">Copy</button>' +
1417
+ '</div>' +
1418
+ '<p style="font-size: 13px; opacity: 0.6;">Once connected, Cortex tools are available in all CoWork sessions.</p>';
1419
+ }
1420
+
1421
+ if (clientType === 'claude-ai') {
1422
+ return '<ol style="margin: 0 0 20px 0; padding-left: 20px; line-height: 2; font-size: 15px;">' +
1423
+ '<li>Open <a href="https://claude.ai/settings/integrations" target="_blank" style="color: #00A3E1;">claude.ai/settings/integrations</a></li>' +
1424
+ '<li>Click <strong>Add custom integration</strong></li>' +
1425
+ '<li>Paste the URL below and click <strong>Add</strong></li>' +
1426
+ '<li>Claude handles SSO authentication automatically</li>' +
1427
+ '</ol>' +
1428
+ '<div style="display: flex; align-items: center; gap: 8px; background: rgba(0,163,225,0.08); border: 1px solid rgba(0,163,225,0.2); border-radius: 8px; padding: 12px 16px; margin-bottom: 16px;">' +
1429
+ '<code style="flex: 1; font-size: 13px; word-break: break-all;">' + escapeHtml(mcpUrl) + '</code>' +
1430
+ '<button class="copy-btn" onclick="copySnippet(this)">Copy</button>' +
1431
+ '</div>' +
1432
+ '<p style="font-size: 13px; opacity: 0.6;">Tools sync automatically to claude.ai, Claude Desktop (web), and the Claude mobile app.</p>';
1433
+ }
1434
+
1435
+ if (clientType === 'perplexity') {
1436
+ var item = state.manualQueue[state.currentManualIndex];
1437
+ var msg = (item && item.message) || '';
1438
+ return '<div style="font-size: 14px; line-height: 1.8; margin-bottom: 16px;">' + escapeHtml(msg).replace(/\\n/g, '<br>') + '</div>';
1439
+ }
1440
+
1441
+ if (clientType === 'stdio') {
1442
+ var item = state.manualQueue[state.currentManualIndex];
1443
+ var msg = (item && item.message) || '';
1444
+ var snippet = msg.replace(/^Add this to your client config:\\n\\n/, '');
1445
+ return '<p style="margin-bottom: 12px; font-size: 14px;">Add this to your client\u2019s MCP config:</p>' +
1446
+ '<div class="stdio-snippet">' +
1447
+ '<button class="copy-btn" onclick="copySnippet(this)">Copy</button>' +
1448
+ '<pre>' + escapeHtml(snippet) + '</pre>' +
1449
+ '</div>';
1450
+ }
1451
+
1452
+ return '';
1453
+ }
1454
+
1455
+ function renderManualSetup() {
1456
+ var el = document.getElementById('manual-setup-content');
1457
+ var total = state.manualQueue.length;
1458
+ var idx = state.currentManualIndex;
1459
+
1460
+ if (idx >= total) {
1461
+ goToStep('connect');
1462
+ return;
1463
+ }
1464
+
1465
+ var item = state.manualQueue[idx];
1466
+ var clientType = item.client;
1467
+ var clientName = MANUAL_CLIENT_NAMES[clientType] || clientType;
1468
+ var icon = CLIENT_ICONS[clientType] || '';
1469
+
1470
+ var progressHtml = total > 1
1471
+ ? '<div style="font-size: 12px; text-transform: uppercase; letter-spacing: 0.1em; opacity: 0.5; margin-bottom: 8px;">Setup ' + (idx + 1) + ' of ' + total + '</div>'
1472
+ : '';
1473
+
1474
+ el.innerHTML = progressHtml +
1475
+ '<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 24px;">' +
1476
+ (icon ? '<div class="client-icon" style="width: 32px; height: 32px;">' + icon + '</div>' : '') +
1477
+ '<h2 style="margin: 0;">Set up ' + escapeHtml(clientName) + '</h2>' +
1478
+ '</div>' +
1479
+ '<p class="subtitle" style="margin-bottom: 24px;">Follow these steps to connect Cortex</p>' +
1480
+ getManualSetupContent(clientType);
1481
+ }
1482
+
1483
+ function completeManualSetup() {
1484
+ state.currentManualIndex++;
1485
+ if (state.currentManualIndex < state.manualQueue.length) {
1486
+ renderManualSetup();
1487
+ } else {
1488
+ goToStep('connect');
1489
+ }
1490
+ }
1491
+
1492
+ function skipManualSetup() {
1493
+ state.currentManualIndex++;
1494
+ if (state.currentManualIndex < state.manualQueue.length) {
1495
+ renderManualSetup();
1496
+ } else {
1497
+ goToStep('connect');
1498
+ }
1499
+ }
1500
+
1501
+ // \u2500\u2500 Step 6: Connect Accounts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1404
1502
  async function renderConnect() {
1405
1503
  var el = document.getElementById('conn-list');
1406
1504
  el.innerHTML = '<div class="status status-info"><span class="spinner"></span> Loading connections...</div>';
@@ -1999,7 +2097,7 @@ function configureClaudeAi(serverUrl, _apiKey, _mcps) {
1999
2097
  }
2000
2098
  function configureClaudeCowork(serverUrl, _apiKey, _mcps) {
2001
2099
  const url = `${serverUrl}/mcp/cortex`;
2002
- return 'Add Cortex to Claude CoWork:\n\n1. Open Claude Desktop \u2192 Settings \u2192 Connectors\n2. Click "Add connector" \u2192 "Custom connector"\n3. Paste this URL: ' + url + "\n4. Click Add \u2014 sign in via Okta when prompted\n5. Cortex tools are now available in CoWork sessions";
2100
+ return 'Add Cortex to Claude CoWork:\n\n1. Open Claude Desktop \u2192 Settings \u2192 Connectors\n2. Click "Add custom connector"\n3. Name: Cortex CoWork\n4. Remote MCP server URL: ' + url + "\n5. Click Add \u2014 sign in via Okta when prompted\n6. Cortex tools are now available in CoWork sessions";
2003
2101
  }
2004
2102
  function generateStdioSnippet(_apiKey) {
2005
2103
  const isWindowsTarget = getPlatform() === "windows" || isWSL();