@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 +3 -0
- package/README.md +172 -0
- package/package.json +42 -0
- package/src/api.js +50 -0
- package/src/http.js +113 -0
- package/src/index.js +30 -0
- package/src/server.js +26 -0
- package/src/tools.js +336 -0
package/.env.example
ADDED
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
|
+
}
|