@aws/nx-plugin 0.83.1 → 0.84.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 (71) hide show
  1. package/generators.json +16 -8
  2. package/package.json +1 -1
  3. package/src/connection/generator.d.ts +12 -0
  4. package/src/connection/generator.js +27 -8
  5. package/src/connection/generator.js.map +1 -1
  6. package/src/infra/app/schema.d.ts +1 -0
  7. package/src/infra/app/schema.json +5 -0
  8. package/src/mcp-server/tools/create-workspace-command.js +1 -1
  9. package/src/preset/generator.js +2 -1
  10. package/src/preset/generator.js.map +1 -1
  11. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +3 -0
  12. package/src/py/fast-api/generator.js +2 -0
  13. package/src/py/fast-api/generator.js.map +1 -1
  14. package/src/py/fast-api/schema.d.ts +1 -0
  15. package/src/py/fast-api/schema.json +5 -0
  16. package/src/py/mcp-server/generator.js +14 -0
  17. package/src/py/mcp-server/generator.js.map +1 -1
  18. package/src/py/project/generator.d.ts +1 -0
  19. package/src/py/project/generator.js +10 -2
  20. package/src/py/project/generator.js.map +1 -1
  21. package/src/py/project/schema.d.ts +1 -0
  22. package/src/py/project/schema.json +5 -0
  23. package/src/py/strands-agent/__snapshots__/generator.spec.ts.snap +5 -5
  24. package/src/py/strands-agent/files/app/agent.py.template +5 -5
  25. package/src/py/strands-agent/generator.js +13 -0
  26. package/src/py/strands-agent/generator.js.map +1 -1
  27. package/src/smithy/ts/api/schema.d.ts +1 -0
  28. package/src/smithy/ts/api/schema.json +5 -0
  29. package/src/terraform/project/schema.d.ts +1 -0
  30. package/src/terraform/project/schema.json +5 -0
  31. package/src/trpc/backend/generator.js +1 -0
  32. package/src/trpc/backend/generator.js.map +1 -1
  33. package/src/trpc/backend/schema.d.ts +1 -0
  34. package/src/trpc/backend/schema.json +5 -0
  35. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +2 -2
  36. package/src/ts/mcp-server/files/Dockerfile.template +1 -1
  37. package/src/ts/mcp-server/files/server.ts.template +2 -2
  38. package/src/ts/mcp-server/files/tools/divide.ts.template +13 -0
  39. package/src/ts/mcp-server/generator.js +15 -1
  40. package/src/ts/mcp-server/generator.js.map +1 -1
  41. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +24 -0
  42. package/src/ts/react-website/app/generator.js +5 -4
  43. package/src/ts/react-website/app/generator.js.map +1 -1
  44. package/src/ts/react-website/app/schema.d.ts +1 -0
  45. package/src/ts/react-website/app/schema.json +5 -0
  46. package/src/ts/strands-agent/__snapshots__/generator.spec.ts.snap +48 -153
  47. package/src/ts/strands-agent/files/app/agent-core-trpc-client.ts.template +19 -2
  48. package/src/ts/strands-agent/files/app/agent.ts.template +11 -9
  49. package/src/ts/strands-agent/files/app/index.ts.template +10 -1
  50. package/src/ts/strands-agent/files/app/init.ts.template +3 -2
  51. package/src/ts/strands-agent/files/app/router.ts.template +1 -1
  52. package/src/ts/strands-agent/files/deploy/Dockerfile.template +1 -1
  53. package/src/ts/strands-agent/generator.js +13 -1
  54. package/src/ts/strands-agent/generator.js.map +1 -1
  55. package/src/ts/strands-agent/mcp-connection/__snapshots__/generator.spec.ts.snap +231 -0
  56. package/src/ts/strands-agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +37 -0
  57. package/src/ts/strands-agent/mcp-connection/generator.d.ts +10 -0
  58. package/src/ts/strands-agent/mcp-connection/generator.js +124 -0
  59. package/src/ts/strands-agent/mcp-connection/generator.js.map +1 -0
  60. package/src/ts/strands-agent/mcp-connection/schema.d.ts +15 -0
  61. package/src/ts/strands-agent/mcp-connection/schema.json +26 -0
  62. package/src/utils/agent-connection/agent-connection.d.ts +11 -0
  63. package/src/utils/agent-connection/agent-connection.js +35 -0
  64. package/src/utils/agent-connection/agent-connection.js.map +1 -0
  65. package/src/{ts/strands-agent/files/app/agent-core-mcp-client.ts.template → utils/agent-connection/files/core/agentcore-mcp-client.ts.template} +62 -35
  66. package/src/utils/ast.js +16 -7
  67. package/src/utils/ast.js.map +1 -1
  68. package/src/utils/versions.d.ts +2 -1
  69. package/src/utils/versions.js +1 -0
  70. package/src/utils/versions.js.map +1 -1
  71. package/src/ts/mcp-server/files/tools/add.ts.template +0 -13
@@ -1,3 +1,4 @@
1
+ import { randomUUID } from 'node:crypto';
1
2
  import { fromNodeProviderChain } from '@aws-sdk/credential-providers';
2
3
  import { createTRPCClient, createWSClient, WebSocketLinkOptions, wsLink } from '@trpc/client';
3
4
  import { AwsClient } from 'aws4fetch';
@@ -9,6 +10,11 @@ export interface WebSocketTrpcClientOptions {
9
10
  * URL of the websocket server, eg http://localhost:8080/ws
10
11
  */
11
12
  url: string;
13
+ /**
14
+ * Session ID to include in the WebSocket handshake headers.
15
+ * Defaults to a random UUID if not provided.
16
+ */
17
+ sessionId?: string;
12
18
  /**
13
19
  * Factory for creating headers to include in the WebSocket handshake
14
20
  */
@@ -24,12 +30,16 @@ export class WebSocketTrpcClient {
24
30
  */
25
31
  public static create = <TRouter extends AnyTRPCRouter>({
26
32
  url,
33
+ sessionId = randomUUID(),
27
34
  buildHeaders = async () => ({}),
28
35
  }: WebSocketTrpcClientOptions) => {
29
36
  let headers = {};
30
37
  const client = createWSClient({
31
38
  url: async () => {
32
- headers = await buildHeaders();
39
+ headers = {
40
+ ...(await buildHeaders()),
41
+ 'X-Amzn-Bedrock-AgentCore-Runtime-Session-Id': sessionId,
42
+ };
33
43
  return url;
34
44
  },
35
45
  WebSocket: class extends WebSocket {
@@ -50,6 +60,11 @@ export interface AgentCoreTrpcClientOptions {
50
60
  * The ARN of the Bedrock AgentCore Runtime to connect to
51
61
  */
52
62
  agentRuntimeArn: string;
63
+ /**
64
+ * Session ID to include in the WebSocket handshake headers.
65
+ * Defaults to a random UUID if not provided.
66
+ */
67
+ sessionId?: string;
53
68
  }
54
69
 
55
70
  export interface AgentCoreTrpcClientIamOptions extends AgentCoreTrpcClientOptions {
@@ -76,7 +91,7 @@ export class AgentCoreTrpcClient {
76
91
  */
77
92
  private static buildUrl = (agentRuntimeArn: string) => {
78
93
  const region = agentRuntimeArn.split(':')[3];
79
- const url = `wss://bedrock-agentcore.${region}.amazonaws.com/runtimes/${agentRuntimeArn.replace(/:/g, '%3A').replace(/\//g, '%2F')}/ws`;
94
+ const url = `wss://bedrock-agentcore.${region}.amazonaws.com/runtimes/${encodeURIComponent(agentRuntimeArn)}/ws`;
80
95
  return { region, url };
81
96
  };
82
97
 
@@ -93,6 +108,7 @@ export class AgentCoreTrpcClient {
93
108
 
94
109
  return WebSocketTrpcClient.create<TRouter>({
95
110
  url,
111
+ sessionId: options.sessionId,
96
112
  buildHeaders: async () =>
97
113
  Object.fromEntries(
98
114
  (
@@ -116,6 +132,7 @@ export class AgentCoreTrpcClient {
116
132
 
117
133
  return WebSocketTrpcClient.create<TRouter>({
118
134
  url,
135
+ sessionId: options.sessionId,
119
136
  buildHeaders: async () => ({
120
137
  Authorization: `Bearer ${await options.accessTokenProvider()}`,
121
138
  }),
@@ -1,20 +1,22 @@
1
1
  import { Agent, tool } from '@strands-agents/sdk';
2
2
  import { z } from 'zod';
3
3
 
4
- const add = tool({
5
- name: 'Add',
6
- description: 'Add two numbers',
4
+ const multiply = tool({
5
+ name: 'Multiply',
6
+ description: 'Multiply two numbers',
7
7
  inputSchema: z.object({
8
8
  a: z.number(),
9
9
  b: z.number(),
10
10
  }),
11
- callback: ({ a, b }) => a + b,
11
+ callback: ({ a, b }) => a * b,
12
12
  });
13
13
 
14
- export const getAgent = () =>
15
- new Agent({
16
- systemPrompt: `You are an addition wizard.
17
- Use the add tool for addition tasks.
14
+ export const getAgent = async (sessionId: string) => {
15
+ console.log(`Creating agent for session ${sessionId}`);
16
+ return new Agent({
17
+ systemPrompt: `You are a mathematical wizard.
18
+ Use your tools for mathematical tasks.
18
19
  Refer to tools as your 'spellbook'.`,
19
- tools: [add],
20
+ tools: [multiply],
20
21
  });
22
+ };
@@ -1,3 +1,4 @@
1
+ import { randomUUID } from 'node:crypto';
1
2
  import { createServer } from 'http';
2
3
  import {
3
4
  CreateHTTPContextOptions,
@@ -16,7 +17,15 @@ const PORT = parseInt(process.env.PORT || '8080');
16
17
 
17
18
  const createContext = (
18
19
  opts: CreateHTTPContextOptions | CreateWSSContextFnOptions,
19
- ): Context => ({});
20
+ ): Context => {
21
+ const sessionId =
22
+ ('req' in opts
23
+ ? opts.req.headers['x-amzn-bedrock-agentcore-runtime-session-id']
24
+ : undefined) ?? randomUUID();
25
+ return {
26
+ sessionId: Array.isArray(sessionId) ? sessionId[0] : sessionId,
27
+ };
28
+ };
20
29
 
21
30
  const handler = createHTTPHandler({
22
31
  router: appRouter,
@@ -1,7 +1,8 @@
1
1
  import { initTRPC } from '@trpc/server';
2
2
 
3
- // eslint-disable-next-line
4
- export interface Context {}
3
+ export interface Context {
4
+ sessionId: string;
5
+ }
5
6
 
6
7
  export const t = initTRPC.context<Context>().create();
7
8
 
@@ -15,7 +15,7 @@ export const appRouter = router({
15
15
  }),
16
16
  )
17
17
  .subscription(async function* (opts) {
18
- const agent = getAgent();
18
+ const agent = await getAgent(opts.ctx.sessionId);
19
19
 
20
20
  for await (const event of agent.stream(opts.input.message)) {
21
21
  if (
@@ -4,7 +4,7 @@ WORKDIR /app
4
4
 
5
5
  # Add AWS Distro for OpenTelemetry for observability
6
6
  # https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/observability-configure.html
7
- RUN npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation@^0.7.0
7
+ RUN npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation@<%- adotVersion %>
8
8
 
9
9
  # Copy bundled agent
10
10
  COPY --from=workspace <%- distDir %>/bundle/agent/<%- name %>/index.js /app
@@ -51,6 +51,7 @@ const tsStrandsAgentGenerator = (tree, options) => tslib_1.__awaiter(void 0, voi
51
51
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', 'deploy'), targetSourceDir, {
52
52
  distDir,
53
53
  name,
54
+ adotVersion: versions_1.TS_VERSIONS['@aws/aws-distro-opentelemetry-node-autoinstrumentation'],
54
55
  }, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
55
56
  const dockerTargetName = `${agentTargetPrefix}-docker`;
56
57
  project.targets[dockerTargetName] = {
@@ -102,8 +103,19 @@ const tsStrandsAgentGenerator = (tree, options) => tslib_1.__awaiter(void 0, voi
102
103
  },
103
104
  },
104
105
  continuous: true,
106
+ }, [`${agentTargetPrefix}-serve-local`]: {
107
+ executor: 'nx:run-commands',
108
+ options: {
109
+ commands: [`tsx --watch ${relativeSourceDir}/index.ts`],
110
+ cwd: '{projectRoot}',
111
+ env: {
112
+ PORT: `${localDevPort}`,
113
+ SERVE_LOCAL: 'true',
114
+ },
115
+ },
116
+ continuous: true,
105
117
  } }) }));
106
- (0, nx_1.addComponentGeneratorMetadata)(tree, project.name, exports.TS_STRANDS_AGENT_GENERATOR_INFO, targetSourceDirRelativeToProjectRoot, agentTargetPrefix, { port: localDevPort });
118
+ (0, nx_1.addComponentGeneratorMetadata)(tree, project.name, exports.TS_STRANDS_AGENT_GENERATOR_INFO, targetSourceDirRelativeToProjectRoot, agentTargetPrefix, { port: localDevPort, rc: agentNameClassName });
107
119
  yield (0, metrics_1.addGeneratorMetricsIfApplicable)(tree, [
108
120
  exports.TS_STRANDS_AGENT_GENERATOR_INFO,
109
121
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/strands-agent/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/strands-agent/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`ts#strands-agent#mcp-connection generator > should match snapshot for agent-connection src files > agent-connection-index.ts 1`] = `
4
+ "export * from './app/inventory-mcp-client.js';
5
+ // Export your library code here
6
+ "
7
+ `;
8
+
9
+ exports[`ts#strands-agent#mcp-connection generator > should match snapshot for agent-connection src files > agentcore-mcp-client.ts 1`] = `
10
+ "import { randomUUID } from 'node:crypto';
11
+ import { McpClient } from '@strands-agents/sdk';
12
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
13
+ import { AwsClient } from 'aws4fetch';
14
+ import { fromNodeProviderChain } from '@aws-sdk/credential-providers';
15
+
16
+ /**
17
+ * Common options for creating an AgentCore MCP client
18
+ */
19
+ export interface AgentCoreMcpClientOptions {
20
+ /**
21
+ * The ARN of the Bedrock AgentCore Runtime to connect to
22
+ */
23
+ agentRuntimeArn: string;
24
+ /**
25
+ * Session ID to include in request headers.
26
+ * Defaults to a random UUID if not provided.
27
+ */
28
+ sessionId?: string;
29
+ }
30
+
31
+ /**
32
+ * Options for creating an AgentCore MCP client with IAM authentication
33
+ */
34
+ export interface AgentCoreMcpClientIamOptions extends AgentCoreMcpClientOptions {
35
+ /**
36
+ * Optional AWS credential provider. If not provided, uses the default
37
+ * credential provider chain from the AWS SDK.
38
+ */
39
+ credentialProvider?: ReturnType<typeof fromNodeProviderChain>;
40
+ }
41
+
42
+ /**
43
+ * Options for creating an AgentCore MCP client with JWT authentication
44
+ */
45
+ export interface AgentCoreMcpClientJwtOptions extends AgentCoreMcpClientOptions {
46
+ /**
47
+ * A function which returns the JWT access token used to authenticate
48
+ */
49
+ accessTokenProvider: () => Promise<string>;
50
+ }
51
+
52
+ /**
53
+ * Internal options for creating an AgentCore MCP client
54
+ */
55
+ interface CreateOptions {
56
+ url: string;
57
+ sessionId?: string;
58
+ buildHeaders?: () => Promise<Record<string, string>>;
59
+ fetch?: typeof fetch;
60
+ }
61
+
62
+ /**
63
+ * Factory for clients to call MCP servers hosted on Bedrock AgentCore Runtime
64
+ */
65
+ export class AgentCoreMcpClient {
66
+ /**
67
+ * Construct the invocation URL for an AgentCore runtime ARN and extract the region.
68
+ * ARN format: arn:partition:service:region:account-id:resource
69
+ */
70
+ private static buildUrl(agentRuntimeArn: string): {
71
+ region: string;
72
+ url: string;
73
+ } {
74
+ const region = agentRuntimeArn.split(':')[3];
75
+ const url = \`https://bedrock-agentcore.\${region}.amazonaws.com/runtimes/\${encodeURIComponent(agentRuntimeArn)}/invocations?qualifier=DEFAULT\`;
76
+ return { region, url };
77
+ }
78
+
79
+ /**
80
+ * Internal method to create an MCP client
81
+ */
82
+ private static create(options: CreateOptions): McpClient {
83
+ const {
84
+ url,
85
+ sessionId = randomUUID(),
86
+ buildHeaders = async () => ({}),
87
+ fetch: customFetch,
88
+ } = options;
89
+
90
+ // Create a custom fetch that adds required headers
91
+ const fetchWithHeaders: typeof fetch = async (input, init) => {
92
+ const headers = {
93
+ 'X-Amzn-Bedrock-AgentCore-Runtime-Session-Id': sessionId,
94
+ ...(await buildHeaders()),
95
+ };
96
+ const existingHeaders = init?.headers;
97
+
98
+ const mergedInit = {
99
+ ...init,
100
+ headers: !existingHeaders
101
+ ? headers
102
+ : existingHeaders instanceof Headers
103
+ ? (() => {
104
+ const h = new Headers(existingHeaders);
105
+ Object.entries(headers).forEach(([k, v]) => h.append(k, v));
106
+ return h;
107
+ })()
108
+ : Array.isArray(existingHeaders)
109
+ ? [...existingHeaders, ...Object.entries(headers)]
110
+ : { ...existingHeaders, ...headers },
111
+ };
112
+ return (customFetch || fetch)(input, mergedInit);
113
+ };
114
+
115
+ // Create the transport
116
+ const transport = new StreamableHTTPClientTransport(new URL(url), {
117
+ fetch: fetchWithHeaders,
118
+ });
119
+
120
+ // Create and return the MCP client
121
+ return new McpClient({ transport });
122
+ }
123
+
124
+ /**
125
+ * Create an MCP client with IAM (SigV4) authentication
126
+ */
127
+ static withIamAuth(options: AgentCoreMcpClientIamOptions): McpClient {
128
+ const { agentRuntimeArn, sessionId } = options;
129
+ const credentialProvider =
130
+ options.credentialProvider ?? fromNodeProviderChain();
131
+ const { region, url } = AgentCoreMcpClient.buildUrl(agentRuntimeArn);
132
+
133
+ // Create a SigV4 signing fetch function
134
+ const sigv4Fetch: typeof fetch = async (...args) => {
135
+ const credentials = await credentialProvider();
136
+ const client = new AwsClient({
137
+ ...credentials,
138
+ service: 'bedrock-agentcore',
139
+ region,
140
+ });
141
+ return client.fetch(...args);
142
+ };
143
+
144
+ return AgentCoreMcpClient.create({
145
+ url,
146
+ sessionId,
147
+ fetch: sigv4Fetch,
148
+ });
149
+ }
150
+
151
+ /**
152
+ * Create an MCP client with JWT authentication
153
+ */
154
+ static withJwtAuth(options: AgentCoreMcpClientJwtOptions): McpClient {
155
+ const { agentRuntimeArn, accessTokenProvider, sessionId } = options;
156
+ const { url } = AgentCoreMcpClient.buildUrl(agentRuntimeArn);
157
+
158
+ return AgentCoreMcpClient.create({
159
+ url,
160
+ sessionId,
161
+ buildHeaders: async () => ({
162
+ Authorization: \`Bearer \${await accessTokenProvider()}\`,
163
+ }),
164
+ });
165
+ }
166
+ }
167
+ "
168
+ `;
169
+
170
+ exports[`ts#strands-agent#mcp-connection generator > should match snapshot for agent-connection src files > inventory-mcp-client.ts 1`] = `
171
+ "import { McpClient } from '@strands-agents/sdk';
172
+ import { AgentCoreMcpClient } from '../core/agentcore-mcp-client.js';
173
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
174
+ import { getAppConfig } from '@aws-lambda-powertools/parameters/appconfig';
175
+
176
+ /**
177
+ * Client for connecting to the InventoryMcp MCP server.
178
+ *
179
+ * In deployed mode: resolves the AgentCore runtime ARN from runtime config
180
+ * and uses SigV4-authenticated AgentCore transport.
181
+ *
182
+ * In local mode (SERVE_LOCAL env var set): connects directly
183
+ * to the local MCP server via Streamable HTTP.
184
+ */
185
+ export class InventoryMcpClient {
186
+ static async create(sessionId: string): Promise<McpClient> {
187
+ if (process.env.SERVE_LOCAL === 'true') {
188
+ // Local development: connect directly via Streamable HTTP
189
+ const transport = new StreamableHTTPClientTransport(
190
+ new URL('http://localhost:8082/mcp'),
191
+ );
192
+ return new McpClient({ transport });
193
+ }
194
+
195
+ // Deployed: resolve ARN from runtime config, use AgentCore transport
196
+ const config = (await getAppConfig('connection', {
197
+ application: process.env.RUNTIME_CONFIG_APP_ID!,
198
+ environment: 'default',
199
+ transform: 'json',
200
+ })) as Record<string, any>;
201
+
202
+ return AgentCoreMcpClient.withIamAuth({
203
+ agentRuntimeArn: config.agentRuntimes.InventoryMcp,
204
+ sessionId,
205
+ });
206
+ }
207
+ }
208
+ "
209
+ `;
210
+
211
+ exports[`ts#strands-agent#mcp-connection generator > should match snapshot for agent-connection src files > transformed-agent.ts 1`] = `
212
+ "import { InventoryMcpClient } from ':proj/agent-connection';
213
+ import { Agent, tool } from '@strands-agents/sdk';
214
+ import { z } from 'zod';
215
+
216
+ const multiply = tool({
217
+ name: 'Multiply',
218
+ description: 'Multiply two numbers',
219
+ inputSchema: z.object({ a: z.number(), b: z.number() }),
220
+ callback: ({ a, b }) => a * b,
221
+ });
222
+
223
+ export const getAgent = async (sessionId: string) => {
224
+ const inventoryMcp = await InventoryMcpClient.create(sessionId);
225
+ return new Agent({
226
+ systemPrompt: 'You are a mathematical wizard.',
227
+ tools: [inventoryMcp, multiply],
228
+ });
229
+ };
230
+ "
231
+ `;
@@ -0,0 +1,37 @@
1
+ import { McpClient } from '@strands-agents/sdk';
2
+ import { AgentCoreMcpClient } from '../core/agentcore-mcp-client.js';
3
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
4
+ import { getAppConfig } from '@aws-lambda-powertools/parameters/appconfig';
5
+
6
+ /**
7
+ * Client for connecting to the <%- mcpServerClassName %> MCP server.
8
+ *
9
+ * In deployed mode: resolves the AgentCore runtime ARN from runtime config
10
+ * and uses SigV4-authenticated AgentCore transport.
11
+ *
12
+ * In local mode (SERVE_LOCAL env var set): connects directly
13
+ * to the local MCP server via Streamable HTTP.
14
+ */
15
+ export class <%- mcpServerClassName %>Client {
16
+ static async create(sessionId: string): Promise<McpClient> {
17
+ if (process.env.SERVE_LOCAL === 'true') {
18
+ // Local development: connect directly via Streamable HTTP
19
+ const transport = new StreamableHTTPClientTransport(
20
+ new URL('http://localhost:<%- mcpServerPort %>/mcp'),
21
+ );
22
+ return new McpClient({ transport });
23
+ }
24
+
25
+ // Deployed: resolve ARN from runtime config, use AgentCore transport
26
+ const config = (await getAppConfig('connection', {
27
+ application: process.env.RUNTIME_CONFIG_APP_ID!,
28
+ environment: 'default',
29
+ transform: 'json',
30
+ })) as Record<string, any>;
31
+
32
+ return AgentCoreMcpClient.withIamAuth({
33
+ agentRuntimeArn: config.agentRuntimes.<%- mcpServerClassName %>,
34
+ sessionId,
35
+ });
36
+ }
37
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { GeneratorCallback, Tree } from '@nx/devkit';
6
+ import { TsStrandsAgentMcpConnectionGeneratorSchema } from './schema';
7
+ import { NxGeneratorInfo } from '../../../utils/nx';
8
+ export declare const TS_STRANDS_AGENT_MCP_CONNECTION_GENERATOR_INFO: NxGeneratorInfo;
9
+ export declare const tsStrandsAgentMcpConnectionGenerator: (tree: Tree, options: TsStrandsAgentMcpConnectionGeneratorSchema) => Promise<GeneratorCallback>;
10
+ export default tsStrandsAgentMcpConnectionGenerator;
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tsStrandsAgentMcpConnectionGenerator = exports.TS_STRANDS_AGENT_MCP_CONNECTION_GENERATOR_INFO = void 0;
4
+ const tslib_1 = require("tslib");
5
+ /**
6
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
+ * SPDX-License-Identifier: Apache-2.0
8
+ */
9
+ const devkit_1 = require("@nx/devkit");
10
+ const nx_1 = require("../../../utils/nx");
11
+ const metrics_1 = require("../../../utils/metrics");
12
+ const format_1 = require("../../../utils/format");
13
+ const names_1 = require("../../../utils/names");
14
+ const versions_1 = require("../../../utils/versions");
15
+ const npm_scope_1 = require("../../../utils/npm-scope");
16
+ const ast_1 = require("../../../utils/ast");
17
+ const agent_connection_1 = require("../../../utils/agent-connection/agent-connection");
18
+ const typescript_1 = tslib_1.__importStar(require("typescript"));
19
+ exports.TS_STRANDS_AGENT_MCP_CONNECTION_GENERATOR_INFO = (0, nx_1.getGeneratorInfo)(__filename);
20
+ const tsStrandsAgentMcpConnectionGenerator = (tree, options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
21
+ var _a, _b, _c, _d, _e, _f;
22
+ const sourceProject = (0, nx_1.readProjectConfigurationUnqualified)(tree, options.sourceProject);
23
+ const targetProject = (0, nx_1.readProjectConfigurationUnqualified)(tree, options.targetProject);
24
+ const agentComponent = options.sourceComponent;
25
+ const mcpComponent = options.targetComponent;
26
+ if (!agentComponent || !mcpComponent) {
27
+ throw new Error('Both sourceComponent and targetComponent must be provided for ts#strands-agent -> mcp connections');
28
+ }
29
+ const mcpComponentName = (_a = mcpComponent.name) !== null && _a !== void 0 ? _a : 'mcp-server';
30
+ const mcpServerClassName = mcpComponent.rc;
31
+ const mcpServerKebabCase = (0, names_1.kebabCase)(mcpServerClassName);
32
+ const mcpServerPort = (_b = mcpComponent.port) !== null && _b !== void 0 ? _b : 8000;
33
+ const npmScope = (0, npm_scope_1.getNpmScope)(tree);
34
+ // 1. Ensure the shared agent-connection project exists
35
+ yield (0, agent_connection_1.ensureTypeScriptAgentConnectionProject)(tree);
36
+ // 2. Generate the per-connection <Name>Client into app/
37
+ (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', 'agent-connection', 'app'), (0, devkit_1.joinPathFragments)(agent_connection_1.AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'), {
38
+ mcpServerKebabCase,
39
+ mcpServerClassName,
40
+ mcpServerPort,
41
+ }, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
42
+ // Add re-export to index.ts
43
+ (0, ast_1.addStarExport)(tree, (0, devkit_1.joinPathFragments)(agent_connection_1.AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'), `./app/${mcpServerKebabCase}-client.js`);
44
+ // 3. AST transform agent.ts to add MCP tools
45
+ const agentSourceDir = (0, devkit_1.joinPathFragments)(sourceProject.root, (_c = agentComponent.path) !== null && _c !== void 0 ? _c : 'src');
46
+ const agentFilePath = (0, devkit_1.joinPathFragments)(agentSourceDir, 'agent.ts');
47
+ if (tree.exists(agentFilePath)) {
48
+ const clientClassName = `${mcpServerClassName}Client`;
49
+ const clientVarName = mcpServerClassName.charAt(0).toLowerCase() + mcpServerClassName.slice(1);
50
+ // Add import for the client
51
+ (0, ast_1.addDestructuredImport)(tree, agentFilePath, [clientClassName], `:${npmScope}/agent-connection`);
52
+ // Create: const <clientVarName> = await <ClientClassName>.create(sessionId);
53
+ const clientCreationStatement = typescript_1.factory.createVariableStatement(undefined, typescript_1.factory.createVariableDeclarationList([
54
+ typescript_1.factory.createVariableDeclaration(clientVarName, undefined, undefined, typescript_1.factory.createAwaitExpression(typescript_1.factory.createCallExpression(typescript_1.factory.createPropertyAccessExpression(typescript_1.factory.createIdentifier(clientClassName), 'create'), undefined, [typescript_1.factory.createIdentifier('sessionId')]))),
55
+ ], 2));
56
+ // Transform the arrow function that contains `new Agent` to have a block body
57
+ // with the client creation statement before the return
58
+ (0, ast_1.replaceIfExists)(tree, agentFilePath, 'ArrowFunction:has(NewExpression[expression.name="Agent"])', (node) => {
59
+ const arrow = node;
60
+ // Check if already transformed
61
+ if (arrow.getText().includes(clientClassName))
62
+ return node;
63
+ // If the body is an expression (not a block), wrap it in a block with return
64
+ if (!typescript_1.default.isBlock(arrow.body)) {
65
+ return typescript_1.factory.updateArrowFunction(arrow, arrow.modifiers, arrow.typeParameters, arrow.parameters, arrow.type, arrow.equalsGreaterThanToken, typescript_1.factory.createBlock([
66
+ clientCreationStatement,
67
+ typescript_1.factory.createReturnStatement(arrow.body),
68
+ ], true));
69
+ }
70
+ // Body is already a block — insert before the statement containing `new Agent`
71
+ const b = arrow.body;
72
+ const agentStatementIndex = b.statements.findIndex((s) => s.getText().includes('new Agent('));
73
+ if (agentStatementIndex === -1)
74
+ return node;
75
+ const newStatements = [...b.statements];
76
+ newStatements.splice(agentStatementIndex, 0, clientCreationStatement);
77
+ return typescript_1.factory.updateArrowFunction(arrow, arrow.modifiers, arrow.typeParameters, arrow.parameters, arrow.type, arrow.equalsGreaterThanToken, typescript_1.factory.updateBlock(b, newStatements));
78
+ });
79
+ // Add client to the tools array: tools: [clientVarName, ...existing]
80
+ (0, ast_1.replaceIfExists)(tree, agentFilePath, 'NewExpression[expression.name="Agent"] ObjectLiteralExpression PropertyAssignment[name.name="tools"] ArrayLiteralExpression', (node) => {
81
+ const arr = node;
82
+ // Check if already added
83
+ if (arr.getText().includes(clientVarName))
84
+ return node;
85
+ return typescript_1.factory.updateArrayLiteralExpression(arr, [
86
+ typescript_1.factory.createIdentifier(clientVarName),
87
+ ...arr.elements,
88
+ ]);
89
+ });
90
+ }
91
+ // 4. Set up serve-local target
92
+ const agentName = (_d = agentComponent.name) !== null && _d !== void 0 ? _d : 'agent';
93
+ const serveLocalTargetName = `${agentName}-serve-local`;
94
+ const mcpServeLocalTargetName = `${mcpComponentName}-serve-local`;
95
+ if ((_e = sourceProject.targets) === null || _e === void 0 ? void 0 : _e[serveLocalTargetName]) {
96
+ const target = sourceProject.targets[serveLocalTargetName];
97
+ target.dependsOn = [
98
+ ...((_f = target.dependsOn) !== null && _f !== void 0 ? _f : []),
99
+ {
100
+ projects: [targetProject.name],
101
+ target: mcpServeLocalTargetName,
102
+ },
103
+ ];
104
+ (0, devkit_1.updateProjectConfiguration)(tree, sourceProject.name, sourceProject);
105
+ }
106
+ // 5. Add dependencies
107
+ (0, devkit_1.addDependenciesToPackageJson)(tree, (0, versions_1.withVersions)([
108
+ '@modelcontextprotocol/sdk',
109
+ '@aws-lambda-powertools/parameters',
110
+ '@aws-sdk/client-appconfigdata',
111
+ 'aws4fetch',
112
+ '@aws-sdk/credential-providers',
113
+ ]), {});
114
+ yield (0, metrics_1.addGeneratorMetricsIfApplicable)(tree, [
115
+ exports.TS_STRANDS_AGENT_MCP_CONNECTION_GENERATOR_INFO,
116
+ ]);
117
+ yield (0, format_1.formatFilesInSubtree)(tree);
118
+ return () => {
119
+ (0, devkit_1.installPackagesTask)(tree);
120
+ };
121
+ });
122
+ exports.tsStrandsAgentMcpConnectionGenerator = tsStrandsAgentMcpConnectionGenerator;
123
+ exports.default = exports.tsStrandsAgentMcpConnectionGenerator;
124
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/ts/strands-agent/mcp-connection/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { ComponentMetadata } from '../../../utils/nx';
6
+
7
+ /**
8
+ * TypeScript types for options defined in schema.json
9
+ */
10
+ export interface TsStrandsAgentMcpConnectionGeneratorSchema {
11
+ sourceProject: string;
12
+ targetProject: string;
13
+ sourceComponent?: ComponentMetadata;
14
+ targetComponent?: ComponentMetadata;
15
+ }