wxo-builder-mcp-server 1.0.8

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/package.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "name": "wxo-builder-mcp-server",
3
+ "version": "1.0.8",
4
+ "description": "MCP server for IBM Watson Orchestrate (WXO): manage tools, agents, connections, flows, and execute tools from Cursor, VS Code Copilot, or Claude.",
5
+ "mcpName": "io.github.markusvankempen/wxo-builder-mcp-server",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "bin": {
9
+ "wxo-builder-mcp-server": "dist/index.js",
10
+ "wxo-builder-mcp": "dist/index.js"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md",
15
+ "CHANGELOG.md",
16
+ "LICENSE",
17
+ "watson-orchestrate-openapi.json",
18
+ "resources"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "start": "node dist/index.js",
23
+ "dev": "ts-node src/index.ts",
24
+ "test:integration": "npm run build && node -r ts-node/register/transpile-only tests/integration-mcp-parity.ts",
25
+ "prepublishOnly": "npm run build",
26
+ "lint": "eslint src --ext .ts",
27
+ "lint:fix": "eslint src --ext .ts --fix",
28
+ "format": "prettier --write \"src/**/*.ts\" \"*.json\" \"*.md\"",
29
+ "format:check": "prettier --check \"src/**/*.ts\" \"*.json\" \"*.md\"",
30
+ "check": "npm run lint && npm run format:check && npm run build",
31
+ "fix": "npm run lint:fix && npm run format",
32
+ "prepare": "husky"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/markusvankempen/wxo-builder-mcp-server.git"
37
+ },
38
+ "homepage": "https://github.com/markusvankempen/wxo-builder-mcp-server#readme",
39
+ "bugs": "https://github.com/markusvankempen/wxo-builder-mcp-server/issues",
40
+ "keywords": [
41
+ "mcp",
42
+ "model-context-protocol",
43
+ "watsonx",
44
+ "watson-orchestrate",
45
+ "watsonx-orchestrate",
46
+ "wxo",
47
+ "ibm",
48
+ "ai",
49
+ "agents",
50
+ "tools",
51
+ "cursor",
52
+ "claude",
53
+ "vscode",
54
+ "copilot",
55
+ "antigravity",
56
+ "windsurf",
57
+ "openai"
58
+ ],
59
+ "author": "Markus van Kempen <markus.van.kempen@gmail.com>",
60
+ "license": "Apache-2.0",
61
+ "publishConfig": {
62
+ "access": "public"
63
+ },
64
+ "engines": {
65
+ "node": ">=18"
66
+ },
67
+ "dependencies": {
68
+ "@modelcontextprotocol/sdk": "^1.26.0",
69
+ "archiver": "^7.0.1",
70
+ "dotenv": "^17.3.1",
71
+ "node-fetch": "^3.3.2",
72
+ "zod": "^4.3.6"
73
+ },
74
+ "lint-staged": {
75
+ "src/**/*.ts": [
76
+ "eslint --fix",
77
+ "prettier --write"
78
+ ],
79
+ "*.{json,md}": [
80
+ "prettier --write"
81
+ ]
82
+ },
83
+ "devDependencies": {
84
+ "@commitlint/cli": "^20.4.1",
85
+ "@commitlint/config-conventional": "^20.4.1",
86
+ "@types/archiver": "^7.0.0",
87
+ "@types/node": "^20.19.33",
88
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
89
+ "@typescript-eslint/parser": "^6.21.0",
90
+ "eslint": "^8.57.1",
91
+ "eslint-config-prettier": "^10.1.8",
92
+ "eslint-plugin-prettier": "^5.5.5",
93
+ "husky": "^9.1.7",
94
+ "lint-staged": "^16.2.7",
95
+ "prettier": "^3.8.1",
96
+ "ts-node": "^10.9.2",
97
+ "typescript": "^5.9.3"
98
+ }
99
+ }
Binary file
@@ -0,0 +1,18 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" fill="none">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#4a4a6a" />
5
+ <stop offset="100%" style="stop-color:#2d2d44" />
6
+ </linearGradient>
7
+ </defs>
8
+ <rect x="0" y="0" width="128" height="128" rx="28" fill="url(#bg)"/>
9
+ <!-- Connected nodes: orchestration / flow -->
10
+ <line x1="32" y1="64" x2="64" y2="48" stroke="white" stroke-width="4" stroke-linecap="round" opacity="0.7"/>
11
+ <line x1="64" y1="48" x2="96" y2="64" stroke="white" stroke-width="4" stroke-linecap="round" opacity="0.7"/>
12
+ <line x1="96" y1="64" x2="64" y2="88" stroke="white" stroke-width="4" stroke-linecap="round" opacity="0.7"/>
13
+ <line x1="64" y1="88" x2="32" y2="64" stroke="white" stroke-width="4" stroke-linecap="round" opacity="0.7"/>
14
+ <circle cx="32" cy="64" r="10" fill="white" opacity="0.95"/>
15
+ <circle cx="64" cy="48" r="10" fill="white" opacity="0.95"/>
16
+ <circle cx="96" cy="64" r="10" fill="white" opacity="0.95"/>
17
+ <circle cx="64" cy="88" r="10" fill="white" opacity="0.95"/>
18
+ </svg>
@@ -0,0 +1,359 @@
1
+ {
2
+ "openapi": "3.0.3",
3
+ "info": {
4
+ "title": "Watson Orchestrate API",
5
+ "description": "IBM Watson Orchestrate REST API used by the Watson Orchestrate MCP server. This spec documents the endpoints the MCP server calls to manage tools, agents, connections, and flows. Agentic flow definitions are tools with binding.flow — use POST/PUT /v1/orchestrate/tools for flow creation and updates.",
6
+ "version": "1.1.0",
7
+ "contact": {
8
+ "name": "Markus van Kempen",
9
+ "email": "markus.van.kempen@gmail.com"
10
+ },
11
+ "license": {
12
+ "name": "Apache-2.0",
13
+ "url": "http://www.apache.org/licenses/LICENSE-2.0"
14
+ }
15
+ },
16
+ "servers": [
17
+ {
18
+ "url": "{baseUrl}",
19
+ "variables": {
20
+ "baseUrl": {
21
+ "default": "https://api.us-south.watson-orchestrate.cloud.ibm.com/instances/YOUR_INSTANCE_ID",
22
+ "description": "WO_INSTANCE_URL from .env"
23
+ }
24
+ }
25
+ }
26
+ ],
27
+ "security": [
28
+ { "bearerAuth": [] }
29
+ ],
30
+ "components": {
31
+ "securitySchemes": {
32
+ "bearerAuth": {
33
+ "type": "http",
34
+ "scheme": "bearer",
35
+ "bearerFormat": "JWT",
36
+ "description": "IAM Bearer token obtained from IBM Cloud API key"
37
+ }
38
+ },
39
+ "schemas": {
40
+ "Tool": {
41
+ "type": "object",
42
+ "properties": {
43
+ "id": { "type": "string" },
44
+ "name": { "type": "string" },
45
+ "display_name": { "type": "string" },
46
+ "description": { "type": "string" },
47
+ "permission": { "type": "string", "enum": ["read_only", "read_write"] },
48
+ "input_schema": { "type": "object" },
49
+ "output_schema": { "type": "object" },
50
+ "binding": {
51
+ "type": "object",
52
+ "description": "For flows: { flow: { flow_id, model, dependencies } }. For OpenAPI tools: { openapi: {...} }."
53
+ }
54
+ }
55
+ },
56
+ "FlowToolCreate": {
57
+ "type": "object",
58
+ "description": "Create an agentic workflow (flow) as a tool. Flows support Timer, Branch, Decisions, Foreach, Prompt, Tool, Agent nodes.",
59
+ "required": ["name", "binding"],
60
+ "properties": {
61
+ "name": { "type": "string" },
62
+ "display_name": { "type": "string" },
63
+ "description": { "type": "string" },
64
+ "permission": { "type": "string", "enum": ["read_only", "read_write"], "default": "read_only" },
65
+ "binding": {
66
+ "type": "object",
67
+ "required": ["flow"],
68
+ "properties": {
69
+ "flow": {
70
+ "type": "object",
71
+ "required": ["flow_id", "model"],
72
+ "properties": {
73
+ "flow_id": { "type": "string" },
74
+ "model": {
75
+ "type": "object",
76
+ "description": "Flow DSL: spec (kind: flow), nodes, edges, schemas"
77
+ },
78
+ "dependencies": {
79
+ "type": "object",
80
+ "properties": {
81
+ "tools": { "type": "array", "items": { "type": "string" }, "description": "Tool IDs for tool nodes" },
82
+ "agents": { "type": "array", "items": { "type": "string" }, "description": "Agent IDs for agent nodes" }
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ },
91
+ "Agent": {
92
+ "type": "object",
93
+ "properties": {
94
+ "id": { "type": "string" },
95
+ "name": { "type": "string" },
96
+ "description": { "type": "string" },
97
+ "llm": { "type": "string" },
98
+ "tools": { "type": "array", "items": { "type": "string" } }
99
+ }
100
+ },
101
+ "Connection": {
102
+ "type": "object",
103
+ "properties": {
104
+ "app_id": { "type": "string" },
105
+ "display_name": { "type": "string" }
106
+ }
107
+ },
108
+ "Flow": {
109
+ "type": "object",
110
+ "properties": {
111
+ "id": { "type": "string" },
112
+ "name": { "type": "string" }
113
+ }
114
+ }
115
+ }
116
+ },
117
+ "paths": {
118
+ "/v1/orchestrate/tools": {
119
+ "get": {
120
+ "summary": "List tools",
121
+ "description": "List all tools/skills in the Watson Orchestrate catalog",
122
+ "operationId": "listTools",
123
+ "parameters": [
124
+ { "name": "limit", "in": "query", "schema": { "type": "integer", "default": 100 } },
125
+ { "name": "offset", "in": "query", "schema": { "type": "integer", "default": 0 } }
126
+ ],
127
+ "responses": { "200": { "description": "List of tools" } }
128
+ },
129
+ "post": {
130
+ "summary": "Create tool",
131
+ "description": "Create a new tool. For OpenAPI tools: provide binding.openapi. For agentic flows: provide binding.flow with flow_id and model (Flow DSL with nodes, edges, schemas). Flows support Timer, Branch, Decisions, Foreach, Prompt, Tool, Agent nodes. See internal/docs/agent_flow_research.md.",
132
+ "operationId": "createTool",
133
+ "requestBody": {
134
+ "content": {
135
+ "application/json": {
136
+ "schema": {
137
+ "type": "object",
138
+ "description": "Flow: use binding.flow. OpenAPI: use binding.openapi. See FlowToolCreate schema."
139
+ }
140
+ }
141
+ }
142
+ },
143
+ "responses": { "200": { "description": "Created tool (returns id)" } }
144
+ }
145
+ },
146
+ "/v1/orchestrate/tools/{toolId}": {
147
+ "get": {
148
+ "summary": "Get tool",
149
+ "operationId": "getTool",
150
+ "parameters": [{ "name": "toolId", "in": "path", "required": true, "schema": { "type": "string" } }],
151
+ "responses": { "200": { "description": "Tool details" } }
152
+ },
153
+ "delete": {
154
+ "summary": "Delete tool",
155
+ "operationId": "deleteTool",
156
+ "parameters": [{ "name": "toolId", "in": "path", "required": true, "schema": { "type": "string" } }],
157
+ "responses": { "200": { "description": "Deleted" } }
158
+ },
159
+ "patch": {
160
+ "summary": "Patch tool",
161
+ "operationId": "patchTool",
162
+ "parameters": [{ "name": "toolId", "in": "path", "required": true, "schema": { "type": "string" } }],
163
+ "requestBody": { "content": { "application/json": { "schema": { "type": "object" } } } },
164
+ "responses": { "200": { "description": "Updated tool" } }
165
+ },
166
+ "put": {
167
+ "summary": "Update tool (full replacement)",
168
+ "description": "Full replace of tool. Use for flow model updates (e.g. fix model: null). Avoid $ref to #/input or #/nodes/<id>/output — causes 500.",
169
+ "operationId": "updateTool",
170
+ "parameters": [{ "name": "toolId", "in": "path", "required": true, "schema": { "type": "string" } }],
171
+ "requestBody": { "content": { "application/json": { "schema": { "type": "object" } } } },
172
+ "responses": { "200": { "description": "Updated tool" } }
173
+ }
174
+ },
175
+ "/v1/orchestrate/tools/{toolId}/upload": {
176
+ "post": {
177
+ "summary": "Upload tool OpenAPI bundle",
178
+ "description": "Upload OpenAPI zip for tool deployment",
179
+ "operationId": "uploadTool",
180
+ "parameters": [{ "name": "toolId", "in": "path", "required": true, "schema": { "type": "string" } }],
181
+ "requestBody": { "content": { "multipart/form-data": { "schema": { "type": "object" } } } },
182
+ "responses": { "200": { "description": "Uploaded" } }
183
+ }
184
+ },
185
+ "/v1/orchestrate/agents": {
186
+ "get": {
187
+ "summary": "List agents",
188
+ "operationId": "listAgents",
189
+ "parameters": [
190
+ { "name": "limit", "in": "query", "schema": { "type": "integer" } },
191
+ { "name": "offset", "in": "query", "schema": { "type": "integer" } }
192
+ ],
193
+ "responses": { "200": { "description": "List of agents" } }
194
+ },
195
+ "post": {
196
+ "summary": "Create agent",
197
+ "operationId": "createAgent",
198
+ "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Agent" } } } },
199
+ "responses": { "200": { "description": "Created agent" } }
200
+ }
201
+ },
202
+ "/v1/orchestrate/agents/{agentId}": {
203
+ "get": {
204
+ "summary": "Get agent",
205
+ "operationId": "getAgent",
206
+ "parameters": [{ "name": "agentId", "in": "path", "required": true, "schema": { "type": "string" } }],
207
+ "responses": { "200": { "description": "Agent details" } }
208
+ },
209
+ "patch": {
210
+ "summary": "Update agent",
211
+ "operationId": "updateAgent",
212
+ "parameters": [{ "name": "agentId", "in": "path", "required": true, "schema": { "type": "string" } }],
213
+ "requestBody": { "content": { "application/json": { "schema": { "type": "object" } } } },
214
+ "responses": { "200": { "description": "Updated agent" } }
215
+ },
216
+ "delete": {
217
+ "summary": "Delete agent",
218
+ "operationId": "deleteAgent",
219
+ "parameters": [{ "name": "agentId", "in": "path", "required": true, "schema": { "type": "string" } }],
220
+ "responses": { "200": { "description": "Deleted" } }
221
+ }
222
+ },
223
+ "/v1/orchestrate/agents/{agentId}/chat-starter-settings": {
224
+ "get": {
225
+ "summary": "Get chat starter settings",
226
+ "description": "Retrieve welcome message and quick prompts for an agent",
227
+ "operationId": "getChatStarterSettings",
228
+ "parameters": [{ "name": "agentId", "in": "path", "required": true, "schema": { "type": "string" } }],
229
+ "responses": { "200": { "description": "Chat starter settings" } }
230
+ },
231
+ "put": {
232
+ "summary": "Update chat starter settings",
233
+ "description": "Set welcome message and quick prompts for an agent",
234
+ "operationId": "updateChatStarterSettings",
235
+ "parameters": [{ "name": "agentId", "in": "path", "required": true, "schema": { "type": "string" } }],
236
+ "requestBody": { "content": { "application/json": { "schema": { "type": "object" } } } },
237
+ "responses": { "200": { "description": "Updated" } }
238
+ }
239
+ },
240
+ "/v1/orchestrate/runs": {
241
+ "post": {
242
+ "summary": "Start run",
243
+ "description": "Start an agentic run (invoke agent or tool). Used for invoke_agent and execute_tool.",
244
+ "operationId": "createRun",
245
+ "requestBody": {
246
+ "content": {
247
+ "application/json": {
248
+ "schema": {
249
+ "type": "object",
250
+ "required": ["message"],
251
+ "properties": {
252
+ "agent_id": { "type": "string", "description": "Required for agentic runs. Use tool_id + agent_id to run a specific tool." },
253
+ "tool_id": { "type": "string", "description": "Tool/flow to execute. Agent routes to it." },
254
+ "parameters": { "type": "object", "description": "Flow/tool input parameters" },
255
+ "message": {
256
+ "type": "object",
257
+ "required": ["role", "content"],
258
+ "properties": {
259
+ "role": { "type": "string", "enum": ["user"] },
260
+ "content": { "type": "string", "description": "Directive e.g. 'Run the flow with these parameters.'" }
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }
266
+ }
267
+ },
268
+ "responses": { "200": { "description": "Run started. Returns thread_id. Poll GET /v1/orchestrate/threads/{threadId}/messages for result." } }
269
+ }
270
+ },
271
+ "/v1/orchestrate/threads/{threadId}/messages": {
272
+ "get": {
273
+ "summary": "Get thread messages",
274
+ "description": "Poll for run completion (assistant response)",
275
+ "operationId": "getThreadMessages",
276
+ "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string" } }],
277
+ "responses": { "200": { "description": "Messages array" } }
278
+ }
279
+ },
280
+ "/v1/orchestrate/catalog/applications": {
281
+ "get": {
282
+ "summary": "List connectors",
283
+ "description": "List available connector applications from catalog",
284
+ "operationId": "listConnectors",
285
+ "parameters": [{ "name": "limit", "in": "query", "schema": { "type": "integer" } }],
286
+ "responses": { "200": { "description": "Connector catalog" } }
287
+ }
288
+ },
289
+ "/v1/orchestrate/connections/applications": {
290
+ "get": {
291
+ "summary": "List connections",
292
+ "parameters": [
293
+ { "name": "scope", "in": "query", "schema": { "enum": ["draft", "live"] } },
294
+ { "name": "include_details", "in": "query", "schema": { "type": "boolean" } }
295
+ ],
296
+ "responses": { "200": { "description": "Configured connections" } }
297
+ },
298
+ "post": {
299
+ "summary": "Create connection",
300
+ "operationId": "createConnection",
301
+ "requestBody": { "content": { "application/json": { "schema": { "type": "object" } } } },
302
+ "responses": { "200": { "description": "Created connection" } }
303
+ }
304
+ },
305
+ "/v1/orchestrate/connections/applications/{appId}": {
306
+ "get": {
307
+ "summary": "Get connection",
308
+ "parameters": [{ "name": "appId", "in": "path", "required": true, "schema": { "type": "string" } }],
309
+ "responses": { "200": { "description": "Connection details" } }
310
+ },
311
+ "delete": {
312
+ "summary": "Delete connection",
313
+ "parameters": [{ "name": "appId", "in": "path", "required": true, "schema": { "type": "string" } }],
314
+ "responses": { "200": { "description": "Deleted" } }
315
+ }
316
+ },
317
+ "/v1/flows/": {
318
+ "get": {
319
+ "summary": "List flows",
320
+ "description": "List flows. Note: Flow definitions are tools with binding.flow. Prefer GET /v1/orchestrate/tools and filter by binding.flow for flow definitions.",
321
+ "operationId": "listFlows",
322
+ "parameters": [
323
+ { "name": "limit", "in": "query", "schema": { "type": "integer" } },
324
+ { "name": "offset", "in": "query", "schema": { "type": "integer" } }
325
+ ],
326
+ "responses": { "200": { "description": "List of flows" } }
327
+ },
328
+ "post": {
329
+ "summary": "Create flow",
330
+ "description": "Create flow. Prefer POST /v1/orchestrate/tools with binding.flow for agentic workflows.",
331
+ "operationId": "createFlow",
332
+ "requestBody": { "content": { "application/json": { "schema": { "type": "object" } } } },
333
+ "responses": { "200": { "description": "Created flow" } }
334
+ }
335
+ },
336
+ "/v1/flows/{flowId}": {
337
+ "get": {
338
+ "summary": "Get flow",
339
+ "description": "Get flow by ID. Flow definitions: use GET /v1/orchestrate/tools/{toolId} — flows are tools with binding.flow.",
340
+ "parameters": [{ "name": "flowId", "in": "path", "required": true, "schema": { "type": "string" } }],
341
+ "responses": { "200": { "description": "Flow details" } }
342
+ },
343
+ "delete": {
344
+ "summary": "Delete flow",
345
+ "description": "Delete flow. Flow definitions: use DELETE /v1/orchestrate/tools/{toolId}.",
346
+ "parameters": [{ "name": "flowId", "in": "path", "required": true, "schema": { "type": "string" } }],
347
+ "responses": { "200": { "description": "Deleted" } }
348
+ }
349
+ },
350
+ "/v1/models/list": {
351
+ "get": {
352
+ "summary": "List models",
353
+ "description": "List LLM models available for agents",
354
+ "operationId": "listModels",
355
+ "responses": { "200": { "description": "Model list" } }
356
+ }
357
+ }
358
+ }
359
+ }