cowork-os 0.3.21 → 0.3.25

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.
Files changed (252) hide show
  1. package/README.md +372 -10
  2. package/connectors/README.md +20 -0
  3. package/connectors/asana-mcp/README.md +24 -0
  4. package/connectors/asana-mcp/dist/index.js +427 -0
  5. package/connectors/asana-mcp/package.json +15 -0
  6. package/connectors/asana-mcp/src/index.ts +553 -0
  7. package/connectors/asana-mcp/tsconfig.json +13 -0
  8. package/connectors/hubspot-mcp/README.md +35 -0
  9. package/connectors/hubspot-mcp/dist/index.js +454 -0
  10. package/connectors/hubspot-mcp/package.json +15 -0
  11. package/connectors/hubspot-mcp/src/index.ts +562 -0
  12. package/connectors/hubspot-mcp/tsconfig.json +13 -0
  13. package/connectors/jira-mcp/README.md +49 -0
  14. package/connectors/jira-mcp/dist/index.js +588 -0
  15. package/connectors/jira-mcp/package.json +15 -0
  16. package/connectors/jira-mcp/src/index.ts +711 -0
  17. package/connectors/jira-mcp/tsconfig.json +13 -0
  18. package/connectors/linear-mcp/README.md +22 -0
  19. package/connectors/linear-mcp/dist/index.js +402 -0
  20. package/connectors/linear-mcp/package.json +15 -0
  21. package/connectors/linear-mcp/src/index.ts +522 -0
  22. package/connectors/linear-mcp/tsconfig.json +13 -0
  23. package/connectors/okta-mcp/README.md +24 -0
  24. package/connectors/okta-mcp/dist/index.js +411 -0
  25. package/connectors/okta-mcp/package.json +15 -0
  26. package/connectors/okta-mcp/src/index.ts +520 -0
  27. package/connectors/okta-mcp/tsconfig.json +13 -0
  28. package/connectors/salesforce-mcp/README.md +47 -0
  29. package/connectors/salesforce-mcp/dist/index.js +584 -0
  30. package/connectors/salesforce-mcp/package.json +15 -0
  31. package/connectors/salesforce-mcp/src/index.ts +722 -0
  32. package/connectors/salesforce-mcp/tsconfig.json +13 -0
  33. package/connectors/servicenow-mcp/README.md +26 -0
  34. package/connectors/servicenow-mcp/dist/index.js +400 -0
  35. package/connectors/servicenow-mcp/package.json +15 -0
  36. package/connectors/servicenow-mcp/src/index.ts +500 -0
  37. package/connectors/servicenow-mcp/tsconfig.json +13 -0
  38. package/connectors/templates/mcp-connector/README.md +31 -0
  39. package/connectors/templates/mcp-connector/package.json +15 -0
  40. package/connectors/templates/mcp-connector/src/index.ts +330 -0
  41. package/connectors/templates/mcp-connector/tsconfig.json +13 -0
  42. package/connectors/zendesk-mcp/README.md +40 -0
  43. package/connectors/zendesk-mcp/dist/index.js +431 -0
  44. package/connectors/zendesk-mcp/package.json +15 -0
  45. package/connectors/zendesk-mcp/src/index.ts +543 -0
  46. package/connectors/zendesk-mcp/tsconfig.json +13 -0
  47. package/dist/electron/electron/agent/custom-skill-loader.js +31 -1
  48. package/dist/electron/electron/agent/daemon.js +189 -13
  49. package/dist/electron/electron/agent/executor.js +895 -78
  50. package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +177 -0
  51. package/dist/electron/electron/agent/llm/azure-openai-provider.js +328 -0
  52. package/dist/electron/electron/agent/llm/bedrock-provider.js +49 -9
  53. package/dist/electron/electron/agent/llm/github-copilot-provider.js +97 -0
  54. package/dist/electron/electron/agent/llm/groq-provider.js +33 -0
  55. package/dist/electron/electron/agent/llm/index.js +13 -1
  56. package/dist/electron/electron/agent/llm/kimi-provider.js +33 -0
  57. package/dist/electron/electron/agent/llm/openai-compatible-provider.js +116 -0
  58. package/dist/electron/electron/agent/llm/openai-compatible.js +111 -0
  59. package/dist/electron/electron/agent/llm/openai-oauth.js +2 -1
  60. package/dist/electron/electron/agent/llm/openrouter-provider.js +1 -1
  61. package/dist/electron/electron/agent/llm/provider-factory.js +350 -4
  62. package/dist/electron/electron/agent/llm/types.js +66 -1
  63. package/dist/electron/electron/agent/llm/xai-provider.js +33 -0
  64. package/dist/electron/electron/agent/search/provider-factory.js +38 -2
  65. package/dist/electron/electron/agent/tools/box-tools.js +231 -0
  66. package/dist/electron/electron/agent/tools/builtin-settings.js +28 -0
  67. package/dist/electron/electron/agent/tools/dropbox-tools.js +237 -0
  68. package/dist/electron/electron/agent/tools/file-tools.js +66 -3
  69. package/dist/electron/electron/agent/tools/google-drive-tools.js +227 -0
  70. package/dist/electron/electron/agent/tools/grep-tools.js +90 -10
  71. package/dist/electron/electron/agent/tools/image-tools.js +11 -1
  72. package/dist/electron/electron/agent/tools/notion-tools.js +312 -0
  73. package/dist/electron/electron/agent/tools/onedrive-tools.js +217 -0
  74. package/dist/electron/electron/agent/tools/registry.js +548 -10
  75. package/dist/electron/electron/agent/tools/search-tools.js +28 -10
  76. package/dist/electron/electron/agent/tools/sharepoint-tools.js +243 -0
  77. package/dist/electron/electron/agent/tools/shell-tools.js +12 -3
  78. package/dist/electron/electron/agent/tools/x-tools.js +1 -1
  79. package/dist/electron/electron/agents/agent-dispatch.js +63 -0
  80. package/dist/electron/electron/database/repositories.js +19 -5
  81. package/dist/electron/electron/database/schema.js +8 -0
  82. package/dist/electron/electron/gateway/channels/whatsapp.js +55 -0
  83. package/dist/electron/electron/gateway/index.js +75 -1
  84. package/dist/electron/electron/gateway/router.js +209 -154
  85. package/dist/electron/electron/ipc/canvas-handlers.js +5 -0
  86. package/dist/electron/electron/ipc/handlers.js +763 -267
  87. package/dist/electron/electron/main.js +63 -0
  88. package/dist/electron/electron/mcp/oauth/connector-oauth.js +333 -0
  89. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +503 -154
  90. package/dist/electron/electron/memory/MemoryService.js +2 -1
  91. package/dist/electron/electron/preload.js +78 -1
  92. package/dist/electron/electron/settings/appearance-manager.js +18 -1
  93. package/dist/electron/electron/settings/box-manager.js +54 -0
  94. package/dist/electron/electron/settings/dropbox-manager.js +54 -0
  95. package/dist/electron/electron/settings/google-drive-manager.js +54 -0
  96. package/dist/electron/electron/settings/notion-manager.js +56 -0
  97. package/dist/electron/electron/settings/onedrive-manager.js +54 -0
  98. package/dist/electron/electron/settings/sharepoint-manager.js +54 -0
  99. package/dist/electron/electron/utils/box-api.js +153 -0
  100. package/dist/electron/electron/utils/dropbox-api.js +144 -0
  101. package/dist/electron/electron/utils/env-migration.js +19 -0
  102. package/dist/electron/electron/utils/google-drive-api.js +152 -0
  103. package/dist/electron/electron/utils/notion-api.js +103 -0
  104. package/dist/electron/electron/utils/onedrive-api.js +113 -0
  105. package/dist/electron/electron/utils/sharepoint-api.js +109 -0
  106. package/dist/electron/electron/utils/validation.js +98 -3
  107. package/dist/electron/electron/utils/x-cli.js +1 -1
  108. package/dist/electron/shared/channelMessages.js +284 -3
  109. package/dist/electron/shared/llm-provider-catalog.js +198 -0
  110. package/dist/electron/shared/types.js +90 -1
  111. package/package.json +14 -3
  112. package/resources/skills/nano-banana-pro.json +4 -4
  113. package/resources/skills/openai-image-gen.json +3 -3
  114. package/resources/skills/scripts/gen.py +163 -0
  115. package/resources/skills/scripts/generate_image.py +91 -0
  116. package/src/electron/agent/custom-skill-loader.ts +34 -1
  117. package/src/electron/agent/daemon.ts +210 -14
  118. package/src/electron/agent/executor.ts +1124 -85
  119. package/src/electron/agent/llm/anthropic-compatible-provider.ts +214 -0
  120. package/src/electron/agent/llm/azure-openai-provider.ts +388 -0
  121. package/src/electron/agent/llm/bedrock-provider.ts +62 -9
  122. package/src/electron/agent/llm/github-copilot-provider.ts +117 -0
  123. package/src/electron/agent/llm/groq-provider.ts +39 -0
  124. package/src/electron/agent/llm/index.ts +6 -0
  125. package/src/electron/agent/llm/kimi-provider.ts +39 -0
  126. package/src/electron/agent/llm/openai-compatible-provider.ts +153 -0
  127. package/src/electron/agent/llm/openai-compatible.ts +133 -0
  128. package/src/electron/agent/llm/openai-oauth.ts +2 -1
  129. package/src/electron/agent/llm/openrouter-provider.ts +2 -1
  130. package/src/electron/agent/llm/provider-factory.ts +459 -6
  131. package/src/electron/agent/llm/types.ts +95 -1
  132. package/src/electron/agent/llm/xai-provider.ts +39 -0
  133. package/src/electron/agent/search/provider-factory.ts +43 -2
  134. package/src/electron/agent/tools/box-tools.ts +239 -0
  135. package/src/electron/agent/tools/builtin-settings.ts +36 -0
  136. package/src/electron/agent/tools/dropbox-tools.ts +237 -0
  137. package/src/electron/agent/tools/file-tools.ts +66 -3
  138. package/src/electron/agent/tools/gmail-tools.ts +240 -0
  139. package/src/electron/agent/tools/google-calendar-tools.ts +258 -0
  140. package/src/electron/agent/tools/google-drive-tools.ts +228 -0
  141. package/src/electron/agent/tools/grep-tools.ts +97 -12
  142. package/src/electron/agent/tools/image-tools.ts +11 -1
  143. package/src/electron/agent/tools/notion-tools.ts +330 -0
  144. package/src/electron/agent/tools/onedrive-tools.ts +217 -0
  145. package/src/electron/agent/tools/registry.ts +794 -10
  146. package/src/electron/agent/tools/search-tools.ts +29 -11
  147. package/src/electron/agent/tools/sharepoint-tools.ts +247 -0
  148. package/src/electron/agent/tools/shell-tools.ts +11 -3
  149. package/src/electron/agent/tools/x-tools.ts +1 -1
  150. package/src/electron/agents/agent-dispatch.ts +79 -0
  151. package/src/electron/database/SecureSettingsRepository.ts +7 -1
  152. package/src/electron/database/repositories.ts +58 -6
  153. package/src/electron/database/schema.ts +8 -0
  154. package/src/electron/gateway/channels/discord.ts +4 -0
  155. package/src/electron/gateway/channels/google-chat.ts +3 -0
  156. package/src/electron/gateway/channels/line.ts +3 -0
  157. package/src/electron/gateway/channels/matrix-client.ts +15 -0
  158. package/src/electron/gateway/channels/matrix.ts +31 -0
  159. package/src/electron/gateway/channels/mattermost.ts +3 -0
  160. package/src/electron/gateway/channels/signal.ts +3 -0
  161. package/src/electron/gateway/channels/slack.ts +9 -4
  162. package/src/electron/gateway/channels/teams.ts +4 -0
  163. package/src/electron/gateway/channels/telegram.ts +2 -0
  164. package/src/electron/gateway/channels/twitch.ts +2 -0
  165. package/src/electron/gateway/channels/types.ts +8 -0
  166. package/src/electron/gateway/channels/whatsapp.ts +66 -0
  167. package/src/electron/gateway/index.ts +95 -2
  168. package/src/electron/gateway/router.ts +231 -161
  169. package/src/electron/gateway/security.ts +21 -9
  170. package/src/electron/ipc/canvas-handlers.ts +10 -0
  171. package/src/electron/ipc/handlers.ts +848 -292
  172. package/src/electron/main.ts +35 -0
  173. package/src/electron/mcp/oauth/connector-oauth.ts +448 -0
  174. package/src/electron/mcp/registry/MCPRegistryManager.ts +343 -12
  175. package/src/electron/memory/MemoryService.ts +7 -1
  176. package/src/electron/preload.ts +200 -5
  177. package/src/electron/settings/appearance-manager.ts +20 -2
  178. package/src/electron/settings/box-manager.ts +58 -0
  179. package/src/electron/settings/dropbox-manager.ts +58 -0
  180. package/src/electron/settings/google-workspace-manager.ts +59 -0
  181. package/src/electron/settings/notion-manager.ts +60 -0
  182. package/src/electron/settings/onedrive-manager.ts +58 -0
  183. package/src/electron/settings/sharepoint-manager.ts +58 -0
  184. package/src/electron/utils/box-api.ts +184 -0
  185. package/src/electron/utils/dropbox-api.ts +171 -0
  186. package/src/electron/utils/env-migration.ts +22 -0
  187. package/src/electron/utils/gmail-api.ts +121 -0
  188. package/src/electron/utils/google-calendar-api.ts +115 -0
  189. package/src/electron/utils/google-workspace-api.ts +228 -0
  190. package/src/electron/utils/google-workspace-auth.ts +109 -0
  191. package/src/electron/utils/google-workspace-oauth.ts +232 -0
  192. package/src/electron/utils/notion-api.ts +126 -0
  193. package/src/electron/utils/onedrive-api.ts +137 -0
  194. package/src/electron/utils/sharepoint-api.ts +132 -0
  195. package/src/electron/utils/validation.ts +128 -1
  196. package/src/electron/utils/x-cli.ts +1 -1
  197. package/src/renderer/App.tsx +119 -8
  198. package/src/renderer/components/ActivityFeedItem.tsx +34 -17
  199. package/src/renderer/components/AgentWorkingStatePanel.tsx +7 -5
  200. package/src/renderer/components/AppearanceSettings.tsx +37 -2
  201. package/src/renderer/components/BlueBubblesSettings.tsx +18 -7
  202. package/src/renderer/components/BoxSettings.tsx +203 -0
  203. package/src/renderer/components/BrowserView.tsx +101 -0
  204. package/src/renderer/components/BuiltinToolsSettings.tsx +105 -0
  205. package/src/renderer/components/CanvasPreview.tsx +68 -1
  206. package/src/renderer/components/ConnectorEnvModal.tsx +116 -0
  207. package/src/renderer/components/ConnectorSetupModal.tsx +566 -0
  208. package/src/renderer/components/ConnectorsSettings.tsx +397 -0
  209. package/src/renderer/components/ControlPlaneSettings.tsx +2 -0
  210. package/src/renderer/components/DiscordSettings.tsx +18 -7
  211. package/src/renderer/components/DropboxSettings.tsx +202 -0
  212. package/src/renderer/components/EmailSettings.tsx +18 -7
  213. package/src/renderer/components/FileViewer.tsx +21 -13
  214. package/src/renderer/components/GoogleChatSettings.tsx +17 -7
  215. package/src/renderer/components/GoogleWorkspaceSettings.tsx +332 -0
  216. package/src/renderer/components/ImessageSettings.tsx +22 -11
  217. package/src/renderer/components/LineIcons.tsx +376 -0
  218. package/src/renderer/components/LineSettings.tsx +18 -7
  219. package/src/renderer/components/MCPSettings.tsx +56 -0
  220. package/src/renderer/components/MainContent.tsx +740 -76
  221. package/src/renderer/components/MatrixSettings.tsx +18 -7
  222. package/src/renderer/components/MattermostSettings.tsx +18 -7
  223. package/src/renderer/components/NodesSettings.tsx +58 -99
  224. package/src/renderer/components/NotificationPanel.tsx +25 -11
  225. package/src/renderer/components/NotionSettings.tsx +231 -0
  226. package/src/renderer/components/Onboarding/Onboarding.tsx +13 -1
  227. package/src/renderer/components/OnboardingModal.tsx +70 -1
  228. package/src/renderer/components/OneDriveSettings.tsx +212 -0
  229. package/src/renderer/components/RightPanel.tsx +141 -28
  230. package/src/renderer/components/ScheduledTasksSettings.tsx +10 -62
  231. package/src/renderer/components/SearchSettings.tsx +118 -114
  232. package/src/renderer/components/Settings.tsx +1425 -651
  233. package/src/renderer/components/SharePointSettings.tsx +224 -0
  234. package/src/renderer/components/Sidebar.tsx +94 -19
  235. package/src/renderer/components/SignalSettings.tsx +18 -7
  236. package/src/renderer/components/SkillHubBrowser.tsx +144 -185
  237. package/src/renderer/components/SlackSettings.tsx +18 -7
  238. package/src/renderer/components/TaskQuickActions.tsx +11 -6
  239. package/src/renderer/components/TaskTimeline.tsx +58 -26
  240. package/src/renderer/components/TeamsSettings.tsx +18 -7
  241. package/src/renderer/components/TelegramSettings.tsx +18 -7
  242. package/src/renderer/components/ThemeIcon.tsx +16 -0
  243. package/src/renderer/components/TwitchSettings.tsx +18 -7
  244. package/src/renderer/components/VoiceSettings.tsx +30 -74
  245. package/src/renderer/components/WhatsAppSettings.tsx +48 -37
  246. package/src/renderer/components/WorkingStateHistory.tsx +7 -5
  247. package/src/renderer/components/WorkspaceSelector.tsx +42 -13
  248. package/src/renderer/hooks/useOnboardingFlow.ts +21 -0
  249. package/src/renderer/styles/index.css +2333 -209
  250. package/src/shared/channelMessages.ts +367 -4
  251. package/src/shared/llm-provider-catalog.ts +217 -0
  252. package/src/shared/types.ts +251 -2
@@ -8,11 +8,47 @@
8
8
  * - Install servers from the registry
9
9
  * - Check for updates to installed servers
10
10
  */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
11
44
  Object.defineProperty(exports, "__esModule", { value: true });
12
45
  exports.MCPRegistryManager = void 0;
13
46
  const uuid_1 = require("uuid");
14
47
  const child_process_1 = require("child_process");
15
48
  const util_1 = require("util");
49
+ const electron_1 = require("electron");
50
+ const path = __importStar(require("path"));
51
+ const fs = __importStar(require("fs"));
16
52
  const settings_1 = require("../settings");
17
53
  const execAsync = (0, util_1.promisify)(child_process_1.exec);
18
54
  // Cache duration in milliseconds (15 minutes)
@@ -20,209 +56,518 @@ const REGISTRY_CACHE_DURATION = 15 * 60 * 1000;
20
56
  // Built-in registry of common MCP servers
21
57
  // This is used as a fallback when the remote registry is unavailable
22
58
  // Package versions verified against npm registry as of 2026-01
23
- const BUILTIN_REGISTRY = {
24
- version: '1.1.0',
25
- lastUpdated: new Date().toISOString(),
26
- servers: [
59
+ const BASE_BUILTIN_SERVERS = [
60
+ {
61
+ id: 'filesystem',
62
+ name: 'Filesystem',
63
+ description: 'Provides secure file system access with configurable root directories',
64
+ version: '2026.1.14',
65
+ author: 'Anthropic',
66
+ homepage: 'https://modelcontextprotocol.io',
67
+ repository: 'https://github.com/modelcontextprotocol/servers',
68
+ license: 'MIT',
69
+ installMethod: 'npm',
70
+ installCommand: 'npx',
71
+ packageName: '@modelcontextprotocol/server-filesystem',
72
+ transport: 'stdio',
73
+ defaultCommand: 'npx',
74
+ defaultArgs: ['-y', '@modelcontextprotocol/server-filesystem'],
75
+ tools: [
76
+ { name: 'read_file', description: 'Read complete file contents' },
77
+ { name: 'read_multiple_files', description: 'Read multiple files at once' },
78
+ { name: 'write_file', description: 'Write content to file' },
79
+ { name: 'edit_file', description: 'Edit file with line-based operations' },
80
+ { name: 'create_directory', description: 'Create a new directory' },
81
+ { name: 'list_directory', description: 'List directory contents' },
82
+ { name: 'directory_tree', description: 'Get recursive directory tree' },
83
+ { name: 'move_file', description: 'Move or rename files and directories' },
84
+ { name: 'search_files', description: 'Search for files matching pattern' },
85
+ { name: 'get_file_info', description: 'Get file metadata' },
86
+ ],
87
+ tags: ['filesystem', 'files', 'official'],
88
+ category: 'filesystem',
89
+ verified: true,
90
+ featured: true,
91
+ },
92
+ {
93
+ id: 'github',
94
+ name: 'GitHub',
95
+ description: 'Provides GitHub API integration for repository management. Requires GITHUB_PERSONAL_ACCESS_TOKEN.',
96
+ version: '2025.4.8',
97
+ author: 'Anthropic',
98
+ homepage: 'https://modelcontextprotocol.io',
99
+ repository: 'https://github.com/modelcontextprotocol/servers',
100
+ license: 'MIT',
101
+ installMethod: 'npm',
102
+ installCommand: 'npx',
103
+ packageName: '@modelcontextprotocol/server-github',
104
+ transport: 'stdio',
105
+ defaultCommand: 'npx',
106
+ defaultArgs: ['-y', '@modelcontextprotocol/server-github'],
107
+ defaultEnv: {
108
+ GITHUB_PERSONAL_ACCESS_TOKEN: '',
109
+ },
110
+ tools: [
111
+ { name: 'create_or_update_file', description: 'Create or update a file in a repository' },
112
+ { name: 'search_repositories', description: 'Search GitHub repositories' },
113
+ { name: 'create_repository', description: 'Create a new repository' },
114
+ { name: 'get_file_contents', description: 'Get contents of a file in a repository' },
115
+ { name: 'push_files', description: 'Push multiple files to a repository' },
116
+ { name: 'create_issue', description: 'Create a new issue' },
117
+ { name: 'create_pull_request', description: 'Create a pull request' },
118
+ { name: 'fork_repository', description: 'Fork a repository' },
119
+ { name: 'create_branch', description: 'Create a new branch' },
120
+ ],
121
+ tags: ['github', 'git', 'version-control', 'official'],
122
+ category: 'development',
123
+ verified: true,
124
+ featured: true,
125
+ },
126
+ {
127
+ id: 'puppeteer',
128
+ name: 'Puppeteer',
129
+ description: 'Browser automation and web scraping using Puppeteer',
130
+ version: '2025.5.12',
131
+ author: 'Anthropic',
132
+ homepage: 'https://modelcontextprotocol.io',
133
+ repository: 'https://github.com/modelcontextprotocol/servers',
134
+ license: 'MIT',
135
+ installMethod: 'npm',
136
+ installCommand: 'npx',
137
+ packageName: '@modelcontextprotocol/server-puppeteer',
138
+ transport: 'stdio',
139
+ defaultCommand: 'npx',
140
+ defaultArgs: ['-y', '@modelcontextprotocol/server-puppeteer'],
141
+ tools: [
142
+ { name: 'puppeteer_navigate', description: 'Navigate to a URL' },
143
+ { name: 'puppeteer_screenshot', description: 'Take a screenshot of the page' },
144
+ { name: 'puppeteer_click', description: 'Click an element on the page' },
145
+ { name: 'puppeteer_fill', description: 'Fill out an input field' },
146
+ { name: 'puppeteer_select', description: 'Select an option from a dropdown' },
147
+ { name: 'puppeteer_hover', description: 'Hover over an element' },
148
+ { name: 'puppeteer_evaluate', description: 'Execute JavaScript in the page' },
149
+ ],
150
+ tags: ['browser', 'automation', 'web', 'official'],
151
+ category: 'automation',
152
+ verified: true,
153
+ },
154
+ {
155
+ id: 'memory',
156
+ name: 'Memory',
157
+ description: 'Knowledge graph-based persistent memory system',
158
+ version: '2026.1.26',
159
+ author: 'Anthropic',
160
+ homepage: 'https://modelcontextprotocol.io',
161
+ repository: 'https://github.com/modelcontextprotocol/servers',
162
+ license: 'MIT',
163
+ installMethod: 'npm',
164
+ installCommand: 'npx',
165
+ packageName: '@modelcontextprotocol/server-memory',
166
+ transport: 'stdio',
167
+ defaultCommand: 'npx',
168
+ defaultArgs: ['-y', '@modelcontextprotocol/server-memory'],
169
+ tools: [
170
+ { name: 'create_entities', description: 'Create new entities in the knowledge graph' },
171
+ { name: 'create_relations', description: 'Create relations between entities' },
172
+ { name: 'add_observations', description: 'Add observations to entities' },
173
+ { name: 'delete_entities', description: 'Delete entities from the graph' },
174
+ { name: 'delete_observations', description: 'Delete observations from entities' },
175
+ { name: 'delete_relations', description: 'Delete relations between entities' },
176
+ { name: 'read_graph', description: 'Read the entire knowledge graph' },
177
+ { name: 'search_nodes', description: 'Search for nodes in the graph' },
178
+ { name: 'open_nodes', description: 'Open specific nodes by name' },
179
+ ],
180
+ tags: ['memory', 'knowledge-graph', 'persistence', 'official'],
181
+ category: 'memory',
182
+ verified: true,
183
+ },
184
+ {
185
+ id: 'postgres',
186
+ name: 'PostgreSQL',
187
+ description: 'PostgreSQL database read-only queries. Requires POSTGRES_CONNECTION_STRING.',
188
+ version: '0.6.2',
189
+ author: 'Anthropic',
190
+ homepage: 'https://modelcontextprotocol.io',
191
+ repository: 'https://github.com/modelcontextprotocol/servers',
192
+ license: 'MIT',
193
+ installMethod: 'npm',
194
+ installCommand: 'npx',
195
+ packageName: '@modelcontextprotocol/server-postgres',
196
+ transport: 'stdio',
197
+ defaultCommand: 'npx',
198
+ defaultArgs: ['-y', '@modelcontextprotocol/server-postgres'],
199
+ defaultEnv: {
200
+ POSTGRES_CONNECTION_STRING: '',
201
+ },
202
+ tools: [
203
+ { name: 'query', description: 'Execute a read-only SQL query' },
204
+ ],
205
+ tags: ['database', 'postgres', 'sql', 'official'],
206
+ category: 'database',
207
+ verified: true,
208
+ },
209
+ {
210
+ id: 'sequential-thinking',
211
+ name: 'Sequential Thinking',
212
+ description: 'MCP server for sequential thinking and problem solving',
213
+ version: '2025.12.18',
214
+ author: 'Anthropic',
215
+ homepage: 'https://modelcontextprotocol.io',
216
+ repository: 'https://github.com/modelcontextprotocol/servers',
217
+ license: 'MIT',
218
+ installMethod: 'npm',
219
+ installCommand: 'npx',
220
+ packageName: '@modelcontextprotocol/server-sequential-thinking',
221
+ transport: 'stdio',
222
+ defaultCommand: 'npx',
223
+ defaultArgs: ['-y', '@modelcontextprotocol/server-sequential-thinking'],
224
+ tools: [
225
+ { name: 'sequentialthinking', description: 'Sequential thinking and problem solving' },
226
+ ],
227
+ tags: ['thinking', 'reasoning', 'official'],
228
+ category: 'reasoning',
229
+ verified: true,
230
+ },
231
+ {
232
+ id: 'everything',
233
+ name: 'Everything (Demo)',
234
+ description: 'MCP server that exercises all features of the MCP protocol. Useful for testing.',
235
+ version: '2026.1.26',
236
+ author: 'Anthropic',
237
+ homepage: 'https://modelcontextprotocol.io',
238
+ repository: 'https://github.com/modelcontextprotocol/servers',
239
+ license: 'MIT',
240
+ installMethod: 'npm',
241
+ installCommand: 'npx',
242
+ packageName: '@modelcontextprotocol/server-everything',
243
+ transport: 'stdio',
244
+ defaultCommand: 'npx',
245
+ defaultArgs: ['-y', '@modelcontextprotocol/server-everything'],
246
+ tools: [
247
+ { name: 'echo', description: 'Echo back the input' },
248
+ { name: 'add', description: 'Add two numbers' },
249
+ { name: 'longRunningOperation', description: 'Test long-running operations' },
250
+ { name: 'sampleLLM', description: 'Sample from an LLM' },
251
+ { name: 'getTinyImage', description: 'Get a tiny test image' },
252
+ ],
253
+ tags: ['demo', 'testing', 'official'],
254
+ category: 'testing',
255
+ verified: true,
256
+ },
257
+ ];
258
+ const LOCAL_CONNECTOR_VERSION = '0.1.0';
259
+ function getConnectorScriptPath(connectorName) {
260
+ const baseDir = electron_1.app.isPackaged
261
+ ? path.join(process.resourcesPath, 'connectors')
262
+ : path.join(process.cwd(), 'connectors');
263
+ return path.join(baseDir, connectorName, 'dist', 'index.js');
264
+ }
265
+ function getConnectorCommandArgs(connectorName) {
266
+ const scriptPath = getConnectorScriptPath(connectorName);
267
+ return {
268
+ // Use Electron's bundled Node runtime when possible
269
+ command: process.execPath,
270
+ args: ['--runAsNode', scriptPath],
271
+ };
272
+ }
273
+ function getConnectorEntries() {
274
+ const salesforceCommand = getConnectorCommandArgs('salesforce-mcp');
275
+ const jiraCommand = getConnectorCommandArgs('jira-mcp');
276
+ const hubspotCommand = getConnectorCommandArgs('hubspot-mcp');
277
+ const zendeskCommand = getConnectorCommandArgs('zendesk-mcp');
278
+ const servicenowCommand = getConnectorCommandArgs('servicenow-mcp');
279
+ const linearCommand = getConnectorCommandArgs('linear-mcp');
280
+ const asanaCommand = getConnectorCommandArgs('asana-mcp');
281
+ const oktaCommand = getConnectorCommandArgs('okta-mcp');
282
+ return [
27
283
  {
28
- id: 'filesystem',
29
- name: 'Filesystem',
30
- description: 'Provides secure file system access with configurable root directories',
31
- version: '2026.1.14',
32
- author: 'Anthropic',
33
- homepage: 'https://modelcontextprotocol.io',
34
- repository: 'https://github.com/modelcontextprotocol/servers',
284
+ id: 'salesforce',
285
+ name: 'Salesforce',
286
+ description: 'Salesforce CRM connector for CoWork OS. Requires SALESFORCE_INSTANCE_URL and an access token.',
287
+ version: LOCAL_CONNECTOR_VERSION,
288
+ author: 'CoWork OS',
289
+ homepage: 'https://github.com/CoWork-OS/CoWork-OS',
290
+ repository: 'https://github.com/CoWork-OS/CoWork-OS',
35
291
  license: 'MIT',
36
- installMethod: 'npm',
37
- installCommand: 'npx',
38
- packageName: '@modelcontextprotocol/server-filesystem',
292
+ installMethod: 'manual',
39
293
  transport: 'stdio',
40
- defaultCommand: 'npx',
41
- defaultArgs: ['-y', '@modelcontextprotocol/server-filesystem'],
294
+ defaultCommand: salesforceCommand.command,
295
+ defaultArgs: salesforceCommand.args,
296
+ defaultEnv: {
297
+ SALESFORCE_INSTANCE_URL: '',
298
+ SALESFORCE_ACCESS_TOKEN: '',
299
+ SALESFORCE_CLIENT_ID: '',
300
+ SALESFORCE_CLIENT_SECRET: '',
301
+ SALESFORCE_REFRESH_TOKEN: '',
302
+ SALESFORCE_LOGIN_URL: 'https://login.salesforce.com',
303
+ SALESFORCE_API_VERSION: '60.0',
304
+ },
42
305
  tools: [
43
- { name: 'read_file', description: 'Read complete file contents' },
44
- { name: 'read_multiple_files', description: 'Read multiple files at once' },
45
- { name: 'write_file', description: 'Write content to file' },
46
- { name: 'edit_file', description: 'Edit file with line-based operations' },
47
- { name: 'create_directory', description: 'Create a new directory' },
48
- { name: 'list_directory', description: 'List directory contents' },
49
- { name: 'directory_tree', description: 'Get recursive directory tree' },
50
- { name: 'move_file', description: 'Move or rename files and directories' },
51
- { name: 'search_files', description: 'Search for files matching pattern' },
52
- { name: 'get_file_info', description: 'Get file metadata' },
306
+ { name: 'salesforce.health', description: 'Check connector health and auth status' },
307
+ { name: 'salesforce.list_objects', description: 'List available Salesforce objects' },
308
+ { name: 'salesforce.describe_object', description: 'Describe an object and its fields' },
309
+ { name: 'salesforce.get_record', description: 'Fetch a record by id' },
310
+ { name: 'salesforce.search_records', description: 'Run a SOQL query' },
311
+ { name: 'salesforce.create_record', description: 'Create a record' },
312
+ { name: 'salesforce.update_record', description: 'Update a record' },
53
313
  ],
54
- tags: ['filesystem', 'files', 'official'],
55
- category: 'filesystem',
314
+ tags: ['salesforce', 'crm', 'enterprise', 'connector'],
315
+ category: 'enterprise',
56
316
  verified: true,
57
317
  featured: true,
58
318
  },
59
319
  {
60
- id: 'github',
61
- name: 'GitHub',
62
- description: 'Provides GitHub API integration for repository management. Requires GITHUB_PERSONAL_ACCESS_TOKEN.',
63
- version: '2025.4.8',
64
- author: 'Anthropic',
65
- homepage: 'https://modelcontextprotocol.io',
66
- repository: 'https://github.com/modelcontextprotocol/servers',
320
+ id: 'jira',
321
+ name: 'Jira',
322
+ description: 'Jira Cloud connector for CoWork OS. Requires JIRA_BASE_URL and auth (token or API token).',
323
+ version: LOCAL_CONNECTOR_VERSION,
324
+ author: 'CoWork OS',
325
+ homepage: 'https://github.com/CoWork-OS/CoWork-OS',
326
+ repository: 'https://github.com/CoWork-OS/CoWork-OS',
67
327
  license: 'MIT',
68
- installMethod: 'npm',
69
- installCommand: 'npx',
70
- packageName: '@modelcontextprotocol/server-github',
328
+ installMethod: 'manual',
71
329
  transport: 'stdio',
72
- defaultCommand: 'npx',
73
- defaultArgs: ['-y', '@modelcontextprotocol/server-github'],
330
+ defaultCommand: jiraCommand.command,
331
+ defaultArgs: jiraCommand.args,
74
332
  defaultEnv: {
75
- GITHUB_PERSONAL_ACCESS_TOKEN: '',
333
+ JIRA_BASE_URL: '',
334
+ JIRA_ACCESS_TOKEN: '',
335
+ JIRA_EMAIL: '',
336
+ JIRA_API_TOKEN: '',
337
+ JIRA_CLIENT_ID: '',
338
+ JIRA_CLIENT_SECRET: '',
339
+ JIRA_REFRESH_TOKEN: '',
340
+ JIRA_API_VERSION: '3',
76
341
  },
77
342
  tools: [
78
- { name: 'create_or_update_file', description: 'Create or update a file in a repository' },
79
- { name: 'search_repositories', description: 'Search GitHub repositories' },
80
- { name: 'create_repository', description: 'Create a new repository' },
81
- { name: 'get_file_contents', description: 'Get contents of a file in a repository' },
82
- { name: 'push_files', description: 'Push multiple files to a repository' },
83
- { name: 'create_issue', description: 'Create a new issue' },
84
- { name: 'create_pull_request', description: 'Create a pull request' },
85
- { name: 'fork_repository', description: 'Fork a repository' },
86
- { name: 'create_branch', description: 'Create a new branch' },
343
+ { name: 'jira.health', description: 'Check connector health and auth status' },
344
+ { name: 'jira.list_projects', description: 'List Jira projects' },
345
+ { name: 'jira.get_issue', description: 'Fetch an issue by id or key' },
346
+ { name: 'jira.search_issues', description: 'Run a JQL query' },
347
+ { name: 'jira.create_issue', description: 'Create an issue' },
348
+ { name: 'jira.update_issue', description: 'Update an issue' },
87
349
  ],
88
- tags: ['github', 'git', 'version-control', 'official'],
89
- category: 'development',
350
+ tags: ['jira', 'issue-tracking', 'enterprise', 'connector'],
351
+ category: 'enterprise',
90
352
  verified: true,
91
353
  featured: true,
92
354
  },
93
355
  {
94
- id: 'puppeteer',
95
- name: 'Puppeteer',
96
- description: 'Browser automation and web scraping using Puppeteer',
97
- version: '2025.5.12',
98
- author: 'Anthropic',
99
- homepage: 'https://modelcontextprotocol.io',
100
- repository: 'https://github.com/modelcontextprotocol/servers',
356
+ id: 'hubspot',
357
+ name: 'HubSpot',
358
+ description: 'HubSpot CRM connector for CoWork OS. Requires HUBSPOT_ACCESS_TOKEN.',
359
+ version: LOCAL_CONNECTOR_VERSION,
360
+ author: 'CoWork OS',
361
+ homepage: 'https://github.com/CoWork-OS/CoWork-OS',
362
+ repository: 'https://github.com/CoWork-OS/CoWork-OS',
101
363
  license: 'MIT',
102
- installMethod: 'npm',
103
- installCommand: 'npx',
104
- packageName: '@modelcontextprotocol/server-puppeteer',
364
+ installMethod: 'manual',
105
365
  transport: 'stdio',
106
- defaultCommand: 'npx',
107
- defaultArgs: ['-y', '@modelcontextprotocol/server-puppeteer'],
366
+ defaultCommand: hubspotCommand.command,
367
+ defaultArgs: hubspotCommand.args,
368
+ defaultEnv: {
369
+ HUBSPOT_ACCESS_TOKEN: '',
370
+ HUBSPOT_CLIENT_ID: '',
371
+ HUBSPOT_CLIENT_SECRET: '',
372
+ HUBSPOT_REFRESH_TOKEN: '',
373
+ HUBSPOT_BASE_URL: 'https://api.hubapi.com',
374
+ },
108
375
  tools: [
109
- { name: 'puppeteer_navigate', description: 'Navigate to a URL' },
110
- { name: 'puppeteer_screenshot', description: 'Take a screenshot of the page' },
111
- { name: 'puppeteer_click', description: 'Click an element on the page' },
112
- { name: 'puppeteer_fill', description: 'Fill out an input field' },
113
- { name: 'puppeteer_select', description: 'Select an option from a dropdown' },
114
- { name: 'puppeteer_hover', description: 'Hover over an element' },
115
- { name: 'puppeteer_evaluate', description: 'Execute JavaScript in the page' },
376
+ { name: 'hubspot.health', description: 'Check connector health and auth status' },
377
+ { name: 'hubspot.search_objects', description: 'Search CRM objects' },
378
+ { name: 'hubspot.get_object', description: 'Fetch a CRM object by id' },
379
+ { name: 'hubspot.create_object', description: 'Create a CRM object' },
380
+ { name: 'hubspot.update_object', description: 'Update a CRM object' },
116
381
  ],
117
- tags: ['browser', 'automation', 'web', 'official'],
118
- category: 'automation',
382
+ tags: ['hubspot', 'crm', 'enterprise', 'connector'],
383
+ category: 'enterprise',
119
384
  verified: true,
120
385
  },
121
386
  {
122
- id: 'memory',
123
- name: 'Memory',
124
- description: 'Knowledge graph-based persistent memory system',
125
- version: '2026.1.26',
126
- author: 'Anthropic',
127
- homepage: 'https://modelcontextprotocol.io',
128
- repository: 'https://github.com/modelcontextprotocol/servers',
387
+ id: 'zendesk',
388
+ name: 'Zendesk',
389
+ description: 'Zendesk Support connector for CoWork OS. Requires ZENDESK credentials.',
390
+ version: LOCAL_CONNECTOR_VERSION,
391
+ author: 'CoWork OS',
392
+ homepage: 'https://github.com/CoWork-OS/CoWork-OS',
393
+ repository: 'https://github.com/CoWork-OS/CoWork-OS',
129
394
  license: 'MIT',
130
- installMethod: 'npm',
131
- installCommand: 'npx',
132
- packageName: '@modelcontextprotocol/server-memory',
395
+ installMethod: 'manual',
133
396
  transport: 'stdio',
134
- defaultCommand: 'npx',
135
- defaultArgs: ['-y', '@modelcontextprotocol/server-memory'],
397
+ defaultCommand: zendeskCommand.command,
398
+ defaultArgs: zendeskCommand.args,
399
+ defaultEnv: {
400
+ ZENDESK_SUBDOMAIN: '',
401
+ ZENDESK_EMAIL: '',
402
+ ZENDESK_API_TOKEN: '',
403
+ ZENDESK_ACCESS_TOKEN: '',
404
+ ZENDESK_CLIENT_ID: '',
405
+ ZENDESK_CLIENT_SECRET: '',
406
+ ZENDESK_REFRESH_TOKEN: '',
407
+ },
136
408
  tools: [
137
- { name: 'create_entities', description: 'Create new entities in the knowledge graph' },
138
- { name: 'create_relations', description: 'Create relations between entities' },
139
- { name: 'add_observations', description: 'Add observations to entities' },
140
- { name: 'delete_entities', description: 'Delete entities from the graph' },
141
- { name: 'delete_observations', description: 'Delete observations from entities' },
142
- { name: 'delete_relations', description: 'Delete relations between entities' },
143
- { name: 'read_graph', description: 'Read the entire knowledge graph' },
144
- { name: 'search_nodes', description: 'Search for nodes in the graph' },
145
- { name: 'open_nodes', description: 'Open specific nodes by name' },
409
+ { name: 'zendesk.health', description: 'Check connector health and auth status' },
410
+ { name: 'zendesk.search_tickets', description: 'Search Zendesk tickets' },
411
+ { name: 'zendesk.get_ticket', description: 'Fetch a ticket by id' },
412
+ { name: 'zendesk.create_ticket', description: 'Create a ticket' },
413
+ { name: 'zendesk.update_ticket', description: 'Update a ticket' },
146
414
  ],
147
- tags: ['memory', 'knowledge-graph', 'persistence', 'official'],
148
- category: 'memory',
415
+ tags: ['zendesk', 'support', 'enterprise', 'connector'],
416
+ category: 'enterprise',
149
417
  verified: true,
150
418
  },
151
419
  {
152
- id: 'postgres',
153
- name: 'PostgreSQL',
154
- description: 'PostgreSQL database read-only queries. Requires POSTGRES_CONNECTION_STRING.',
155
- version: '0.6.2',
156
- author: 'Anthropic',
157
- homepage: 'https://modelcontextprotocol.io',
158
- repository: 'https://github.com/modelcontextprotocol/servers',
420
+ id: 'servicenow',
421
+ name: 'ServiceNow',
422
+ description: 'ServiceNow connector for CoWork OS. Requires instance URL and credentials.',
423
+ version: LOCAL_CONNECTOR_VERSION,
424
+ author: 'CoWork OS',
425
+ homepage: 'https://github.com/CoWork-OS/CoWork-OS',
426
+ repository: 'https://github.com/CoWork-OS/CoWork-OS',
159
427
  license: 'MIT',
160
- installMethod: 'npm',
161
- installCommand: 'npx',
162
- packageName: '@modelcontextprotocol/server-postgres',
428
+ installMethod: 'manual',
163
429
  transport: 'stdio',
164
- defaultCommand: 'npx',
165
- defaultArgs: ['-y', '@modelcontextprotocol/server-postgres'],
430
+ defaultCommand: servicenowCommand.command,
431
+ defaultArgs: servicenowCommand.args,
166
432
  defaultEnv: {
167
- POSTGRES_CONNECTION_STRING: '',
433
+ SERVICENOW_INSTANCE_URL: '',
434
+ SERVICENOW_INSTANCE: '',
435
+ SERVICENOW_USERNAME: '',
436
+ SERVICENOW_PASSWORD: '',
437
+ SERVICENOW_ACCESS_TOKEN: '',
168
438
  },
169
439
  tools: [
170
- { name: 'query', description: 'Execute a read-only SQL query' },
440
+ { name: 'servicenow.health', description: 'Check connector health and auth status' },
441
+ { name: 'servicenow.list_records', description: 'List records from a table' },
442
+ { name: 'servicenow.get_record', description: 'Fetch a record by sys_id' },
443
+ { name: 'servicenow.create_record', description: 'Create a record in a table' },
444
+ { name: 'servicenow.update_record', description: 'Update a record in a table' },
171
445
  ],
172
- tags: ['database', 'postgres', 'sql', 'official'],
173
- category: 'database',
446
+ tags: ['servicenow', 'itsm', 'enterprise', 'connector'],
447
+ category: 'enterprise',
174
448
  verified: true,
175
449
  },
176
450
  {
177
- id: 'sequential-thinking',
178
- name: 'Sequential Thinking',
179
- description: 'MCP server for sequential thinking and problem solving',
180
- version: '2025.12.18',
181
- author: 'Anthropic',
182
- homepage: 'https://modelcontextprotocol.io',
183
- repository: 'https://github.com/modelcontextprotocol/servers',
451
+ id: 'linear',
452
+ name: 'Linear',
453
+ description: 'Linear GraphQL connector for CoWork OS. Requires LINEAR_API_KEY.',
454
+ version: LOCAL_CONNECTOR_VERSION,
455
+ author: 'CoWork OS',
456
+ homepage: 'https://github.com/CoWork-OS/CoWork-OS',
457
+ repository: 'https://github.com/CoWork-OS/CoWork-OS',
184
458
  license: 'MIT',
185
- installMethod: 'npm',
186
- installCommand: 'npx',
187
- packageName: '@modelcontextprotocol/server-sequential-thinking',
459
+ installMethod: 'manual',
188
460
  transport: 'stdio',
189
- defaultCommand: 'npx',
190
- defaultArgs: ['-y', '@modelcontextprotocol/server-sequential-thinking'],
461
+ defaultCommand: linearCommand.command,
462
+ defaultArgs: linearCommand.args,
463
+ defaultEnv: {
464
+ LINEAR_API_KEY: '',
465
+ },
191
466
  tools: [
192
- { name: 'sequentialthinking', description: 'Sequential thinking and problem solving' },
467
+ { name: 'linear.health', description: 'Check connector health and auth status' },
468
+ { name: 'linear.list_projects', description: 'List Linear projects' },
469
+ { name: 'linear.search_issues', description: 'Search issues by title' },
470
+ { name: 'linear.get_issue', description: 'Fetch an issue by id' },
193
471
  ],
194
- tags: ['thinking', 'reasoning', 'official'],
195
- category: 'reasoning',
472
+ tags: ['linear', 'project', 'enterprise', 'connector'],
473
+ category: 'enterprise',
196
474
  verified: true,
197
475
  },
198
476
  {
199
- id: 'everything',
200
- name: 'Everything (Demo)',
201
- description: 'MCP server that exercises all features of the MCP protocol. Useful for testing.',
202
- version: '2026.1.26',
203
- author: 'Anthropic',
204
- homepage: 'https://modelcontextprotocol.io',
205
- repository: 'https://github.com/modelcontextprotocol/servers',
477
+ id: 'asana',
478
+ name: 'Asana',
479
+ description: 'Asana connector for CoWork OS. Requires ASANA_ACCESS_TOKEN.',
480
+ version: LOCAL_CONNECTOR_VERSION,
481
+ author: 'CoWork OS',
482
+ homepage: 'https://github.com/CoWork-OS/CoWork-OS',
483
+ repository: 'https://github.com/CoWork-OS/CoWork-OS',
206
484
  license: 'MIT',
207
- installMethod: 'npm',
208
- installCommand: 'npx',
209
- packageName: '@modelcontextprotocol/server-everything',
485
+ installMethod: 'manual',
210
486
  transport: 'stdio',
211
- defaultCommand: 'npx',
212
- defaultArgs: ['-y', '@modelcontextprotocol/server-everything'],
487
+ defaultCommand: asanaCommand.command,
488
+ defaultArgs: asanaCommand.args,
489
+ defaultEnv: {
490
+ ASANA_ACCESS_TOKEN: '',
491
+ },
213
492
  tools: [
214
- { name: 'echo', description: 'Echo back the input' },
215
- { name: 'add', description: 'Add two numbers' },
216
- { name: 'longRunningOperation', description: 'Test long-running operations' },
217
- { name: 'sampleLLM', description: 'Sample from an LLM' },
218
- { name: 'getTinyImage', description: 'Get a tiny test image' },
493
+ { name: 'asana.health', description: 'Check connector health and auth status' },
494
+ { name: 'asana.list_projects', description: 'List projects in a workspace' },
495
+ { name: 'asana.get_task', description: 'Fetch a task by id' },
496
+ { name: 'asana.search_tasks', description: 'Search tasks in a workspace' },
497
+ { name: 'asana.create_task', description: 'Create a task' },
498
+ { name: 'asana.update_task', description: 'Update a task' },
219
499
  ],
220
- tags: ['demo', 'testing', 'official'],
221
- category: 'testing',
500
+ tags: ['asana', 'project', 'enterprise', 'connector'],
501
+ category: 'enterprise',
222
502
  verified: true,
223
503
  },
224
- ],
225
- };
504
+ {
505
+ id: 'okta',
506
+ name: 'Okta',
507
+ description: 'Okta connector for CoWork OS. Requires OKTA_BASE_URL and OKTA_API_TOKEN.',
508
+ version: LOCAL_CONNECTOR_VERSION,
509
+ author: 'CoWork OS',
510
+ homepage: 'https://github.com/CoWork-OS/CoWork-OS',
511
+ repository: 'https://github.com/CoWork-OS/CoWork-OS',
512
+ license: 'MIT',
513
+ installMethod: 'manual',
514
+ transport: 'stdio',
515
+ defaultCommand: oktaCommand.command,
516
+ defaultArgs: oktaCommand.args,
517
+ defaultEnv: {
518
+ OKTA_BASE_URL: '',
519
+ OKTA_API_TOKEN: '',
520
+ },
521
+ tools: [
522
+ { name: 'okta.health', description: 'Check connector health and auth status' },
523
+ { name: 'okta.list_users', description: 'List users' },
524
+ { name: 'okta.get_user', description: 'Fetch a user by id' },
525
+ { name: 'okta.create_user', description: 'Create a user' },
526
+ { name: 'okta.update_user', description: 'Update a user' },
527
+ ],
528
+ tags: ['okta', 'identity', 'enterprise', 'connector'],
529
+ category: 'enterprise',
530
+ verified: true,
531
+ },
532
+ ];
533
+ }
534
+ function getBuiltinRegistry() {
535
+ return {
536
+ version: '1.1.0',
537
+ lastUpdated: new Date().toISOString(),
538
+ servers: [...BASE_BUILTIN_SERVERS, ...getConnectorEntries()],
539
+ };
540
+ }
541
+ function mergeLocalConnectors(registry) {
542
+ const localConnectors = getConnectorEntries();
543
+ const existingIds = new Set(registry.servers.map((s) => s.id));
544
+ const existingNames = new Set(registry.servers.map((s) => s.name.toLowerCase()));
545
+ const mergedServers = [...registry.servers];
546
+ for (const connector of localConnectors) {
547
+ if (existingIds.has(connector.id) || existingNames.has(connector.name.toLowerCase())) {
548
+ continue;
549
+ }
550
+ mergedServers.push(connector);
551
+ }
552
+ return {
553
+ ...registry,
554
+ servers: mergedServers,
555
+ };
556
+ }
557
+ function validateManualEntry(entry) {
558
+ if (entry.installMethod !== 'manual')
559
+ return;
560
+ const command = entry.defaultCommand || entry.installCommand;
561
+ if (!command) {
562
+ throw new Error(`Manual server ${entry.name} is missing a command`);
563
+ }
564
+ const args = entry.defaultArgs || [];
565
+ const scriptPath = args.find((arg) => /\.(c|m)?js$/i.test(arg));
566
+ if (scriptPath && !fs.existsSync(scriptPath)) {
567
+ throw new Error(`Connector script not found at ${scriptPath}. ` +
568
+ `Build connectors first (npm run build:connectors) or reinstall.`);
569
+ }
570
+ }
226
571
  class MCPRegistryManager {
227
572
  /**
228
573
  * Fetch the MCP server registry
@@ -235,7 +580,7 @@ class MCPRegistryManager {
235
580
  const settings = settings_1.MCPSettingsManager.loadSettings();
236
581
  if (!settings.registryEnabled) {
237
582
  console.log('[MCPRegistryManager] Registry disabled, using built-in registry');
238
- return BUILTIN_REGISTRY;
583
+ return getBuiltinRegistry();
239
584
  }
240
585
  try {
241
586
  console.log(`[MCPRegistryManager] Fetching registry from ${settings.registryUrl}`);
@@ -253,11 +598,13 @@ class MCPRegistryManager {
253
598
  if (!registry.version || !Array.isArray(registry.servers)) {
254
599
  throw new Error('Invalid registry format');
255
600
  }
601
+ // Merge local connectors into remote registry
602
+ const mergedRegistry = mergeLocalConnectors(registry);
256
603
  // Update cache
257
- this.registryCache = registry;
604
+ this.registryCache = mergedRegistry;
258
605
  this.cacheTimestamp = Date.now();
259
- console.log(`[MCPRegistryManager] Fetched ${registry.servers.length} servers from registry`);
260
- return registry;
606
+ console.log(`[MCPRegistryManager] Fetched ${mergedRegistry.servers.length} servers from registry (with local connectors)`);
607
+ return mergedRegistry;
261
608
  }
262
609
  catch (error) {
263
610
  // Only log on first failure or after cache expires
@@ -265,9 +612,9 @@ class MCPRegistryManager {
265
612
  console.warn('[MCPRegistryManager] Failed to fetch registry, using built-in:', error.message);
266
613
  }
267
614
  // Cache the built-in registry to prevent repeated fetch attempts
268
- this.registryCache = BUILTIN_REGISTRY;
615
+ this.registryCache = getBuiltinRegistry();
269
616
  this.cacheTimestamp = Date.now();
270
- return BUILTIN_REGISTRY;
617
+ return this.registryCache;
271
618
  }
272
619
  }
273
620
  /**
@@ -349,6 +696,8 @@ class MCPRegistryManager {
349
696
  if (existingIndex !== -1) {
350
697
  throw new Error(`Server ${entry.name} is already installed`);
351
698
  }
699
+ // Validate manual entries (local connectors)
700
+ validateManualEntry(entry);
352
701
  // Verify the npm package exists before installing
353
702
  if (entry.packageName && entry.installMethod === 'npm') {
354
703
  const verification = await this.verifyNpmPackage(entry.packageName);