@usestratus/mcp-aws 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +610 -0
  2. package/dist/auth/api-key.d.ts +29 -0
  3. package/dist/auth/api-key.d.ts.map +1 -0
  4. package/dist/auth/api-key.js +42 -0
  5. package/dist/auth/api-key.js.map +1 -0
  6. package/dist/auth/cognito.d.ts +26 -0
  7. package/dist/auth/cognito.d.ts.map +1 -0
  8. package/dist/auth/cognito.js +58 -0
  9. package/dist/auth/cognito.js.map +1 -0
  10. package/dist/auth/index.d.ts +11 -0
  11. package/dist/auth/index.d.ts.map +1 -0
  12. package/dist/auth/index.js +21 -0
  13. package/dist/auth/index.js.map +1 -0
  14. package/dist/auth/metadata.d.ts +30 -0
  15. package/dist/auth/metadata.d.ts.map +1 -0
  16. package/dist/auth/metadata.js +25 -0
  17. package/dist/auth/metadata.js.map +1 -0
  18. package/dist/auth/types.d.ts +8 -0
  19. package/dist/auth/types.d.ts.map +1 -0
  20. package/dist/auth/types.js +2 -0
  21. package/dist/auth/types.js.map +1 -0
  22. package/dist/codemode/executor.d.ts +29 -0
  23. package/dist/codemode/executor.d.ts.map +1 -0
  24. package/dist/codemode/executor.js +154 -0
  25. package/dist/codemode/executor.js.map +1 -0
  26. package/dist/codemode/index.d.ts +4 -0
  27. package/dist/codemode/index.d.ts.map +1 -0
  28. package/dist/codemode/index.js +3 -0
  29. package/dist/codemode/index.js.map +1 -0
  30. package/dist/codemode/types.d.ts +10 -0
  31. package/dist/codemode/types.d.ts.map +1 -0
  32. package/dist/codemode/types.js +195 -0
  33. package/dist/codemode/types.js.map +1 -0
  34. package/dist/compose.d.ts +57 -0
  35. package/dist/compose.d.ts.map +1 -0
  36. package/dist/compose.js +138 -0
  37. package/dist/compose.js.map +1 -0
  38. package/dist/context.d.ts +22 -0
  39. package/dist/context.d.ts.map +1 -0
  40. package/dist/context.js +39 -0
  41. package/dist/context.js.map +1 -0
  42. package/dist/deploy.d.ts +57 -0
  43. package/dist/deploy.d.ts.map +1 -0
  44. package/dist/deploy.js +281 -0
  45. package/dist/deploy.js.map +1 -0
  46. package/dist/disclosure/index.d.ts +3 -0
  47. package/dist/disclosure/index.d.ts.map +1 -0
  48. package/dist/disclosure/index.js +3 -0
  49. package/dist/disclosure/index.js.map +1 -0
  50. package/dist/disclosure/search.d.ts +15 -0
  51. package/dist/disclosure/search.d.ts.map +1 -0
  52. package/dist/disclosure/search.js +73 -0
  53. package/dist/disclosure/search.js.map +1 -0
  54. package/dist/disclosure/tier.d.ts +16 -0
  55. package/dist/disclosure/tier.d.ts.map +1 -0
  56. package/dist/disclosure/tier.js +69 -0
  57. package/dist/disclosure/tier.js.map +1 -0
  58. package/dist/errors.d.ts +34 -0
  59. package/dist/errors.d.ts.map +1 -0
  60. package/dist/errors.js +56 -0
  61. package/dist/errors.js.map +1 -0
  62. package/dist/events.d.ts +93 -0
  63. package/dist/events.d.ts.map +1 -0
  64. package/dist/events.js +28 -0
  65. package/dist/events.js.map +1 -0
  66. package/dist/gating/combinators.d.ts +10 -0
  67. package/dist/gating/combinators.d.ts.map +1 -0
  68. package/dist/gating/combinators.js +34 -0
  69. package/dist/gating/combinators.js.map +1 -0
  70. package/dist/gating/gates.d.ts +21 -0
  71. package/dist/gating/gates.d.ts.map +1 -0
  72. package/dist/gating/gates.js +74 -0
  73. package/dist/gating/gates.js.map +1 -0
  74. package/dist/gating/index.d.ts +3 -0
  75. package/dist/gating/index.d.ts.map +1 -0
  76. package/dist/gating/index.js +3 -0
  77. package/dist/gating/index.js.map +1 -0
  78. package/dist/index.d.ts +21 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +28 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/server.d.ts +161 -0
  83. package/dist/server.d.ts.map +1 -0
  84. package/dist/server.js +768 -0
  85. package/dist/server.js.map +1 -0
  86. package/dist/session/dynamo.d.ts +23 -0
  87. package/dist/session/dynamo.d.ts.map +1 -0
  88. package/dist/session/dynamo.js +92 -0
  89. package/dist/session/dynamo.js.map +1 -0
  90. package/dist/session/index.d.ts +4 -0
  91. package/dist/session/index.d.ts.map +1 -0
  92. package/dist/session/index.js +4 -0
  93. package/dist/session/index.js.map +1 -0
  94. package/dist/session/memory.d.ts +16 -0
  95. package/dist/session/memory.d.ts.map +1 -0
  96. package/dist/session/memory.js +43 -0
  97. package/dist/session/memory.js.map +1 -0
  98. package/dist/session/sqlite.d.ts +17 -0
  99. package/dist/session/sqlite.d.ts.map +1 -0
  100. package/dist/session/sqlite.js +79 -0
  101. package/dist/session/sqlite.js.map +1 -0
  102. package/dist/ssrf.d.ts +25 -0
  103. package/dist/ssrf.d.ts.map +1 -0
  104. package/dist/ssrf.js +88 -0
  105. package/dist/ssrf.js.map +1 -0
  106. package/dist/types.d.ts +110 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +21 -0
  109. package/dist/types.js.map +1 -0
  110. package/package.json +50 -0
@@ -0,0 +1,57 @@
1
+ import { McpServer as SdkMcpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Executor } from "./codemode/executor.js";
3
+ export type CodeMcpServerOptions = {
4
+ /** The MCP server to wrap */
5
+ server: SdkMcpServer;
6
+ /** Optional executor (default: FunctionExecutor with 30s timeout) */
7
+ executor?: Executor;
8
+ /** Name for the wrapper server */
9
+ name?: string;
10
+ /** Version for the wrapper server */
11
+ version?: string;
12
+ };
13
+ /**
14
+ * Wrap any MCP server with code mode. Returns a new MCP server with a single
15
+ * `execute_code` tool. The LLM writes code that calls the wrapped server's tools.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
20
+ * import { codeMcpServer } from "@usestratus/mcp-aws";
21
+ *
22
+ * const original = new McpServer({ name: "tools", version: "1.0" });
23
+ * original.registerTool("greet", { inputSchema: { name: z.string() } },
24
+ * async ({ name }) => ({ content: [{ type: "text", text: `Hello ${name}` }] })
25
+ * );
26
+ *
27
+ * const codeServer = await codeMcpServer({ server: original });
28
+ * // codeServer has one tool: execute_code
29
+ * ```
30
+ */
31
+ export declare function codeMcpServer(options: CodeMcpServerOptions): Promise<SdkMcpServer>;
32
+ export type CreateMcpHandlerOptions = {
33
+ /** Factory that creates a fresh MCP server per request (stateless isolation). */
34
+ createServer: () => SdkMcpServer;
35
+ };
36
+ /**
37
+ * Create a stateless HTTP request handler from any MCP server.
38
+ * Each request gets a fresh transport. Works with Lambda Function URLs,
39
+ * Bun.serve, Deno.serve, or any Web Standard compatible runtime.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
44
+ * import { createMcpHandler } from "@usestratus/mcp-aws";
45
+ *
46
+ * const server = new McpServer({ name: "api", version: "1.0" });
47
+ * const handler = createMcpHandler({ server });
48
+ *
49
+ * // Bun
50
+ * Bun.serve({ fetch: handler });
51
+ *
52
+ * // Lambda Function URL
53
+ * export default handler;
54
+ * ```
55
+ */
56
+ export declare function createMcpHandler(options: CreateMcpHandlerOptions): (req: Request) => Promise<Response>;
57
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAEpF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,MAAM,MAAM,oBAAoB,GAAG;IAClC,6BAA6B;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAmFxF;AAED,MAAM,MAAM,uBAAuB,GAAG;IACrC,iFAAiF;IACjF,YAAY,EAAE,MAAM,YAAY,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,uBAAuB,GAC9B,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA0BrC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Composition utilities for MCP servers.
3
+ *
4
+ * codeMcpServer() — wraps any MCP server with code mode
5
+ * createMcpHandler() — stateless request handler from a McpServer
6
+ */
7
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
8
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
9
+ import { McpServer as SdkMcpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import { z } from "zod";
11
+ import { FunctionExecutor, normalizeCode, sanitizeToolName } from "./codemode/index.js";
12
+ /**
13
+ * Wrap any MCP server with code mode. Returns a new MCP server with a single
14
+ * `execute_code` tool. The LLM writes code that calls the wrapped server's tools.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
19
+ * import { codeMcpServer } from "@usestratus/mcp-aws";
20
+ *
21
+ * const original = new McpServer({ name: "tools", version: "1.0" });
22
+ * original.registerTool("greet", { inputSchema: { name: z.string() } },
23
+ * async ({ name }) => ({ content: [{ type: "text", text: `Hello ${name}` }] })
24
+ * );
25
+ *
26
+ * const codeServer = await codeMcpServer({ server: original });
27
+ * // codeServer has one tool: execute_code
28
+ * ```
29
+ */
30
+ export async function codeMcpServer(options) {
31
+ const { server, name = "code-server", version = "1.0.0" } = options;
32
+ const executor = options.executor ?? new FunctionExecutor({ timeout: 30_000 });
33
+ // Connect a client to discover the wrapped server's tools
34
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
35
+ const client = new Client({ name: "code-bridge", version: "1.0.0" });
36
+ await server.connect(serverTransport);
37
+ await client.connect(clientTransport);
38
+ const toolsResponse = await client.listTools();
39
+ const tools = toolsResponse.tools;
40
+ // Generate type definitions for all discovered tools
41
+ const typeLines = [];
42
+ const toolMap = new Map();
43
+ for (const tool of tools) {
44
+ const safeName = sanitizeToolName(tool.name);
45
+ if (toolMap.has(safeName)) {
46
+ throw new Error(`Tool name collision: "${tool.name}" sanitizes to "${safeName}" which is already used. Rename one of the conflicting tools.`);
47
+ }
48
+ typeLines.push(`\t/** ${tool.description ?? tool.name} */`);
49
+ typeLines.push(`\t${safeName}: (input: unknown) => Promise<unknown>;`);
50
+ toolMap.set(safeName, async (args) => {
51
+ const result = await client.callTool({
52
+ name: tool.name,
53
+ arguments: (args ?? {}),
54
+ });
55
+ const content = result.content;
56
+ const textPart = content.find((c) => c.type === "text" && c.text);
57
+ if (textPart?.text) {
58
+ try {
59
+ return JSON.parse(textPart.text);
60
+ }
61
+ catch {
62
+ return textPart.text;
63
+ }
64
+ }
65
+ return null;
66
+ });
67
+ }
68
+ const types = `declare const codemode: {\n${typeLines.join("\n")}\n}`;
69
+ const description = `Execute code to use available tools.\n\nAvailable:\n${types}\n\nWrite an async arrow function in JavaScript.\nExample: async () => { const r = await codemode.greet({ name: "World" }); return r; }`;
70
+ // Create the wrapper server with a single code tool
71
+ const wrapper = new SdkMcpServer({ name, version });
72
+ wrapper.registerTool("execute_code", {
73
+ description,
74
+ inputSchema: {
75
+ code: z.string().describe("JavaScript async arrow function to execute"),
76
+ },
77
+ }, async ({ code }) => {
78
+ const fns = {};
79
+ for (const [safeName, fn] of toolMap) {
80
+ fns[safeName] = fn;
81
+ }
82
+ const normalized = normalizeCode(code);
83
+ const result = await executor.execute(normalized, fns);
84
+ if (result.error) {
85
+ const logs = result.logs?.length ? `\n\nLogs:\n${result.logs.join("\n")}` : "";
86
+ return {
87
+ content: [{ type: "text", text: `Error: ${result.error}${logs}` }],
88
+ isError: true,
89
+ };
90
+ }
91
+ return {
92
+ content: [{ type: "text", text: JSON.stringify(result.result) }],
93
+ };
94
+ });
95
+ return wrapper;
96
+ }
97
+ /**
98
+ * Create a stateless HTTP request handler from any MCP server.
99
+ * Each request gets a fresh transport. Works with Lambda Function URLs,
100
+ * Bun.serve, Deno.serve, or any Web Standard compatible runtime.
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
105
+ * import { createMcpHandler } from "@usestratus/mcp-aws";
106
+ *
107
+ * const server = new McpServer({ name: "api", version: "1.0" });
108
+ * const handler = createMcpHandler({ server });
109
+ *
110
+ * // Bun
111
+ * Bun.serve({ fetch: handler });
112
+ *
113
+ * // Lambda Function URL
114
+ * export default handler;
115
+ * ```
116
+ */
117
+ export function createMcpHandler(options) {
118
+ return async (req) => {
119
+ if (req.method !== "POST") {
120
+ return new Response(JSON.stringify({ error: "Method not allowed" }), {
121
+ status: 405,
122
+ headers: { "Content-Type": "application/json", Allow: "POST" },
123
+ });
124
+ }
125
+ const { WebStandardStreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js");
126
+ const transport = new WebStandardStreamableHTTPServerTransport({
127
+ sessionIdGenerator: undefined,
128
+ enableJsonResponse: true,
129
+ });
130
+ const server = options.createServer();
131
+ await server.connect(transport);
132
+ const response = await transport.handleRequest(req);
133
+ await transport.close();
134
+ await server.close();
135
+ return response;
136
+ };
137
+ }
138
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { AuthContext, McpSession } from "./types.js";
2
+ type RequestContext = {
3
+ auth: AuthContext;
4
+ session: McpSession;
5
+ };
6
+ /**
7
+ * Run a function with auth/session context available via getAuthContext()/getSession().
8
+ * Called internally by the server's tool handler wrapper.
9
+ */
10
+ export declare function withContext<T>(ctx: RequestContext, fn: () => T | Promise<T>): T | Promise<T>;
11
+ /**
12
+ * Get the current request's auth context from anywhere in the call stack.
13
+ * Returns unauthenticated context if called outside a request.
14
+ */
15
+ export declare function getAuthContext(): AuthContext;
16
+ /**
17
+ * Get the current request's session from anywhere in the call stack.
18
+ * Returns undefined if called outside a request.
19
+ */
20
+ export declare function getSession(): McpSession | undefined;
21
+ export {};
22
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1D,KAAK,cAAc,GAAG;IACrB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,UAAU,CAAC;CACpB,CAAC;AAIF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE5F;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,UAAU,GAAG,SAAS,CAEnD"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * AsyncLocalStorage-based auth and session context.
3
+ * Tool handlers can call getAuthContext() / getSession() without explicit parameters.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { getAuthContext, getSession } from "@usestratus/mcp-aws";
8
+ *
9
+ * server.tool("my_tool", async () => {
10
+ * const auth = getAuthContext(); // no params needed
11
+ * if (!auth.authenticated) return "Not logged in";
12
+ * return `Hello, ${auth.subject}!`;
13
+ * });
14
+ * ```
15
+ */
16
+ import { AsyncLocalStorage } from "node:async_hooks";
17
+ const storage = new AsyncLocalStorage();
18
+ /**
19
+ * Run a function with auth/session context available via getAuthContext()/getSession().
20
+ * Called internally by the server's tool handler wrapper.
21
+ */
22
+ export function withContext(ctx, fn) {
23
+ return storage.run(ctx, fn);
24
+ }
25
+ /**
26
+ * Get the current request's auth context from anywhere in the call stack.
27
+ * Returns unauthenticated context if called outside a request.
28
+ */
29
+ export function getAuthContext() {
30
+ return storage.getStore()?.auth ?? { authenticated: false, roles: [], claims: {} };
31
+ }
32
+ /**
33
+ * Get the current request's session from anywhere in the call stack.
34
+ * Returns undefined if called outside a request.
35
+ */
36
+ export function getSession() {
37
+ return storage.getStore()?.session;
38
+ }
39
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAQrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAI,GAAmB,EAAE,EAAwB;IAC3E,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC7B,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACpF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACzB,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC;AACpC,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Deploy a McpServer to AWS Lambda with a Function URL.
3
+ *
4
+ * Uses Bun-native APIs:
5
+ * - Bun.build for bundling
6
+ * - Bun.gzipSync for compression
7
+ * - Bun.$ for shell commands (future)
8
+ */
9
+ export type VpcConfig = {
10
+ /** Subnet IDs for the Lambda (use private subnets for VPC-only access) */
11
+ subnetIds: string[];
12
+ /** Security group IDs controlling inbound/outbound traffic */
13
+ securityGroupIds: string[];
14
+ };
15
+ export type DeployConfig = {
16
+ /** Path to the server entry file (must export `handler` via server.lambda()) */
17
+ entry: string;
18
+ /** AWS region (default: us-east-1) */
19
+ region?: string;
20
+ /** Lambda function name (default: derived from server name) */
21
+ functionName?: string;
22
+ /** Lambda memory in MB (default: 256) */
23
+ memory?: number;
24
+ /** Lambda timeout in seconds (default: 30) */
25
+ timeout?: number;
26
+ /** IAM role ARN. If not provided, creates one automatically. */
27
+ roleArn?: string;
28
+ /**
29
+ * Function URL auth type.
30
+ * - `"NONE"` (default): Public URL, MCP-level auth via server.auth().
31
+ * - `"AWS_IAM"`: Callers must sign requests with SigV4. Use for service-to-service.
32
+ * - `"none"`: No Function URL created. Invoke via AWS SDK only (most private).
33
+ */
34
+ urlAuth?: "NONE" | "AWS_IAM" | "none";
35
+ /**
36
+ * Deploy Lambda inside a VPC.
37
+ */
38
+ vpc?: VpcConfig;
39
+ /** Environment variables to set on the Lambda function */
40
+ environment?: Record<string, string>;
41
+ /** Additional IAM policy ARNs to attach to the Lambda role */
42
+ policies?: string[];
43
+ };
44
+ export type DeployResult = {
45
+ functionName: string;
46
+ functionArn: string;
47
+ /** HTTPS endpoint. Empty string if urlAuth is "none" (no Function URL). */
48
+ url: string;
49
+ region: string;
50
+ };
51
+ export type DestroyResult = {
52
+ functionName: string;
53
+ deleted: boolean;
54
+ };
55
+ export declare function deploy(config: DeployConfig): Promise<DeployResult>;
56
+ export declare function destroy(functionName: string, region?: string): Promise<DestroyResult>;
57
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,SAAS,GAAG;IACvB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,8DAA8D;IAC9D,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAEtC;;OAEG;IACH,GAAG,CAAC,EAAE,SAAS,CAAC;IAEhB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC;AAyJF,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA8HxE;AAED,wBAAsB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAShG"}
package/dist/deploy.js ADDED
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Deploy a McpServer to AWS Lambda with a Function URL.
3
+ *
4
+ * Uses Bun-native APIs:
5
+ * - Bun.build for bundling
6
+ * - Bun.gzipSync for compression
7
+ * - Bun.$ for shell commands (future)
8
+ */
9
+ /**
10
+ * Bundle a server entry file into a Lambda-compatible zip.
11
+ * Uses Bun.build for bundling + Bun.gzipSync for compression.
12
+ */
13
+ async function bundle(entry) {
14
+ const result = await Bun.build({
15
+ entrypoints: [entry],
16
+ target: "node",
17
+ format: "esm",
18
+ minify: true,
19
+ external: ["@aws-sdk/*", "bun:*"],
20
+ });
21
+ if (!result.success) {
22
+ const errors = result.logs.map((l) => l.message).join("\n");
23
+ throw new Error(`Bundle failed:\n${errors}`);
24
+ }
25
+ const output = result.outputs[0];
26
+ if (!output)
27
+ throw new Error("Bundle produced no output");
28
+ const code = await output.text();
29
+ // Use Bun's native zip creation via Bun.$
30
+ // Lambda expects a zip with index.mjs at the root
31
+ const zipBytes = await createZipWithBun({ "index.mjs": code });
32
+ return zipBytes;
33
+ }
34
+ /**
35
+ * Create a zip using Bun's shell to invoke the `zip` command,
36
+ * falling back to a manual implementation if zip isn't available.
37
+ */
38
+ async function createZipWithBun(files) {
39
+ // Write files to a temp dir, zip them, read the zip back
40
+ const tmpDir = `${Bun.env.TMPDIR ?? "/tmp"}/stratus-deploy-${Date.now()}`;
41
+ try {
42
+ const { mkdirSync, writeFileSync, rmSync } = await import("node:fs");
43
+ mkdirSync(tmpDir, { recursive: true });
44
+ for (const [name, content] of Object.entries(files)) {
45
+ writeFileSync(`${tmpDir}/${name}`, content);
46
+ }
47
+ // Use Bun.$ shell to create the zip
48
+ const zipPath = `${tmpDir}/bundle.zip`;
49
+ const fileNames = Object.keys(files).join(" ");
50
+ await Bun.$ `cd ${tmpDir} && zip -j ${zipPath} ${fileNames}`.quiet();
51
+ const zipFile = Bun.file(zipPath);
52
+ const bytes = new Uint8Array(await zipFile.arrayBuffer());
53
+ // Cleanup
54
+ rmSync(tmpDir, { recursive: true, force: true });
55
+ return bytes;
56
+ }
57
+ catch {
58
+ // Fallback: manual zip if `zip` command not available
59
+ const { rmSync } = await import("node:fs");
60
+ try {
61
+ rmSync(tmpDir, { recursive: true, force: true });
62
+ }
63
+ catch { }
64
+ return manualCreateZip(files);
65
+ }
66
+ }
67
+ /** Fallback zip creator when the `zip` CLI isn't available. */
68
+ function manualCreateZip(files) {
69
+ const entries = [];
70
+ const parts = [];
71
+ let offset = 0;
72
+ for (const [name, content] of Object.entries(files)) {
73
+ const nameBytes = new TextEncoder().encode(name);
74
+ const dataBytes = new TextEncoder().encode(content);
75
+ const crc = crc32(dataBytes);
76
+ const header = new ArrayBuffer(30 + nameBytes.length);
77
+ const v = new DataView(header);
78
+ v.setUint32(0, 0x04034b50, true);
79
+ v.setUint16(4, 20, true);
80
+ v.setUint16(8, 0, true);
81
+ v.setUint32(14, crc, true);
82
+ v.setUint32(18, dataBytes.length, true);
83
+ v.setUint32(22, dataBytes.length, true);
84
+ v.setUint16(26, nameBytes.length, true);
85
+ new Uint8Array(header).set(nameBytes, 30);
86
+ const hdr = new Uint8Array(header);
87
+ entries.push({ name: nameBytes, data: dataBytes, crc, offset });
88
+ parts.push(hdr, dataBytes);
89
+ offset += hdr.length + dataBytes.length;
90
+ }
91
+ const centralStart = offset;
92
+ for (const e of entries) {
93
+ const cd = new ArrayBuffer(46 + e.name.length);
94
+ const v = new DataView(cd);
95
+ v.setUint32(0, 0x02014b50, true);
96
+ v.setUint16(4, 20, true);
97
+ v.setUint16(6, 20, true);
98
+ v.setUint32(16, e.crc, true);
99
+ v.setUint32(20, e.data.length, true);
100
+ v.setUint32(24, e.data.length, true);
101
+ v.setUint16(28, e.name.length, true);
102
+ v.setUint32(42, e.offset, true);
103
+ new Uint8Array(cd).set(e.name, 46);
104
+ parts.push(new Uint8Array(cd));
105
+ offset += 46 + e.name.length;
106
+ }
107
+ const eocd = new ArrayBuffer(22);
108
+ const ev = new DataView(eocd);
109
+ ev.setUint32(0, 0x06054b50, true);
110
+ ev.setUint16(8, entries.length, true);
111
+ ev.setUint16(10, entries.length, true);
112
+ ev.setUint32(12, offset - centralStart, true);
113
+ ev.setUint32(16, centralStart, true);
114
+ parts.push(new Uint8Array(eocd));
115
+ const total = parts.reduce((s, p) => s + p.length, 0);
116
+ const out = new Uint8Array(total);
117
+ let pos = 0;
118
+ for (const p of parts) {
119
+ out.set(p, pos);
120
+ pos += p.length;
121
+ }
122
+ return out;
123
+ }
124
+ function crc32(data) {
125
+ let crc = 0xffffffff;
126
+ for (const byte of data) {
127
+ crc ^= byte;
128
+ for (let j = 0; j < 8; j++) {
129
+ crc = crc & 1 ? (crc >>> 1) ^ 0xedb88320 : crc >>> 1;
130
+ }
131
+ }
132
+ return (crc ^ 0xffffffff) >>> 0;
133
+ }
134
+ const LAMBDA_TRUST_POLICY = JSON.stringify({
135
+ Version: "2012-10-17",
136
+ Statement: [
137
+ {
138
+ Effect: "Allow",
139
+ Principal: { Service: "lambda.amazonaws.com" },
140
+ Action: "sts:AssumeRole",
141
+ },
142
+ ],
143
+ });
144
+ export async function deploy(config) {
145
+ const { entry, region = "us-east-1", memory = 256, timeout = 30, urlAuth = "NONE", vpc, environment, } = config;
146
+ const functionName = config.functionName ?? `stratus-mcp-${Date.now()}`;
147
+ const zipBuffer = await bundle(entry);
148
+ let roleArn = config.roleArn;
149
+ if (!roleArn) {
150
+ roleArn = await ensureRole(functionName, region, !!vpc, config.policies);
151
+ await Bun.sleep(15000);
152
+ }
153
+ const { LambdaClient, CreateFunctionCommand, UpdateFunctionCodeCommand, GetFunctionCommand, CreateFunctionUrlConfigCommand, GetFunctionUrlConfigCommand, AddPermissionCommand, } = await import("@aws-sdk/client-lambda");
154
+ const lambda = new LambdaClient({ region });
155
+ const envVars = {
156
+ NODE_OPTIONS: "--experimental-vm-modules",
157
+ ...environment,
158
+ };
159
+ let functionArn = "";
160
+ try {
161
+ const existing = await lambda.send(new GetFunctionCommand({ FunctionName: functionName }));
162
+ functionArn = existing.Configuration?.FunctionArn ?? "";
163
+ await lambda.send(new UpdateFunctionCodeCommand({ FunctionName: functionName, ZipFile: zipBuffer }));
164
+ }
165
+ catch {
166
+ let lastError;
167
+ for (let attempt = 0; attempt < 5; attempt++) {
168
+ try {
169
+ const result = await lambda.send(new CreateFunctionCommand({
170
+ FunctionName: functionName,
171
+ Runtime: "nodejs22.x",
172
+ Handler: "index.handler",
173
+ Role: roleArn,
174
+ Code: { ZipFile: zipBuffer },
175
+ MemorySize: memory,
176
+ Timeout: timeout,
177
+ PackageType: "Zip",
178
+ Architectures: ["arm64"],
179
+ Environment: { Variables: envVars },
180
+ ...(vpc
181
+ ? { VpcConfig: { SubnetIds: vpc.subnetIds, SecurityGroupIds: vpc.securityGroupIds } }
182
+ : {}),
183
+ }));
184
+ functionArn = result.FunctionArn ?? "";
185
+ lastError = undefined;
186
+ break;
187
+ }
188
+ catch (err) {
189
+ lastError = err;
190
+ if (attempt < 4)
191
+ await Bun.sleep(5000);
192
+ }
193
+ }
194
+ if (lastError)
195
+ throw lastError;
196
+ if (!functionArn)
197
+ throw new Error("Failed to create Lambda function");
198
+ }
199
+ // Wait for active
200
+ for (let i = 0; i < 30; i++) {
201
+ const fn = await lambda.send(new GetFunctionCommand({ FunctionName: functionName }));
202
+ if (fn.Configuration?.State === "Active")
203
+ break;
204
+ await Bun.sleep(2000);
205
+ }
206
+ // Function URL
207
+ let url = "";
208
+ if (urlAuth !== "none") {
209
+ try {
210
+ const cfg = await lambda.send(new GetFunctionUrlConfigCommand({ FunctionName: functionName }));
211
+ url = cfg.FunctionUrl ?? "";
212
+ }
213
+ catch {
214
+ const res = await lambda.send(new CreateFunctionUrlConfigCommand({
215
+ FunctionName: functionName,
216
+ AuthType: urlAuth,
217
+ InvokeMode: "BUFFERED",
218
+ }));
219
+ url = res.FunctionUrl ?? "";
220
+ const addPerm = (sid, action, extra) => lambda
221
+ .send(new AddPermissionCommand({
222
+ FunctionName: functionName,
223
+ StatementId: sid,
224
+ Action: action,
225
+ Principal: "*",
226
+ ...extra,
227
+ }))
228
+ .catch((err) => {
229
+ if (!err.name?.includes("ResourceConflict"))
230
+ throw err;
231
+ });
232
+ if (urlAuth === "NONE") {
233
+ await addPerm("FunctionURLAllowPublicAccess", "lambda:InvokeFunctionUrl", {
234
+ FunctionUrlAuthType: "NONE",
235
+ });
236
+ await addPerm("FunctionURLInvokeAllowPublicAccess", "lambda:InvokeFunction", {});
237
+ }
238
+ }
239
+ }
240
+ return { functionName, functionArn, url, region };
241
+ }
242
+ export async function destroy(functionName, region = "us-east-1") {
243
+ const { LambdaClient, DeleteFunctionCommand } = await import("@aws-sdk/client-lambda");
244
+ const lambda = new LambdaClient({ region });
245
+ try {
246
+ await lambda.send(new DeleteFunctionCommand({ FunctionName: functionName }));
247
+ return { functionName, deleted: true };
248
+ }
249
+ catch {
250
+ return { functionName, deleted: false };
251
+ }
252
+ }
253
+ async function ensureRole(functionName, region, needsVpc = false, extraPolicies) {
254
+ const { IAMClient, CreateRoleCommand, AttachRolePolicyCommand, GetRoleCommand } = await import("@aws-sdk/client-iam");
255
+ const iam = new IAMClient({ region });
256
+ const roleName = `${functionName}-role`;
257
+ try {
258
+ const existing = await iam.send(new GetRoleCommand({ RoleName: roleName }));
259
+ return existing.Role?.Arn ?? "";
260
+ }
261
+ catch {
262
+ const result = await iam.send(new CreateRoleCommand({ RoleName: roleName, AssumeRolePolicyDocument: LAMBDA_TRUST_POLICY }));
263
+ await iam.send(new AttachRolePolicyCommand({
264
+ RoleName: roleName,
265
+ PolicyArn: "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
266
+ }));
267
+ if (needsVpc) {
268
+ await iam.send(new AttachRolePolicyCommand({
269
+ RoleName: roleName,
270
+ PolicyArn: "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole",
271
+ }));
272
+ }
273
+ if (extraPolicies) {
274
+ for (const policyArn of extraPolicies) {
275
+ await iam.send(new AttachRolePolicyCommand({ RoleName: roleName, PolicyArn: policyArn }));
276
+ }
277
+ }
278
+ return result.Role?.Arn ?? "";
279
+ }
280
+ }
281
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { SearchIndex, type SearchResult } from "./search.js";
2
+ export { getVisibleTools, promoteToVisible, handleGateUnlock } from "./tier.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/disclosure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { SearchIndex } from "./search.js";
2
+ export { getVisibleTools, promoteToVisible, handleGateUnlock } from "./tier.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/disclosure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}