@ateam-ai/mcp 0.1.0

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/.env.example ADDED
@@ -0,0 +1,3 @@
1
+ ADAS_API_URL=https://api.ateam-ai.com
2
+ ADAS_TENANT=main
3
+ ADAS_API_KEY=your-api-key-here
package/README.md ADDED
@@ -0,0 +1,172 @@
1
+ # ateam-mcp
2
+
3
+ **Give any AI the ability to build, validate, and deploy production multi-agent systems.**
4
+
5
+ This is an MCP server that connects AI assistants — ChatGPT, Claude, Gemini, Copilot, Cursor, Windsurf, and any MCP-compatible environment — directly to the [ADAS](https://ateam-ai.com) platform.
6
+
7
+ An AI developer says *"Build me a customer support system with order tracking and escalation"* — and their AI assistant handles the entire lifecycle: reads the spec, builds skill definitions, validates them, deploys to production, and verifies health. No manual JSON authoring, no docs reading, no copy-paste workflows.
8
+
9
+ ## Why this matters
10
+
11
+ Today, building multi-agent systems requires deep platform knowledge, manual configuration, and switching between docs, editors, and dashboards. **ateam-mcp eliminates all of that** by making the ADAS platform a native capability of the AI tools developers already use.
12
+
13
+ The AI assistant becomes the developer interface:
14
+
15
+ ```
16
+ Developer: "Create an identity verification agent that checks documents,
17
+ validates faces, and escalates fraud cases"
18
+
19
+ AI Assistant:
20
+ → reads ADAS spec (adas_get_spec)
21
+ → studies working examples (adas_get_examples)
22
+ → builds skill + solution definitions
23
+ → validates iteratively (adas_validate_skill, adas_validate_solution)
24
+ → deploys to production (adas_deploy_solution)
25
+ → verifies everything is running (adas_get_solution → health)
26
+
27
+ Developer: "Add a new skill that handles address verification"
28
+
29
+ AI Assistant:
30
+ → deploys into the existing solution (adas_deploy_skill)
31
+ → redeploys (adas_redeploy)
32
+ → confirms health
33
+ ```
34
+
35
+ No context switching. No manual steps. The full ADAS platform — specs, validation, deployment, monitoring — is available as natural language.
36
+
37
+ ## How it reaches the AI community
38
+
39
+ ### ChatGPT users
40
+
41
+ ChatGPT supports MCP connectors in Developer Mode. Users connect by pasting a single URL:
42
+
43
+ **Settings → Connectors → Developer Mode → paste `https://mcp.ateam-ai.com`**
44
+
45
+ That's it. All 12 ADAS tools appear in ChatGPT. Any ChatGPT Pro, Plus, Business, or Enterprise user can build and deploy multi-agent solutions through conversation.
46
+
47
+ ### Claude users
48
+
49
+ **Claude Desktop** — install as an extension (one-click) or add to config:
50
+
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "ateam": {
55
+ "command": "npx",
56
+ "args": ["-y", "@ateam-ai/mcp"],
57
+ "env": {
58
+ "ADAS_TENANT": "your-tenant",
59
+ "ADAS_API_KEY": "your-api-key"
60
+ }
61
+ }
62
+ }
63
+ }
64
+ ```
65
+
66
+ **Claude Code** — one command:
67
+
68
+ ```bash
69
+ claude mcp add ateam -- npx -y @ateam-ai/mcp
70
+ ```
71
+
72
+ ### Cursor / Windsurf / VS Code (Copilot)
73
+
74
+ Add to `.cursor/mcp.json`, `mcp_config.json`, or `.vscode/mcp.json`:
75
+
76
+ ```json
77
+ {
78
+ "mcpServers": {
79
+ "ateam": {
80
+ "command": "npx",
81
+ "args": ["-y", "@ateam-ai/mcp"],
82
+ "env": {
83
+ "ADAS_TENANT": "your-tenant",
84
+ "ADAS_API_KEY": "your-api-key"
85
+ }
86
+ }
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### Gemini and other platforms
92
+
93
+ As MCP adoption grows (it's now governed by the Agentic AI Foundation under the Linux Foundation, co-founded by Anthropic, OpenAI, and Block), every AI platform that implements MCP gets access to ateam-mcp automatically. The remote HTTP endpoint (`https://mcp.ateam-ai.com`) works with any client that supports Streamable HTTP transport.
94
+
95
+ ### Discovery
96
+
97
+ Developers find ateam-mcp through:
98
+
99
+ - **npm** — `npm search mcp ai-agents` → `@ateam-ai/mcp`
100
+ - **Official MCP Registry** — registry.modelcontextprotocol.io
101
+ - **Claude Desktop Extensions** — built-in extension browser
102
+ - **Claude Code Plugin Marketplace** — `/plugin` → Discover tab
103
+ - **Windsurf MCP Marketplace** — built-in marketplace
104
+ - **VS Code MCP Gallery** — Extensions view
105
+ - **Community directories** — Smithery, mcp.so, PulseMCP (30,000+ combined listings)
106
+
107
+ ## Available tools
108
+
109
+ | Tool | What it does |
110
+ |---|---|
111
+ | `adas_get_spec` | Read the ADAS specification — skill schema, solution architecture, enums, agent guides |
112
+ | `adas_get_examples` | Get complete working examples — skills, connectors, solutions |
113
+ | `adas_validate_skill` | Validate a skill definition through the 5-stage pipeline |
114
+ | `adas_validate_solution` | Validate a solution — cross-skill contracts + quality scoring |
115
+ | `adas_deploy_solution` | Deploy a complete solution to production |
116
+ | `adas_deploy_skill` | Add a skill to an existing solution |
117
+ | `adas_deploy_connector` | Deploy a connector to ADAS Core |
118
+ | `adas_list_solutions` | List all deployed solutions |
119
+ | `adas_get_solution` | Inspect a solution — definition, skills, health, status, export |
120
+ | `adas_update` | Update a solution or skill incrementally (PATCH) |
121
+ | `adas_redeploy` | Push changes live — regenerates MCP servers, deploys to ADAS Core |
122
+ | `adas_solution_chat` | Talk to the Solution Bot for guided modifications |
123
+
124
+ ## Setup
125
+
126
+ ```bash
127
+ # Clone
128
+ git clone https://github.com/ariekogan/ateam-mcp.git
129
+ cd ateam-mcp
130
+
131
+ # Install
132
+ npm install
133
+
134
+ # Configure
135
+ cp .env.example .env
136
+ # Edit .env with your ADAS tenant and API key
137
+
138
+ # Run
139
+ npm start
140
+ ```
141
+
142
+ ## Architecture
143
+
144
+ ```
145
+ ┌─────────────────────────────────────────────┐
146
+ │ AI Environment │
147
+ │ (ChatGPT / Claude / Cursor / Windsurf) │
148
+ │ │
149
+ │ Developer: "build me a support system" │
150
+ └──────────────────┬──────────────────────────┘
151
+ │ MCP protocol
152
+ │ (stdio or HTTP)
153
+ ┌──────────────────▼──────────────────────────┐
154
+ │ ateam-mcp │
155
+ │ 12 tools — spec, validate, deploy, manage │
156
+ └──────────────────┬──────────────────────────┘
157
+ │ HTTPS
158
+ │ X-ADAS-TENANT / X-API-KEY
159
+ ┌──────────────────▼──────────────────────────┐
160
+ │ ADAS External Agent API │
161
+ │ api.ateam-ai.com │
162
+ └──────────────────┬──────────────────────────┘
163
+
164
+ ┌──────────────────▼──────────────────────────┐
165
+ │ ADAS Core │
166
+ │ Multi-agent runtime │
167
+ └─────────────────────────────────────────────┘
168
+ ```
169
+
170
+ ## License
171
+
172
+ MIT
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@ateam-ai/mcp",
3
+ "version": "0.1.0",
4
+ "description": "ADAS MCP Server — build, validate, and deploy multi-agent solutions from any AI environment",
5
+ "type": "module",
6
+ "bin": {
7
+ "ateam-mcp": "./src/index.js"
8
+ },
9
+ "main": "./src/index.js",
10
+ "scripts": {
11
+ "start": "node src/index.js",
12
+ "start:http": "node src/index.js --http",
13
+ "dev": "node --watch src/index.js",
14
+ "dev:http": "node --watch src/index.js --http"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "adas",
20
+ "ai-agents",
21
+ "multi-agent",
22
+ "mcp-server"
23
+ ],
24
+ "author": "A-Team AI",
25
+ "license": "MIT",
26
+ "files": [
27
+ "src/",
28
+ "README.md",
29
+ ".env.example"
30
+ ],
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/ariekogan/ateam-mcp.git"
34
+ },
35
+ "engines": {
36
+ "node": ">=18.0.0"
37
+ },
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.0.0",
40
+ "express": "^5.2.1"
41
+ }
42
+ }
package/src/api.js ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * ADAS API client — thin HTTP wrapper for the External Agent API.
3
+ */
4
+
5
+ const BASE_URL = process.env.ADAS_API_URL || "https://api.ateam-ai.com";
6
+ const TENANT = process.env.ADAS_TENANT || "main";
7
+ const API_KEY = process.env.ADAS_API_KEY || "";
8
+
9
+ function headers() {
10
+ return {
11
+ "Content-Type": "application/json",
12
+ "X-ADAS-TENANT": TENANT,
13
+ "X-API-KEY": API_KEY,
14
+ };
15
+ }
16
+
17
+ export async function get(path) {
18
+ const res = await fetch(`${BASE_URL}${path}`, { headers: headers() });
19
+ if (!res.ok) throw new Error(`GET ${path} → ${res.status}: ${await res.text()}`);
20
+ return res.json();
21
+ }
22
+
23
+ export async function post(path, body) {
24
+ const res = await fetch(`${BASE_URL}${path}`, {
25
+ method: "POST",
26
+ headers: headers(),
27
+ body: JSON.stringify(body),
28
+ });
29
+ if (!res.ok) throw new Error(`POST ${path} → ${res.status}: ${await res.text()}`);
30
+ return res.json();
31
+ }
32
+
33
+ export async function patch(path, body) {
34
+ const res = await fetch(`${BASE_URL}${path}`, {
35
+ method: "PATCH",
36
+ headers: headers(),
37
+ body: JSON.stringify(body),
38
+ });
39
+ if (!res.ok) throw new Error(`PATCH ${path} → ${res.status}: ${await res.text()}`);
40
+ return res.json();
41
+ }
42
+
43
+ export async function del(path) {
44
+ const res = await fetch(`${BASE_URL}${path}`, {
45
+ method: "DELETE",
46
+ headers: headers(),
47
+ });
48
+ if (!res.ok) throw new Error(`DELETE ${path} → ${res.status}: ${await res.text()}`);
49
+ return res.json();
50
+ }
package/src/http.js ADDED
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Streamable HTTP transport for ateam-mcp.
3
+ * Enables ChatGPT and remote MCP clients to connect via HTTPS.
4
+ */
5
+
6
+ import { randomUUID } from "node:crypto";
7
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
8
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
9
+ import express from "express";
10
+ import { createServer } from "./server.js";
11
+
12
+ // Active sessions
13
+ const transports = {};
14
+
15
+ export function startHttpServer(port = 3100) {
16
+ const app = express();
17
+ app.use(express.json());
18
+
19
+ // ─── Health check ─────────────────────────────────────────────
20
+ app.get("/health", (_req, res) => {
21
+ res.json({ ok: true, service: "ateam-mcp", transport: "http" });
22
+ });
23
+
24
+ // ─── MCP POST — handle tool calls + initialize ───────────────
25
+ app.post("/mcp", async (req, res) => {
26
+ const sessionId = req.headers["mcp-session-id"];
27
+
28
+ try {
29
+ let transport;
30
+
31
+ if (sessionId && transports[sessionId]) {
32
+ // Reuse existing session
33
+ transport = transports[sessionId];
34
+ } else if (!sessionId && isInitializeRequest(req.body)) {
35
+ // New session
36
+ transport = new StreamableHTTPServerTransport({
37
+ sessionIdGenerator: () => randomUUID(),
38
+ onsessioninitialized: (sid) => {
39
+ transports[sid] = transport;
40
+ },
41
+ });
42
+
43
+ transport.onclose = () => {
44
+ const sid = transport.sessionId;
45
+ if (sid && transports[sid]) {
46
+ delete transports[sid];
47
+ }
48
+ };
49
+
50
+ const server = createServer();
51
+ await server.connect(transport);
52
+ await transport.handleRequest(req, res, req.body);
53
+ return;
54
+ } else {
55
+ res.status(400).json({
56
+ jsonrpc: "2.0",
57
+ error: { code: -32000, message: "Bad Request: No valid session ID" },
58
+ id: null,
59
+ });
60
+ return;
61
+ }
62
+
63
+ await transport.handleRequest(req, res, req.body);
64
+ } catch (err) {
65
+ console.error("MCP request error:", err);
66
+ if (!res.headersSent) {
67
+ res.status(500).json({
68
+ jsonrpc: "2.0",
69
+ error: { code: -32603, message: "Internal server error" },
70
+ id: null,
71
+ });
72
+ }
73
+ }
74
+ });
75
+
76
+ // ─── MCP GET — SSE stream for notifications ──────────────────
77
+ app.get("/mcp", async (req, res) => {
78
+ const sessionId = req.headers["mcp-session-id"];
79
+ if (!sessionId || !transports[sessionId]) {
80
+ res.status(400).send("Invalid or missing session ID");
81
+ return;
82
+ }
83
+ await transports[sessionId].handleRequest(req, res);
84
+ });
85
+
86
+ // ─── MCP DELETE — session termination ────────────────────────
87
+ app.delete("/mcp", async (req, res) => {
88
+ const sessionId = req.headers["mcp-session-id"];
89
+ if (!sessionId || !transports[sessionId]) {
90
+ res.status(400).send("Invalid or missing session ID");
91
+ return;
92
+ }
93
+ await transports[sessionId].handleRequest(req, res);
94
+ });
95
+
96
+ // ─── Start ────────────────────────────────────────────────────
97
+ app.listen(port, "0.0.0.0", () => {
98
+ console.log(`ateam-mcp HTTP server listening on port ${port}`);
99
+ console.log(` MCP endpoint: http://localhost:${port}/mcp`);
100
+ console.log(` Health check: http://localhost:${port}/health`);
101
+ });
102
+
103
+ // Graceful shutdown
104
+ process.on("SIGINT", async () => {
105
+ for (const sid of Object.keys(transports)) {
106
+ try {
107
+ await transports[sid].close();
108
+ } catch {}
109
+ delete transports[sid];
110
+ }
111
+ process.exit(0);
112
+ });
113
+ }
package/src/index.js ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * ADAS MCP Server
5
+ * Build, validate, and deploy multi-agent solutions from any AI environment.
6
+ *
7
+ * Transports:
8
+ * --http [port] Start Streamable HTTP server (default port 3100)
9
+ * (default) Start stdio transport for Claude Code, Cursor, etc.
10
+ */
11
+
12
+ import { createServer } from "./server.js";
13
+
14
+ const httpFlag = process.argv.includes("--http");
15
+
16
+ if (httpFlag) {
17
+ // ─── HTTP transport (for ChatGPT, remote clients) ─────────────
18
+ const { startHttpServer } = await import("./http.js");
19
+ const portArg = process.argv[process.argv.indexOf("--http") + 1];
20
+ const port = portArg && !portArg.startsWith("-") ? parseInt(portArg, 10) : 3100;
21
+ startHttpServer(port);
22
+ } else {
23
+ // ─── Stdio transport (for Claude Code, Cursor, Windsurf, VS Code) ──
24
+ const { StdioServerTransport } = await import(
25
+ "@modelcontextprotocol/sdk/server/stdio.js"
26
+ );
27
+ const server = createServer();
28
+ const transport = new StdioServerTransport();
29
+ await server.connect(transport);
30
+ }
package/src/server.js ADDED
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared MCP server factory — used by both stdio and HTTP transports.
3
+ */
4
+
5
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
+ import {
7
+ CallToolRequestSchema,
8
+ ListToolsRequestSchema,
9
+ } from "@modelcontextprotocol/sdk/types.js";
10
+ import { tools, handleToolCall } from "./tools.js";
11
+
12
+ export function createServer() {
13
+ const server = new Server(
14
+ { name: "ateam-mcp", version: "0.1.0" },
15
+ { capabilities: { tools: {} } }
16
+ );
17
+
18
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
19
+
20
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
21
+ const { name, arguments: args } = request.params;
22
+ return handleToolCall(name, args);
23
+ });
24
+
25
+ return server;
26
+ }
package/src/tools.js ADDED
@@ -0,0 +1,336 @@
1
+ /**
2
+ * ADAS MCP tool definitions and handlers.
3
+ * 12 tools covering the full ADAS External Agent API.
4
+ */
5
+
6
+ import { get, post, patch, del } from "./api.js";
7
+
8
+ // ─── Tool definitions ───────────────────────────────────────────────
9
+
10
+ export const tools = [
11
+ {
12
+ name: "adas_get_spec",
13
+ description:
14
+ "Get the ADAS specification — schemas, validation rules, system tools, agent guides, and templates. Use this to understand how to build skills and solutions.",
15
+ inputSchema: {
16
+ type: "object",
17
+ properties: {
18
+ topic: {
19
+ type: "string",
20
+ enum: ["overview", "skill", "solution", "enums"],
21
+ description:
22
+ "What to fetch: 'overview' = API overview + endpoints, 'skill' = full skill spec, 'solution' = full solution spec, 'enums' = all enum values",
23
+ },
24
+ },
25
+ required: ["topic"],
26
+ },
27
+ },
28
+ {
29
+ name: "adas_get_examples",
30
+ description:
31
+ "Get complete working examples that pass validation. Study these before building your own.",
32
+ inputSchema: {
33
+ type: "object",
34
+ properties: {
35
+ type: {
36
+ type: "string",
37
+ enum: ["skill", "connector", "connector-ui", "solution", "index"],
38
+ description:
39
+ "Example type: 'skill' = Order Support Agent, 'connector' = stdio MCP connector, 'connector-ui' = UI-capable connector, 'solution' = full 3-skill e-commerce solution, 'index' = list all available examples",
40
+ },
41
+ },
42
+ required: ["type"],
43
+ },
44
+ },
45
+ {
46
+ name: "adas_validate_skill",
47
+ description:
48
+ "Validate a skill definition through the 5-stage ADAS validation pipeline. Returns errors and suggestions to fix.",
49
+ inputSchema: {
50
+ type: "object",
51
+ properties: {
52
+ skill: {
53
+ type: "object",
54
+ description: "The full skill definition object to validate",
55
+ },
56
+ },
57
+ required: ["skill"],
58
+ },
59
+ },
60
+ {
61
+ name: "adas_validate_solution",
62
+ description:
63
+ "Validate a solution definition — cross-skill contracts, grant economy, handoffs, and LLM quality scoring.",
64
+ inputSchema: {
65
+ type: "object",
66
+ properties: {
67
+ solution: {
68
+ type: "object",
69
+ description: "The full solution definition object to validate",
70
+ },
71
+ skills: {
72
+ type: "array",
73
+ items: { type: "object" },
74
+ description: "Array of skill definitions included in the solution",
75
+ },
76
+ },
77
+ required: ["solution"],
78
+ },
79
+ },
80
+ {
81
+ name: "adas_deploy_solution",
82
+ description:
83
+ "Deploy a complete solution to ADAS Core — identity, connectors, skills. The Skill Builder auto-generates MCP servers from tool definitions. This is the main deployment action.",
84
+ inputSchema: {
85
+ type: "object",
86
+ properties: {
87
+ solution: {
88
+ type: "object",
89
+ description: "Solution architecture — identity, grants, handoffs, routing",
90
+ },
91
+ skills: {
92
+ type: "array",
93
+ items: { type: "object" },
94
+ description: "Array of full skill definitions",
95
+ },
96
+ connectors: {
97
+ type: "array",
98
+ items: { type: "object" },
99
+ description: "Array of connector metadata (id, name, transport, command, args)",
100
+ },
101
+ mcp_store: {
102
+ type: "object",
103
+ description:
104
+ "Optional: connector source code files. Key = connector id, value = array of {path, content}",
105
+ },
106
+ },
107
+ required: ["solution", "skills"],
108
+ },
109
+ },
110
+ {
111
+ name: "adas_deploy_skill",
112
+ description: "Deploy a single skill into an existing solution.",
113
+ inputSchema: {
114
+ type: "object",
115
+ properties: {
116
+ solution_id: {
117
+ type: "string",
118
+ description: "The existing solution ID to add the skill to",
119
+ },
120
+ skill: {
121
+ type: "object",
122
+ description: "Full skill definition",
123
+ },
124
+ },
125
+ required: ["solution_id", "skill"],
126
+ },
127
+ },
128
+ {
129
+ name: "adas_deploy_connector",
130
+ description: "Deploy a connector — registers in the Skill Builder catalog and connects in ADAS Core.",
131
+ inputSchema: {
132
+ type: "object",
133
+ properties: {
134
+ connector: {
135
+ type: "object",
136
+ description: "Connector metadata (id, name, transport, command, args)",
137
+ },
138
+ },
139
+ required: ["connector"],
140
+ },
141
+ },
142
+ {
143
+ name: "adas_list_solutions",
144
+ description: "List all solutions deployed in the Skill Builder.",
145
+ inputSchema: {
146
+ type: "object",
147
+ properties: {},
148
+ },
149
+ },
150
+ {
151
+ name: "adas_get_solution",
152
+ description:
153
+ "Read solution state — definition, skills, health, status, or export. Use this to inspect deployed solutions.",
154
+ inputSchema: {
155
+ type: "object",
156
+ properties: {
157
+ solution_id: {
158
+ type: "string",
159
+ description: "The solution ID",
160
+ },
161
+ view: {
162
+ type: "string",
163
+ enum: ["definition", "skills", "health", "status", "export", "validate", "connectors_health"],
164
+ description:
165
+ "What to read: 'definition' = full solution def, 'skills' = list skills, 'health' = live health check, 'status' = deploy status, 'export' = exportable bundle, 'validate' = re-validate from stored state, 'connectors_health' = connector status",
166
+ },
167
+ skill_id: {
168
+ type: "string",
169
+ description: "Optional: read a specific skill by ID (original or internal)",
170
+ },
171
+ },
172
+ required: ["solution_id", "view"],
173
+ },
174
+ },
175
+ {
176
+ name: "adas_update",
177
+ description:
178
+ "Update a deployed solution or skill incrementally using PATCH. Supports dot notation for scalar fields and _push/_delete/_update for arrays.",
179
+ inputSchema: {
180
+ type: "object",
181
+ properties: {
182
+ solution_id: {
183
+ type: "string",
184
+ description: "The solution ID",
185
+ },
186
+ target: {
187
+ type: "string",
188
+ enum: ["solution", "skill"],
189
+ description: "What to update: 'solution' or 'skill'",
190
+ },
191
+ skill_id: {
192
+ type: "string",
193
+ description: "Required when target is 'skill'",
194
+ },
195
+ updates: {
196
+ type: "object",
197
+ description:
198
+ "The update payload — use dot notation for scalars (e.g. 'problem.statement'), and tools_push/tools_delete/tools_update for array operations",
199
+ },
200
+ },
201
+ required: ["solution_id", "target", "updates"],
202
+ },
203
+ },
204
+ {
205
+ name: "adas_redeploy",
206
+ description:
207
+ "Re-deploy after making updates. Regenerates MCP servers and pushes to ADAS Core.",
208
+ inputSchema: {
209
+ type: "object",
210
+ properties: {
211
+ solution_id: {
212
+ type: "string",
213
+ description: "The solution ID",
214
+ },
215
+ skill_id: {
216
+ type: "string",
217
+ description: "Optional: redeploy a single skill. Omit to redeploy all skills.",
218
+ },
219
+ },
220
+ required: ["solution_id"],
221
+ },
222
+ },
223
+ {
224
+ name: "adas_solution_chat",
225
+ description:
226
+ "Send a message to the Solution Bot — an AI assistant that understands your deployed solution and can help with modifications.",
227
+ inputSchema: {
228
+ type: "object",
229
+ properties: {
230
+ solution_id: {
231
+ type: "string",
232
+ description: "The solution ID",
233
+ },
234
+ message: {
235
+ type: "string",
236
+ description: "Your message to the Solution Bot",
237
+ },
238
+ },
239
+ required: ["solution_id", "message"],
240
+ },
241
+ },
242
+ ];
243
+
244
+ // ─── Tool handlers ──────────────────────────────────────────────────
245
+
246
+ const SPEC_PATHS = {
247
+ overview: "/spec",
248
+ skill: "/spec/skill",
249
+ solution: "/spec/solution",
250
+ enums: "/spec/enums",
251
+ };
252
+
253
+ const EXAMPLE_PATHS = {
254
+ index: "/spec/examples",
255
+ skill: "/spec/examples/skill",
256
+ connector: "/spec/examples/connector",
257
+ "connector-ui": "/spec/examples/connector-ui",
258
+ solution: "/spec/examples/solution",
259
+ };
260
+
261
+ const handlers = {
262
+ adas_get_spec: async ({ topic }) => get(SPEC_PATHS[topic]),
263
+
264
+ adas_get_examples: async ({ type }) => get(EXAMPLE_PATHS[type]),
265
+
266
+ adas_validate_skill: async ({ skill }) => post("/validate/skill", { skill }),
267
+
268
+ adas_validate_solution: async ({ solution, skills }) =>
269
+ post("/validate/solution", { solution, skills }),
270
+
271
+ adas_deploy_solution: async ({ solution, skills, connectors, mcp_store }) =>
272
+ post("/deploy/solution", { solution, skills, connectors, mcp_store }),
273
+
274
+ adas_deploy_skill: async ({ solution_id, skill }) =>
275
+ post(`/deploy/solutions/${solution_id}/skills`, { skill }),
276
+
277
+ adas_deploy_connector: async ({ connector }) =>
278
+ post("/deploy/connector", { connector }),
279
+
280
+ adas_list_solutions: async () => get("/deploy/solutions"),
281
+
282
+ adas_get_solution: async ({ solution_id, view, skill_id }) => {
283
+ const base = `/deploy/solutions/${solution_id}`;
284
+ if (skill_id) return get(`${base}/skills/${skill_id}`);
285
+ const paths = {
286
+ definition: `${base}/definition`,
287
+ skills: `${base}/skills`,
288
+ health: `${base}/health`,
289
+ status: `/deploy/status/${solution_id}`,
290
+ export: `${base}/export`,
291
+ validate: `${base}/validate`,
292
+ connectors_health: `${base}/connectors/health`,
293
+ };
294
+ return get(paths[view]);
295
+ },
296
+
297
+ adas_update: async ({ solution_id, target, skill_id, updates }) => {
298
+ if (target === "skill") {
299
+ return patch(`/deploy/solutions/${solution_id}/skills/${skill_id}`, { updates });
300
+ }
301
+ return patch(`/deploy/solutions/${solution_id}`, { state_update: updates });
302
+ },
303
+
304
+ adas_redeploy: async ({ solution_id, skill_id }) => {
305
+ if (skill_id) {
306
+ return post(`/deploy/solutions/${solution_id}/skills/${skill_id}/redeploy`, {});
307
+ }
308
+ return post(`/deploy/solutions/${solution_id}/redeploy`, {});
309
+ },
310
+
311
+ adas_solution_chat: async ({ solution_id, message }) =>
312
+ post(`/deploy/solutions/${solution_id}/chat`, { message }),
313
+ };
314
+
315
+ // ─── Dispatcher ─────────────────────────────────────────────────────
316
+
317
+ export async function handleToolCall(name, args) {
318
+ const handler = handlers[name];
319
+ if (!handler) {
320
+ return {
321
+ content: [{ type: "text", text: `Unknown tool: ${name}` }],
322
+ isError: true,
323
+ };
324
+ }
325
+ try {
326
+ const result = await handler(args);
327
+ return {
328
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
329
+ };
330
+ } catch (err) {
331
+ return {
332
+ content: [{ type: "text", text: `Error: ${err.message}` }],
333
+ isError: true,
334
+ };
335
+ }
336
+ }