@adhd/agent-mcp 0.0.1
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/drizzle/0000_nifty_sasquatch.sql +55 -0
- package/drizzle/meta/0000_snapshot.json +387 -0
- package/drizzle/meta/_journal.json +13 -0
- package/package.json +51 -0
- package/src/clients/http-client.d.ts +24 -0
- package/src/clients/http-client.d.ts.map +1 -0
- package/src/clients/http-client.js +96 -0
- package/src/clients/http-client.js.map +1 -0
- package/src/clients/in-process.d.ts +27 -0
- package/src/clients/in-process.d.ts.map +1 -0
- package/src/clients/in-process.js +32 -0
- package/src/clients/in-process.js.map +1 -0
- package/src/clients/index.d.ts +7 -0
- package/src/clients/index.d.ts.map +1 -0
- package/src/clients/index.js +5 -0
- package/src/clients/index.js.map +1 -0
- package/src/clients/registry.d.ts +37 -0
- package/src/clients/registry.d.ts.map +1 -0
- package/src/clients/registry.js +125 -0
- package/src/clients/registry.js.map +1 -0
- package/src/clients/stdio-client.d.ts +16 -0
- package/src/clients/stdio-client.d.ts.map +1 -0
- package/src/clients/stdio-client.js +90 -0
- package/src/clients/stdio-client.js.map +1 -0
- package/src/clients/types.d.ts +14 -0
- package/src/clients/types.d.ts.map +1 -0
- package/src/clients/types.js +2 -0
- package/src/clients/types.js.map +1 -0
- package/src/db/client.d.ts +6 -0
- package/src/db/client.d.ts.map +1 -0
- package/src/db/client.js +19 -0
- package/src/db/client.js.map +1 -0
- package/src/db/migrate.d.ts +6 -0
- package/src/db/migrate.d.ts.map +1 -0
- package/src/db/migrate.js +12 -0
- package/src/db/migrate.js.map +1 -0
- package/src/db/schema.d.ts +733 -0
- package/src/db/schema.d.ts.map +1 -0
- package/src/db/schema.js +100 -0
- package/src/db/schema.js.map +1 -0
- package/src/engine/orchestrator.d.ts +24 -0
- package/src/engine/orchestrator.d.ts.map +1 -0
- package/src/engine/orchestrator.js +231 -0
- package/src/engine/orchestrator.js.map +1 -0
- package/src/engine/policy.d.ts +42 -0
- package/src/engine/policy.d.ts.map +1 -0
- package/src/engine/policy.js +45 -0
- package/src/engine/policy.js.map +1 -0
- package/src/engine/queue.d.ts +23 -0
- package/src/engine/queue.d.ts.map +1 -0
- package/src/engine/queue.js +45 -0
- package/src/engine/queue.js.map +1 -0
- package/src/index.d.ts +3 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +51 -0
- package/src/index.js.map +1 -0
- package/src/logger.d.ts +11 -0
- package/src/logger.d.ts.map +1 -0
- package/src/logger.js +17 -0
- package/src/logger.js.map +1 -0
- package/src/providers/anthropic.d.ts +11 -0
- package/src/providers/anthropic.d.ts.map +1 -0
- package/src/providers/anthropic.js +133 -0
- package/src/providers/anthropic.js.map +1 -0
- package/src/providers/factory.d.ts +7 -0
- package/src/providers/factory.d.ts.map +1 -0
- package/src/providers/factory.js +21 -0
- package/src/providers/factory.js.map +1 -0
- package/src/providers/index.d.ts +6 -0
- package/src/providers/index.d.ts.map +1 -0
- package/src/providers/index.js +5 -0
- package/src/providers/index.js.map +1 -0
- package/src/providers/lmstudio.d.ts +8 -0
- package/src/providers/lmstudio.d.ts.map +1 -0
- package/src/providers/lmstudio.js +15 -0
- package/src/providers/lmstudio.js.map +1 -0
- package/src/providers/openai.d.ts +12 -0
- package/src/providers/openai.d.ts.map +1 -0
- package/src/providers/openai.js +129 -0
- package/src/providers/openai.js.map +1 -0
- package/src/providers/types.d.ts +32 -0
- package/src/providers/types.d.ts.map +1 -0
- package/src/providers/types.js +2 -0
- package/src/providers/types.js.map +1 -0
- package/src/server.d.ts +23 -0
- package/src/server.d.ts.map +1 -0
- package/src/server.js +539 -0
- package/src/server.js.map +1 -0
- package/src/store/agent-store.d.ts +12 -0
- package/src/store/agent-store.d.ts.map +1 -0
- package/src/store/agent-store.js +97 -0
- package/src/store/agent-store.js.map +1 -0
- package/src/store/index.d.ts +4 -0
- package/src/store/index.d.ts.map +1 -0
- package/src/store/index.js +4 -0
- package/src/store/index.js.map +1 -0
- package/src/store/session-store.d.ts +23 -0
- package/src/store/session-store.d.ts.map +1 -0
- package/src/store/session-store.js +152 -0
- package/src/store/session-store.js.map +1 -0
- package/src/store/task-store.d.ts +49 -0
- package/src/store/task-store.d.ts.map +1 -0
- package/src/store/task-store.js +154 -0
- package/src/store/task-store.js.map +1 -0
- package/src/tools/agent-crud.d.ts +13 -0
- package/src/tools/agent-crud.d.ts.map +1 -0
- package/src/tools/agent-crud.js +17 -0
- package/src/tools/agent-crud.js.map +1 -0
- package/src/tools/session.d.ts +21 -0
- package/src/tools/session.d.ts.map +1 -0
- package/src/tools/session.js +41 -0
- package/src/tools/session.js.map +1 -0
- package/src/tools/task.d.ts +38 -0
- package/src/tools/task.d.ts.map +1 -0
- package/src/tools/task.js +136 -0
- package/src/tools/task.js.map +1 -0
- package/src/types/agent.d.ts +2 -0
- package/src/types/agent.d.ts.map +1 -0
- package/src/types/agent.js +3 -0
- package/src/types/agent.js.map +1 -0
- package/src/types/execution.d.ts +2 -0
- package/src/types/execution.d.ts.map +1 -0
- package/src/types/execution.js +3 -0
- package/src/types/execution.js.map +1 -0
- package/src/types/index.d.ts +2 -0
- package/src/types/index.d.ts.map +1 -0
- package/src/types/index.js +2 -0
- package/src/types/index.js.map +1 -0
- package/src/types/mcp.d.ts +2 -0
- package/src/types/mcp.d.ts.map +1 -0
- package/src/types/mcp.js +3 -0
- package/src/types/mcp.js.map +1 -0
- package/src/types/message.d.ts +2 -0
- package/src/types/message.d.ts.map +1 -0
- package/src/types/message.js +3 -0
- package/src/types/message.js.map +1 -0
- package/src/types/session.d.ts +2 -0
- package/src/types/session.d.ts.map +1 -0
- package/src/types/session.js +3 -0
- package/src/types/session.js.map +1 -0
- package/src/types/task.d.ts +2 -0
- package/src/types/task.d.ts.map +1 -0
- package/src/types/task.js +3 -0
- package/src/types/task.js.map +1 -0
- package/src/utils/ids.d.ts +2 -0
- package/src/utils/ids.d.ts.map +1 -0
- package/src/utils/ids.js +5 -0
- package/src/utils/ids.js.map +1 -0
- package/src/utils/logger.d.ts +2 -0
- package/src/utils/logger.d.ts.map +1 -0
- package/src/utils/logger.js +5 -0
- package/src/utils/logger.js.map +1 -0
- package/src/utils/timestamps.d.ts +2 -0
- package/src/utils/timestamps.d.ts.map +1 -0
- package/src/utils/timestamps.js +4 -0
- package/src/utils/timestamps.js.map +1 -0
- package/src/validation/agent.d.ts +276 -0
- package/src/validation/agent.d.ts.map +1 -0
- package/src/validation/agent.js +94 -0
- package/src/validation/agent.js.map +1 -0
- package/src/validation/agents.d.ts +2 -0
- package/src/validation/agents.d.ts.map +1 -0
- package/src/validation/agents.js +3 -0
- package/src/validation/agents.js.map +1 -0
- package/src/validation/errors.d.ts +23 -0
- package/src/validation/errors.d.ts.map +1 -0
- package/src/validation/errors.js +33 -0
- package/src/validation/errors.js.map +1 -0
- package/src/validation/execution.d.ts +83 -0
- package/src/validation/execution.d.ts.map +1 -0
- package/src/validation/execution.js +23 -0
- package/src/validation/execution.js.map +1 -0
- package/src/validation/index.d.ts +8 -0
- package/src/validation/index.d.ts.map +1 -0
- package/src/validation/index.js +8 -0
- package/src/validation/index.js.map +1 -0
- package/src/validation/mcp.d.ts +43 -0
- package/src/validation/mcp.d.ts.map +1 -0
- package/src/validation/mcp.js +28 -0
- package/src/validation/mcp.js.map +1 -0
- package/src/validation/message.d.ts +46 -0
- package/src/validation/message.d.ts.map +1 -0
- package/src/validation/message.js +23 -0
- package/src/validation/message.js.map +1 -0
- package/src/validation/session.d.ts +49 -0
- package/src/validation/session.d.ts.map +1 -0
- package/src/validation/session.js +34 -0
- package/src/validation/session.js.map +1 -0
- package/src/validation/task.d.ts +94 -0
- package/src/validation/task.d.ts.map +1 -0
- package/src/validation/task.js +60 -0
- package/src/validation/task.js.map +1 -0
- package/src/validation/tasks.d.ts +2 -0
- package/src/validation/tasks.d.ts.map +1 -0
- package/src/validation/tasks.js +3 -0
- package/src/validation/tasks.js.map +1 -0
package/src/server.js
ADDED
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { logger } from "./logger.js";
|
|
7
|
+
import { agentCreate, agentRead, agentUpdate, agentDelete, agentList, } from "./tools/agent-crud.js";
|
|
8
|
+
import { agentTool, sessionList, sessionClose, sessionClear } from "./tools/session.js";
|
|
9
|
+
import { taskTool, taskList, taskCancel, resultTool } from "./tools/task.js";
|
|
10
|
+
import { ToolError } from "./validation/errors.js";
|
|
11
|
+
import { agentCreateInputSchema, agentReadInputSchema, agentUpdateInputSchema, agentDeleteInputSchema, agentToolInputSchema, sessionListInputSchema, sessionCloseInputSchema, sessionClearInputSchema, taskToolInputSchema, taskListInputSchema, taskCancelInputSchema, resultInputSchema, } from "./validation/index.js";
|
|
12
|
+
function toMcpErrorContent(error) {
|
|
13
|
+
let message;
|
|
14
|
+
if (error instanceof ToolError) {
|
|
15
|
+
message = `[${error.code}] ${error.message}`;
|
|
16
|
+
}
|
|
17
|
+
else if (error instanceof Error) {
|
|
18
|
+
message = error.message;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
message = String(error);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
isError: true,
|
|
25
|
+
content: [{ type: "text", text: message }],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function toMcpContent(value) {
|
|
29
|
+
return {
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: "text",
|
|
33
|
+
text: JSON.stringify(value, null, 2),
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const USAGE_GUIDE = `
|
|
39
|
+
# agent-mcp Usage Guide
|
|
40
|
+
|
|
41
|
+
This server lets you create persistent AI agents, open sessions with them, and
|
|
42
|
+
run tasks — including having agents delegate work to other agents recursively.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Core concepts
|
|
47
|
+
|
|
48
|
+
- **Agent definition** — a stored blueprint: provider, model, system prompt, MCP
|
|
49
|
+
tools, and delegation permissions. Created once with \`agent_create\`.
|
|
50
|
+
- **Session** — a stateful conversation thread tied to one agent definition. The
|
|
51
|
+
agent snapshot is taken at session creation, so updating the definition later
|
|
52
|
+
does not affect open sessions.
|
|
53
|
+
- **Task** — a single prompt sent to a session. Can run synchronously (wait for
|
|
54
|
+
the result) or in the background (poll with \`result\`).
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Workflow 1 — Basic: ask an agent a question
|
|
59
|
+
|
|
60
|
+
\`\`\`
|
|
61
|
+
1. agent_create { name, provider, systemPrompt, mcpServers, permissions }
|
|
62
|
+
2. agent { name } → { session_id }
|
|
63
|
+
3. task { session_id, prompt,
|
|
64
|
+
background: false } → { task_id, status, result }
|
|
65
|
+
\`\`\`
|
|
66
|
+
|
|
67
|
+
Example calls:
|
|
68
|
+
|
|
69
|
+
\`\`\`jsonc
|
|
70
|
+
// Step 1 — create the agent (once; skip if already exists)
|
|
71
|
+
agent_create({
|
|
72
|
+
"name": "assistant",
|
|
73
|
+
"systemPrompt": "You are a concise assistant.",
|
|
74
|
+
"provider": {
|
|
75
|
+
"type": "openai",
|
|
76
|
+
"model": "gpt-4o-mini"
|
|
77
|
+
},
|
|
78
|
+
"mcpServers": {},
|
|
79
|
+
"permissions": {}
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
// Step 2 — open a session
|
|
83
|
+
agent({ "name": "assistant" })
|
|
84
|
+
// → { "session_id": "abc-123" }
|
|
85
|
+
|
|
86
|
+
// Step 3 — run a prompt synchronously
|
|
87
|
+
task({ "session_id": "abc-123", "prompt": "What is 2 + 2?", "background": false })
|
|
88
|
+
// → { "task_id": "t-456", "status": "completed", "result": "4" }
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
The session is persistent — call \`task\` again on the same \`session_id\` to
|
|
92
|
+
continue the conversation with full history.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Workflow 2 — Background task with polling
|
|
97
|
+
|
|
98
|
+
Use \`background: true\` for long-running tasks so this call returns immediately.
|
|
99
|
+
|
|
100
|
+
\`\`\`
|
|
101
|
+
1. task { session_id, prompt, background: true } → { task_id, status: "pending" }
|
|
102
|
+
2. result { task_id } → { status: "running"|"completed"|"failed" }
|
|
103
|
+
(repeat step 2 until status is terminal)
|
|
104
|
+
\`\`\`
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
|
|
108
|
+
\`\`\`jsonc
|
|
109
|
+
task({ "session_id": "abc-123", "prompt": "Write a 500-word essay on recursion.", "background": true })
|
|
110
|
+
// → { "task_id": "t-789", "status": "pending" }
|
|
111
|
+
|
|
112
|
+
result({ "task_id": "t-789" })
|
|
113
|
+
// → { "status": "running", ... } ← not done yet, poll again
|
|
114
|
+
|
|
115
|
+
result({ "task_id": "t-789" })
|
|
116
|
+
// → { "status": "completed", "result": "Recursion is ..." }
|
|
117
|
+
\`\`\`
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Workflow 3 — Agent delegation (agents calling agents)
|
|
122
|
+
|
|
123
|
+
An agent can call another agent if:
|
|
124
|
+
- Its \`mcpServers\` contains an \`"agent-mcp"\` entry pointing back at this server
|
|
125
|
+
- The target agent is in its \`permissions.allowedAgents\` (or the list is omitted = unrestricted)
|
|
126
|
+
|
|
127
|
+
\`\`\`jsonc
|
|
128
|
+
// Create the sub-agent
|
|
129
|
+
agent_create({
|
|
130
|
+
"name": "researcher",
|
|
131
|
+
"systemPrompt": "You are a research specialist. Answer with citations.",
|
|
132
|
+
"provider": { "type": "anthropic", "model": "claude-opus-4-5" },
|
|
133
|
+
"mcpServers": {},
|
|
134
|
+
"permissions": {}
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
// Create the orchestrator agent that can delegate to "researcher"
|
|
138
|
+
agent_create({
|
|
139
|
+
"name": "orchestrator",
|
|
140
|
+
"systemPrompt": "You coordinate tasks. Delegate research questions to the researcher agent.",
|
|
141
|
+
"provider": { "type": "anthropic", "model": "claude-opus-4-5" },
|
|
142
|
+
"mcpServers": {
|
|
143
|
+
"agent-mcp": { "transport": "stdio", "command": "node",
|
|
144
|
+
"args": ["/path/to/dist/index.js"] }
|
|
145
|
+
},
|
|
146
|
+
"permissions": {
|
|
147
|
+
"allowedAgents": ["researcher"]
|
|
148
|
+
}
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
// Open a session for the orchestrator and run a task
|
|
152
|
+
agent({ "name": "orchestrator" })
|
|
153
|
+
// → { "session_id": "orch-session-id" }
|
|
154
|
+
|
|
155
|
+
task({
|
|
156
|
+
"session_id": "orch-session-id",
|
|
157
|
+
"prompt": "Research the history of the MCP protocol and summarise it.",
|
|
158
|
+
"background": false
|
|
159
|
+
})
|
|
160
|
+
// The orchestrator will autonomously call agent("researcher") and task() internally.
|
|
161
|
+
\`\`\`
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Workflow 4 — Multi-turn conversation
|
|
166
|
+
|
|
167
|
+
Sessions preserve full message history. Call \`task\` repeatedly on the same
|
|
168
|
+
\`session_id\` to have a back-and-forth conversation.
|
|
169
|
+
|
|
170
|
+
\`\`\`jsonc
|
|
171
|
+
task({ "session_id": "abc-123", "prompt": "My name is Alice.", "background": false })
|
|
172
|
+
// → { "result": "Nice to meet you, Alice!" }
|
|
173
|
+
|
|
174
|
+
task({ "session_id": "abc-123", "prompt": "What is my name?", "background": false })
|
|
175
|
+
// → { "result": "Your name is Alice." }
|
|
176
|
+
\`\`\`
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Updating an agent definition
|
|
181
|
+
|
|
182
|
+
\`agent_update\` never affects open sessions. It bumps the version and only
|
|
183
|
+
applies to sessions opened after the update.
|
|
184
|
+
|
|
185
|
+
\`\`\`jsonc
|
|
186
|
+
agent_update({
|
|
187
|
+
"name": "assistant",
|
|
188
|
+
"patch": { "systemPrompt": "You are a terse assistant. Reply in one sentence." }
|
|
189
|
+
})
|
|
190
|
+
\`\`\`
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Cancelling a task
|
|
195
|
+
|
|
196
|
+
\`\`\`jsonc
|
|
197
|
+
task_cancel({ "task_id": "t-789" })
|
|
198
|
+
\`\`\`
|
|
199
|
+
|
|
200
|
+
Only works when status is \`"pending"\` or \`"running"\`.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Clearing a session's context
|
|
205
|
+
|
|
206
|
+
\`session_clear\` deletes all messages from a session without closing it. The session
|
|
207
|
+
stays active and the next task starts with a blank slate. The system prompt is
|
|
208
|
+
part of the agent definition — it is never affected by \`session_clear\`.
|
|
209
|
+
|
|
210
|
+
\`\`\`jsonc
|
|
211
|
+
session_clear({ "session_id": "abc-123" })
|
|
212
|
+
// → { "session_id": "abc-123", "cleared": 12 }
|
|
213
|
+
\`\`\`
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Provider types
|
|
218
|
+
|
|
219
|
+
| type | required fields | notes |
|
|
220
|
+
|-------------|----------------------------|------------------------------|
|
|
221
|
+
| \`openai\` | model | apiKeyEnv defaults to OPENAI_API_KEY |
|
|
222
|
+
| \`anthropic\` | model | apiKeyEnv defaults to ANTHROPIC_API_KEY |
|
|
223
|
+
| \`lmstudio\` | model, baseURL | OpenAI-compatible local server |
|
|
224
|
+
|
|
225
|
+
All providers accept: \`temperature\`, \`maxTokens\`, \`timeoutMs\`, \`retryConfig\`.
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Common errors
|
|
230
|
+
|
|
231
|
+
| error code | meaning |
|
|
232
|
+
|-------------------------|-------------------------------------------------------|
|
|
233
|
+
| AGENT_NOT_FOUND | Call \`agent_create\` first |
|
|
234
|
+
| AGENT_ALREADY_EXISTS | Agent name already taken; use \`agent_update\` instead |
|
|
235
|
+
| SESSION_NOT_FOUND | Invalid or expired session_id |
|
|
236
|
+
| SESSION_CLOSED | Session was closed; open a new one with \`agent\` |
|
|
237
|
+
| TASK_NOT_FOUND | Invalid task_id |
|
|
238
|
+
| TASK_NOT_CANCELLABLE | Task already completed, failed, or cancelled |
|
|
239
|
+
| MAX_DEPTH_EXCEEDED | Delegation chain too deep (server limit: MAX_DEPTH) |
|
|
240
|
+
| MAX_TOOL_LOOPS_EXCEEDED | Agent used too many tool calls in one task |
|
|
241
|
+
| DELEGATION_NOT_ALLOWED | Target agent not in caller's allowedAgents list |
|
|
242
|
+
`.trim();
|
|
243
|
+
export function createServer(deps) {
|
|
244
|
+
const server = new Server({ name: "agent-mcp", version: "1.0.0" }, { capabilities: { tools: {} } });
|
|
245
|
+
// ── Tool descriptors for in-process recursive calls ──────────────────
|
|
246
|
+
// These describe the MCP tools that an agent can call via the
|
|
247
|
+
// "agent-mcp" self-referential server entry.
|
|
248
|
+
const inProcessDescriptors = [
|
|
249
|
+
{
|
|
250
|
+
name: "agent",
|
|
251
|
+
description: "Instantiate a session for a named agent",
|
|
252
|
+
inputSchema: z.toJSONSchema(agentToolInputSchema),
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
name: "task",
|
|
256
|
+
description: "Run a prompt against a session",
|
|
257
|
+
inputSchema: z.toJSONSchema(taskToolInputSchema),
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
name: "result",
|
|
261
|
+
description: "Get the result of a task",
|
|
262
|
+
inputSchema: z.toJSONSchema(resultInputSchema),
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
name: "task_list",
|
|
266
|
+
description: "List tasks",
|
|
267
|
+
inputSchema: z.toJSONSchema(taskListInputSchema),
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
name: "task_cancel",
|
|
271
|
+
description: "Cancel a running task",
|
|
272
|
+
inputSchema: z.toJSONSchema(taskCancelInputSchema),
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: "session_list",
|
|
276
|
+
description: "List sessions",
|
|
277
|
+
inputSchema: z.toJSONSchema(sessionListInputSchema),
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
name: "session_close",
|
|
281
|
+
description: "Close a session",
|
|
282
|
+
inputSchema: z.toJSONSchema(sessionCloseInputSchema),
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
name: "session_clear",
|
|
286
|
+
description: "Clear all messages from a session's context without closing it",
|
|
287
|
+
inputSchema: z.toJSONSchema(sessionClearInputSchema),
|
|
288
|
+
},
|
|
289
|
+
];
|
|
290
|
+
// In-process handler that routes tool calls to the local handlers
|
|
291
|
+
const inProcessHandler = async (toolName, args, ctx) => {
|
|
292
|
+
switch (toolName) {
|
|
293
|
+
case "agent":
|
|
294
|
+
return agentTool(agentToolInputSchema.parse(args), { agentStore: deps.agentStore, sessionStore: deps.sessionStore, policy: deps.policy }, ctx);
|
|
295
|
+
case "task":
|
|
296
|
+
return taskTool(taskToolInputSchema.parse(args), {
|
|
297
|
+
sessionStore: deps.sessionStore,
|
|
298
|
+
taskStore: deps.taskStore,
|
|
299
|
+
orchestrator: deps.orchestrator,
|
|
300
|
+
queue: deps.queue,
|
|
301
|
+
policy: deps.policy,
|
|
302
|
+
selfUrl: deps.selfUrl,
|
|
303
|
+
inProcessDescriptors,
|
|
304
|
+
inProcessHandler,
|
|
305
|
+
}, ctx);
|
|
306
|
+
case "result":
|
|
307
|
+
return resultTool(resultInputSchema.parse(args), { taskStore: deps.taskStore });
|
|
308
|
+
case "task_list":
|
|
309
|
+
return taskList(taskListInputSchema.parse(args), { taskStore: deps.taskStore });
|
|
310
|
+
case "task_cancel":
|
|
311
|
+
return taskCancel(taskCancelInputSchema.parse(args), { taskStore: deps.taskStore });
|
|
312
|
+
case "session_list":
|
|
313
|
+
return sessionList(sessionListInputSchema.parse(args), {
|
|
314
|
+
agentStore: deps.agentStore,
|
|
315
|
+
sessionStore: deps.sessionStore,
|
|
316
|
+
policy: deps.policy,
|
|
317
|
+
});
|
|
318
|
+
case "session_close":
|
|
319
|
+
return sessionClose(sessionCloseInputSchema.parse(args), {
|
|
320
|
+
agentStore: deps.agentStore,
|
|
321
|
+
sessionStore: deps.sessionStore,
|
|
322
|
+
policy: deps.policy,
|
|
323
|
+
});
|
|
324
|
+
case "session_clear":
|
|
325
|
+
return sessionClear(sessionClearInputSchema.parse(args), {
|
|
326
|
+
agentStore: deps.agentStore,
|
|
327
|
+
sessionStore: deps.sessionStore,
|
|
328
|
+
policy: deps.policy,
|
|
329
|
+
});
|
|
330
|
+
default:
|
|
331
|
+
throw new ToolError("VALIDATION_ERROR", `Unknown in-process tool: ${toolName}`);
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
// ── Tool list ─────────────────────────────────────────────────────────
|
|
335
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
336
|
+
tools: [
|
|
337
|
+
{
|
|
338
|
+
name: "agent_create",
|
|
339
|
+
description: "Create a new stored agent definition",
|
|
340
|
+
inputSchema: z.toJSONSchema(agentCreateInputSchema),
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
name: "agent_read",
|
|
344
|
+
description: "Read a stored agent definition by name",
|
|
345
|
+
inputSchema: z.toJSONSchema(agentReadInputSchema),
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
name: "agent_update",
|
|
349
|
+
description: "Update a stored agent definition",
|
|
350
|
+
inputSchema: z.toJSONSchema(agentUpdateInputSchema),
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
name: "agent_delete",
|
|
354
|
+
description: "Delete a stored agent definition",
|
|
355
|
+
inputSchema: z.toJSONSchema(agentDeleteInputSchema),
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
name: "agent_list",
|
|
359
|
+
description: "List all stored agent definitions",
|
|
360
|
+
inputSchema: { type: "object", properties: {} },
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
name: "agent",
|
|
364
|
+
description: "Instantiate a stateful session for a named agent",
|
|
365
|
+
inputSchema: z.toJSONSchema(agentToolInputSchema),
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
name: "session_list",
|
|
369
|
+
description: "List sessions",
|
|
370
|
+
inputSchema: z.toJSONSchema(sessionListInputSchema),
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
name: "session_close",
|
|
374
|
+
description: "Close an active session",
|
|
375
|
+
inputSchema: z.toJSONSchema(sessionCloseInputSchema),
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
name: "session_clear",
|
|
379
|
+
description: "Clear all messages from a session's context without closing it",
|
|
380
|
+
inputSchema: z.toJSONSchema(sessionClearInputSchema),
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
name: "task",
|
|
384
|
+
description: "Run a prompt against a session's agent (sync or background)",
|
|
385
|
+
inputSchema: z.toJSONSchema(taskToolInputSchema),
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
name: "task_list",
|
|
389
|
+
description: "List tasks",
|
|
390
|
+
inputSchema: z.toJSONSchema(taskListInputSchema),
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
name: "task_cancel",
|
|
394
|
+
description: "Cancel a running or pending task",
|
|
395
|
+
inputSchema: z.toJSONSchema(taskCancelInputSchema),
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
name: "result",
|
|
399
|
+
description: "Get the current state and result of a task",
|
|
400
|
+
inputSchema: z.toJSONSchema(resultInputSchema),
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
name: "usage",
|
|
404
|
+
description: "Returns a complete guide explaining how to use this server — call this first if you are unsure what to do",
|
|
405
|
+
inputSchema: { type: "object", properties: {} },
|
|
406
|
+
},
|
|
407
|
+
],
|
|
408
|
+
}));
|
|
409
|
+
// ── Tool dispatcher ───────────────────────────────────────────────────
|
|
410
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
411
|
+
const { name, arguments: args } = request.params;
|
|
412
|
+
try {
|
|
413
|
+
switch (name) {
|
|
414
|
+
case "agent_create":
|
|
415
|
+
return toMcpContent(agentCreate(agentCreateInputSchema.parse(args), { agentStore: deps.agentStore }));
|
|
416
|
+
case "agent_read":
|
|
417
|
+
return toMcpContent(agentRead(agentReadInputSchema.parse(args), { agentStore: deps.agentStore }));
|
|
418
|
+
case "agent_update":
|
|
419
|
+
return toMcpContent(agentUpdate(agentUpdateInputSchema.parse(args), { agentStore: deps.agentStore }));
|
|
420
|
+
case "agent_delete":
|
|
421
|
+
return toMcpContent(agentDelete(agentDeleteInputSchema.parse(args), { agentStore: deps.agentStore }));
|
|
422
|
+
case "agent_list":
|
|
423
|
+
return toMcpContent(agentList(args, { agentStore: deps.agentStore }));
|
|
424
|
+
case "agent":
|
|
425
|
+
return toMcpContent(await agentTool(agentToolInputSchema.parse(args), {
|
|
426
|
+
agentStore: deps.agentStore,
|
|
427
|
+
sessionStore: deps.sessionStore,
|
|
428
|
+
policy: deps.policy,
|
|
429
|
+
})
|
|
430
|
+
// No executionContext — top-level call
|
|
431
|
+
);
|
|
432
|
+
case "session_list":
|
|
433
|
+
return toMcpContent(sessionList(sessionListInputSchema.parse(args), {
|
|
434
|
+
agentStore: deps.agentStore,
|
|
435
|
+
sessionStore: deps.sessionStore,
|
|
436
|
+
policy: deps.policy,
|
|
437
|
+
}));
|
|
438
|
+
case "session_close":
|
|
439
|
+
return toMcpContent(sessionClose(sessionCloseInputSchema.parse(args), {
|
|
440
|
+
agentStore: deps.agentStore,
|
|
441
|
+
sessionStore: deps.sessionStore,
|
|
442
|
+
policy: deps.policy,
|
|
443
|
+
}));
|
|
444
|
+
case "session_clear":
|
|
445
|
+
return toMcpContent(sessionClear(sessionClearInputSchema.parse(args), {
|
|
446
|
+
agentStore: deps.agentStore,
|
|
447
|
+
sessionStore: deps.sessionStore,
|
|
448
|
+
policy: deps.policy,
|
|
449
|
+
}));
|
|
450
|
+
case "task":
|
|
451
|
+
return toMcpContent(await taskTool(taskToolInputSchema.parse(args), {
|
|
452
|
+
sessionStore: deps.sessionStore,
|
|
453
|
+
taskStore: deps.taskStore,
|
|
454
|
+
orchestrator: deps.orchestrator,
|
|
455
|
+
queue: deps.queue,
|
|
456
|
+
policy: deps.policy,
|
|
457
|
+
selfUrl: deps.selfUrl,
|
|
458
|
+
inProcessDescriptors,
|
|
459
|
+
inProcessHandler,
|
|
460
|
+
})
|
|
461
|
+
// No callerContext — top-level call
|
|
462
|
+
);
|
|
463
|
+
case "task_list":
|
|
464
|
+
return toMcpContent(taskList(taskListInputSchema.parse(args), { taskStore: deps.taskStore }));
|
|
465
|
+
case "task_cancel":
|
|
466
|
+
return toMcpContent(taskCancel(taskCancelInputSchema.parse(args), { taskStore: deps.taskStore }));
|
|
467
|
+
case "result":
|
|
468
|
+
return toMcpContent(resultTool(resultInputSchema.parse(args), { taskStore: deps.taskStore }));
|
|
469
|
+
case "usage":
|
|
470
|
+
return toMcpContent(USAGE_GUIDE);
|
|
471
|
+
default:
|
|
472
|
+
return toMcpErrorContent(new ToolError("VALIDATION_ERROR", `Unknown tool: ${name}`));
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
catch (error) {
|
|
476
|
+
return toMcpErrorContent(error);
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
return server;
|
|
480
|
+
}
|
|
481
|
+
export async function startServer(deps) {
|
|
482
|
+
const server = createServer(deps);
|
|
483
|
+
const transport = process.env["TRANSPORT"] ?? "stdio";
|
|
484
|
+
const port = parseInt(process.env["PORT"] ?? "3000", 10);
|
|
485
|
+
if (transport === "stdio") {
|
|
486
|
+
const stdioTransport = new StdioServerTransport();
|
|
487
|
+
await server.connect(stdioTransport);
|
|
488
|
+
logger.info({ transport: "stdio" }, "MCP server started");
|
|
489
|
+
return {
|
|
490
|
+
close: async () => {
|
|
491
|
+
await server.close();
|
|
492
|
+
},
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
if (transport === "http") {
|
|
496
|
+
// Dynamically import http to avoid requiring it in stdio mode
|
|
497
|
+
const { createServer: createHttpServer } = await import("node:http");
|
|
498
|
+
const httpTransport = new StreamableHTTPServerTransport({
|
|
499
|
+
sessionIdGenerator: () => crypto.randomUUID(),
|
|
500
|
+
});
|
|
501
|
+
const httpServer = createHttpServer(async (req, res) => {
|
|
502
|
+
await httpTransport.handleRequest(req, res);
|
|
503
|
+
});
|
|
504
|
+
await server.connect(httpTransport);
|
|
505
|
+
await new Promise((resolve, reject) => {
|
|
506
|
+
httpServer.listen(port, () => {
|
|
507
|
+
logger.info({ transport: "http", port }, "MCP server started");
|
|
508
|
+
resolve();
|
|
509
|
+
});
|
|
510
|
+
httpServer.on("error", reject);
|
|
511
|
+
});
|
|
512
|
+
const selfUrl = `http://localhost:${port}`;
|
|
513
|
+
deps.selfUrl = selfUrl;
|
|
514
|
+
return {
|
|
515
|
+
close: async () => {
|
|
516
|
+
await server.close();
|
|
517
|
+
await new Promise((resolve, reject) => {
|
|
518
|
+
httpServer.close(err => (err ? reject(err) : resolve()));
|
|
519
|
+
});
|
|
520
|
+
},
|
|
521
|
+
httpServer,
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
// SSE transport
|
|
525
|
+
if (transport === "sse") {
|
|
526
|
+
// SSE transport requires a different setup; use StreamableHTTP as fallback for now
|
|
527
|
+
// A proper SSE implementation would use express or a custom HTTP server
|
|
528
|
+
logger.warn({ transport }, "SSE transport not fully implemented; falling back to stdio behavior");
|
|
529
|
+
const stdioTransport = new StdioServerTransport();
|
|
530
|
+
await server.connect(stdioTransport);
|
|
531
|
+
return {
|
|
532
|
+
close: async () => {
|
|
533
|
+
await server.close();
|
|
534
|
+
},
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
throw new Error(`Unknown transport: ${transport}`);
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../../packages/ai/agent-mcp/src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
|
|
2
|
+
import type { AgentCreateInput, AgentDefinition, AgentUpdateInput } from "../validation/index.js";
|
|
3
|
+
export declare class AgentStore {
|
|
4
|
+
private readonly db;
|
|
5
|
+
constructor(db: BetterSQLite3Database<Record<string, never>>);
|
|
6
|
+
create(input: AgentCreateInput): AgentDefinition;
|
|
7
|
+
read(name: string): AgentDefinition;
|
|
8
|
+
update(input: AgentUpdateInput): AgentDefinition;
|
|
9
|
+
delete(name: string): void;
|
|
10
|
+
list(): AgentDefinition[];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=agent-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-store.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/store/agent-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAIxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAKlG,qBAAa,UAAU;IAEf,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAGrE,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe;IAkChD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAiBnC,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe;IAkChD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA8B1B,IAAI,IAAI,eAAe,EAAE;CAI5B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm";
|
|
2
|
+
import { agentsTable, sessionsTable } from "../db/schema.js";
|
|
3
|
+
import { logger } from "../logger.js";
|
|
4
|
+
import { agentDefinitionSchema } from "../validation/index.js";
|
|
5
|
+
import { ToolError } from "../validation/errors.js";
|
|
6
|
+
import { nowIso } from "../utils/timestamps.js";
|
|
7
|
+
export class AgentStore {
|
|
8
|
+
db;
|
|
9
|
+
constructor(db) {
|
|
10
|
+
this.db = db;
|
|
11
|
+
}
|
|
12
|
+
create(input) {
|
|
13
|
+
const now = nowIso();
|
|
14
|
+
const definition = {
|
|
15
|
+
...input,
|
|
16
|
+
version: 1,
|
|
17
|
+
createdAt: now,
|
|
18
|
+
updatedAt: now,
|
|
19
|
+
};
|
|
20
|
+
const existing = this.db
|
|
21
|
+
.select()
|
|
22
|
+
.from(agentsTable)
|
|
23
|
+
.where(eq(agentsTable.name, input.name))
|
|
24
|
+
.get();
|
|
25
|
+
if (existing) {
|
|
26
|
+
throw new ToolError("AGENT_ALREADY_EXISTS", `Agent '${input.name}' already exists`);
|
|
27
|
+
}
|
|
28
|
+
this.db.insert(agentsTable).values({
|
|
29
|
+
name: definition.name,
|
|
30
|
+
version: definition.version,
|
|
31
|
+
data: JSON.stringify(definition),
|
|
32
|
+
createdAt: now,
|
|
33
|
+
updatedAt: now,
|
|
34
|
+
}).run();
|
|
35
|
+
logger.info({ agentName: input.name }, "Agent created");
|
|
36
|
+
return definition;
|
|
37
|
+
}
|
|
38
|
+
read(name) {
|
|
39
|
+
const row = this.db
|
|
40
|
+
.select()
|
|
41
|
+
.from(agentsTable)
|
|
42
|
+
.where(eq(agentsTable.name, name))
|
|
43
|
+
.get();
|
|
44
|
+
if (!row) {
|
|
45
|
+
throw new ToolError("AGENT_NOT_FOUND", `Agent '${name}' not found`);
|
|
46
|
+
}
|
|
47
|
+
return agentDefinitionSchema.parse(JSON.parse(row.data));
|
|
48
|
+
}
|
|
49
|
+
update(input) {
|
|
50
|
+
const existing = this.read(input.name); // throws AGENT_NOT_FOUND if missing
|
|
51
|
+
// Strip undefined values so absent patch fields don't clobber existing ones
|
|
52
|
+
const definedPatch = Object.fromEntries(Object.entries(input.patch).filter(([, v]) => v !== undefined));
|
|
53
|
+
const updated = {
|
|
54
|
+
...existing,
|
|
55
|
+
...definedPatch,
|
|
56
|
+
name: existing.name, // name is immutable
|
|
57
|
+
createdAt: existing.createdAt, // createdAt is immutable
|
|
58
|
+
version: existing.version + 1,
|
|
59
|
+
updatedAt: nowIso(),
|
|
60
|
+
};
|
|
61
|
+
this.db
|
|
62
|
+
.update(agentsTable)
|
|
63
|
+
.set({
|
|
64
|
+
version: updated.version,
|
|
65
|
+
data: JSON.stringify(updated),
|
|
66
|
+
updatedAt: updated.updatedAt,
|
|
67
|
+
})
|
|
68
|
+
.where(eq(agentsTable.name, input.name))
|
|
69
|
+
.run();
|
|
70
|
+
logger.info({ agentName: input.name, version: updated.version }, "Agent updated");
|
|
71
|
+
return updated;
|
|
72
|
+
}
|
|
73
|
+
delete(name) {
|
|
74
|
+
const activeSessionCheck = this.db
|
|
75
|
+
.select()
|
|
76
|
+
.from(sessionsTable)
|
|
77
|
+
.where(eq(sessionsTable.agentName, name))
|
|
78
|
+
.all()
|
|
79
|
+
.find(s => s.status === "active");
|
|
80
|
+
if (activeSessionCheck) {
|
|
81
|
+
throw new ToolError("AGENT_HAS_ACTIVE_SESSIONS", `Agent '${name}' has active sessions and cannot be deleted`);
|
|
82
|
+
}
|
|
83
|
+
const result = this.db
|
|
84
|
+
.delete(agentsTable)
|
|
85
|
+
.where(eq(agentsTable.name, name))
|
|
86
|
+
.run();
|
|
87
|
+
if (result.changes === 0) {
|
|
88
|
+
throw new ToolError("AGENT_NOT_FOUND", `Agent '${name}' not found`);
|
|
89
|
+
}
|
|
90
|
+
logger.info({ agentName: name }, "Agent deleted");
|
|
91
|
+
}
|
|
92
|
+
list() {
|
|
93
|
+
const rows = this.db.select().from(agentsTable).all();
|
|
94
|
+
return rows.map(row => agentDefinitionSchema.parse(JSON.parse(row.data)));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=agent-store.js.map
|