@aws/nx-plugin 0.112.1 → 0.113.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.
- package/LICENSE-THIRD-PARTY +957 -429
- package/package.json +1 -1
- package/src/py/project/generator.js +4 -0
- package/src/py/project/generator.js.map +1 -1
- package/src/py/strands-agent/__snapshots__/generator.spec.ts.snap +42 -20
- package/src/py/strands-agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +6 -13
- package/src/py/strands-agent/a2a-connection/generator.js +1 -1
- package/src/py/strands-agent/files/a2a/main.py.template +24 -3
- package/src/py/strands-agent/files/ag-ui/main.py.template +3 -2
- package/src/py/strands-agent/files/common/agent.py.template +1 -2
- package/src/py/strands-agent/files/http/main.py.template +32 -13
- package/src/py/strands-agent/generator.js +11 -0
- package/src/py/strands-agent/generator.js.map +1 -1
- package/src/py/strands-agent/mcp-connection/__snapshots__/generator.spec.ts.snap +66 -59
- package/src/py/strands-agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +6 -14
- package/src/py/strands-agent/mcp-connection/generator.js +3 -3
- package/src/ts/strands-agent/__snapshots__/generator.spec.ts.snap +17 -7
- package/src/ts/strands-agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +6 -14
- package/src/ts/strands-agent/a2a-connection/generator.js +2 -3
- package/src/ts/strands-agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/strands-agent/files/a2a/index.ts.template +12 -2
- package/src/ts/strands-agent/files/common/agent.ts.template +2 -4
- package/src/ts/strands-agent/files/http/init.ts.template +12 -1
- package/src/ts/strands-agent/files/http/router.ts.template +3 -2
- package/src/ts/strands-agent/generator.js +7 -0
- package/src/ts/strands-agent/generator.js.map +1 -1
- package/src/ts/strands-agent/mcp-connection/__snapshots__/generator.spec.ts.snap +46 -71
- package/src/ts/strands-agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +8 -19
- package/src/ts/strands-agent/mcp-connection/generator.js +1 -1
- package/src/ts/strands-agent/mcp-connection/generator.js.map +1 -1
- package/src/utils/agent-connection/agent-connection.js +22 -0
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +46 -57
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +35 -51
- package/src/utils/agent-connection/files/core-runtime-config/session-context.ts.template +21 -0
- package/src/utils/agent-connection/files/core-runtime-config/with-session-id.ts.template +27 -0
- package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +44 -15
- package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +50 -43
- package/src/utils/agent-connection/files/py-core-runtime-config/session_context.py.template +22 -0
- package/src/utils/agent-connection/files/py-core-runtime-config/with_session_id.py.template +44 -0
- package/src/utils/bundle/bundle.js +1 -0
- package/src/utils/bundle/bundle.js.map +1 -1
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
|
-
from mcp.client.streamable_http import streamablehttp_client
|
|
4
3
|
from strands.tools.mcp.mcp_client import MCPClient
|
|
5
4
|
|
|
6
5
|
from <%- agentConnectionModuleName %>.core.agentcore_mcp_client import AgentCoreMCPClient
|
|
@@ -10,21 +9,14 @@ from <%- agentConnectionModuleName %>.core.runtime_config import (
|
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
class <%- mcpServerClassName %>Client:
|
|
13
|
-
"""Client for
|
|
14
|
-
|
|
15
|
-
In deployed mode: resolves the AgentCore runtime ARN from runtime config
|
|
16
|
-
and uses SigV4-authenticated AgentCore transport.
|
|
17
|
-
|
|
18
|
-
In local mode (SERVE_LOCAL env var set): connects directly
|
|
19
|
-
to the local MCP server via Streamable HTTP.
|
|
20
|
-
"""
|
|
12
|
+
"""Client for the <%- mcpServerClassName %> MCP server."""
|
|
21
13
|
|
|
22
14
|
@staticmethod
|
|
23
|
-
def create(
|
|
15
|
+
def create() -> MCPClient:
|
|
24
16
|
if os.environ.get("SERVE_LOCAL") == "true":
|
|
25
|
-
return
|
|
26
|
-
|
|
17
|
+
return AgentCoreMCPClient.without_auth(
|
|
18
|
+
"http://localhost:<%- mcpServerPort %>/mcp"
|
|
19
|
+
)
|
|
27
20
|
return AgentCoreMCPClient.with_iam_auth(
|
|
28
|
-
|
|
29
|
-
session_id=session_id,
|
|
21
|
+
get_connected_agent_runtime_arn("<%- mcpServerClassName %>")
|
|
30
22
|
)
|
|
@@ -141,9 +141,9 @@ const addMcpClientToGetAgent = async (tree, filePath, clientClassName, clientVar
|
|
|
141
141
|
}`));
|
|
142
142
|
if (addedToWith) {
|
|
143
143
|
// Subsequent connection — also add creation line after the existing one
|
|
144
|
-
await (0, ast_1.applyGritQL)(tree, filePath, py(`\`$var = $cls.create(
|
|
144
|
+
await (0, ast_1.applyGritQL)(tree, filePath, py(`\`$var = $cls.create()\` as $stmt where {
|
|
145
145
|
$program <: not contains \`${clientClassName}.create\`,
|
|
146
|
-
$stmt += \`\n${clientVarName} = ${clientClassName}.create(
|
|
146
|
+
$stmt += \`\n${clientVarName} = ${clientClassName}.create()\`
|
|
147
147
|
}`));
|
|
148
148
|
return;
|
|
149
149
|
}
|
|
@@ -155,7 +155,7 @@ const addMcpClientToGetAgent = async (tree, filePath, clientClassName, clientVar
|
|
|
155
155
|
$body <: contains \`yield Agent($_)\`,
|
|
156
156
|
$body <: not contains \`with ($_, ): $_\`
|
|
157
157
|
} => \`def get_agent($params):
|
|
158
|
-
${clientVarName} = ${clientClassName}.create(
|
|
158
|
+
${clientVarName} = ${clientClassName}.create()
|
|
159
159
|
with (
|
|
160
160
|
${clientVarName},
|
|
161
161
|
):
|
|
@@ -641,15 +641,13 @@ const multiply = tool({
|
|
|
641
641
|
callback: ({ a, b }) => a * b,
|
|
642
642
|
});
|
|
643
643
|
|
|
644
|
-
export const getAgent = async (
|
|
645
|
-
|
|
646
|
-
return new Agent({
|
|
644
|
+
export const getAgent = async () =>
|
|
645
|
+
new Agent({
|
|
647
646
|
systemPrompt: \`You are a mathematical wizard.
|
|
648
647
|
Use your tools for mathematical tasks.
|
|
649
648
|
Refer to tools as your 'spellbook'.\`,
|
|
650
649
|
tools: [multiply],
|
|
651
650
|
});
|
|
652
|
-
};
|
|
653
651
|
"
|
|
654
652
|
`;
|
|
655
653
|
|
|
@@ -915,6 +913,7 @@ console.log(\`TRPC server listening on port \${PORT}\`);
|
|
|
915
913
|
|
|
916
914
|
exports[`ts#strands-agent generator > should match snapshot for generated files > strands-agent-init.ts 1`] = `
|
|
917
915
|
"import { initTRPC } from '@trpc/server';
|
|
916
|
+
import { enterSessionContext } from ':proj/agent-connection';
|
|
918
917
|
|
|
919
918
|
export interface Context {
|
|
920
919
|
sessionId: string;
|
|
@@ -922,7 +921,17 @@ export interface Context {
|
|
|
922
921
|
|
|
923
922
|
export const t = initTRPC.context<Context>().create();
|
|
924
923
|
|
|
925
|
-
|
|
924
|
+
/**
|
|
925
|
+
* Bind the inbound session onto the current async flow so downstream MCP /
|
|
926
|
+
* A2A clients forward it on outbound calls. Uses \`enterWith\` so the binding
|
|
927
|
+
* persists across subscription iterations.
|
|
928
|
+
*/
|
|
929
|
+
const sessionMiddleware = t.middleware(({ ctx, next }) => {
|
|
930
|
+
enterSessionContext(ctx.sessionId);
|
|
931
|
+
return next();
|
|
932
|
+
});
|
|
933
|
+
|
|
934
|
+
export const publicProcedure = t.procedure.use(sessionMiddleware);
|
|
926
935
|
"
|
|
927
936
|
`;
|
|
928
937
|
|
|
@@ -930,10 +939,13 @@ exports[`ts#strands-agent generator > should match snapshot for generated files
|
|
|
930
939
|
"import { publicProcedure, t } from './init.js';
|
|
931
940
|
import { z } from 'zod';
|
|
932
941
|
import { zAsyncIterable } from './schema/z-async-iterable.js';
|
|
942
|
+
import { withSessionId } from ':proj/agent-connection';
|
|
933
943
|
import { getAgent } from './agent.js';
|
|
934
944
|
|
|
935
945
|
export const router = t.router;
|
|
936
946
|
|
|
947
|
+
const agent = withSessionId(getAgent);
|
|
948
|
+
|
|
937
949
|
export const appRouter = router({
|
|
938
950
|
invoke: publicProcedure
|
|
939
951
|
.input(z.object({ message: z.string() }))
|
|
@@ -944,8 +956,6 @@ export const appRouter = router({
|
|
|
944
956
|
}),
|
|
945
957
|
)
|
|
946
958
|
.subscription(async function* (opts) {
|
|
947
|
-
const agent = await getAgent(opts.ctx.sessionId);
|
|
948
|
-
|
|
949
959
|
for await (const event of agent.stream(opts.input.message)) {
|
|
950
960
|
if (
|
|
951
961
|
event.type === 'modelStreamUpdateEvent' &&
|
|
@@ -2,26 +2,18 @@ import { A2AAgent } from '@strands-agents/sdk/a2a';
|
|
|
2
2
|
import { AgentCoreA2aClient } from '../core/agentcore-a2a-client.js';
|
|
3
3
|
import { getConnectedAgentRuntimeArn } from '../core/runtime-config.js';
|
|
4
4
|
|
|
5
|
-
/**
|
|
6
|
-
* Client for connecting to the <%- targetAgentClassName %> A2A agent.
|
|
7
|
-
*
|
|
8
|
-
* In deployed mode: resolves the AgentCore runtime ARN from runtime config
|
|
9
|
-
* and uses a SigV4-authenticated A2A transport.
|
|
10
|
-
*
|
|
11
|
-
* In local mode (SERVE_LOCAL env var set): connects directly to the local
|
|
12
|
-
* A2A server over plain HTTP.
|
|
13
|
-
*/
|
|
5
|
+
/** Client for the <%- targetAgentClassName %> A2A agent. */
|
|
14
6
|
export class <%- targetAgentClassName %>Client {
|
|
15
|
-
static async create(
|
|
7
|
+
static async create(): Promise<A2AAgent> {
|
|
16
8
|
if (process.env.SERVE_LOCAL === 'true') {
|
|
17
|
-
return
|
|
9
|
+
return AgentCoreA2aClient.withoutAuth({
|
|
18
10
|
url: 'http://localhost:<%- targetAgentPort %>/',
|
|
19
11
|
});
|
|
20
12
|
}
|
|
21
|
-
|
|
22
13
|
return AgentCoreA2aClient.withIamAuth({
|
|
23
|
-
agentRuntimeArn: await getConnectedAgentRuntimeArn(
|
|
24
|
-
|
|
14
|
+
agentRuntimeArn: await getConnectedAgentRuntimeArn(
|
|
15
|
+
'<%- targetAgentClassName %>',
|
|
16
|
+
),
|
|
25
17
|
});
|
|
26
18
|
}
|
|
27
19
|
}
|
|
@@ -58,9 +58,8 @@ const tsStrandsAgentA2aConnectionGenerator = async (tree, options) => {
|
|
|
58
58
|
await (0, ast_1.addDestructuredImport)(tree, agentFilePath, ['tool'], '@strands-agents/sdk');
|
|
59
59
|
await (0, ast_1.addDestructuredImport)(tree, agentFilePath, ['z'], 'zod');
|
|
60
60
|
await (0, ast_1.addDestructuredImport)(tree, agentFilePath, [clientClassName], `:${npmScope}/agent-connection`);
|
|
61
|
-
// Build the tool creation + Agent wiring.
|
|
62
|
-
|
|
63
|
-
const toolCreationBlock = `const ${clientVarName} = await ${clientClassName}.create(sessionId);
|
|
61
|
+
// Build the tool creation + Agent wiring.
|
|
62
|
+
const toolCreationBlock = `const ${clientVarName} = await ${clientClassName}.create();
|
|
64
63
|
const ${toolVarName} = tool({
|
|
65
64
|
name: '${toolName}',
|
|
66
65
|
description: 'Delegate a question to the remote ${targetAgentClassName} A2A agent and return its reply.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/ts/strands-agent/a2a-connection/generator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/ts/strands-agent/a2a-connection/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { A2AExpressServer } from '@strands-agents/sdk/a2a/express';
|
|
2
|
-
import express from 'express';
|
|
2
|
+
import express, { type Request, type Response, type NextFunction } from 'express';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { runWithSessionId, withSessionId } from '<%- agentConnectionImport %>';
|
|
3
5
|
import { getAgent } from './agent.js';
|
|
4
6
|
|
|
5
7
|
const PORT = parseInt(process.env.PORT || '9000');
|
|
6
8
|
const HOST = '0.0.0.0';
|
|
7
9
|
|
|
10
|
+
const SESSION_ID_HEADER = 'x-amzn-bedrock-agentcore-runtime-session-id';
|
|
11
|
+
|
|
8
12
|
void (async () => {
|
|
9
13
|
const httpUrl =
|
|
10
14
|
process.env.AGENTCORE_RUNTIME_URL ?? `http://localhost:${PORT}/`;
|
|
11
15
|
|
|
12
16
|
const server = new A2AExpressServer({
|
|
13
|
-
agent:
|
|
17
|
+
agent: withSessionId(getAgent),
|
|
14
18
|
name: '<%= agentNameClassName %>',
|
|
15
19
|
description:
|
|
16
20
|
'A Strands Agent exposed via the Agent-to-Agent (A2A) protocol.',
|
|
@@ -21,6 +25,12 @@ void (async () => {
|
|
|
21
25
|
|
|
22
26
|
const app = express();
|
|
23
27
|
app.get('/ping', (_req, res) => res.status(200).json({ status: 'Healthy' }));
|
|
28
|
+
// Bind the inbound session (or a fresh UUID) for downstream MCP / A2A calls.
|
|
29
|
+
app.use((req: Request, _res: Response, next: NextFunction) => {
|
|
30
|
+
const header = req.headers[SESSION_ID_HEADER];
|
|
31
|
+
const sessionId = (Array.isArray(header) ? header[0] : header) ?? randomUUID();
|
|
32
|
+
runWithSessionId(sessionId, () => next());
|
|
33
|
+
});
|
|
24
34
|
app.use(server.createMiddleware());
|
|
25
35
|
app.listen(PORT, HOST, () => {
|
|
26
36
|
console.log(`A2A server listening on ${HOST}:${PORT}`);
|
|
@@ -11,12 +11,10 @@ const multiply = tool({
|
|
|
11
11
|
callback: ({ a, b }) => a * b,
|
|
12
12
|
});
|
|
13
13
|
|
|
14
|
-
export const getAgent = async (
|
|
15
|
-
|
|
16
|
-
return new Agent({
|
|
14
|
+
export const getAgent = async () =>
|
|
15
|
+
new Agent({
|
|
17
16
|
systemPrompt: `You are a mathematical wizard.
|
|
18
17
|
Use your tools for mathematical tasks.
|
|
19
18
|
Refer to tools as your 'spellbook'.`,
|
|
20
19
|
tools: [multiply],
|
|
21
20
|
});
|
|
22
|
-
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { initTRPC } from '@trpc/server';
|
|
2
|
+
import { enterSessionContext } from '<%- agentConnectionImport %>';
|
|
2
3
|
|
|
3
4
|
export interface Context {
|
|
4
5
|
sessionId: string;
|
|
@@ -6,4 +7,14 @@ export interface Context {
|
|
|
6
7
|
|
|
7
8
|
export const t = initTRPC.context<Context>().create();
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Bind the inbound session onto the current async flow so downstream MCP /
|
|
12
|
+
* A2A clients forward it on outbound calls. Uses `enterWith` so the binding
|
|
13
|
+
* persists across subscription iterations.
|
|
14
|
+
*/
|
|
15
|
+
const sessionMiddleware = t.middleware(({ ctx, next }) => {
|
|
16
|
+
enterSessionContext(ctx.sessionId);
|
|
17
|
+
return next();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export const publicProcedure = t.procedure.use(sessionMiddleware);
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { publicProcedure, t } from './init.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { zAsyncIterable } from './schema/z-async-iterable.js';
|
|
4
|
+
import { withSessionId } from '<%- agentConnectionImport %>';
|
|
4
5
|
import { getAgent } from './agent.js';
|
|
5
6
|
|
|
6
7
|
export const router = t.router;
|
|
7
8
|
|
|
9
|
+
const agent = withSessionId(getAgent);
|
|
10
|
+
|
|
8
11
|
export const appRouter = router({
|
|
9
12
|
invoke: publicProcedure
|
|
10
13
|
.input(z.object({ message: z.string() }))
|
|
@@ -15,8 +18,6 @@ export const appRouter = router({
|
|
|
15
18
|
}),
|
|
16
19
|
)
|
|
17
20
|
.subscription(async function* (opts) {
|
|
18
|
-
const agent = await getAgent(opts.ctx.sessionId);
|
|
19
|
-
|
|
20
21
|
for await (const event of agent.stream(opts.input.message)) {
|
|
21
22
|
if (
|
|
22
23
|
event.type === 'modelStreamUpdateEvent' &&
|
|
@@ -18,6 +18,7 @@ const shared_constructs_1 = require("../../utils/shared-constructs");
|
|
|
18
18
|
const agent_core_constructs_1 = require("../../utils/agent-core-constructs/agent-core-constructs");
|
|
19
19
|
const port_1 = require("../../utils/port");
|
|
20
20
|
const fs_1 = require("../../utils/fs");
|
|
21
|
+
const agent_connection_1 = require("../../utils/agent-connection/agent-connection");
|
|
21
22
|
exports.TS_STRANDS_AGENT_GENERATOR_INFO = (0, nx_1.getGeneratorInfo)(__filename);
|
|
22
23
|
const tsStrandsAgentGenerator = async (tree, options) => {
|
|
23
24
|
const project = (0, nx_1.readProjectConfigurationUnqualified)(tree, options.project);
|
|
@@ -40,10 +41,16 @@ const tsStrandsAgentGenerator = async (tree, options) => {
|
|
|
40
41
|
`Use a Python Strands Agent with protocol='AG-UI' instead, or choose 'HTTP' or 'A2A' for TypeScript. ` +
|
|
41
42
|
`Track TypeScript support at https://github.com/strands-agents/sdk-typescript/issues/347`);
|
|
42
43
|
}
|
|
44
|
+
// Ensure the shared agent-connection project exists so the server entry
|
|
45
|
+
// point can import `runWithSessionId` and propagate the AgentCore session
|
|
46
|
+
// ID to any downstream MCP / A2A clients a later connection generator
|
|
47
|
+
// wires into this agent.
|
|
48
|
+
await (0, agent_connection_1.ensureTypeScriptAgentConnectionProject)(tree);
|
|
43
49
|
const templateContext = {
|
|
44
50
|
name,
|
|
45
51
|
agentNameClassName,
|
|
46
52
|
distDir,
|
|
53
|
+
agentConnectionImport: `:${(0, npm_scope_1.getNpmScope)(tree)}/agent-connection`,
|
|
47
54
|
};
|
|
48
55
|
// Generate common files shared by both protocols
|
|
49
56
|
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', 'common'), targetSourceDir, templateContext, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/strands-agent/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCASoB;AAEpB,uCAMwB;AACxB,iDAAsE;AACtE,+CAA0D;AAC1D,6CAA2D;AAC3D,mDAAiE;AACjE,qDAAoD;AACpD,sDAAsE;AACtE,yCAAqD;AACrD,qEAA0E;AAC1E,mGAAwF;AAExF,2CAA8C;AAC9C,uCAA4C;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/strands-agent/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,34 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
exports[`ts#strands-agent#mcp-connection generator > should match snapshot for agent-connection src files > agent-connection-index.ts 1`] = `
|
|
4
4
|
"export * from './app/inventory-mcp-client.js';
|
|
5
|
+
export * from './core/with-session-id.js';
|
|
6
|
+
export * from './core/session-context.js';
|
|
5
7
|
// Export your library code here
|
|
6
8
|
"
|
|
7
9
|
`;
|
|
8
10
|
|
|
9
11
|
exports[`ts#strands-agent#mcp-connection generator > should match snapshot for agent-connection src files > agentcore-mcp-client.ts 1`] = `
|
|
10
|
-
"import {
|
|
11
|
-
import { McpClient } from '@strands-agents/sdk';
|
|
12
|
+
"import { McpClient } from '@strands-agents/sdk';
|
|
12
13
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
13
14
|
import { AwsClient } from 'aws4fetch';
|
|
14
15
|
import { fromNodeProviderChain } from '@aws-sdk/credential-providers';
|
|
16
|
+
import { getCurrentSessionId } from './session-context.js';
|
|
17
|
+
|
|
18
|
+
const SESSION_HEADER = 'X-Amzn-Bedrock-AgentCore-Runtime-Session-Id';
|
|
15
19
|
|
|
16
20
|
/**
|
|
17
|
-
* Common options for creating an AgentCore MCP client
|
|
21
|
+
* Common options for creating an AgentCore MCP client.
|
|
18
22
|
*/
|
|
19
23
|
export interface AgentCoreMcpClientOptions {
|
|
20
24
|
/**
|
|
21
|
-
* The ARN of the Bedrock AgentCore Runtime to connect to
|
|
25
|
+
* The ARN of the Bedrock AgentCore Runtime to connect to.
|
|
22
26
|
*/
|
|
23
27
|
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
28
|
}
|
|
30
29
|
|
|
31
30
|
/**
|
|
32
|
-
* Options for creating an AgentCore MCP client with IAM authentication
|
|
31
|
+
* Options for creating an AgentCore MCP client with IAM authentication.
|
|
33
32
|
*/
|
|
34
33
|
export interface AgentCoreMcpClientIamOptions extends AgentCoreMcpClientOptions {
|
|
35
34
|
/**
|
|
@@ -40,32 +39,34 @@ export interface AgentCoreMcpClientIamOptions extends AgentCoreMcpClientOptions
|
|
|
40
39
|
}
|
|
41
40
|
|
|
42
41
|
/**
|
|
43
|
-
* Options for creating an AgentCore MCP client with JWT authentication
|
|
42
|
+
* Options for creating an AgentCore MCP client with JWT authentication.
|
|
44
43
|
*/
|
|
45
44
|
export interface AgentCoreMcpClientJwtOptions extends AgentCoreMcpClientOptions {
|
|
46
45
|
/**
|
|
47
|
-
* A function which returns the JWT access token used to authenticate
|
|
46
|
+
* A function which returns the JWT access token used to authenticate.
|
|
48
47
|
*/
|
|
49
48
|
accessTokenProvider: () => Promise<string>;
|
|
50
49
|
}
|
|
51
50
|
|
|
52
51
|
/**
|
|
53
|
-
*
|
|
52
|
+
* Options for creating an MCP client with no auth (local dev).
|
|
54
53
|
*/
|
|
54
|
+
export interface AgentCoreMcpClientNoAuthOptions {
|
|
55
|
+
/** Full URL of the local MCP endpoint. */
|
|
56
|
+
url: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
55
59
|
interface CreateOptions {
|
|
56
60
|
url: string;
|
|
57
|
-
sessionId?: string;
|
|
58
61
|
buildHeaders?: () => Promise<Record<string, string>>;
|
|
59
62
|
fetch?: typeof fetch;
|
|
60
63
|
}
|
|
61
64
|
|
|
62
|
-
/**
|
|
63
|
-
* Factory for clients to call MCP servers hosted on Bedrock AgentCore Runtime
|
|
64
|
-
*/
|
|
65
|
+
/** Factory for MCP clients that forward the current async-context session. */
|
|
65
66
|
export class AgentCoreMcpClient {
|
|
66
67
|
/**
|
|
67
|
-
* Construct the invocation URL for an AgentCore runtime ARN and extract
|
|
68
|
-
* ARN format: arn:partition:service:region:account-id:resource
|
|
68
|
+
* Construct the invocation URL for an AgentCore runtime ARN and extract
|
|
69
|
+
* the region. ARN format: arn:partition:service:region:account-id:resource
|
|
69
70
|
*/
|
|
70
71
|
private static buildUrl(agentRuntimeArn: string): {
|
|
71
72
|
region: string;
|
|
@@ -76,78 +77,65 @@ export class AgentCoreMcpClient {
|
|
|
76
77
|
return { region, url };
|
|
77
78
|
}
|
|
78
79
|
|
|
79
|
-
/**
|
|
80
|
-
* Internal method to create an MCP client
|
|
81
|
-
*/
|
|
82
80
|
private static create(options: CreateOptions): McpClient {
|
|
83
81
|
const {
|
|
84
82
|
url,
|
|
85
|
-
sessionId = randomUUID(),
|
|
86
83
|
buildHeaders = async (): Promise<Record<string, string>> => ({}),
|
|
87
84
|
fetch: customFetch,
|
|
88
85
|
} = options;
|
|
89
|
-
|
|
90
|
-
// Create a custom fetch that adds required headers
|
|
91
86
|
const fetchWithHeaders: typeof fetch = async (input, init) => {
|
|
92
87
|
const headers = new Headers(init?.headers);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
88
|
+
const sessionId = getCurrentSessionId();
|
|
89
|
+
if (sessionId) headers.set(SESSION_HEADER, sessionId);
|
|
90
|
+
const extra = await buildHeaders();
|
|
91
|
+
for (const k of Object.keys(extra)) {
|
|
92
|
+
headers.set(k, extra[k]);
|
|
96
93
|
}
|
|
97
|
-
return (customFetch
|
|
94
|
+
return (customFetch ?? fetch)(input, { ...init, headers });
|
|
98
95
|
};
|
|
99
|
-
|
|
100
|
-
// Create the transport
|
|
101
96
|
const transport = new StreamableHTTPClientTransport(new URL(url), {
|
|
102
97
|
fetch: fetchWithHeaders,
|
|
103
98
|
});
|
|
104
|
-
|
|
105
|
-
// Create and return the MCP client
|
|
106
99
|
return new McpClient({ transport });
|
|
107
100
|
}
|
|
108
101
|
|
|
109
102
|
/**
|
|
110
|
-
*
|
|
103
|
+
* SigV4-authenticated client for a Bedrock AgentCore runtime.
|
|
111
104
|
*/
|
|
112
105
|
static withIamAuth(options: AgentCoreMcpClientIamOptions): McpClient {
|
|
113
|
-
const {
|
|
106
|
+
const { region, url } = AgentCoreMcpClient.buildUrl(
|
|
107
|
+
options.agentRuntimeArn,
|
|
108
|
+
);
|
|
114
109
|
const credentialProvider =
|
|
115
110
|
options.credentialProvider ?? fromNodeProviderChain();
|
|
116
|
-
const { region, url } = AgentCoreMcpClient.buildUrl(agentRuntimeArn);
|
|
117
|
-
|
|
118
|
-
// Create a SigV4 signing fetch function
|
|
119
111
|
const sigv4Fetch: typeof fetch = async (...args) => {
|
|
120
|
-
const credentials = await credentialProvider();
|
|
121
112
|
const client = new AwsClient({
|
|
122
|
-
...
|
|
113
|
+
...(await credentialProvider()),
|
|
123
114
|
service: 'bedrock-agentcore',
|
|
124
115
|
region,
|
|
125
116
|
});
|
|
126
117
|
return client.fetch(...args);
|
|
127
118
|
};
|
|
128
|
-
|
|
129
|
-
return AgentCoreMcpClient.create({
|
|
130
|
-
url,
|
|
131
|
-
sessionId,
|
|
132
|
-
fetch: sigv4Fetch,
|
|
133
|
-
});
|
|
119
|
+
return AgentCoreMcpClient.create({ url, fetch: sigv4Fetch });
|
|
134
120
|
}
|
|
135
121
|
|
|
136
122
|
/**
|
|
137
|
-
*
|
|
123
|
+
* Bearer-authenticated client for a Bedrock AgentCore runtime.
|
|
138
124
|
*/
|
|
139
125
|
static withJwtAuth(options: AgentCoreMcpClientJwtOptions): McpClient {
|
|
140
|
-
const {
|
|
141
|
-
const { url } = AgentCoreMcpClient.buildUrl(agentRuntimeArn);
|
|
142
|
-
|
|
126
|
+
const { url } = AgentCoreMcpClient.buildUrl(options.agentRuntimeArn);
|
|
143
127
|
return AgentCoreMcpClient.create({
|
|
144
128
|
url,
|
|
145
|
-
sessionId,
|
|
146
129
|
buildHeaders: async () => ({
|
|
147
|
-
Authorization: \`Bearer \${await accessTokenProvider()}\`,
|
|
130
|
+
Authorization: \`Bearer \${await options.accessTokenProvider()}\`,
|
|
148
131
|
}),
|
|
149
132
|
});
|
|
150
133
|
}
|
|
134
|
+
|
|
135
|
+
/** For local dev — plain HTTP, no auth. */
|
|
136
|
+
static withoutAuth(options: AgentCoreMcpClientNoAuthOptions): McpClient {
|
|
137
|
+
return AgentCoreMcpClient.create({ url: options.url });
|
|
138
|
+
}
|
|
151
139
|
}
|
|
152
140
|
"
|
|
153
141
|
`;
|
|
@@ -155,31 +143,18 @@ export class AgentCoreMcpClient {
|
|
|
155
143
|
exports[`ts#strands-agent#mcp-connection generator > should match snapshot for agent-connection src files > inventory-mcp-client.ts 1`] = `
|
|
156
144
|
"import { McpClient } from '@strands-agents/sdk';
|
|
157
145
|
import { AgentCoreMcpClient } from '../core/agentcore-mcp-client.js';
|
|
158
|
-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
159
146
|
import { getConnectedAgentRuntimeArn } from '../core/runtime-config.js';
|
|
160
147
|
|
|
161
|
-
/**
|
|
162
|
-
* Client for connecting to the InventoryMcp MCP server.
|
|
163
|
-
*
|
|
164
|
-
* In deployed mode: resolves the AgentCore runtime ARN from runtime config
|
|
165
|
-
* and uses SigV4-authenticated AgentCore transport.
|
|
166
|
-
*
|
|
167
|
-
* In local mode (SERVE_LOCAL env var set): connects directly
|
|
168
|
-
* to the local MCP server via Streamable HTTP.
|
|
169
|
-
*/
|
|
148
|
+
/** Client for the InventoryMcp MCP server. */
|
|
170
149
|
export class InventoryMcpClient {
|
|
171
|
-
static async create(
|
|
150
|
+
static async create(): Promise<McpClient> {
|
|
172
151
|
if (process.env.SERVE_LOCAL === 'true') {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
);
|
|
177
|
-
return new McpClient({ transport });
|
|
152
|
+
return AgentCoreMcpClient.withoutAuth({
|
|
153
|
+
url: 'http://localhost:8082/mcp',
|
|
154
|
+
});
|
|
178
155
|
}
|
|
179
|
-
|
|
180
156
|
return AgentCoreMcpClient.withIamAuth({
|
|
181
157
|
agentRuntimeArn: await getConnectedAgentRuntimeArn('InventoryMcp'),
|
|
182
|
-
sessionId,
|
|
183
158
|
});
|
|
184
159
|
}
|
|
185
160
|
}
|
|
@@ -199,7 +174,7 @@ const multiply = tool({
|
|
|
199
174
|
});
|
|
200
175
|
|
|
201
176
|
export const getAgent = async (sessionId: string) => {
|
|
202
|
-
const inventoryMcp = await InventoryMcpClient.create(
|
|
177
|
+
const inventoryMcp = await InventoryMcpClient.create();
|
|
203
178
|
return new Agent({
|
|
204
179
|
systemPrompt: 'You are a mathematical wizard.',
|
|
205
180
|
tools: [inventoryMcp, multiply],
|
|
@@ -1,30 +1,19 @@
|
|
|
1
1
|
import { McpClient } from '@strands-agents/sdk';
|
|
2
2
|
import { AgentCoreMcpClient } from '../core/agentcore-mcp-client.js';
|
|
3
|
-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
4
3
|
import { getConnectedAgentRuntimeArn } from '../core/runtime-config.js';
|
|
5
4
|
|
|
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
|
-
*/
|
|
5
|
+
/** Client for the <%- mcpServerClassName %> MCP server. */
|
|
15
6
|
export class <%- mcpServerClassName %>Client {
|
|
16
|
-
static async create(
|
|
7
|
+
static async create(): Promise<McpClient> {
|
|
17
8
|
if (process.env.SERVE_LOCAL === 'true') {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
);
|
|
22
|
-
return new McpClient({ transport });
|
|
9
|
+
return AgentCoreMcpClient.withoutAuth({
|
|
10
|
+
url: 'http://localhost:<%- mcpServerPort %>/mcp',
|
|
11
|
+
});
|
|
23
12
|
}
|
|
24
|
-
|
|
25
13
|
return AgentCoreMcpClient.withIamAuth({
|
|
26
|
-
agentRuntimeArn: await getConnectedAgentRuntimeArn(
|
|
27
|
-
|
|
14
|
+
agentRuntimeArn: await getConnectedAgentRuntimeArn(
|
|
15
|
+
'<%- mcpServerClassName %>',
|
|
16
|
+
),
|
|
28
17
|
});
|
|
29
18
|
}
|
|
30
19
|
}
|
|
@@ -50,7 +50,7 @@ const tsStrandsAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
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`);
|
|
53
|
-
const clientCreationStmt = `const ${clientVarName} = await ${clientClassName}.create(
|
|
53
|
+
const clientCreationStmt = `const ${clientVarName} = await ${clientClassName}.create();`;
|
|
54
54
|
// Transform the arrow function that contains `new Agent`:
|
|
55
55
|
// - Expression body: wrap in block with client creation and return
|
|
56
56
|
// - Block body: prepend client creation statement
|
|
@@ -1 +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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
|
|
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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"}
|