@aws/nx-plugin 1.0.0-rc.18 → 1.0.0-rc.19
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/package.json +1 -1
- package/src/py/agent/__snapshots__/generator.spec.ts.snap +15 -6
- package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +201 -0
- package/src/py/agent/a2a-connection/files/agent-connection/app/{__targetAgentSnakeCase___client.py.template → __targetAgentSnakeCase___client_strands.py.template} +7 -5
- package/src/py/agent/a2a-connection/generator.js +6 -5
- package/src/py/agent/a2a-connection/generator.js.map +1 -1
- package/src/py/agent/files/http/main.py.template +2 -2
- package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +197 -0
- package/src/py/agent/gateway-connection/files/agent-connection/app/{__gatewaySnakeCase___client.py.template → __gatewaySnakeCase___client_strands.py.template} +6 -6
- package/src/py/agent/gateway-connection/generator.js +5 -5
- package/src/py/agent/gateway-connection/generator.js.map +1 -1
- package/src/py/agent/generator.js +3 -0
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +157 -79
- package/src/py/agent/mcp-connection/files/agent-connection/app/{__mcpServerSnakeCase___client.py.template → __mcpServerSnakeCase___client_strands.py.template} +7 -5
- package/src/py/agent/mcp-connection/generator.js +5 -5
- package/src/py/agent/mcp-connection/generator.js.map +1 -1
- package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +37 -3
- package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +13 -4
- package/src/smithy/project/__snapshots__/generator.spec.ts.snap +1 -0
- package/src/smithy/project/files/src/operations/echo.smithy.template +1 -0
- package/src/terraform/project/files/application/src/main.tf.template +6 -1
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +35 -4
- package/src/trpc/backend/files/src/procedures/echo.ts.template +1 -1
- package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +14 -5
- package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +256 -0
- package/src/ts/agent/a2a-connection/files/agent-connection/app/{__targetAgentKebabCase__-client.ts.template → __targetAgentKebabCase__-client-strands.ts.template} +5 -5
- package/src/ts/agent/a2a-connection/generator.js +3 -3
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/files/http/router.ts.template +1 -1
- package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +220 -0
- package/src/ts/agent/gateway-connection/files/agent-connection/app/{__gatewayKebabCase__-client.ts.template → __gatewayKebabCase__-client-strands.ts.template} +5 -5
- package/src/ts/agent/gateway-connection/generator.js +3 -3
- package/src/ts/agent/gateway-connection/generator.js.map +1 -1
- package/src/ts/agent/generator.js +3 -0
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +183 -110
- package/src/ts/agent/mcp-connection/files/agent-connection/app/{__mcpServerKebabCase__-client.ts.template → __mcpServerKebabCase__-client-strands.ts.template} +5 -5
- package/src/ts/agent/mcp-connection/generator.js +3 -3
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +13 -4
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +64 -24
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +13 -4
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +9 -3
- package/src/utils/agent-connection/agent-connection.d.ts +50 -24
- package/src/utils/agent-connection/agent-connection.js +137 -45
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
- package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
- package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
- package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
- package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
- package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
- package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
- package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
- package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
- package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
- package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
- package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
- package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
- package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
- package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
- package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
- package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
- package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +7 -2
- package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +13 -4
- package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +9 -0
- package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +23 -1
- package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +9 -3
- package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +7 -2
- package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +9 -3
- package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +22 -8
- package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +10 -4
- package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +13 -4
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
- package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-client.ts.template +0 -78
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
- package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
- package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_client.py.template +0 -78
- package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
- /package/src/utils/agent-connection/files/{core-runtime-config/model-errors.ts.template → core-strands/base/model-errors-strands.ts.template} +0 -0
- /package/src/utils/agent-connection/files/{core-runtime-config/with-session-id.ts.template → core-strands/base/with-session-id-strands.ts.template} +0 -0
- /package/src/utils/agent-connection/files/{py-core-runtime-config/model_errors.py.template → py-core-strands/base/model_errors_strands.py.template} +0 -0
- /package/src/utils/agent-connection/files/{py-core-runtime-config/with_session_id.py.template → py-core-strands/base/with_session_id_strands.py.template} +0 -0
|
@@ -1,158 +1,231 @@
|
|
|
1
1
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
3
|
exports[`ts#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 * from './core/model-errors.js';
|
|
6
|
-
export * from './core/with-session-id.js';
|
|
4
|
+
"export * from './app/inventory-mcp-client-strands.js';
|
|
5
|
+
export * from './core/model-errors-strands.js';
|
|
6
|
+
export * from './core/with-session-id-strands.js';
|
|
7
7
|
export * from './core/session-context.js';
|
|
8
8
|
// Export your library code here
|
|
9
9
|
"
|
|
10
10
|
`;
|
|
11
11
|
|
|
12
|
-
exports[`ts#agent#mcp-connection generator > should match snapshot for agent-connection src files > agentcore-
|
|
13
|
-
"import {
|
|
14
|
-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
15
|
-
import { AwsClient } from 'aws4fetch';
|
|
12
|
+
exports[`ts#agent#mcp-connection generator > should match snapshot for agent-connection src files > agentcore-fetch.ts 1`] = `
|
|
13
|
+
"import { AwsClient } from 'aws4fetch';
|
|
16
14
|
import { fromNodeProviderChain } from '@aws-sdk/credential-providers';
|
|
17
15
|
import { getCurrentSessionId } from './session-context.js';
|
|
18
16
|
|
|
19
17
|
const SESSION_HEADER = 'X-Amzn-Bedrock-AgentCore-Runtime-Session-Id';
|
|
20
18
|
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
/** Wrap a fetch so each request carries the current async-context session id. */
|
|
20
|
+
const withSessionHeader =
|
|
21
|
+
(inner: typeof fetch): typeof fetch =>
|
|
22
|
+
async (input, init) => {
|
|
23
|
+
const headers = new Headers(init?.headers);
|
|
24
|
+
const sessionId = getCurrentSessionId();
|
|
25
|
+
if (sessionId) headers.set(SESSION_HEADER, sessionId);
|
|
26
|
+
return inner(input, { ...init, headers });
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** Options for a SigV4-signing fetch. */
|
|
30
|
+
export interface SigV4FetchOptions {
|
|
31
|
+
/** AWS region to sign for. */
|
|
32
|
+
region: string;
|
|
33
|
+
/** AWS service to sign for. Defaults to \`bedrock-agentcore\`. */
|
|
34
|
+
service?: string;
|
|
35
|
+
/** AWS credential provider; defaults to the standard provider chain. */
|
|
36
|
+
credentialProvider?: ReturnType<typeof fromNodeProviderChain>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** A fetch that signs every request with AWS SigV4 (per-request, body-aware). */
|
|
40
|
+
export const createSigV4Fetch = (options: SigV4FetchOptions): typeof fetch => {
|
|
41
|
+
const { region, service = 'bedrock-agentcore' } = options;
|
|
42
|
+
const credentialProvider =
|
|
43
|
+
options.credentialProvider ?? fromNodeProviderChain();
|
|
44
|
+
const signedFetch: typeof fetch = async (...args) => {
|
|
45
|
+
const client = new AwsClient({
|
|
46
|
+
...(await credentialProvider()),
|
|
47
|
+
service,
|
|
48
|
+
region,
|
|
49
|
+
});
|
|
50
|
+
return client.fetch(...args);
|
|
51
|
+
};
|
|
52
|
+
return withSessionHeader(signedFetch);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/** A fetch that adds a bearer token from the given async provider. */
|
|
56
|
+
export const createJwtFetch = (
|
|
57
|
+
accessTokenProvider: () => Promise<string>,
|
|
58
|
+
): typeof fetch =>
|
|
59
|
+
withSessionHeader(async (input, init) => {
|
|
60
|
+
const headers = new Headers(init?.headers);
|
|
61
|
+
headers.set('Authorization', \`Bearer \${await accessTokenProvider()}\`);
|
|
62
|
+
return fetch(input, { ...init, headers });
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
/** A plain fetch (local dev) that still forwards the session id. */
|
|
66
|
+
export const createPlainFetch = (): typeof fetch => withSessionHeader(fetch);
|
|
67
|
+
"
|
|
68
|
+
`;
|
|
69
|
+
|
|
70
|
+
exports[`ts#agent#mcp-connection generator > should match snapshot for agent-connection src files > agentcore-mcp-client-strands.ts 1`] = `
|
|
71
|
+
"import { McpClient } from '@strands-agents/sdk';
|
|
72
|
+
import {
|
|
73
|
+
AgentCoreMcpTransport,
|
|
74
|
+
type AgentCoreMcpTransportIamOptions,
|
|
75
|
+
type AgentCoreMcpTransportJwtOptions,
|
|
76
|
+
type AgentCoreMcpTransportNoAuthOptions,
|
|
77
|
+
} from './agentcore-mcp-transport.js';
|
|
78
|
+
|
|
79
|
+
/** Strands MCP clients for a Bedrock AgentCore runtime. */
|
|
80
|
+
export class AgentCoreMcpClientStrands {
|
|
81
|
+
/** SigV4-authenticated client for a Bedrock AgentCore runtime. */
|
|
82
|
+
static withIamAuth(options: AgentCoreMcpTransportIamOptions): McpClient {
|
|
83
|
+
return new McpClient({
|
|
84
|
+
transport: AgentCoreMcpTransport.withIamAuth(options),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Bearer-authenticated client for a Bedrock AgentCore runtime. */
|
|
89
|
+
static withJwtAuth(options: AgentCoreMcpTransportJwtOptions): McpClient {
|
|
90
|
+
return new McpClient({
|
|
91
|
+
transport: AgentCoreMcpTransport.withJwtAuth(options),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** For local dev — plain HTTP, no auth. */
|
|
96
|
+
static withoutAuth(options: AgentCoreMcpTransportNoAuthOptions): McpClient {
|
|
97
|
+
return new McpClient({
|
|
98
|
+
transport: AgentCoreMcpTransport.withoutAuth(options),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
29
101
|
}
|
|
102
|
+
"
|
|
103
|
+
`;
|
|
104
|
+
|
|
105
|
+
exports[`ts#agent#mcp-connection generator > should match snapshot for agent-connection src files > agentcore-mcp-transport.ts 1`] = `
|
|
106
|
+
"import type { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
107
|
+
import { fromNodeProviderChain } from '@aws-sdk/credential-providers';
|
|
108
|
+
import { mcpUrlFromArn, regionFromArn } from './agentcore-endpoints.js';
|
|
109
|
+
import {
|
|
110
|
+
sigV4Transport,
|
|
111
|
+
jwtTransport,
|
|
112
|
+
noAuthTransport,
|
|
113
|
+
} from './agentcore-transport.js';
|
|
30
114
|
|
|
31
115
|
/**
|
|
32
|
-
* Options for
|
|
116
|
+
* Options for an MCP transport with IAM authentication.
|
|
33
117
|
*/
|
|
34
|
-
export interface
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
* credential provider chain from the AWS SDK.
|
|
39
|
-
*/
|
|
118
|
+
export interface AgentCoreMcpTransportIamOptions {
|
|
119
|
+
/** The ARN of the Bedrock AgentCore Runtime to connect to. */
|
|
120
|
+
agentRuntimeArn: string;
|
|
121
|
+
/** AWS credential provider; defaults to the standard provider chain. */
|
|
40
122
|
credentialProvider?: ReturnType<typeof fromNodeProviderChain>;
|
|
41
123
|
}
|
|
42
124
|
|
|
43
125
|
/**
|
|
44
|
-
* Options for
|
|
126
|
+
* Options for an MCP transport with JWT authentication.
|
|
45
127
|
*/
|
|
46
|
-
export interface
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
*/
|
|
128
|
+
export interface AgentCoreMcpTransportJwtOptions {
|
|
129
|
+
/** The ARN of the Bedrock AgentCore Runtime to connect to. */
|
|
130
|
+
agentRuntimeArn: string;
|
|
131
|
+
/** A function which returns the JWT access token used to authenticate. */
|
|
51
132
|
accessTokenProvider: () => Promise<string>;
|
|
52
133
|
}
|
|
53
134
|
|
|
54
135
|
/**
|
|
55
|
-
* Options for
|
|
136
|
+
* Options for an MCP transport with no auth (local dev).
|
|
56
137
|
*/
|
|
57
|
-
export interface
|
|
138
|
+
export interface AgentCoreMcpTransportNoAuthOptions {
|
|
58
139
|
/** Full URL of the local MCP endpoint. */
|
|
59
140
|
url: string;
|
|
60
141
|
}
|
|
61
142
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
* the region. ARN format: arn:partition:service:region:account-id:resource
|
|
73
|
-
*/
|
|
74
|
-
private static buildUrl(agentRuntimeArn: string): {
|
|
75
|
-
region: string;
|
|
76
|
-
url: string;
|
|
77
|
-
} {
|
|
78
|
-
const region = agentRuntimeArn.split(':')[3];
|
|
79
|
-
const url = \`https://bedrock-agentcore.\${region}.amazonaws.com/runtimes/\${encodeURIComponent(agentRuntimeArn)}/invocations?qualifier=DEFAULT\`;
|
|
80
|
-
return { region, url };
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
private static create(options: CreateOptions): McpClient {
|
|
84
|
-
const {
|
|
85
|
-
url,
|
|
86
|
-
buildHeaders = async (): Promise<Record<string, string>> => ({}),
|
|
87
|
-
fetch: customFetch,
|
|
88
|
-
} = options;
|
|
89
|
-
const fetchWithHeaders: typeof fetch = async (input, init) => {
|
|
90
|
-
const headers = new Headers(init?.headers);
|
|
91
|
-
const sessionId = getCurrentSessionId();
|
|
92
|
-
if (sessionId) headers.set(SESSION_HEADER, sessionId);
|
|
93
|
-
const extra = await buildHeaders();
|
|
94
|
-
for (const k of Object.keys(extra)) {
|
|
95
|
-
headers.set(k, extra[k]);
|
|
96
|
-
}
|
|
97
|
-
return (customFetch ?? fetch)(input, { ...init, headers });
|
|
98
|
-
};
|
|
99
|
-
const transport = new StreamableHTTPClientTransport(new URL(url), {
|
|
100
|
-
fetch: fetchWithHeaders,
|
|
143
|
+
/** Factory for MCP transports that connect to a Bedrock AgentCore runtime. */
|
|
144
|
+
export class AgentCoreMcpTransport {
|
|
145
|
+
/** SigV4-authenticated transport for a Bedrock AgentCore runtime. */
|
|
146
|
+
static withIamAuth(
|
|
147
|
+
options: AgentCoreMcpTransportIamOptions,
|
|
148
|
+
): StreamableHTTPClientTransport {
|
|
149
|
+
return sigV4Transport({
|
|
150
|
+
region: regionFromArn(options.agentRuntimeArn),
|
|
151
|
+
url: mcpUrlFromArn(options.agentRuntimeArn),
|
|
152
|
+
credentialProvider: options.credentialProvider,
|
|
101
153
|
});
|
|
102
|
-
return new McpClient({ transport });
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* SigV4-authenticated client for a Bedrock AgentCore runtime.
|
|
107
|
-
*/
|
|
108
|
-
static withIamAuth(options: AgentCoreMcpClientIamOptions): McpClient {
|
|
109
|
-
const { region, url } = AgentCoreMcpClient.buildUrl(
|
|
110
|
-
options.agentRuntimeArn,
|
|
111
|
-
);
|
|
112
|
-
const credentialProvider =
|
|
113
|
-
options.credentialProvider ?? fromNodeProviderChain();
|
|
114
|
-
const sigv4Fetch: typeof fetch = async (...args) => {
|
|
115
|
-
const client = new AwsClient({
|
|
116
|
-
...(await credentialProvider()),
|
|
117
|
-
service: 'bedrock-agentcore',
|
|
118
|
-
region,
|
|
119
|
-
});
|
|
120
|
-
return client.fetch(...args);
|
|
121
|
-
};
|
|
122
|
-
return AgentCoreMcpClient.create({ url, fetch: sigv4Fetch });
|
|
123
154
|
}
|
|
124
155
|
|
|
125
|
-
/**
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
buildHeaders: async () => ({
|
|
133
|
-
Authorization: \`Bearer \${await options.accessTokenProvider()}\`,
|
|
134
|
-
}),
|
|
156
|
+
/** Bearer-authenticated transport for a Bedrock AgentCore runtime. */
|
|
157
|
+
static withJwtAuth(
|
|
158
|
+
options: AgentCoreMcpTransportJwtOptions,
|
|
159
|
+
): StreamableHTTPClientTransport {
|
|
160
|
+
return jwtTransport({
|
|
161
|
+
url: mcpUrlFromArn(options.agentRuntimeArn),
|
|
162
|
+
accessTokenProvider: options.accessTokenProvider,
|
|
135
163
|
});
|
|
136
164
|
}
|
|
137
165
|
|
|
138
166
|
/** For local dev — plain HTTP, no auth. */
|
|
139
|
-
static withoutAuth(
|
|
140
|
-
|
|
167
|
+
static withoutAuth(
|
|
168
|
+
options: AgentCoreMcpTransportNoAuthOptions,
|
|
169
|
+
): StreamableHTTPClientTransport {
|
|
170
|
+
return noAuthTransport({ url: options.url });
|
|
141
171
|
}
|
|
142
172
|
}
|
|
143
173
|
"
|
|
144
174
|
`;
|
|
145
175
|
|
|
146
|
-
exports[`ts#agent#mcp-connection generator > should match snapshot for agent-connection src files >
|
|
176
|
+
exports[`ts#agent#mcp-connection generator > should match snapshot for agent-connection src files > agentcore-transport.ts 1`] = `
|
|
177
|
+
"import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
178
|
+
import { fromNodeProviderChain } from '@aws-sdk/credential-providers';
|
|
179
|
+
import {
|
|
180
|
+
createSigV4Fetch,
|
|
181
|
+
createJwtFetch,
|
|
182
|
+
createPlainFetch,
|
|
183
|
+
} from './agentcore-fetch.js';
|
|
184
|
+
|
|
185
|
+
const build = (
|
|
186
|
+
url: string,
|
|
187
|
+
fetchFn: typeof fetch,
|
|
188
|
+
): StreamableHTTPClientTransport =>
|
|
189
|
+
new StreamableHTTPClientTransport(new URL(url), { fetch: fetchFn });
|
|
190
|
+
|
|
191
|
+
/** SigV4-signed transport for a resolved AgentCore endpoint. */
|
|
192
|
+
export const sigV4Transport = (options: {
|
|
193
|
+
region: string;
|
|
194
|
+
url: string;
|
|
195
|
+
credentialProvider?: ReturnType<typeof fromNodeProviderChain>;
|
|
196
|
+
}): StreamableHTTPClientTransport =>
|
|
197
|
+
build(
|
|
198
|
+
options.url,
|
|
199
|
+
createSigV4Fetch({
|
|
200
|
+
region: options.region,
|
|
201
|
+
credentialProvider: options.credentialProvider,
|
|
202
|
+
}),
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
/** Bearer-token transport for a resolved AgentCore endpoint. */
|
|
206
|
+
export const jwtTransport = (options: {
|
|
207
|
+
url: string;
|
|
208
|
+
accessTokenProvider: () => Promise<string>;
|
|
209
|
+
}): StreamableHTTPClientTransport =>
|
|
210
|
+
build(options.url, createJwtFetch(options.accessTokenProvider));
|
|
211
|
+
|
|
212
|
+
/** Plain-HTTP transport — for local dev. */
|
|
213
|
+
export const noAuthTransport = (options: {
|
|
214
|
+
url: string;
|
|
215
|
+
}): StreamableHTTPClientTransport => build(options.url, createPlainFetch());
|
|
216
|
+
"
|
|
217
|
+
`;
|
|
218
|
+
|
|
219
|
+
exports[`ts#agent#mcp-connection generator > should match snapshot for agent-connection src files > inventory-mcp-client-strands.ts 1`] = `
|
|
147
220
|
"import { McpClient } from '@strands-agents/sdk';
|
|
148
|
-
import {
|
|
221
|
+
import { AgentCoreMcpClientStrands } from '../core/agentcore-mcp-client-strands.js';
|
|
149
222
|
import { getAgentCoreRuntimeConfig } from '../core/runtime-config.js';
|
|
150
223
|
|
|
151
|
-
/**
|
|
152
|
-
export class
|
|
224
|
+
/** Strands client for the InventoryMcp MCP server. */
|
|
225
|
+
export class InventoryMcpClientStrands {
|
|
153
226
|
static async create(): Promise<McpClient> {
|
|
154
227
|
if (process.env.SERVE_LOCAL === 'true') {
|
|
155
|
-
return
|
|
228
|
+
return AgentCoreMcpClientStrands.withoutAuth({
|
|
156
229
|
url: 'http://localhost:8082/mcp',
|
|
157
230
|
});
|
|
158
231
|
}
|
|
@@ -163,14 +236,14 @@ export class InventoryMcpClient {
|
|
|
163
236
|
\`No connected MCP server runtime named 'InventoryMcp' found in runtime configuration.\`,
|
|
164
237
|
);
|
|
165
238
|
}
|
|
166
|
-
return
|
|
239
|
+
return AgentCoreMcpClientStrands.withIamAuth({ agentRuntimeArn });
|
|
167
240
|
}
|
|
168
241
|
}
|
|
169
242
|
"
|
|
170
243
|
`;
|
|
171
244
|
|
|
172
245
|
exports[`ts#agent#mcp-connection generator > should match snapshot for agent-connection src files > transformed-agent.ts 1`] = `
|
|
173
|
-
"import {
|
|
246
|
+
"import { InventoryMcpClientStrands } from ':proj/agent-connection';
|
|
174
247
|
import { Agent, tool } from '@strands-agents/sdk';
|
|
175
248
|
import { z } from 'zod';
|
|
176
249
|
|
|
@@ -182,7 +255,7 @@ const multiply = tool({
|
|
|
182
255
|
});
|
|
183
256
|
|
|
184
257
|
export const getAgent = async (sessionId: string) => {
|
|
185
|
-
const inventoryMcp = await
|
|
258
|
+
const inventoryMcp = await InventoryMcpClientStrands.create();
|
|
186
259
|
return new Agent({
|
|
187
260
|
systemPrompt: 'You are a mathematical wizard.',
|
|
188
261
|
tools: [inventoryMcp, multiply],
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { McpClient } from '@strands-agents/sdk';
|
|
2
|
-
import {
|
|
2
|
+
import { AgentCoreMcpClientStrands } from '../core/agentcore-mcp-client-strands.js';
|
|
3
3
|
import { getAgentCoreRuntimeConfig } from '../core/runtime-config.js';
|
|
4
4
|
|
|
5
|
-
/**
|
|
6
|
-
export class <%- mcpServerClassName %>
|
|
5
|
+
/** Strands client for the <%- mcpServerClassName %> MCP server. */
|
|
6
|
+
export class <%- mcpServerClassName %>ClientStrands {
|
|
7
7
|
static async create(): Promise<McpClient> {
|
|
8
8
|
if (process.env.SERVE_LOCAL === 'true') {
|
|
9
|
-
return
|
|
9
|
+
return AgentCoreMcpClientStrands.withoutAuth({
|
|
10
10
|
url: 'http://localhost:<%- mcpServerPort %>/mcp',
|
|
11
11
|
});
|
|
12
12
|
}
|
|
@@ -17,6 +17,6 @@ export class <%- mcpServerClassName %>Client {
|
|
|
17
17
|
`No connected MCP server runtime named '<%- mcpServerClassName %>' found in runtime configuration.`,
|
|
18
18
|
);
|
|
19
19
|
}
|
|
20
|
-
return
|
|
20
|
+
return AgentCoreMcpClientStrands.withIamAuth({ agentRuntimeArn });
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -33,7 +33,7 @@ const tsAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
33
33
|
const npmScope = (0, npm_scope_1.getNpmScope)(tree);
|
|
34
34
|
// 1. Ensure the shared agent-connection project exists + has the MCP core client
|
|
35
35
|
await (0, agent_connection_1.ensureTypeScriptAgentConnectionProject)(tree);
|
|
36
|
-
(0, agent_connection_1.addTypeScriptCoreClient)(tree, 'mcp');
|
|
36
|
+
await (0, agent_connection_1.addTypeScriptCoreClient)(tree, 'mcp');
|
|
37
37
|
// 2. Generate the per-connection <Name>Client into app/
|
|
38
38
|
(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'), {
|
|
39
39
|
mcpServerKebabCase,
|
|
@@ -41,12 +41,12 @@ const tsAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
41
41
|
mcpServerPort,
|
|
42
42
|
}, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
|
|
43
43
|
// Add re-export to index.ts
|
|
44
|
-
await (0, ast_1.addStarExport)(tree, (0, devkit_1.joinPathFragments)(agent_connection_1.AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'), `./app/${mcpServerKebabCase}-client.js`);
|
|
44
|
+
await (0, ast_1.addStarExport)(tree, (0, devkit_1.joinPathFragments)(agent_connection_1.AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'), `./app/${mcpServerKebabCase}-client-strands.js`);
|
|
45
45
|
// 3. AST transform agent.ts to add MCP tools
|
|
46
46
|
const agentSourceDir = (0, devkit_1.joinPathFragments)(sourceProject.root, agentComponent.path ?? 'src');
|
|
47
47
|
const agentFilePath = (0, devkit_1.joinPathFragments)(agentSourceDir, 'agent.ts');
|
|
48
48
|
if (tree.exists(agentFilePath)) {
|
|
49
|
-
const clientClassName = `${mcpServerClassName}
|
|
49
|
+
const clientClassName = `${mcpServerClassName}ClientStrands`;
|
|
50
50
|
const clientVarName = mcpServerClassName.charAt(0).toLowerCase() + mcpServerClassName.slice(1);
|
|
51
51
|
// Add import for the client
|
|
52
52
|
await (0, ast_1.addDestructuredImport)(tree, agentFilePath, [clientClassName], `:${npmScope}/agent-connection`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/ts/agent/mcp-connection/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCASoB;AACpB,uFAK0D;AAC1D,4CAA0E;AAC1E,kDAA6D;AAC7D,oDAAyE;AACzE,gDAAiD;AACjD,wDAAuD;AACvD,0CAK2B;AAC3B,sDAAuD;AAG1C,QAAA,sCAAsC,GACjD,IAAA,qBAAgB,EAAC,UAAU,CAAC,CAAC;AAExB,MAAM,6BAA6B,GAAG,KAAK,EAChD,IAAU,EACV,OAA4C,EAChB,EAAE;IAC9B,MAAM,aAAa,GAAG,IAAA,wCAAmC,EACvD,IAAI,EACJ,OAAO,CAAC,aAAa,CACtB,CAAC;IACF,MAAM,aAAa,GAAG,IAAA,wCAAmC,EACvD,IAAI,EACJ,OAAO,CAAC,aAAa,CACtB,CAAC;IAEF,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAE7C,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CACb,0EAA0E,YAAY,CAAC,IAAI,WAAW,YAAY,CAAC,IAAI,mBAAmB,CAC3I,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC;IAC3D,MAAM,kBAAkB,GAAG,YAAY,CAAC,EAAY,CAAC;IACrD,MAAM,kBAAkB,GAAG,IAAA,iBAAS,EAAC,kBAAkB,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC;IAEhD,MAAM,QAAQ,GAAG,IAAA,uBAAW,EAAC,IAAI,CAAC,CAAC;IAEnC,iFAAiF;IACjF,MAAM,IAAA,yDAAsC,EAAC,IAAI,CAAC,CAAC;IACnD,IAAA,0CAAuB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/ts/agent/mcp-connection/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -412,14 +412,19 @@ resource "null_resource" "docker_publish" {
|
|
|
412
412
|
provisioner "local-exec" {
|
|
413
413
|
command = <<-EOT
|
|
414
414
|
# Get ECR login token
|
|
415
|
-
aws ecr get-login-password --region
|
|
415
|
+
aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
|
|
416
416
|
|
|
417
417
|
# Tag the image
|
|
418
|
-
docker tag
|
|
418
|
+
docker tag "$DOCKER_IMAGE_TAG" "$REPOSITORY_URL:latest"
|
|
419
419
|
|
|
420
420
|
# Push the image
|
|
421
|
-
docker push
|
|
421
|
+
docker push "$REPOSITORY_URL:latest"
|
|
422
422
|
EOT
|
|
423
|
+
environment = {
|
|
424
|
+
AWS_REGION = local.aws_region
|
|
425
|
+
REPOSITORY_URL = self.triggers.repository_url
|
|
426
|
+
DOCKER_IMAGE_TAG = self.triggers.docker_image_tag
|
|
427
|
+
}
|
|
423
428
|
}
|
|
424
429
|
|
|
425
430
|
depends_on = [aws_ecr_repository_policy.agent_core_ecr_policy]
|
|
@@ -481,10 +486,11 @@ resource "null_resource" "runtime_ready" {
|
|
|
481
486
|
uv run --with boto3 python -c "
|
|
482
487
|
import boto3
|
|
483
488
|
import json
|
|
489
|
+
import os
|
|
484
490
|
import time
|
|
485
491
|
import uuid
|
|
486
492
|
|
|
487
|
-
runtime_arn =
|
|
493
|
+
runtime_arn = os.environ['RUNTIME_ARN']
|
|
488
494
|
client = boto3.client('bedrock-agentcore')
|
|
489
495
|
initialize_request = json.dumps({
|
|
490
496
|
'jsonrpc': '2.0',
|
|
@@ -516,6 +522,9 @@ while True:
|
|
|
516
522
|
print(f'Runtime {runtime_arn} is serving MCP')
|
|
517
523
|
"
|
|
518
524
|
EOT
|
|
525
|
+
environment = {
|
|
526
|
+
RUNTIME_ARN = self.triggers.runtime_arn
|
|
527
|
+
}
|
|
519
528
|
}
|
|
520
529
|
}
|
|
521
530
|
|