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.
- package/dist/api/audits/index.d.ts +418 -338
- package/dist/api/audits/index.d.ts.map +1 -0
- package/dist/api/files/index.d.ts +81 -1
- package/dist/api/files/index.d.ts.map +1 -0
- package/dist/api/jobs/index.d.ts +107 -27
- package/dist/api/jobs/index.d.ts.map +1 -0
- package/dist/api/notifications/index.d.ts +21 -1
- package/dist/api/notifications/index.d.ts.map +1 -0
- package/dist/api/parameters/index.d.ts +455 -8
- package/dist/api/parameters/index.d.ts.map +1 -0
- package/dist/api/users/index.d.ts +844 -840
- package/dist/api/users/index.d.ts.map +1 -0
- package/dist/api/verifications/index.d.ts.map +1 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/bucket/index.d.ts.map +1 -0
- package/dist/cache/core/index.d.ts.map +1 -0
- package/dist/cache/redis/index.d.ts.map +1 -0
- package/dist/cli/index.d.ts +254 -59
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +499 -127
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +217 -10
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.js +350 -74
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +1334 -1318
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +76 -72
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +1337 -1321
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +1337 -1321
- package/dist/core/index.native.js.map +1 -1
- package/dist/datetime/index.d.ts.map +1 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/fake/index.d.ts.map +1 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js.map +1 -1
- package/dist/lock/core/index.d.ts.map +1 -0
- package/dist/lock/redis/index.d.ts.map +1 -0
- package/dist/logger/index.d.ts +1 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/mcp/index.d.ts +820 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +978 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/orm/index.d.ts +234 -107
- package/dist/orm/index.d.ts.map +1 -0
- package/dist/orm/index.js +376 -316
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +4 -4
- package/dist/queue/core/index.d.ts.map +1 -0
- package/dist/queue/redis/index.d.ts.map +1 -0
- package/dist/queue/redis/index.js +2 -4
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/redis/index.d.ts +400 -29
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/redis/index.js +412 -21
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/scheduler/index.d.ts +6 -6
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/security/index.d.ts +28 -28
- package/dist/security/index.d.ts.map +1 -0
- package/dist/server/auth/index.d.ts +155 -155
- package/dist/server/auth/index.d.ts.map +1 -0
- package/dist/server/cache/index.d.ts.map +1 -0
- package/dist/server/compress/index.d.ts.map +1 -0
- package/dist/server/cookies/index.d.ts.map +1 -0
- package/dist/server/core/index.d.ts +0 -1
- package/dist/server/core/index.d.ts.map +1 -0
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts.map +1 -0
- package/dist/server/health/index.d.ts +17 -17
- package/dist/server/health/index.d.ts.map +1 -0
- package/dist/server/helmet/index.d.ts +4 -1
- package/dist/server/helmet/index.d.ts.map +1 -0
- package/dist/server/links/index.d.ts +33 -33
- package/dist/server/links/index.d.ts.map +1 -0
- package/dist/server/metrics/index.d.ts.map +1 -0
- package/dist/server/multipart/index.d.ts.map +1 -0
- package/dist/server/multipart/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts.map +1 -0
- package/dist/server/proxy/index.js.map +1 -1
- package/dist/server/rate-limit/index.d.ts.map +1 -0
- package/dist/server/security/index.d.ts +9 -9
- package/dist/server/security/index.d.ts.map +1 -0
- package/dist/server/static/index.d.ts.map +1 -0
- package/dist/server/swagger/index.d.ts.map +1 -0
- package/dist/sms/index.d.ts.map +1 -0
- package/dist/thread/index.d.ts.map +1 -0
- package/dist/topic/core/index.d.ts.map +1 -0
- package/dist/topic/redis/index.d.ts.map +1 -0
- package/dist/topic/redis/index.js +3 -3
- package/dist/topic/redis/index.js.map +1 -1
- package/dist/vite/index.d.ts +10 -2
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +45 -20
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.d.ts.map +1 -0
- package/package.json +9 -4
- package/src/cli/apps/AlephaCli.ts +10 -3
- package/src/cli/apps/AlephaPackageBuilderCli.ts +15 -8
- package/src/cli/assets/mainTs.ts +9 -10
- package/src/cli/atoms/changelogOptions.ts +45 -0
- package/src/cli/commands/ChangelogCommands.ts +259 -0
- package/src/cli/commands/DeployCommands.ts +118 -0
- package/src/cli/commands/DrizzleCommands.ts +230 -10
- package/src/cli/commands/ViteCommands.ts +47 -23
- package/src/cli/defineConfig.ts +15 -0
- package/src/cli/index.ts +3 -0
- package/src/cli/services/AlephaCliUtils.ts +10 -154
- package/src/cli/services/GitMessageParser.ts +77 -0
- package/src/command/helpers/EnvUtils.ts +37 -0
- package/src/command/index.ts +3 -1
- package/src/command/primitives/$command.ts +172 -6
- package/src/command/providers/CliProvider.ts +499 -95
- package/src/core/Alepha.ts +1 -1
- package/src/core/providers/SchemaValidator.ts +23 -1
- package/src/file/providers/NodeFileSystemProvider.ts +3 -1
- package/src/mcp/errors/McpError.ts +72 -0
- package/src/mcp/helpers/jsonrpc.ts +163 -0
- package/src/mcp/index.ts +132 -0
- package/src/mcp/interfaces/McpTypes.ts +248 -0
- package/src/mcp/primitives/$prompt.ts +188 -0
- package/src/mcp/primitives/$resource.ts +171 -0
- package/src/mcp/primitives/$tool.ts +285 -0
- package/src/mcp/providers/McpServerProvider.ts +382 -0
- package/src/mcp/transports/SseMcpTransport.ts +172 -0
- package/src/mcp/transports/StdioMcpTransport.ts +126 -0
- package/src/orm/index.ts +20 -4
- package/src/orm/interfaces/PgQueryWhere.ts +1 -26
- package/src/orm/providers/drivers/BunPostgresProvider.ts +225 -0
- package/src/orm/providers/drivers/BunSqliteProvider.ts +180 -0
- package/src/orm/providers/drivers/CloudflareD1Provider.ts +164 -0
- package/src/orm/providers/drivers/DatabaseProvider.ts +25 -0
- package/src/orm/providers/drivers/NodePostgresProvider.ts +0 -25
- package/src/orm/providers/drivers/NodeSqliteProvider.ts +3 -1
- package/src/orm/services/QueryManager.ts +10 -125
- package/src/queue/redis/providers/RedisQueueProvider.ts +2 -7
- package/src/redis/index.ts +65 -3
- package/src/redis/providers/BunRedisProvider.ts +304 -0
- package/src/redis/providers/BunRedisSubscriberProvider.ts +94 -0
- package/src/redis/providers/NodeRedisProvider.ts +280 -0
- package/src/redis/providers/NodeRedisSubscriberProvider.ts +94 -0
- package/src/redis/providers/RedisProvider.ts +134 -140
- package/src/redis/providers/RedisSubscriberProvider.ts +58 -49
- package/src/server/core/providers/BunHttpServerProvider.ts +0 -3
- package/src/server/core/providers/ServerBodyParserProvider.ts +3 -1
- package/src/server/core/providers/ServerProvider.ts +7 -4
- package/src/server/multipart/providers/ServerMultipartProvider.ts +3 -1
- package/src/server/proxy/providers/ServerProxyProvider.ts +1 -1
- package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
- package/src/vite/plugins/viteAlephaBuild.ts +8 -2
- package/src/vite/plugins/viteAlephaDev.ts +6 -2
- package/src/vite/tasks/buildServer.ts +2 -1
- package/src/vite/tasks/generateCloudflare.ts +43 -15
- package/src/vite/tasks/runAlepha.ts +1 -0
- package/src/orm/services/PgJsonQueryManager.ts +0 -511
package/src/core/Alepha.ts
CHANGED
|
@@ -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
|
|
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) =>
|
|
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
|
+
}
|
package/src/mcp/index.ts
ADDED
|
@@ -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
|
+
}
|