alepha 0.13.8 → 0.14.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 (160) hide show
  1. package/dist/api/audits/index.d.ts +418 -338
  2. package/dist/api/audits/index.d.ts.map +1 -0
  3. package/dist/api/files/index.d.ts +81 -1
  4. package/dist/api/files/index.d.ts.map +1 -0
  5. package/dist/api/jobs/index.d.ts +107 -27
  6. package/dist/api/jobs/index.d.ts.map +1 -0
  7. package/dist/api/notifications/index.d.ts +21 -1
  8. package/dist/api/notifications/index.d.ts.map +1 -0
  9. package/dist/api/parameters/index.d.ts +455 -8
  10. package/dist/api/parameters/index.d.ts.map +1 -0
  11. package/dist/api/users/index.d.ts +844 -840
  12. package/dist/api/users/index.d.ts.map +1 -0
  13. package/dist/api/verifications/index.d.ts.map +1 -0
  14. package/dist/batch/index.d.ts.map +1 -0
  15. package/dist/bucket/index.d.ts.map +1 -0
  16. package/dist/cache/core/index.d.ts.map +1 -0
  17. package/dist/cache/redis/index.d.ts.map +1 -0
  18. package/dist/cli/index.d.ts +254 -59
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +499 -127
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/command/index.d.ts +217 -10
  23. package/dist/command/index.d.ts.map +1 -0
  24. package/dist/command/index.js +350 -74
  25. package/dist/command/index.js.map +1 -1
  26. package/dist/core/index.browser.js +1334 -1318
  27. package/dist/core/index.browser.js.map +1 -1
  28. package/dist/core/index.d.ts +76 -72
  29. package/dist/core/index.d.ts.map +1 -0
  30. package/dist/core/index.js +1337 -1321
  31. package/dist/core/index.js.map +1 -1
  32. package/dist/core/index.native.js +1337 -1321
  33. package/dist/core/index.native.js.map +1 -1
  34. package/dist/datetime/index.d.ts.map +1 -0
  35. package/dist/email/index.d.ts.map +1 -0
  36. package/dist/fake/index.d.ts.map +1 -0
  37. package/dist/file/index.d.ts.map +1 -0
  38. package/dist/file/index.js.map +1 -1
  39. package/dist/lock/core/index.d.ts.map +1 -0
  40. package/dist/lock/redis/index.d.ts.map +1 -0
  41. package/dist/logger/index.d.ts +1 -0
  42. package/dist/logger/index.d.ts.map +1 -0
  43. package/dist/mcp/index.d.ts +820 -0
  44. package/dist/mcp/index.d.ts.map +1 -0
  45. package/dist/mcp/index.js +978 -0
  46. package/dist/mcp/index.js.map +1 -0
  47. package/dist/orm/index.d.ts +234 -107
  48. package/dist/orm/index.d.ts.map +1 -0
  49. package/dist/orm/index.js +376 -316
  50. package/dist/orm/index.js.map +1 -1
  51. package/dist/queue/core/index.d.ts +4 -4
  52. package/dist/queue/core/index.d.ts.map +1 -0
  53. package/dist/queue/redis/index.d.ts.map +1 -0
  54. package/dist/queue/redis/index.js +2 -4
  55. package/dist/queue/redis/index.js.map +1 -1
  56. package/dist/redis/index.d.ts +400 -29
  57. package/dist/redis/index.d.ts.map +1 -0
  58. package/dist/redis/index.js +412 -21
  59. package/dist/redis/index.js.map +1 -1
  60. package/dist/retry/index.d.ts.map +1 -0
  61. package/dist/router/index.d.ts.map +1 -0
  62. package/dist/scheduler/index.d.ts +6 -6
  63. package/dist/scheduler/index.d.ts.map +1 -0
  64. package/dist/security/index.d.ts +28 -28
  65. package/dist/security/index.d.ts.map +1 -0
  66. package/dist/server/auth/index.d.ts +155 -155
  67. package/dist/server/auth/index.d.ts.map +1 -0
  68. package/dist/server/cache/index.d.ts.map +1 -0
  69. package/dist/server/compress/index.d.ts.map +1 -0
  70. package/dist/server/cookies/index.d.ts.map +1 -0
  71. package/dist/server/core/index.d.ts +0 -1
  72. package/dist/server/core/index.d.ts.map +1 -0
  73. package/dist/server/core/index.js.map +1 -1
  74. package/dist/server/cors/index.d.ts.map +1 -0
  75. package/dist/server/health/index.d.ts +17 -17
  76. package/dist/server/health/index.d.ts.map +1 -0
  77. package/dist/server/helmet/index.d.ts +4 -1
  78. package/dist/server/helmet/index.d.ts.map +1 -0
  79. package/dist/server/links/index.d.ts +33 -33
  80. package/dist/server/links/index.d.ts.map +1 -0
  81. package/dist/server/metrics/index.d.ts.map +1 -0
  82. package/dist/server/multipart/index.d.ts.map +1 -0
  83. package/dist/server/multipart/index.js.map +1 -1
  84. package/dist/server/proxy/index.d.ts.map +1 -0
  85. package/dist/server/proxy/index.js.map +1 -1
  86. package/dist/server/rate-limit/index.d.ts.map +1 -0
  87. package/dist/server/security/index.d.ts +9 -9
  88. package/dist/server/security/index.d.ts.map +1 -0
  89. package/dist/server/static/index.d.ts.map +1 -0
  90. package/dist/server/swagger/index.d.ts.map +1 -0
  91. package/dist/sms/index.d.ts.map +1 -0
  92. package/dist/thread/index.d.ts.map +1 -0
  93. package/dist/topic/core/index.d.ts.map +1 -0
  94. package/dist/topic/redis/index.d.ts.map +1 -0
  95. package/dist/topic/redis/index.js +3 -3
  96. package/dist/topic/redis/index.js.map +1 -1
  97. package/dist/vite/index.d.ts +10 -2
  98. package/dist/vite/index.d.ts.map +1 -0
  99. package/dist/vite/index.js +45 -20
  100. package/dist/vite/index.js.map +1 -1
  101. package/dist/websocket/index.d.ts.map +1 -0
  102. package/package.json +9 -4
  103. package/src/cli/apps/AlephaCli.ts +10 -3
  104. package/src/cli/apps/AlephaPackageBuilderCli.ts +15 -8
  105. package/src/cli/assets/mainTs.ts +9 -10
  106. package/src/cli/atoms/changelogOptions.ts +45 -0
  107. package/src/cli/commands/ChangelogCommands.ts +259 -0
  108. package/src/cli/commands/DeployCommands.ts +118 -0
  109. package/src/cli/commands/DrizzleCommands.ts +230 -10
  110. package/src/cli/commands/ViteCommands.ts +47 -23
  111. package/src/cli/defineConfig.ts +15 -0
  112. package/src/cli/index.ts +3 -0
  113. package/src/cli/services/AlephaCliUtils.ts +10 -154
  114. package/src/cli/services/GitMessageParser.ts +77 -0
  115. package/src/command/helpers/EnvUtils.ts +37 -0
  116. package/src/command/index.ts +3 -1
  117. package/src/command/primitives/$command.ts +172 -6
  118. package/src/command/providers/CliProvider.ts +499 -95
  119. package/src/core/Alepha.ts +1 -1
  120. package/src/core/providers/SchemaValidator.ts +23 -1
  121. package/src/file/providers/NodeFileSystemProvider.ts +3 -1
  122. package/src/mcp/errors/McpError.ts +72 -0
  123. package/src/mcp/helpers/jsonrpc.ts +163 -0
  124. package/src/mcp/index.ts +132 -0
  125. package/src/mcp/interfaces/McpTypes.ts +248 -0
  126. package/src/mcp/primitives/$prompt.ts +188 -0
  127. package/src/mcp/primitives/$resource.ts +171 -0
  128. package/src/mcp/primitives/$tool.ts +285 -0
  129. package/src/mcp/providers/McpServerProvider.ts +382 -0
  130. package/src/mcp/transports/SseMcpTransport.ts +172 -0
  131. package/src/mcp/transports/StdioMcpTransport.ts +126 -0
  132. package/src/orm/index.ts +20 -4
  133. package/src/orm/interfaces/PgQueryWhere.ts +1 -26
  134. package/src/orm/providers/drivers/BunPostgresProvider.ts +225 -0
  135. package/src/orm/providers/drivers/BunSqliteProvider.ts +180 -0
  136. package/src/orm/providers/drivers/CloudflareD1Provider.ts +164 -0
  137. package/src/orm/providers/drivers/DatabaseProvider.ts +25 -0
  138. package/src/orm/providers/drivers/NodePostgresProvider.ts +0 -25
  139. package/src/orm/providers/drivers/NodeSqliteProvider.ts +3 -1
  140. package/src/orm/services/QueryManager.ts +10 -125
  141. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -7
  142. package/src/redis/index.ts +65 -3
  143. package/src/redis/providers/BunRedisProvider.ts +304 -0
  144. package/src/redis/providers/BunRedisSubscriberProvider.ts +94 -0
  145. package/src/redis/providers/NodeRedisProvider.ts +280 -0
  146. package/src/redis/providers/NodeRedisSubscriberProvider.ts +94 -0
  147. package/src/redis/providers/RedisProvider.ts +134 -140
  148. package/src/redis/providers/RedisSubscriberProvider.ts +58 -49
  149. package/src/server/core/providers/BunHttpServerProvider.ts +0 -3
  150. package/src/server/core/providers/ServerBodyParserProvider.ts +3 -1
  151. package/src/server/core/providers/ServerProvider.ts +7 -4
  152. package/src/server/multipart/providers/ServerMultipartProvider.ts +3 -1
  153. package/src/server/proxy/providers/ServerProxyProvider.ts +1 -1
  154. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  155. package/src/vite/plugins/viteAlephaBuild.ts +8 -2
  156. package/src/vite/plugins/viteAlephaDev.ts +6 -2
  157. package/src/vite/tasks/buildServer.ts +2 -1
  158. package/src/vite/tasks/generateCloudflare.ts +43 -15
  159. package/src/vite/tasks/runAlepha.ts +1 -0
  160. package/src/orm/services/PgJsonQueryManager.ts +0 -511
@@ -1016,7 +1016,7 @@ export interface Env {
1016
1016
  /**
1017
1017
  * Optional environment variable that indicates the current environment.
1018
1018
  */
1019
- NODE_ENV?: "dev" | "test" | "production";
1019
+ NODE_ENV?: string;
1020
1020
 
1021
1021
  /**
1022
1022
  * Optional name of the application.
@@ -1,10 +1,12 @@
1
1
  import type { TSchema } from "typebox";
2
2
  import { Compile, type Validator } from "typebox/compile";
3
3
  import { TypeBoxError } from "../errors/TypeBoxError.ts";
4
- import type { Static } from "./TypeProvider.ts";
4
+ import { $hook } from "../primitives/$hook.ts";
5
+ import { type Static, t, Value } from "./TypeProvider.ts";
5
6
 
6
7
  export class SchemaValidator {
7
8
  protected cache = new Map<TSchema, Validator>();
9
+ protected useEval: boolean = true;
8
10
 
9
11
  /**
10
12
  * Validate the value against the provided schema.
@@ -23,6 +25,10 @@ export class SchemaValidator {
23
25
  });
24
26
 
25
27
  try {
28
+ //
29
+ if (!this.useEval) {
30
+ return Value.Parse(schema, newValue);
31
+ }
26
32
  return this.getValidator(schema).Parse(newValue) as Static<T>;
27
33
  } catch (error: any) {
28
34
  if (error.cause?.errors?.[0]) {
@@ -130,6 +136,22 @@ export class SchemaValidator {
130
136
  }
131
137
  return false;
132
138
  };
139
+
140
+ protected onConfigure = $hook({
141
+ on: "configure",
142
+ handler: () => {
143
+ this.useEval = this.canEval();
144
+ },
145
+ });
146
+
147
+ protected canEval(): boolean {
148
+ try {
149
+ Compile(t.object({ test: t.string() })).Parse({ test: "value" });
150
+ return true;
151
+ } catch {
152
+ return false;
153
+ }
154
+ }
133
155
  }
134
156
 
135
157
  export interface ValidateOptions {
@@ -548,7 +548,9 @@ export class NodeFileSystemProvider implements FileSystemProvider {
548
548
  const stream = new PassThrough();
549
549
 
550
550
  fetch(url)
551
- .then((res) => Readable.fromWeb(res.body as NodeWebStream).pipe(stream))
551
+ .then((res) =>
552
+ Readable.fromWeb(res.body as unknown as NodeWebStream).pipe(stream),
553
+ )
552
554
  .catch((err) => stream.destroy(err));
553
555
 
554
556
  return stream;
@@ -0,0 +1,72 @@
1
+ import { JsonRpcErrorCodes } from "../helpers/jsonrpc.ts";
2
+
3
+ // ---------------------------------------------------------------------------------------------------------------------
4
+
5
+ export class McpError extends Error {
6
+ name = "McpError";
7
+ code: number;
8
+
9
+ constructor(
10
+ message: string,
11
+ code: number = JsonRpcErrorCodes.INTERNAL_ERROR,
12
+ ) {
13
+ super(message);
14
+ this.code = code;
15
+ }
16
+ }
17
+
18
+ // ---------------------------------------------------------------------------------------------------------------------
19
+
20
+ export class McpMethodNotFoundError extends McpError {
21
+ name = "McpMethodNotFoundError";
22
+
23
+ constructor(method: string) {
24
+ super(`Method not found: ${method}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);
25
+ }
26
+ }
27
+
28
+ // ---------------------------------------------------------------------------------------------------------------------
29
+
30
+ export class McpToolNotFoundError extends McpError {
31
+ name = "McpToolNotFoundError";
32
+ tool: string;
33
+
34
+ constructor(tool: string) {
35
+ super(`Tool not found: ${tool}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);
36
+ this.tool = tool;
37
+ }
38
+ }
39
+
40
+ // ---------------------------------------------------------------------------------------------------------------------
41
+
42
+ export class McpResourceNotFoundError extends McpError {
43
+ name = "McpResourceNotFoundError";
44
+ uri: string;
45
+
46
+ constructor(uri: string) {
47
+ super(`Resource not found: ${uri}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);
48
+ this.uri = uri;
49
+ }
50
+ }
51
+
52
+ // ---------------------------------------------------------------------------------------------------------------------
53
+
54
+ export class McpPromptNotFoundError extends McpError {
55
+ name = "McpPromptNotFoundError";
56
+ prompt: string;
57
+
58
+ constructor(prompt: string) {
59
+ super(`Prompt not found: ${prompt}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);
60
+ this.prompt = prompt;
61
+ }
62
+ }
63
+
64
+ // ---------------------------------------------------------------------------------------------------------------------
65
+
66
+ export class McpInvalidParamsError extends McpError {
67
+ name = "McpInvalidParamsError";
68
+
69
+ constructor(message: string) {
70
+ super(message, JsonRpcErrorCodes.INVALID_PARAMS);
71
+ }
72
+ }
@@ -0,0 +1,163 @@
1
+ import { AlephaError } from "alepha";
2
+ import type {
3
+ JsonRpcError,
4
+ JsonRpcNotification,
5
+ JsonRpcRequest,
6
+ JsonRpcResponse,
7
+ } from "../interfaces/McpTypes.ts";
8
+
9
+ // ---------------------------------------------------------------------------------------------------------------------
10
+ // Constants
11
+ // ---------------------------------------------------------------------------------------------------------------------
12
+
13
+ export const JSONRPC_VERSION = "2.0" as const;
14
+
15
+ export const MCP_PROTOCOL_VERSION = "2024-11-05" as const;
16
+
17
+ export const JsonRpcErrorCodes = {
18
+ PARSE_ERROR: -32700,
19
+ INVALID_REQUEST: -32600,
20
+ METHOD_NOT_FOUND: -32601,
21
+ INVALID_PARAMS: -32602,
22
+ INTERNAL_ERROR: -32603,
23
+ } as const;
24
+
25
+ // ---------------------------------------------------------------------------------------------------------------------
26
+ // Response Builders
27
+ // ---------------------------------------------------------------------------------------------------------------------
28
+
29
+ export function createResponse(
30
+ id: string | number,
31
+ result: unknown,
32
+ ): JsonRpcResponse {
33
+ return {
34
+ jsonrpc: JSONRPC_VERSION,
35
+ id,
36
+ result,
37
+ };
38
+ }
39
+
40
+ export function createErrorResponse(
41
+ id: string | number,
42
+ error: JsonRpcError,
43
+ ): JsonRpcResponse {
44
+ return {
45
+ jsonrpc: JSONRPC_VERSION,
46
+ id,
47
+ error,
48
+ };
49
+ }
50
+
51
+ export function createNotification(
52
+ method: string,
53
+ params?: Record<string, unknown>,
54
+ ): JsonRpcNotification {
55
+ return {
56
+ jsonrpc: JSONRPC_VERSION,
57
+ method,
58
+ params,
59
+ };
60
+ }
61
+
62
+ // ---------------------------------------------------------------------------------------------------------------------
63
+ // Error Builders
64
+ // ---------------------------------------------------------------------------------------------------------------------
65
+
66
+ export function createParseError(message = "Parse error"): JsonRpcError {
67
+ return {
68
+ code: JsonRpcErrorCodes.PARSE_ERROR,
69
+ message,
70
+ };
71
+ }
72
+
73
+ export function createInvalidRequestError(
74
+ message = "Invalid request",
75
+ ): JsonRpcError {
76
+ return {
77
+ code: JsonRpcErrorCodes.INVALID_REQUEST,
78
+ message,
79
+ };
80
+ }
81
+
82
+ export function createMethodNotFoundError(method: string): JsonRpcError {
83
+ return {
84
+ code: JsonRpcErrorCodes.METHOD_NOT_FOUND,
85
+ message: `Method not found: ${method}`,
86
+ };
87
+ }
88
+
89
+ export function createInvalidParamsError(message: string): JsonRpcError {
90
+ return {
91
+ code: JsonRpcErrorCodes.INVALID_PARAMS,
92
+ message,
93
+ };
94
+ }
95
+
96
+ export function createInternalError(message: string): JsonRpcError {
97
+ return {
98
+ code: JsonRpcErrorCodes.INTERNAL_ERROR,
99
+ message,
100
+ };
101
+ }
102
+
103
+ // ---------------------------------------------------------------------------------------------------------------------
104
+ // Message Parsing
105
+ // ---------------------------------------------------------------------------------------------------------------------
106
+
107
+ export function parseMessage(data: string): JsonRpcRequest {
108
+ let parsed: unknown;
109
+
110
+ try {
111
+ parsed = JSON.parse(data);
112
+ } catch {
113
+ throw new JsonRpcParseError("Invalid JSON");
114
+ }
115
+
116
+ if (!isValidJsonRpcRequest(parsed)) {
117
+ throw new JsonRpcParseError("Invalid JSON-RPC request");
118
+ }
119
+
120
+ return parsed;
121
+ }
122
+
123
+ export function isValidJsonRpcRequest(value: unknown): value is JsonRpcRequest {
124
+ if (typeof value !== "object" || value === null) {
125
+ return false;
126
+ }
127
+
128
+ const obj = value as Record<string, unknown>;
129
+
130
+ if (obj.jsonrpc !== JSONRPC_VERSION) {
131
+ return false;
132
+ }
133
+
134
+ if (typeof obj.method !== "string") {
135
+ return false;
136
+ }
137
+
138
+ if (
139
+ obj.id !== undefined &&
140
+ typeof obj.id !== "string" &&
141
+ typeof obj.id !== "number"
142
+ ) {
143
+ return false;
144
+ }
145
+
146
+ if (obj.params !== undefined && typeof obj.params !== "object") {
147
+ return false;
148
+ }
149
+
150
+ return true;
151
+ }
152
+
153
+ export function isNotification(request: JsonRpcRequest): boolean {
154
+ return request.id === undefined;
155
+ }
156
+
157
+ // ---------------------------------------------------------------------------------------------------------------------
158
+ // Errors
159
+ // ---------------------------------------------------------------------------------------------------------------------
160
+
161
+ export class JsonRpcParseError extends AlephaError {
162
+ name = "JsonRpcParseError";
163
+ }
@@ -0,0 +1,132 @@
1
+ import { $module } from "alepha";
2
+ import { $prompt } from "./primitives/$prompt.ts";
3
+ import { $resource } from "./primitives/$resource.ts";
4
+ import { $tool } from "./primitives/$tool.ts";
5
+ import { McpServerProvider } from "./providers/McpServerProvider.ts";
6
+ import { SseMcpTransport } from "./transports/SseMcpTransport.ts";
7
+ import { StdioMcpTransport } from "./transports/StdioMcpTransport.ts";
8
+
9
+ // ---------------------------------------------------------------------------------------------------------------------
10
+
11
+ export {
12
+ McpError,
13
+ McpInvalidParamsError,
14
+ McpMethodNotFoundError,
15
+ McpPromptNotFoundError,
16
+ McpResourceNotFoundError,
17
+ McpToolNotFoundError,
18
+ } from "./errors/McpError.ts";
19
+ export {
20
+ createErrorResponse,
21
+ createInternalError,
22
+ createInvalidParamsError,
23
+ createInvalidRequestError,
24
+ createMethodNotFoundError,
25
+ createNotification,
26
+ createParseError,
27
+ createResponse,
28
+ isNotification,
29
+ isValidJsonRpcRequest,
30
+ JSONRPC_VERSION,
31
+ JsonRpcErrorCodes,
32
+ JsonRpcParseError,
33
+ MCP_PROTOCOL_VERSION,
34
+ parseMessage,
35
+ } from "./helpers/jsonrpc.ts";
36
+ export type {
37
+ JsonRpcError,
38
+ JsonRpcNotification,
39
+ // JSON-RPC types
40
+ JsonRpcRequest,
41
+ JsonRpcResponse,
42
+ // MCP protocol types
43
+ McpCapabilities,
44
+ McpClientInfo,
45
+ McpContent,
46
+ // Context type for auth/headers
47
+ McpContext,
48
+ McpInitializeParams,
49
+ McpInitializeResult,
50
+ McpJsonSchema,
51
+ McpPromptArgument,
52
+ McpPromptContent,
53
+ // Prompt types
54
+ McpPromptDescriptor,
55
+ McpPromptGetParams,
56
+ McpPromptGetResult,
57
+ McpPromptMessage,
58
+ McpResourceContent,
59
+ // Resource types
60
+ McpResourceDescriptor,
61
+ McpResourceReadParams,
62
+ McpResourceReadResult,
63
+ McpServerInfo,
64
+ McpToolCallParams,
65
+ McpToolCallResult,
66
+ // Tool types
67
+ McpToolDescriptor,
68
+ PromptHandler,
69
+ PromptHandlerArgs,
70
+ PromptMessage,
71
+ ResourceContent,
72
+ ResourceHandler,
73
+ ResourceHandlerArgs,
74
+ ToolHandler,
75
+ ToolHandlerArgs,
76
+ ToolHandlerResult,
77
+ // Handler types
78
+ ToolPrimitiveSchema,
79
+ } from "./interfaces/McpTypes.ts";
80
+ export type { PromptPrimitiveOptions } from "./primitives/$prompt.ts";
81
+ export { $prompt, PromptPrimitive } from "./primitives/$prompt.ts";
82
+ export type { ResourcePrimitiveOptions } from "./primitives/$resource.ts";
83
+ export { $resource, ResourcePrimitive } from "./primitives/$resource.ts";
84
+ export type { ToolPrimitiveOptions } from "./primitives/$tool.ts";
85
+ export { $tool, ToolPrimitive } from "./primitives/$tool.ts";
86
+ export { McpServerProvider } from "./providers/McpServerProvider.ts";
87
+ export { SseMcpTransport } from "./transports/SseMcpTransport.ts";
88
+ export { StdioMcpTransport } from "./transports/StdioMcpTransport.ts";
89
+
90
+ // ---------------------------------------------------------------------------------------------------------------------
91
+
92
+ /**
93
+ * Core MCP module with primitives and server provider.
94
+ *
95
+ * This module registers the $tool, $resource, and $prompt primitives
96
+ * and the McpServerProvider. You need to add a transport module
97
+ * (AlephaMcpStdio or AlephaMcpSse) for actual communication.
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * import { Alepha, run } from "alepha";
102
+ * import { AlephaMcp, AlephaMcpStdio, $tool, t } from "alepha/mcp";
103
+ *
104
+ * class MyMcpServer {
105
+ * add = $tool({
106
+ * description: "Add two numbers",
107
+ * schema: {
108
+ * params: t.object({ a: t.number(), b: t.number() }),
109
+ * result: t.number(),
110
+ * },
111
+ * handler: async ({ params }) => params.a + params.b,
112
+ * });
113
+ * }
114
+ *
115
+ * run(
116
+ * Alepha.create()
117
+ * .with(AlephaMcp)
118
+ * .with(AlephaMcpStdio)
119
+ * .with(MyMcpServer)
120
+ * );
121
+ * ```
122
+ *
123
+ * @module alepha.mcp
124
+ */
125
+ export const AlephaMcp = $module({
126
+ name: "alepha.mcp",
127
+ primitives: [$tool, $resource, $prompt],
128
+ services: [McpServerProvider, SseMcpTransport, StdioMcpTransport],
129
+ register: (alepha) => {
130
+ alepha.with(McpServerProvider);
131
+ },
132
+ });
@@ -0,0 +1,248 @@
1
+ import type { Async, Static, TObject, TSchema } from "alepha";
2
+
3
+ // ---------------------------------------------------------------------------------------------------------------------
4
+ // JSON-RPC 2.0 Types
5
+ // ---------------------------------------------------------------------------------------------------------------------
6
+
7
+ export interface JsonRpcRequest {
8
+ jsonrpc: "2.0";
9
+ id?: string | number;
10
+ method: string;
11
+ params?: Record<string, unknown>;
12
+ }
13
+
14
+ export interface JsonRpcResponse {
15
+ jsonrpc: "2.0";
16
+ id: string | number;
17
+ result?: unknown;
18
+ error?: JsonRpcError;
19
+ }
20
+
21
+ export interface JsonRpcNotification {
22
+ jsonrpc: "2.0";
23
+ method: string;
24
+ params?: Record<string, unknown>;
25
+ }
26
+
27
+ export interface JsonRpcError {
28
+ code: number;
29
+ message: string;
30
+ data?: unknown;
31
+ }
32
+
33
+ // ---------------------------------------------------------------------------------------------------------------------
34
+ // MCP Protocol Types
35
+ // ---------------------------------------------------------------------------------------------------------------------
36
+
37
+ export interface McpCapabilities {
38
+ tools?: Record<string, never>;
39
+ resources?: Record<string, never>;
40
+ prompts?: Record<string, never>;
41
+ }
42
+
43
+ export interface McpServerInfo {
44
+ name: string;
45
+ version: string;
46
+ }
47
+
48
+ export interface McpClientInfo {
49
+ name: string;
50
+ version: string;
51
+ }
52
+
53
+ export interface McpInitializeParams {
54
+ protocolVersion: string;
55
+ capabilities: McpCapabilities;
56
+ clientInfo: McpClientInfo;
57
+ }
58
+
59
+ export interface McpInitializeResult {
60
+ protocolVersion: string;
61
+ capabilities: McpCapabilities;
62
+ serverInfo: McpServerInfo;
63
+ }
64
+
65
+ // ---------------------------------------------------------------------------------------------------------------------
66
+ // Tool Types
67
+ // ---------------------------------------------------------------------------------------------------------------------
68
+
69
+ export interface McpToolDescriptor {
70
+ name: string;
71
+ description: string;
72
+ inputSchema: McpJsonSchema;
73
+ }
74
+
75
+ export interface McpJsonSchema {
76
+ type: string;
77
+ properties?: Record<string, unknown>;
78
+ required?: string[];
79
+ }
80
+
81
+ export interface McpToolCallParams {
82
+ name: string;
83
+ arguments?: Record<string, unknown>;
84
+ }
85
+
86
+ export interface McpToolCallResult {
87
+ content: McpContent[];
88
+ isError?: boolean;
89
+ }
90
+
91
+ export interface McpContent {
92
+ type: "text" | "image" | "resource";
93
+ text?: string;
94
+ data?: string;
95
+ mimeType?: string;
96
+ }
97
+
98
+ // ---------------------------------------------------------------------------------------------------------------------
99
+ // Resource Types
100
+ // ---------------------------------------------------------------------------------------------------------------------
101
+
102
+ export interface McpResourceDescriptor {
103
+ uri: string;
104
+ name: string;
105
+ description?: string;
106
+ mimeType?: string;
107
+ }
108
+
109
+ export interface McpResourceReadParams {
110
+ uri: string;
111
+ }
112
+
113
+ export interface McpResourceReadResult {
114
+ contents: McpResourceContent[];
115
+ }
116
+
117
+ export interface McpResourceContent {
118
+ uri: string;
119
+ mimeType?: string;
120
+ text?: string;
121
+ blob?: string;
122
+ }
123
+
124
+ // ---------------------------------------------------------------------------------------------------------------------
125
+ // Prompt Types
126
+ // ---------------------------------------------------------------------------------------------------------------------
127
+
128
+ export interface McpPromptDescriptor {
129
+ name: string;
130
+ description?: string;
131
+ arguments?: McpPromptArgument[];
132
+ }
133
+
134
+ export interface McpPromptArgument {
135
+ name: string;
136
+ description?: string;
137
+ required?: boolean;
138
+ }
139
+
140
+ export interface McpPromptGetParams {
141
+ name: string;
142
+ arguments?: Record<string, string>;
143
+ }
144
+
145
+ export interface McpPromptGetResult {
146
+ description?: string;
147
+ messages: McpPromptMessage[];
148
+ }
149
+
150
+ export interface McpPromptMessage {
151
+ role: "user" | "assistant";
152
+ content: McpPromptContent;
153
+ }
154
+
155
+ export interface McpPromptContent {
156
+ type: "text" | "image" | "resource";
157
+ text?: string;
158
+ data?: string;
159
+ mimeType?: string;
160
+ }
161
+
162
+ // ---------------------------------------------------------------------------------------------------------------------
163
+ // Primitive Schema Types
164
+ // ---------------------------------------------------------------------------------------------------------------------
165
+
166
+ export interface ToolPrimitiveSchema {
167
+ params?: TObject;
168
+ result?: TSchema;
169
+ }
170
+
171
+ export interface ResourcePrimitiveSchema {
172
+ contents?: TSchema;
173
+ }
174
+
175
+ export interface PromptPrimitiveSchema {
176
+ args?: TObject;
177
+ }
178
+
179
+ // ---------------------------------------------------------------------------------------------------------------------
180
+ // Context Types
181
+ // ---------------------------------------------------------------------------------------------------------------------
182
+
183
+ /**
184
+ * Context passed to MCP handlers from the transport layer.
185
+ *
186
+ * This allows tools, resources, and prompts to access request-level
187
+ * information like headers for authentication.
188
+ */
189
+ export interface McpContext<T = unknown> {
190
+ /**
191
+ * HTTP headers from the request (for SSE transport).
192
+ */
193
+ headers?: Record<string, string | string[] | undefined>;
194
+
195
+ /**
196
+ * Custom context data set by transport or middleware.
197
+ * Can be used to pass authenticated user, project scope, etc.
198
+ */
199
+ data?: T;
200
+ }
201
+
202
+ // ---------------------------------------------------------------------------------------------------------------------
203
+ // Handler Types
204
+ // ---------------------------------------------------------------------------------------------------------------------
205
+
206
+ export type ToolHandler<T extends ToolPrimitiveSchema, TContext = unknown> = (
207
+ args: ToolHandlerArgs<T, TContext>,
208
+ ) => Async<ToolHandlerResult<T>>;
209
+
210
+ export interface ToolHandlerArgs<
211
+ T extends ToolPrimitiveSchema,
212
+ TContext = unknown,
213
+ > {
214
+ params: T["params"] extends TObject
215
+ ? Static<T["params"]>
216
+ : Record<string, never>;
217
+ context?: McpContext<TContext>;
218
+ }
219
+
220
+ export type ToolHandlerResult<T extends ToolPrimitiveSchema> =
221
+ T["result"] extends TSchema ? Static<T["result"]> : unknown;
222
+
223
+ export type ResourceHandler<TContext = unknown> = (
224
+ args: ResourceHandlerArgs<TContext>,
225
+ ) => Async<ResourceContent>;
226
+
227
+ export interface ResourceHandlerArgs<TContext = unknown> {
228
+ context?: McpContext<TContext>;
229
+ }
230
+
231
+ export interface ResourceContent {
232
+ text?: string;
233
+ blob?: Uint8Array;
234
+ }
235
+
236
+ export type PromptHandler<T extends TObject, TContext = unknown> = (
237
+ args: PromptHandlerArgs<T, TContext>,
238
+ ) => Async<PromptMessage[]>;
239
+
240
+ export interface PromptHandlerArgs<T extends TObject, TContext = unknown> {
241
+ args: Static<T>;
242
+ context?: McpContext<TContext>;
243
+ }
244
+
245
+ export interface PromptMessage {
246
+ role: "user" | "assistant";
247
+ content: string;
248
+ }