@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/gateway-connection/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCAQoB;AACpB,oEAAoF;AACpF,uFAQ0D;AAC1D,4CAAiE;AACjE,kDAA6D;AAC7D,oDAAyE;AACzE,gDAAiD;AACjD,0CAK2B;AAC3B,0CAG2B;AAGd,QAAA,0CAA0C,GACrD,IAAA,qBAAgB,EAAC,UAAU,CAAC,CAAC;AAExB,MAAM,iCAAiC,GAAG,KAAK,EACpD,IAAU,EACV,OAAgD,EACpB,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,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAA,wCAA4B,EAAC,aAAa,CAAC,CAAC;IAE5D,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,YAAY,OAAO,CAAC,IAAI,mBAAmB,OAAO,CAAC,QAAQ,8CAA8C,CAC1G,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,YAAY,OAAO,CAAC,IAAI,gBAAgB,OAAO,CAAC,IAAI,yDAAyD,CAC9G,CAAC;IACJ,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,IAAI,cAAc,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,UAAU,cAAc,CAAC,IAAI,gBAAgB,cAAc,CAAC,IAAI,+DAA+D,CAChI,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,EAAE,CAAC;IACpC,MAAM,gBAAgB,GAAG,IAAA,iBAAS,EAAC,gBAAgB,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,sBAAsB,GAAG,GAAG,gBAAgB,QAAQ,CAAC;IAC3D,MAAM,2BAA2B,GAAG,GAAG,gBAAgB,cAAc,CAAC;IAEtE,MAAM,IAAA,qDAAkC,EAAC,IAAI,CAAC,CAAC;IAC/C,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/gateway-connection/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,6 +56,9 @@ const pyAgentGenerator = async (tree, options) => {
|
|
|
56
56
|
// session ID to any downstream MCP / A2A clients a later connection
|
|
57
57
|
// generator wires into this agent.
|
|
58
58
|
await (0, agent_connection_1.ensurePythonAgentConnectionProject)(tree);
|
|
59
|
+
// The agent server imports the framework base helpers (session cache + model
|
|
60
|
+
// error logging) regardless of whether a connection client is wired in.
|
|
61
|
+
await (0, agent_connection_1.addPythonFrameworkBase)(tree);
|
|
59
62
|
const agentConnectionModuleName = (0, agent_connection_1.getPythonAgentConnectionModuleName)(tree);
|
|
60
63
|
const agentConnectionPackageName = (0, agent_connection_1.getPythonAgentConnectionPackageName)(tree);
|
|
61
64
|
(0, py_1.addWorkspaceDependencyToPyProject)(tree, project.root, agentConnectionPackageName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/py/agent/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCASoB;AACpB,kEAAwE;AACxE,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/py/agent/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,12 @@ exports[`py#agent#mcp-connection generator > should match snapshot for generated
|
|
|
5
5
|
|
|
6
6
|
from .core.session_context import get_current_session_id, session_id_context
|
|
7
7
|
|
|
8
|
-
from .app.
|
|
8
|
+
from .app.inventory_mcp_client_strands import InventoryMcpClientStrands
|
|
9
9
|
|
|
10
|
-
from .core.
|
|
10
|
+
from .core.model_errors_strands import log_model_errors
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
from .core.
|
|
13
|
+
from .core.with_session_id_strands import with_session_id
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
__all__ = [
|
|
@@ -18,134 +18,212 @@ __all__ = [
|
|
|
18
18
|
"session_id_context",
|
|
19
19
|
"with_session_id",
|
|
20
20
|
"log_model_errors",
|
|
21
|
-
"
|
|
21
|
+
"InventoryMcpClientStrands",
|
|
22
22
|
]
|
|
23
23
|
"
|
|
24
24
|
`;
|
|
25
25
|
|
|
26
|
-
exports[`py#agent#mcp-connection generator > should match snapshot for generated files >
|
|
26
|
+
exports[`py#agent#mcp-connection generator > should match snapshot for generated files > agentcore_mcp_client_strands.py 1`] = `
|
|
27
27
|
"from collections.abc import Callable
|
|
28
28
|
|
|
29
|
-
import boto3
|
|
30
|
-
import httpx
|
|
31
|
-
from mcp.client.streamable_http import streamablehttp_client
|
|
32
29
|
from strands.tools.mcp.mcp_client import MCPClient
|
|
33
30
|
|
|
34
|
-
from .
|
|
35
|
-
from .session_context import get_current_session_id
|
|
36
|
-
|
|
37
|
-
SESSION_HEADER = "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class _SessionHeaderAuth(httpx.Auth):
|
|
41
|
-
"""Stamps the AgentCore session header from the current async context."""
|
|
42
|
-
|
|
43
|
-
requires_request_body = True
|
|
44
|
-
requires_response_body = True
|
|
45
|
-
|
|
46
|
-
def __init__(self, inner: httpx.Auth | None = None):
|
|
47
|
-
self._inner = inner
|
|
48
|
-
|
|
49
|
-
def auth_flow(self, request: httpx.Request): # type: ignore[override]
|
|
50
|
-
sid = get_current_session_id()
|
|
51
|
-
if sid:
|
|
52
|
-
request.headers[SESSION_HEADER] = sid
|
|
53
|
-
if self._inner is None:
|
|
54
|
-
yield request
|
|
55
|
-
return
|
|
56
|
-
yield from self._inner.auth_flow(request)
|
|
57
|
-
|
|
31
|
+
from .agentcore_mcp_transport import AgentCoreMCPTransport
|
|
58
32
|
|
|
59
|
-
class AgentCoreMCPClient:
|
|
60
|
-
"""Factory for MCP clients that forward the current async-context session."""
|
|
61
33
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
"""Extract region from ARN and construct the invocation URL.
|
|
65
|
-
|
|
66
|
-
ARN format: arn:partition:service:region:account-id:resource
|
|
67
|
-
"""
|
|
68
|
-
region = agent_runtime_arn.split(":")[3]
|
|
69
|
-
encoded_arn = agent_runtime_arn.replace(":", "%3A").replace("/", "%2F")
|
|
70
|
-
url = (
|
|
71
|
-
f"https://bedrock-agentcore.{region}.amazonaws.com/runtimes/"
|
|
72
|
-
f"{encoded_arn}/invocations?qualifier=DEFAULT"
|
|
73
|
-
)
|
|
74
|
-
return region, url
|
|
75
|
-
|
|
76
|
-
@staticmethod
|
|
77
|
-
def _create(url: str, auth: httpx.Auth | None = None) -> MCPClient:
|
|
78
|
-
return MCPClient(
|
|
79
|
-
lambda: streamablehttp_client(
|
|
80
|
-
url,
|
|
81
|
-
auth=_SessionHeaderAuth(auth),
|
|
82
|
-
timeout=120,
|
|
83
|
-
terminate_on_close=False,
|
|
84
|
-
)
|
|
85
|
-
)
|
|
34
|
+
class AgentCoreMCPClientStrands:
|
|
35
|
+
"""Factory for Strands MCP clients that connect to an AgentCore runtime."""
|
|
86
36
|
|
|
87
37
|
@staticmethod
|
|
88
38
|
def with_iam_auth(agent_runtime_arn: str) -> MCPClient:
|
|
89
39
|
"""SigV4-authenticated client for a Bedrock AgentCore runtime."""
|
|
90
|
-
|
|
91
|
-
credentials = boto3.Session(region_name=region).get_credentials()
|
|
92
|
-
return AgentCoreMCPClient._create(
|
|
93
|
-
url, SigV4HTTPXAuth(credentials, "bedrock-agentcore", region)
|
|
94
|
-
)
|
|
40
|
+
return MCPClient(AgentCoreMCPTransport.with_iam_auth(agent_runtime_arn))
|
|
95
41
|
|
|
96
42
|
@staticmethod
|
|
97
43
|
def with_jwt_auth(
|
|
98
44
|
agent_runtime_arn: str, access_token_provider: Callable[[], str]
|
|
99
45
|
) -> MCPClient:
|
|
100
46
|
"""Bearer-authenticated client for a Bedrock AgentCore runtime."""
|
|
101
|
-
_, url = AgentCoreMCPClient._build_url(agent_runtime_arn)
|
|
102
47
|
return MCPClient(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
auth=_SessionHeaderAuth(),
|
|
106
|
-
headers={"Authorization": f"Bearer {access_token_provider()}"},
|
|
107
|
-
timeout=120,
|
|
108
|
-
terminate_on_close=False,
|
|
48
|
+
AgentCoreMCPTransport.with_jwt_auth(
|
|
49
|
+
agent_runtime_arn, access_token_provider
|
|
109
50
|
)
|
|
110
51
|
)
|
|
111
52
|
|
|
112
53
|
@staticmethod
|
|
113
54
|
def without_auth(url: str) -> MCPClient:
|
|
114
55
|
"""Plain-HTTP client — for local dev."""
|
|
115
|
-
return
|
|
56
|
+
return MCPClient(AgentCoreMCPTransport.without_auth(url))
|
|
57
|
+
"
|
|
58
|
+
`;
|
|
59
|
+
|
|
60
|
+
exports[`py#agent#mcp-connection generator > should match snapshot for generated files > agentcore_mcp_transport.py 1`] = `
|
|
61
|
+
"from collections.abc import Callable
|
|
62
|
+
|
|
63
|
+
from .agentcore_endpoints import mcp_url_from_arn, region_from_arn
|
|
64
|
+
from .agentcore_transport import (
|
|
65
|
+
TransportFactory,
|
|
66
|
+
jwt_transport,
|
|
67
|
+
no_auth_transport,
|
|
68
|
+
sigv4_transport,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class AgentCoreMCPTransport:
|
|
73
|
+
"""Factory for MCP transport factories that connect to an AgentCore runtime."""
|
|
74
|
+
|
|
75
|
+
@staticmethod
|
|
76
|
+
def with_iam_auth(agent_runtime_arn: str) -> TransportFactory:
|
|
77
|
+
"""SigV4-authenticated transport for a Bedrock AgentCore runtime."""
|
|
78
|
+
return sigv4_transport(
|
|
79
|
+
mcp_url_from_arn(agent_runtime_arn), region_from_arn(agent_runtime_arn)
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
@staticmethod
|
|
83
|
+
def with_jwt_auth(
|
|
84
|
+
agent_runtime_arn: str, access_token_provider: Callable[[], str]
|
|
85
|
+
) -> TransportFactory:
|
|
86
|
+
"""Bearer-authenticated transport for a Bedrock AgentCore runtime."""
|
|
87
|
+
return jwt_transport(mcp_url_from_arn(agent_runtime_arn), access_token_provider)
|
|
88
|
+
|
|
89
|
+
@staticmethod
|
|
90
|
+
def without_auth(url: str) -> TransportFactory:
|
|
91
|
+
"""Plain-HTTP transport — for local dev."""
|
|
92
|
+
return no_auth_transport(url)
|
|
93
|
+
"
|
|
94
|
+
`;
|
|
95
|
+
|
|
96
|
+
exports[`py#agent#mcp-connection generator > should match snapshot for generated files > agentcore_transport.py 1`] = `
|
|
97
|
+
"from collections.abc import Callable
|
|
98
|
+
from typing import Any
|
|
99
|
+
|
|
100
|
+
import boto3
|
|
101
|
+
|
|
102
|
+
from mcp.client.streamable_http import streamablehttp_client
|
|
103
|
+
|
|
104
|
+
from .auth.session import jwt_auth, plain_auth, sigv4_auth
|
|
105
|
+
|
|
106
|
+
# Agent frameworks wrap a transport *factory* — a no-arg callable returning a
|
|
107
|
+
# streamable-HTTP transport context manager. Typed as \`\`Any\`\` so this layer
|
|
108
|
+
# stays free of any framework-specific transport type.
|
|
109
|
+
TransportFactory = Callable[[], Any]
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _factory(url: str, auth) -> TransportFactory:
|
|
113
|
+
return lambda: streamablehttp_client(
|
|
114
|
+
url,
|
|
115
|
+
auth=auth,
|
|
116
|
+
timeout=120,
|
|
117
|
+
terminate_on_close=False,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def sigv4_transport(url: str, region: str) -> TransportFactory:
|
|
122
|
+
"""SigV4-signed transport factory for a resolved AgentCore endpoint."""
|
|
123
|
+
credentials = boto3.Session(region_name=region).get_credentials()
|
|
124
|
+
return _factory(url, sigv4_auth(credentials, region))
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def jwt_transport(
|
|
128
|
+
url: str, access_token_provider: Callable[[], str]
|
|
129
|
+
) -> TransportFactory:
|
|
130
|
+
"""Bearer-token transport factory for a resolved AgentCore endpoint."""
|
|
131
|
+
return _factory(url, jwt_auth(access_token_provider))
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def no_auth_transport(url: str) -> TransportFactory:
|
|
135
|
+
"""Plain-HTTP transport factory — for local dev."""
|
|
136
|
+
return _factory(url, plain_auth())
|
|
116
137
|
"
|
|
117
138
|
`;
|
|
118
139
|
|
|
119
|
-
exports[`py#agent#mcp-connection generator > should match snapshot for generated files >
|
|
140
|
+
exports[`py#agent#mcp-connection generator > should match snapshot for generated files > inventory_mcp_client_strands.py 1`] = `
|
|
120
141
|
"import os
|
|
121
142
|
|
|
122
143
|
from strands.tools.mcp.mcp_client import MCPClient
|
|
123
144
|
|
|
124
|
-
from proj_agent_connection.core.
|
|
145
|
+
from proj_agent_connection.core.agentcore_mcp_client_strands import (
|
|
146
|
+
AgentCoreMCPClientStrands,
|
|
147
|
+
)
|
|
125
148
|
from proj_agent_connection.core.runtime_config import (
|
|
126
149
|
get_agentcore_runtime_config,
|
|
127
150
|
)
|
|
128
151
|
|
|
129
152
|
|
|
130
|
-
class
|
|
131
|
-
"""
|
|
153
|
+
class InventoryMcpClientStrands:
|
|
154
|
+
"""Strands client for the InventoryMcp MCP server."""
|
|
132
155
|
|
|
133
156
|
@staticmethod
|
|
134
157
|
def create() -> MCPClient:
|
|
135
158
|
if os.environ.get("SERVE_LOCAL") == "true":
|
|
136
|
-
return
|
|
159
|
+
return AgentCoreMCPClientStrands.without_auth("http://localhost:8082/mcp")
|
|
137
160
|
config = get_agentcore_runtime_config()
|
|
138
161
|
agent_runtime_arn = config.get("agentRuntimes", {}).get("InventoryMcp")
|
|
139
162
|
if not agent_runtime_arn:
|
|
140
163
|
raise RuntimeError(
|
|
141
164
|
"No connected MCP server runtime named 'InventoryMcp' found in runtime configuration."
|
|
142
165
|
)
|
|
143
|
-
return
|
|
166
|
+
return AgentCoreMCPClientStrands.with_iam_auth(agent_runtime_arn)
|
|
167
|
+
"
|
|
168
|
+
`;
|
|
169
|
+
|
|
170
|
+
exports[`py#agent#mcp-connection generator > should match snapshot for generated files > session.py 1`] = `
|
|
171
|
+
"from collections.abc import Callable
|
|
172
|
+
|
|
173
|
+
import httpx
|
|
174
|
+
|
|
175
|
+
from ..session_context import get_current_session_id
|
|
176
|
+
from .sigv4 import SigV4HTTPXAuth
|
|
177
|
+
|
|
178
|
+
SESSION_HEADER = "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id"
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class SessionHeaderAuth(httpx.Auth):
|
|
182
|
+
"""Stamps the AgentCore session header from the current async context,
|
|
183
|
+
then delegates to an optional inner auth (e.g. SigV4)."""
|
|
184
|
+
|
|
185
|
+
requires_request_body = True
|
|
186
|
+
requires_response_body = True
|
|
187
|
+
|
|
188
|
+
def __init__(self, inner: httpx.Auth | None = None):
|
|
189
|
+
self._inner = inner
|
|
190
|
+
|
|
191
|
+
def auth_flow(self, request: httpx.Request): # type: ignore[override]
|
|
192
|
+
sid = get_current_session_id()
|
|
193
|
+
if sid:
|
|
194
|
+
request.headers[SESSION_HEADER] = sid
|
|
195
|
+
if self._inner is None:
|
|
196
|
+
yield request
|
|
197
|
+
return
|
|
198
|
+
yield from self._inner.auth_flow(request)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def sigv4_auth(
|
|
202
|
+
credentials, region: str, service: str = "bedrock-agentcore"
|
|
203
|
+
) -> httpx.Auth:
|
|
204
|
+
"""Session-forwarding SigV4 auth (per-request, body-aware)."""
|
|
205
|
+
return SessionHeaderAuth(SigV4HTTPXAuth(credentials, service, region))
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def jwt_auth(access_token_provider: Callable[[], str]) -> httpx.Auth:
|
|
209
|
+
"""Session-forwarding bearer-token auth."""
|
|
210
|
+
|
|
211
|
+
class _Bearer(httpx.Auth):
|
|
212
|
+
def auth_flow(self, request: httpx.Request):
|
|
213
|
+
request.headers["Authorization"] = f"Bearer {access_token_provider()}"
|
|
214
|
+
yield request
|
|
215
|
+
|
|
216
|
+
return SessionHeaderAuth(_Bearer())
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def plain_auth() -> httpx.Auth:
|
|
220
|
+
"""Session-forwarding plain auth — for local dev."""
|
|
221
|
+
return SessionHeaderAuth()
|
|
144
222
|
"
|
|
145
223
|
`;
|
|
146
224
|
|
|
147
225
|
exports[`py#agent#mcp-connection generator > should match snapshot for generated files > transformed-agent.py 1`] = `
|
|
148
|
-
"from proj_agent_connection import
|
|
226
|
+
"from proj_agent_connection import InventoryMcpClientStrands
|
|
149
227
|
from contextlib import contextmanager
|
|
150
228
|
|
|
151
229
|
from strands import Agent, tool
|
|
@@ -160,7 +238,7 @@ def subtract(a: int, b: int) -> int:
|
|
|
160
238
|
|
|
161
239
|
@contextmanager
|
|
162
240
|
def get_agent(session_id: str):
|
|
163
|
-
inventory_mcp =
|
|
241
|
+
inventory_mcp = InventoryMcpClientStrands.create()
|
|
164
242
|
with (
|
|
165
243
|
inventory_mcp,
|
|
166
244
|
):
|
|
@@ -2,19 +2,21 @@ import os
|
|
|
2
2
|
|
|
3
3
|
from strands.tools.mcp.mcp_client import MCPClient
|
|
4
4
|
|
|
5
|
-
from <%- agentConnectionModuleName %>.core.
|
|
5
|
+
from <%- agentConnectionModuleName %>.core.agentcore_mcp_client_strands import (
|
|
6
|
+
AgentCoreMCPClientStrands,
|
|
7
|
+
)
|
|
6
8
|
from <%- agentConnectionModuleName %>.core.runtime_config import (
|
|
7
9
|
get_agentcore_runtime_config,
|
|
8
10
|
)
|
|
9
11
|
|
|
10
12
|
|
|
11
|
-
class <%- mcpServerClassName %>
|
|
12
|
-
"""
|
|
13
|
+
class <%- mcpServerClassName %>ClientStrands:
|
|
14
|
+
"""Strands client for the <%- mcpServerClassName %> MCP server."""
|
|
13
15
|
|
|
14
16
|
@staticmethod
|
|
15
17
|
def create() -> MCPClient:
|
|
16
18
|
if os.environ.get("SERVE_LOCAL") == "true":
|
|
17
|
-
return
|
|
19
|
+
return AgentCoreMCPClientStrands.without_auth(
|
|
18
20
|
"http://localhost:<%- mcpServerPort %>/mcp"
|
|
19
21
|
)
|
|
20
22
|
config = get_agentcore_runtime_config()
|
|
@@ -25,4 +27,4 @@ class <%- mcpServerClassName %>Client:
|
|
|
25
27
|
raise RuntimeError(
|
|
26
28
|
"No connected MCP server runtime named '<%- mcpServerClassName %>' found in runtime configuration."
|
|
27
29
|
)
|
|
28
|
-
return
|
|
30
|
+
return AgentCoreMCPClientStrands.with_iam_auth(agent_runtime_arn)
|
|
@@ -32,17 +32,17 @@ const pyAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
32
32
|
// 1. Ensure the shared Python agent-connection project exists + has the
|
|
33
33
|
// MCP core client and its shared SigV4 auth helper.
|
|
34
34
|
await (0, agent_connection_1.ensurePythonAgentConnectionProject)(tree);
|
|
35
|
-
(0, agent_connection_1.addPythonCoreClient)(tree, '
|
|
36
|
-
(0, agent_connection_1.addPythonCoreClient)(tree, 'mcp');
|
|
35
|
+
await (0, agent_connection_1.addPythonCoreClient)(tree, 'mcp');
|
|
37
36
|
const agentConnectionProjectDir = (0, agent_connection_1.getPythonAgentConnectionProjectDir)(tree);
|
|
38
37
|
const agentConnectionModuleName = (0, agent_connection_1.getPythonAgentConnectionModuleName)(tree);
|
|
39
38
|
const agentConnectionPackageName = (0, agent_connection_1.getPythonAgentConnectionPackageName)(tree);
|
|
40
39
|
// Python deps required by the MCP core client + shared auth helper.
|
|
40
|
+
// Layer 0/1 deps for the MCP transport + signed httpx auth. The framework's
|
|
41
|
+
// own dependency (strands-agents) is added by addPythonCoreClient.
|
|
41
42
|
(0, py_1.addDependenciesToPyProjectToml)(tree, agentConnectionProjectDir, [
|
|
42
43
|
'boto3',
|
|
43
44
|
'httpx',
|
|
44
45
|
'mcp',
|
|
45
|
-
'strands-agents',
|
|
46
46
|
]);
|
|
47
47
|
// 2. Generate the per-connection client into the shared agent-connection project
|
|
48
48
|
const appDir = (0, devkit_1.joinPathFragments)(agentConnectionProjectDir, agentConnectionModuleName, 'app');
|
|
@@ -59,12 +59,12 @@ const pyAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
59
59
|
}
|
|
60
60
|
// Add re-export to module __init__.py
|
|
61
61
|
const moduleInitPath = (0, devkit_1.joinPathFragments)(agentConnectionProjectDir, agentConnectionModuleName, '__init__.py');
|
|
62
|
-
await (0, agent_connection_1.addPythonReExport)(tree, moduleInitPath, `.app.${mcpServerSnakeCase}
|
|
62
|
+
await (0, agent_connection_1.addPythonReExport)(tree, moduleInitPath, `.app.${mcpServerSnakeCase}_client_strands`, `${mcpServerClassName}ClientStrands`);
|
|
63
63
|
// 3. Transform agent.py to add MCP client import and usage
|
|
64
64
|
const agentSourceDir = (0, devkit_1.joinPathFragments)(sourceProject.root, agentComponent.path ?? 'src');
|
|
65
65
|
const agentFilePath = (0, devkit_1.joinPathFragments)(agentSourceDir, 'agent.py');
|
|
66
66
|
if (tree.exists(agentFilePath)) {
|
|
67
|
-
const clientClassName = `${mcpServerClassName}
|
|
67
|
+
const clientClassName = `${mcpServerClassName}ClientStrands`;
|
|
68
68
|
const clientVarName = mcpServerSnakeCase;
|
|
69
69
|
await (0, ast_1.addPythonDestructuredImport)(tree, agentFilePath, [clientClassName], agentConnectionModuleName);
|
|
70
70
|
await (0, agent_connection_1.addPythonClientToAgent)(tree, agentFilePath, clientClassName, clientVarName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/mcp-connection/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCAQoB;AACpB,uFAQ0D;AAC1D,4CAAiE;AACjE,kDAA6D;AAC7D,oDAAyE;AACzE,gDAAiD;AACjD,0CAK2B;AAC3B,0CAG2B;AAGd,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,wEAAwE;IACxE,uDAAuD;IACvD,MAAM,IAAA,qDAAkC,EAAC,IAAI,CAAC,CAAC;IAC/C,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/mcp-connection/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -191,7 +191,10 @@ class LoggerRouteHandler(APIRoute):
|
|
|
191
191
|
|
|
192
192
|
app.router.route_class = LoggerRouteHandler
|
|
193
193
|
",
|
|
194
|
-
"apps/test_api/proj_test_api/main.py": "import
|
|
194
|
+
"apps/test_api/proj_test_api/main.py": "from typing import Annotated
|
|
195
|
+
|
|
196
|
+
import uvicorn
|
|
197
|
+
from fastapi import Query
|
|
195
198
|
from pydantic import BaseModel
|
|
196
199
|
|
|
197
200
|
from .init import app, tracer
|
|
@@ -203,7 +206,7 @@ class EchoOutput(BaseModel):
|
|
|
203
206
|
|
|
204
207
|
@app.get("/echo")
|
|
205
208
|
@tracer.capture_method
|
|
206
|
-
def echo(message: str) -> EchoOutput:
|
|
209
|
+
def echo(message: Annotated[str, Query(max_length=1024)]) -> EchoOutput:
|
|
207
210
|
return EchoOutput(message=f"{message}")
|
|
208
211
|
|
|
209
212
|
|
|
@@ -253,6 +256,7 @@ import {
|
|
|
253
256
|
HttpMethod,
|
|
254
257
|
HttpStage,
|
|
255
258
|
LogGroupLogDestination,
|
|
259
|
+
ThrottleSettings,
|
|
256
260
|
} from 'aws-cdk-lib/aws-apigatewayv2';
|
|
257
261
|
import { LogGroup } from 'aws-cdk-lib/aws-logs';
|
|
258
262
|
import { suppressRules } from '../checkov.js';
|
|
@@ -279,6 +283,12 @@ export interface HttpApiProps<
|
|
|
279
283
|
* Map of operation names to their API Gateway integrations
|
|
280
284
|
*/
|
|
281
285
|
readonly integrations: TIntegrations;
|
|
286
|
+
/**
|
|
287
|
+
* Default throttling limits applied to the API's default stage.
|
|
288
|
+
*
|
|
289
|
+
* @default { rateLimit: 10000, burstLimit: 5000 }
|
|
290
|
+
*/
|
|
291
|
+
readonly throttle?: ThrottleSettings;
|
|
282
292
|
}
|
|
283
293
|
|
|
284
294
|
/**
|
|
@@ -312,6 +322,7 @@ export class HttpApi<
|
|
|
312
322
|
apiName,
|
|
313
323
|
operations,
|
|
314
324
|
integrations,
|
|
325
|
+
throttle = { rateLimit: 10000, burstLimit: 5000 },
|
|
315
326
|
...props
|
|
316
327
|
}: HttpApiProps<TIntegrations, TOperation>,
|
|
317
328
|
) {
|
|
@@ -339,6 +350,7 @@ export class HttpApi<
|
|
|
339
350
|
this.defaultStage = new HttpStage(this, 'DefaultStage', {
|
|
340
351
|
httpApi: this.api,
|
|
341
352
|
autoDeploy: true,
|
|
353
|
+
throttle,
|
|
342
354
|
accessLogSettings: {
|
|
343
355
|
destination: new LogGroupLogDestination(accessLogGroup),
|
|
344
356
|
},
|
|
@@ -1062,6 +1074,7 @@ import {
|
|
|
1062
1074
|
RestApiProps as _RestApiProps,
|
|
1063
1075
|
IResource,
|
|
1064
1076
|
Stage,
|
|
1077
|
+
ThrottleSettings,
|
|
1065
1078
|
} from 'aws-cdk-lib/aws-apigateway';
|
|
1066
1079
|
import { IAspect, RemovalPolicy } from 'aws-cdk-lib';
|
|
1067
1080
|
import {
|
|
@@ -1108,6 +1121,12 @@ export interface RestApiProps<
|
|
|
1108
1121
|
* @default true
|
|
1109
1122
|
*/
|
|
1110
1123
|
readonly enableWaf?: boolean;
|
|
1124
|
+
/**
|
|
1125
|
+
* Default throttling limits applied to all methods on the API's default stage.
|
|
1126
|
+
*
|
|
1127
|
+
* @default { rateLimit: 10000, burstLimit: 5000 }
|
|
1128
|
+
*/
|
|
1129
|
+
readonly throttle?: ThrottleSettings;
|
|
1111
1130
|
}
|
|
1112
1131
|
|
|
1113
1132
|
/**
|
|
@@ -1142,6 +1161,7 @@ export class RestApi<
|
|
|
1142
1161
|
operations,
|
|
1143
1162
|
integrations,
|
|
1144
1163
|
enableWaf = true,
|
|
1164
|
+
throttle = { rateLimit: 10000, burstLimit: 5000 },
|
|
1145
1165
|
...props
|
|
1146
1166
|
}: RestApiProps<TIntegrations, TOperation>,
|
|
1147
1167
|
) {
|
|
@@ -1149,7 +1169,21 @@ export class RestApi<
|
|
|
1149
1169
|
this.integrations = integrations;
|
|
1150
1170
|
|
|
1151
1171
|
// Create the API Gateway REST API
|
|
1152
|
-
this.api = new _RestApi(this, 'Api',
|
|
1172
|
+
this.api = new _RestApi(this, 'Api', {
|
|
1173
|
+
...props,
|
|
1174
|
+
deployOptions: {
|
|
1175
|
+
...props.deployOptions,
|
|
1176
|
+
methodOptions: {
|
|
1177
|
+
...props.deployOptions?.methodOptions,
|
|
1178
|
+
// Default throttling applied to all resource paths and methods
|
|
1179
|
+
'/*/*': {
|
|
1180
|
+
throttlingRateLimit: throttle.rateLimit,
|
|
1181
|
+
throttlingBurstLimit: throttle.burstLimit,
|
|
1182
|
+
...props.deployOptions?.methodOptions?.['/*/*'],
|
|
1183
|
+
},
|
|
1184
|
+
},
|
|
1185
|
+
},
|
|
1186
|
+
});
|
|
1153
1187
|
|
|
1154
1188
|
if (enableWaf) {
|
|
1155
1189
|
this.webAcl = new CfnWebACL(this, 'WebAcl', {
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
1
3
|
import uvicorn
|
|
4
|
+
from fastapi import Query
|
|
2
5
|
from pydantic import BaseModel
|
|
3
6
|
|
|
4
7
|
from .init import app, tracer
|
|
@@ -10,7 +13,7 @@ class EchoOutput(BaseModel):
|
|
|
10
13
|
|
|
11
14
|
@app.get("/echo")
|
|
12
15
|
@tracer.capture_method
|
|
13
|
-
def echo(message: str) -> EchoOutput:
|
|
16
|
+
def echo(message: Annotated[str, Query(max_length=1024)]) -> EchoOutput:
|
|
14
17
|
return EchoOutput(message=f"{message}")
|
|
15
18
|
|
|
16
19
|
|
|
@@ -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
|
|