@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.
Files changed (196) hide show
  1. package/drizzle/0000_nifty_sasquatch.sql +55 -0
  2. package/drizzle/meta/0000_snapshot.json +387 -0
  3. package/drizzle/meta/_journal.json +13 -0
  4. package/package.json +51 -0
  5. package/src/clients/http-client.d.ts +24 -0
  6. package/src/clients/http-client.d.ts.map +1 -0
  7. package/src/clients/http-client.js +96 -0
  8. package/src/clients/http-client.js.map +1 -0
  9. package/src/clients/in-process.d.ts +27 -0
  10. package/src/clients/in-process.d.ts.map +1 -0
  11. package/src/clients/in-process.js +32 -0
  12. package/src/clients/in-process.js.map +1 -0
  13. package/src/clients/index.d.ts +7 -0
  14. package/src/clients/index.d.ts.map +1 -0
  15. package/src/clients/index.js +5 -0
  16. package/src/clients/index.js.map +1 -0
  17. package/src/clients/registry.d.ts +37 -0
  18. package/src/clients/registry.d.ts.map +1 -0
  19. package/src/clients/registry.js +125 -0
  20. package/src/clients/registry.js.map +1 -0
  21. package/src/clients/stdio-client.d.ts +16 -0
  22. package/src/clients/stdio-client.d.ts.map +1 -0
  23. package/src/clients/stdio-client.js +90 -0
  24. package/src/clients/stdio-client.js.map +1 -0
  25. package/src/clients/types.d.ts +14 -0
  26. package/src/clients/types.d.ts.map +1 -0
  27. package/src/clients/types.js +2 -0
  28. package/src/clients/types.js.map +1 -0
  29. package/src/db/client.d.ts +6 -0
  30. package/src/db/client.d.ts.map +1 -0
  31. package/src/db/client.js +19 -0
  32. package/src/db/client.js.map +1 -0
  33. package/src/db/migrate.d.ts +6 -0
  34. package/src/db/migrate.d.ts.map +1 -0
  35. package/src/db/migrate.js +12 -0
  36. package/src/db/migrate.js.map +1 -0
  37. package/src/db/schema.d.ts +733 -0
  38. package/src/db/schema.d.ts.map +1 -0
  39. package/src/db/schema.js +100 -0
  40. package/src/db/schema.js.map +1 -0
  41. package/src/engine/orchestrator.d.ts +24 -0
  42. package/src/engine/orchestrator.d.ts.map +1 -0
  43. package/src/engine/orchestrator.js +231 -0
  44. package/src/engine/orchestrator.js.map +1 -0
  45. package/src/engine/policy.d.ts +42 -0
  46. package/src/engine/policy.d.ts.map +1 -0
  47. package/src/engine/policy.js +45 -0
  48. package/src/engine/policy.js.map +1 -0
  49. package/src/engine/queue.d.ts +23 -0
  50. package/src/engine/queue.d.ts.map +1 -0
  51. package/src/engine/queue.js +45 -0
  52. package/src/engine/queue.js.map +1 -0
  53. package/src/index.d.ts +3 -0
  54. package/src/index.d.ts.map +1 -0
  55. package/src/index.js +51 -0
  56. package/src/index.js.map +1 -0
  57. package/src/logger.d.ts +11 -0
  58. package/src/logger.d.ts.map +1 -0
  59. package/src/logger.js +17 -0
  60. package/src/logger.js.map +1 -0
  61. package/src/providers/anthropic.d.ts +11 -0
  62. package/src/providers/anthropic.d.ts.map +1 -0
  63. package/src/providers/anthropic.js +133 -0
  64. package/src/providers/anthropic.js.map +1 -0
  65. package/src/providers/factory.d.ts +7 -0
  66. package/src/providers/factory.d.ts.map +1 -0
  67. package/src/providers/factory.js +21 -0
  68. package/src/providers/factory.js.map +1 -0
  69. package/src/providers/index.d.ts +6 -0
  70. package/src/providers/index.d.ts.map +1 -0
  71. package/src/providers/index.js +5 -0
  72. package/src/providers/index.js.map +1 -0
  73. package/src/providers/lmstudio.d.ts +8 -0
  74. package/src/providers/lmstudio.d.ts.map +1 -0
  75. package/src/providers/lmstudio.js +15 -0
  76. package/src/providers/lmstudio.js.map +1 -0
  77. package/src/providers/openai.d.ts +12 -0
  78. package/src/providers/openai.d.ts.map +1 -0
  79. package/src/providers/openai.js +129 -0
  80. package/src/providers/openai.js.map +1 -0
  81. package/src/providers/types.d.ts +32 -0
  82. package/src/providers/types.d.ts.map +1 -0
  83. package/src/providers/types.js +2 -0
  84. package/src/providers/types.js.map +1 -0
  85. package/src/server.d.ts +23 -0
  86. package/src/server.d.ts.map +1 -0
  87. package/src/server.js +539 -0
  88. package/src/server.js.map +1 -0
  89. package/src/store/agent-store.d.ts +12 -0
  90. package/src/store/agent-store.d.ts.map +1 -0
  91. package/src/store/agent-store.js +97 -0
  92. package/src/store/agent-store.js.map +1 -0
  93. package/src/store/index.d.ts +4 -0
  94. package/src/store/index.d.ts.map +1 -0
  95. package/src/store/index.js +4 -0
  96. package/src/store/index.js.map +1 -0
  97. package/src/store/session-store.d.ts +23 -0
  98. package/src/store/session-store.d.ts.map +1 -0
  99. package/src/store/session-store.js +152 -0
  100. package/src/store/session-store.js.map +1 -0
  101. package/src/store/task-store.d.ts +49 -0
  102. package/src/store/task-store.d.ts.map +1 -0
  103. package/src/store/task-store.js +154 -0
  104. package/src/store/task-store.js.map +1 -0
  105. package/src/tools/agent-crud.d.ts +13 -0
  106. package/src/tools/agent-crud.d.ts.map +1 -0
  107. package/src/tools/agent-crud.js +17 -0
  108. package/src/tools/agent-crud.js.map +1 -0
  109. package/src/tools/session.d.ts +21 -0
  110. package/src/tools/session.d.ts.map +1 -0
  111. package/src/tools/session.js +41 -0
  112. package/src/tools/session.js.map +1 -0
  113. package/src/tools/task.d.ts +38 -0
  114. package/src/tools/task.d.ts.map +1 -0
  115. package/src/tools/task.js +136 -0
  116. package/src/tools/task.js.map +1 -0
  117. package/src/types/agent.d.ts +2 -0
  118. package/src/types/agent.d.ts.map +1 -0
  119. package/src/types/agent.js +3 -0
  120. package/src/types/agent.js.map +1 -0
  121. package/src/types/execution.d.ts +2 -0
  122. package/src/types/execution.d.ts.map +1 -0
  123. package/src/types/execution.js +3 -0
  124. package/src/types/execution.js.map +1 -0
  125. package/src/types/index.d.ts +2 -0
  126. package/src/types/index.d.ts.map +1 -0
  127. package/src/types/index.js +2 -0
  128. package/src/types/index.js.map +1 -0
  129. package/src/types/mcp.d.ts +2 -0
  130. package/src/types/mcp.d.ts.map +1 -0
  131. package/src/types/mcp.js +3 -0
  132. package/src/types/mcp.js.map +1 -0
  133. package/src/types/message.d.ts +2 -0
  134. package/src/types/message.d.ts.map +1 -0
  135. package/src/types/message.js +3 -0
  136. package/src/types/message.js.map +1 -0
  137. package/src/types/session.d.ts +2 -0
  138. package/src/types/session.d.ts.map +1 -0
  139. package/src/types/session.js +3 -0
  140. package/src/types/session.js.map +1 -0
  141. package/src/types/task.d.ts +2 -0
  142. package/src/types/task.d.ts.map +1 -0
  143. package/src/types/task.js +3 -0
  144. package/src/types/task.js.map +1 -0
  145. package/src/utils/ids.d.ts +2 -0
  146. package/src/utils/ids.d.ts.map +1 -0
  147. package/src/utils/ids.js +5 -0
  148. package/src/utils/ids.js.map +1 -0
  149. package/src/utils/logger.d.ts +2 -0
  150. package/src/utils/logger.d.ts.map +1 -0
  151. package/src/utils/logger.js +5 -0
  152. package/src/utils/logger.js.map +1 -0
  153. package/src/utils/timestamps.d.ts +2 -0
  154. package/src/utils/timestamps.d.ts.map +1 -0
  155. package/src/utils/timestamps.js +4 -0
  156. package/src/utils/timestamps.js.map +1 -0
  157. package/src/validation/agent.d.ts +276 -0
  158. package/src/validation/agent.d.ts.map +1 -0
  159. package/src/validation/agent.js +94 -0
  160. package/src/validation/agent.js.map +1 -0
  161. package/src/validation/agents.d.ts +2 -0
  162. package/src/validation/agents.d.ts.map +1 -0
  163. package/src/validation/agents.js +3 -0
  164. package/src/validation/agents.js.map +1 -0
  165. package/src/validation/errors.d.ts +23 -0
  166. package/src/validation/errors.d.ts.map +1 -0
  167. package/src/validation/errors.js +33 -0
  168. package/src/validation/errors.js.map +1 -0
  169. package/src/validation/execution.d.ts +83 -0
  170. package/src/validation/execution.d.ts.map +1 -0
  171. package/src/validation/execution.js +23 -0
  172. package/src/validation/execution.js.map +1 -0
  173. package/src/validation/index.d.ts +8 -0
  174. package/src/validation/index.d.ts.map +1 -0
  175. package/src/validation/index.js +8 -0
  176. package/src/validation/index.js.map +1 -0
  177. package/src/validation/mcp.d.ts +43 -0
  178. package/src/validation/mcp.d.ts.map +1 -0
  179. package/src/validation/mcp.js +28 -0
  180. package/src/validation/mcp.js.map +1 -0
  181. package/src/validation/message.d.ts +46 -0
  182. package/src/validation/message.d.ts.map +1 -0
  183. package/src/validation/message.js +23 -0
  184. package/src/validation/message.js.map +1 -0
  185. package/src/validation/session.d.ts +49 -0
  186. package/src/validation/session.d.ts.map +1 -0
  187. package/src/validation/session.js +34 -0
  188. package/src/validation/session.js.map +1 -0
  189. package/src/validation/task.d.ts +94 -0
  190. package/src/validation/task.d.ts.map +1 -0
  191. package/src/validation/task.js +60 -0
  192. package/src/validation/task.js.map +1 -0
  193. package/src/validation/tasks.d.ts +2 -0
  194. package/src/validation/tasks.d.ts.map +1 -0
  195. package/src/validation/tasks.js +3 -0
  196. 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