cowork-os 0.3.21 → 0.3.23

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 (170) hide show
  1. package/README.md +293 -6
  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/daemon.js +25 -0
  48. package/dist/electron/electron/agent/executor.js +181 -26
  49. package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +177 -0
  50. package/dist/electron/electron/agent/llm/github-copilot-provider.js +97 -0
  51. package/dist/electron/electron/agent/llm/groq-provider.js +33 -0
  52. package/dist/electron/electron/agent/llm/index.js +11 -1
  53. package/dist/electron/electron/agent/llm/kimi-provider.js +33 -0
  54. package/dist/electron/electron/agent/llm/openai-compatible-provider.js +116 -0
  55. package/dist/electron/electron/agent/llm/openai-compatible.js +111 -0
  56. package/dist/electron/electron/agent/llm/openai-oauth.js +2 -1
  57. package/dist/electron/electron/agent/llm/openrouter-provider.js +1 -1
  58. package/dist/electron/electron/agent/llm/provider-factory.js +318 -4
  59. package/dist/electron/electron/agent/llm/types.js +66 -1
  60. package/dist/electron/electron/agent/llm/xai-provider.js +33 -0
  61. package/dist/electron/electron/agent/tools/box-tools.js +231 -0
  62. package/dist/electron/electron/agent/tools/builtin-settings.js +28 -0
  63. package/dist/electron/electron/agent/tools/dropbox-tools.js +237 -0
  64. package/dist/electron/electron/agent/tools/google-drive-tools.js +227 -0
  65. package/dist/electron/electron/agent/tools/notion-tools.js +312 -0
  66. package/dist/electron/electron/agent/tools/onedrive-tools.js +217 -0
  67. package/dist/electron/electron/agent/tools/registry.js +541 -0
  68. package/dist/electron/electron/agent/tools/sharepoint-tools.js +243 -0
  69. package/dist/electron/electron/agent/tools/shell-tools.js +12 -3
  70. package/dist/electron/electron/agent/tools/x-tools.js +1 -1
  71. package/dist/electron/electron/gateway/index.js +1 -0
  72. package/dist/electron/electron/gateway/router.js +123 -143
  73. package/dist/electron/electron/ipc/canvas-handlers.js +5 -0
  74. package/dist/electron/electron/ipc/handlers.js +627 -158
  75. package/dist/electron/electron/main.js +63 -0
  76. package/dist/electron/electron/mcp/oauth/connector-oauth.js +333 -0
  77. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +503 -154
  78. package/dist/electron/electron/memory/MemoryService.js +1 -1
  79. package/dist/electron/electron/preload.js +74 -1
  80. package/dist/electron/electron/settings/box-manager.js +54 -0
  81. package/dist/electron/electron/settings/dropbox-manager.js +54 -0
  82. package/dist/electron/electron/settings/google-drive-manager.js +54 -0
  83. package/dist/electron/electron/settings/notion-manager.js +56 -0
  84. package/dist/electron/electron/settings/onedrive-manager.js +54 -0
  85. package/dist/electron/electron/settings/sharepoint-manager.js +54 -0
  86. package/dist/electron/electron/utils/box-api.js +153 -0
  87. package/dist/electron/electron/utils/dropbox-api.js +144 -0
  88. package/dist/electron/electron/utils/env-migration.js +19 -0
  89. package/dist/electron/electron/utils/google-drive-api.js +152 -0
  90. package/dist/electron/electron/utils/notion-api.js +103 -0
  91. package/dist/electron/electron/utils/onedrive-api.js +113 -0
  92. package/dist/electron/electron/utils/sharepoint-api.js +109 -0
  93. package/dist/electron/electron/utils/validation.js +82 -3
  94. package/dist/electron/electron/utils/x-cli.js +1 -1
  95. package/dist/electron/shared/channelMessages.js +284 -3
  96. package/dist/electron/shared/llm-provider-catalog.js +198 -0
  97. package/dist/electron/shared/types.js +88 -1
  98. package/package.json +12 -2
  99. package/src/electron/agent/executor.ts +205 -28
  100. package/src/electron/agent/llm/anthropic-compatible-provider.ts +214 -0
  101. package/src/electron/agent/llm/github-copilot-provider.ts +117 -0
  102. package/src/electron/agent/llm/groq-provider.ts +39 -0
  103. package/src/electron/agent/llm/index.ts +5 -0
  104. package/src/electron/agent/llm/kimi-provider.ts +39 -0
  105. package/src/electron/agent/llm/openai-compatible-provider.ts +153 -0
  106. package/src/electron/agent/llm/openai-compatible.ts +133 -0
  107. package/src/electron/agent/llm/openai-oauth.ts +2 -1
  108. package/src/electron/agent/llm/openrouter-provider.ts +2 -1
  109. package/src/electron/agent/llm/provider-factory.ts +414 -6
  110. package/src/electron/agent/llm/types.ts +90 -1
  111. package/src/electron/agent/llm/xai-provider.ts +39 -0
  112. package/src/electron/agent/tools/box-tools.ts +239 -0
  113. package/src/electron/agent/tools/builtin-settings.ts +34 -0
  114. package/src/electron/agent/tools/dropbox-tools.ts +237 -0
  115. package/src/electron/agent/tools/google-drive-tools.ts +228 -0
  116. package/src/electron/agent/tools/notion-tools.ts +330 -0
  117. package/src/electron/agent/tools/onedrive-tools.ts +217 -0
  118. package/src/electron/agent/tools/registry.ts +565 -0
  119. package/src/electron/agent/tools/sharepoint-tools.ts +247 -0
  120. package/src/electron/agent/tools/shell-tools.ts +11 -3
  121. package/src/electron/agent/tools/x-tools.ts +1 -1
  122. package/src/electron/database/SecureSettingsRepository.ts +7 -1
  123. package/src/electron/gateway/index.ts +1 -0
  124. package/src/electron/gateway/router.ts +134 -149
  125. package/src/electron/ipc/canvas-handlers.ts +10 -0
  126. package/src/electron/ipc/handlers.ts +673 -153
  127. package/src/electron/main.ts +35 -0
  128. package/src/electron/mcp/oauth/connector-oauth.ts +448 -0
  129. package/src/electron/mcp/registry/MCPRegistryManager.ts +343 -12
  130. package/src/electron/memory/MemoryService.ts +5 -1
  131. package/src/electron/preload.ts +167 -4
  132. package/src/electron/settings/box-manager.ts +58 -0
  133. package/src/electron/settings/dropbox-manager.ts +58 -0
  134. package/src/electron/settings/google-drive-manager.ts +58 -0
  135. package/src/electron/settings/notion-manager.ts +60 -0
  136. package/src/electron/settings/onedrive-manager.ts +58 -0
  137. package/src/electron/settings/sharepoint-manager.ts +58 -0
  138. package/src/electron/utils/box-api.ts +184 -0
  139. package/src/electron/utils/dropbox-api.ts +171 -0
  140. package/src/electron/utils/env-migration.ts +22 -0
  141. package/src/electron/utils/google-drive-api.ts +183 -0
  142. package/src/electron/utils/notion-api.ts +126 -0
  143. package/src/electron/utils/onedrive-api.ts +137 -0
  144. package/src/electron/utils/sharepoint-api.ts +132 -0
  145. package/src/electron/utils/validation.ts +102 -1
  146. package/src/electron/utils/x-cli.ts +1 -1
  147. package/src/renderer/App.tsx +20 -2
  148. package/src/renderer/components/BoxSettings.tsx +203 -0
  149. package/src/renderer/components/BrowserView.tsx +101 -0
  150. package/src/renderer/components/BuiltinToolsSettings.tsx +105 -0
  151. package/src/renderer/components/CanvasPreview.tsx +68 -1
  152. package/src/renderer/components/ConnectorEnvModal.tsx +116 -0
  153. package/src/renderer/components/ConnectorSetupModal.tsx +566 -0
  154. package/src/renderer/components/ConnectorsSettings.tsx +397 -0
  155. package/src/renderer/components/DropboxSettings.tsx +202 -0
  156. package/src/renderer/components/GoogleDriveSettings.tsx +201 -0
  157. package/src/renderer/components/MCPSettings.tsx +56 -0
  158. package/src/renderer/components/MainContent.tsx +270 -34
  159. package/src/renderer/components/NotionSettings.tsx +231 -0
  160. package/src/renderer/components/Onboarding/Onboarding.tsx +13 -1
  161. package/src/renderer/components/OnboardingModal.tsx +70 -1
  162. package/src/renderer/components/OneDriveSettings.tsx +212 -0
  163. package/src/renderer/components/Settings.tsx +611 -8
  164. package/src/renderer/components/SharePointSettings.tsx +224 -0
  165. package/src/renderer/components/Sidebar.tsx +25 -9
  166. package/src/renderer/hooks/useOnboardingFlow.ts +21 -0
  167. package/src/renderer/styles/index.css +438 -25
  168. package/src/shared/channelMessages.ts +367 -4
  169. package/src/shared/llm-provider-catalog.ts +217 -0
  170. package/src/shared/types.ts +226 -1
@@ -0,0 +1,330 @@
1
+ import * as readline from 'readline';
2
+
3
+ // ==================== MCP Types ====================
4
+
5
+ type JSONRPCId = string | number;
6
+
7
+ type JSONRPCRequest = {
8
+ jsonrpc: '2.0';
9
+ id: JSONRPCId;
10
+ method: string;
11
+ params?: Record<string, any>;
12
+ };
13
+
14
+ type JSONRPCNotification = {
15
+ jsonrpc: '2.0';
16
+ method: string;
17
+ params?: Record<string, any>;
18
+ };
19
+
20
+ type JSONRPCResponse = {
21
+ jsonrpc: '2.0';
22
+ id: JSONRPCId;
23
+ result?: any;
24
+ error?: { code: number; message: string; data?: any };
25
+ };
26
+
27
+ type MCPToolProperty = {
28
+ type: string;
29
+ description?: string;
30
+ enum?: string[];
31
+ default?: any;
32
+ items?: MCPToolProperty;
33
+ properties?: Record<string, MCPToolProperty>;
34
+ required?: string[];
35
+ };
36
+
37
+ type MCPTool = {
38
+ name: string;
39
+ description?: string;
40
+ inputSchema: {
41
+ type: 'object';
42
+ properties?: Record<string, MCPToolProperty>;
43
+ required?: string[];
44
+ additionalProperties?: boolean;
45
+ };
46
+ };
47
+
48
+ type MCPServerInfo = {
49
+ name: string;
50
+ version: string;
51
+ protocolVersion?: string;
52
+ capabilities?: {
53
+ tools?: { listChanged?: boolean };
54
+ };
55
+ };
56
+
57
+ const PROTOCOL_VERSION = '2024-11-05';
58
+
59
+ const MCP_METHODS = {
60
+ INITIALIZE: 'initialize',
61
+ INITIALIZED: 'notifications/initialized',
62
+ SHUTDOWN: 'shutdown',
63
+ TOOLS_LIST: 'tools/list',
64
+ TOOLS_CALL: 'tools/call',
65
+ } as const;
66
+
67
+ const MCP_ERROR_CODES = {
68
+ PARSE_ERROR: -32700,
69
+ INVALID_REQUEST: -32600,
70
+ METHOD_NOT_FOUND: -32601,
71
+ INVALID_PARAMS: -32602,
72
+ INTERNAL_ERROR: -32603,
73
+ SERVER_NOT_INITIALIZED: -32002,
74
+ } as const;
75
+
76
+ // ==================== Tool Provider ====================
77
+
78
+ type ToolProvider = {
79
+ getTools(): MCPTool[];
80
+ executeTool(name: string, args: Record<string, any>): Promise<any>;
81
+ };
82
+
83
+ // ==================== MCP Stdio Server ====================
84
+
85
+ class StdioMCPServer {
86
+ private initialized = false;
87
+ private rl: readline.Interface | null = null;
88
+
89
+ constructor(
90
+ private toolProvider: ToolProvider,
91
+ private serverInfo: MCPServerInfo
92
+ ) {}
93
+
94
+ start(): void {
95
+ this.rl = readline.createInterface({
96
+ input: process.stdin,
97
+ output: process.stdout,
98
+ terminal: false,
99
+ });
100
+
101
+ this.rl.on('line', (line) => this.handleLine(line));
102
+ this.rl.on('close', () => this.stop());
103
+
104
+ process.on('SIGINT', () => this.stop());
105
+ process.on('SIGTERM', () => this.stop());
106
+ }
107
+
108
+ stop(): void {
109
+ if (this.rl) {
110
+ this.rl.close();
111
+ this.rl = null;
112
+ }
113
+ process.exit(0);
114
+ }
115
+
116
+ private handleLine(line: string): void {
117
+ const trimmed = line.trim();
118
+ if (!trimmed) return;
119
+
120
+ try {
121
+ const message = JSON.parse(trimmed);
122
+ this.handleMessage(message);
123
+ } catch (error) {
124
+ this.sendError(0, MCP_ERROR_CODES.PARSE_ERROR, 'Parse error');
125
+ }
126
+ }
127
+
128
+ private async handleMessage(message: any): Promise<void> {
129
+ if ('id' in message && message.id !== null) {
130
+ await this.handleRequest(message as JSONRPCRequest);
131
+ return;
132
+ }
133
+
134
+ if ('method' in message) {
135
+ await this.handleNotification(message as JSONRPCNotification);
136
+ }
137
+ }
138
+
139
+ private async handleRequest(request: JSONRPCRequest): Promise<void> {
140
+ const { id, method, params } = request;
141
+
142
+ try {
143
+ let result: any;
144
+
145
+ switch (method) {
146
+ case MCP_METHODS.INITIALIZE:
147
+ result = this.handleInitialize(params);
148
+ break;
149
+ case MCP_METHODS.TOOLS_LIST:
150
+ this.requireInitialized();
151
+ result = this.handleToolsList();
152
+ break;
153
+ case MCP_METHODS.TOOLS_CALL:
154
+ this.requireInitialized();
155
+ result = await this.handleToolsCall(params);
156
+ break;
157
+ case MCP_METHODS.SHUTDOWN:
158
+ result = this.handleShutdown();
159
+ break;
160
+ default:
161
+ throw this.createError(MCP_ERROR_CODES.METHOD_NOT_FOUND, `Method not found: ${method}`);
162
+ }
163
+
164
+ this.sendResult(id, result);
165
+ } catch (error: any) {
166
+ if (error.code !== undefined) {
167
+ this.sendError(id, error.code, error.message, error.data);
168
+ } else {
169
+ this.sendError(id, MCP_ERROR_CODES.INTERNAL_ERROR, error?.message || 'Internal error');
170
+ }
171
+ }
172
+ }
173
+
174
+ private async handleNotification(notification: JSONRPCNotification): Promise<void> {
175
+ const { method } = notification;
176
+
177
+ if (method === MCP_METHODS.INITIALIZED) {
178
+ this.initialized = true;
179
+ }
180
+ }
181
+
182
+ private handleInitialize(_params: any): {
183
+ protocolVersion: string;
184
+ capabilities: MCPServerInfo['capabilities'];
185
+ serverInfo: MCPServerInfo;
186
+ } {
187
+ if (this.initialized) {
188
+ throw this.createError(MCP_ERROR_CODES.INVALID_REQUEST, 'Already initialized');
189
+ }
190
+
191
+ return {
192
+ protocolVersion: PROTOCOL_VERSION,
193
+ capabilities: this.serverInfo.capabilities,
194
+ serverInfo: this.serverInfo,
195
+ };
196
+ }
197
+
198
+ private handleToolsList(): { tools: MCPTool[] } {
199
+ return { tools: this.toolProvider.getTools() };
200
+ }
201
+
202
+ private async handleToolsCall(params: any): Promise<any> {
203
+ const { name, arguments: args } = params || {};
204
+ if (!name) {
205
+ throw this.createError(MCP_ERROR_CODES.INVALID_PARAMS, 'Tool name is required');
206
+ }
207
+
208
+ try {
209
+ const result = await this.toolProvider.executeTool(name, args || {});
210
+
211
+ if (typeof result === 'string') {
212
+ return { content: [{ type: 'text', text: result }] };
213
+ }
214
+
215
+ if (result && typeof result === 'object') {
216
+ if (result.content && Array.isArray(result.content)) {
217
+ return result;
218
+ }
219
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
220
+ }
221
+
222
+ return { content: [{ type: 'text', text: String(result) }] };
223
+ } catch (error: any) {
224
+ return {
225
+ content: [{ type: 'text', text: `Error: ${error?.message || 'Tool failed'}` }],
226
+ isError: true,
227
+ };
228
+ }
229
+ }
230
+
231
+ private handleShutdown(): Record<string, never> {
232
+ setImmediate(() => this.stop());
233
+ return {};
234
+ }
235
+
236
+ private sendResult(id: JSONRPCId, result: any): void {
237
+ const response: JSONRPCResponse = { jsonrpc: '2.0', id, result };
238
+ this.sendMessage(response);
239
+ }
240
+
241
+ private sendError(id: JSONRPCId, code: number, message: string, data?: any): void {
242
+ const response: JSONRPCResponse = {
243
+ jsonrpc: '2.0',
244
+ id,
245
+ error: { code, message, data },
246
+ };
247
+ this.sendMessage(response);
248
+ }
249
+
250
+ private sendMessage(message: JSONRPCResponse | JSONRPCNotification): void {
251
+ process.stdout.write(JSON.stringify(message) + '\n');
252
+ }
253
+
254
+ private requireInitialized(): void {
255
+ if (!this.initialized) {
256
+ throw this.createError(MCP_ERROR_CODES.SERVER_NOT_INITIALIZED, 'Server not initialized');
257
+ }
258
+ }
259
+
260
+ private createError(code: number, message: string, data?: any): { code: number; message: string; data?: any } {
261
+ return { code, message, data };
262
+ }
263
+ }
264
+
265
+ // ==================== Example Tools ====================
266
+
267
+ const CONNECTOR_PREFIX = process.env.CONNECTOR_PREFIX || 'example';
268
+
269
+ const tools: MCPTool[] = [
270
+ {
271
+ name: `${CONNECTOR_PREFIX}.health`,
272
+ description: 'Check connector health and authentication status',
273
+ inputSchema: {
274
+ type: 'object',
275
+ properties: {},
276
+ additionalProperties: false,
277
+ },
278
+ },
279
+ {
280
+ name: `${CONNECTOR_PREFIX}.echo`,
281
+ description: 'Echo input for testing',
282
+ inputSchema: {
283
+ type: 'object',
284
+ properties: {
285
+ text: { type: 'string', description: 'Text to echo back' },
286
+ },
287
+ required: ['text'],
288
+ additionalProperties: false,
289
+ },
290
+ },
291
+ ];
292
+
293
+ const handlers: Record<string, (args: Record<string, any>) => Promise<any>> = {
294
+ [`${CONNECTOR_PREFIX}.health`]: async () => ({
295
+ ok: true,
296
+ data: {
297
+ status: 'ok',
298
+ connector: CONNECTOR_PREFIX,
299
+ },
300
+ }),
301
+ [`${CONNECTOR_PREFIX}.echo`]: async (args) => ({
302
+ ok: true,
303
+ data: {
304
+ echo: args.text,
305
+ },
306
+ }),
307
+ };
308
+
309
+ const toolProvider: ToolProvider = {
310
+ getTools: () => tools,
311
+ executeTool: async (name, args) => {
312
+ const handler = handlers[name];
313
+ if (!handler) {
314
+ throw new Error(`Unknown tool: ${name}`);
315
+ }
316
+ return handler(args);
317
+ },
318
+ };
319
+
320
+ const serverInfo: MCPServerInfo = {
321
+ name: `Connector (${CONNECTOR_PREFIX})`,
322
+ version: '0.1.0',
323
+ protocolVersion: PROTOCOL_VERSION,
324
+ capabilities: {
325
+ tools: { listChanged: false },
326
+ },
327
+ };
328
+
329
+ const server = new StdioMCPServer(toolProvider, serverInfo);
330
+ server.start();
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "rootDir": "src",
6
+ "outDir": "dist",
7
+ "strict": true,
8
+ "esModuleInterop": true,
9
+ "skipLibCheck": true,
10
+ "lib": ["ES2020", "DOM"]
11
+ },
12
+ "include": ["src"]
13
+ }
@@ -0,0 +1,40 @@
1
+ # Zendesk MCP Connector (MVP)
2
+
3
+ This connector exposes Zendesk Support APIs to CoWork OS through MCP tools.
4
+
5
+ ## Requirements
6
+
7
+ Provide credentials via environment variables:
8
+
9
+ - `ZENDESK_SUBDOMAIN` (required unless `ZENDESK_BASE_URL` provided)
10
+ - `ZENDESK_EMAIL` (required for API token auth)
11
+ - `ZENDESK_API_TOKEN` (required for API token auth)
12
+
13
+ Optional:
14
+ - `ZENDESK_ACCESS_TOKEN` (OAuth bearer token)
15
+ - `ZENDESK_BASE_URL` (override full base URL, e.g., `https://your-domain.zendesk.com`)
16
+ - Optional refresh: `ZENDESK_CLIENT_ID`, `ZENDESK_CLIENT_SECRET`, `ZENDESK_REFRESH_TOKEN`
17
+
18
+ ## Build & Run
19
+
20
+ ```bash
21
+ npm install
22
+ npm run build
23
+ npm start
24
+ ```
25
+
26
+ ## Add to CoWork MCP Settings
27
+
28
+ - **Command**: `node`
29
+ - **Args**: `/absolute/path/to/connectors/zendesk-mcp/dist/index.js`
30
+ - **Env**: set the variables above
31
+
32
+ ## Tools
33
+
34
+ - `zendesk.health`
35
+ - `zendesk.search_tickets`
36
+ - `zendesk.get_ticket`
37
+ - `zendesk.create_ticket`
38
+ - `zendesk.update_ticket`
39
+
40
+ See `docs/enterprise-connectors.md` for the connector contract.