@aws/nx-plugin-mcp 1.0.0-rc.8 → 1.0.0-rc.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/bin/aws-nx-mcp.js +14210 -13550
  2. package/docs/get_started/building-with-ai.mdx +116 -0
  3. package/docs/get_started/concepts.mdx +67 -0
  4. package/docs/get_started/existing-project.mdx +180 -0
  5. package/docs/get_started/graph-builder.mdx +39 -0
  6. package/docs/get_started/quick-start.mdx +277 -0
  7. package/docs/get_started/tutorials/contribute-generator.mdx +408 -0
  8. package/docs/get_started/tutorials/dungeon-game/1.mdx +1578 -0
  9. package/docs/get_started/tutorials/dungeon-game/2.mdx +245 -0
  10. package/docs/get_started/tutorials/dungeon-game/3.mdx +66 -0
  11. package/docs/get_started/tutorials/dungeon-game/4.mdx +164 -0
  12. package/docs/get_started/tutorials/dungeon-game/overview.mdx +145 -0
  13. package/docs/get_started/tutorials/dungeon-game/wrap-up.mdx +41 -0
  14. package/docs/get_started/upgrading.mdx +147 -0
  15. package/docs/guides/agentcore-gateway.mdx +490 -0
  16. package/docs/guides/agentcore-harness.mdx +275 -0
  17. package/docs/guides/astro-docs.mdx +8 -0
  18. package/docs/guides/connection/agentcore-gateway-agent.mdx +222 -0
  19. package/docs/guides/connection/agentcore-gateway-gateway.mdx +154 -0
  20. package/docs/guides/connection/agentcore-gateway-mcp.mdx +134 -0
  21. package/docs/guides/connection/py-agent-a2a.mdx +48 -16
  22. package/docs/guides/connection/py-agent-dynamodb.mdx +116 -0
  23. package/docs/guides/connection/py-agent-gateway.mdx +182 -0
  24. package/docs/guides/connection/py-agent-mcp.mdx +43 -14
  25. package/docs/guides/connection/py-agent-rdb.mdx +178 -0
  26. package/docs/guides/connection/py-fast-api-dynamodb.mdx +56 -0
  27. package/docs/guides/connection/py-fast-api-rdb.mdx +184 -0
  28. package/docs/guides/connection/py-mcp-server-dynamodb.mdx +116 -0
  29. package/docs/guides/connection/py-mcp-server-rdb.mdx +187 -0
  30. package/docs/guides/connection/react-agentcore-gateway.mdx +112 -0
  31. package/docs/guides/connection/react-agui.mdx +33 -14
  32. package/docs/guides/connection/react-fastapi.mdx +39 -3
  33. package/docs/guides/connection/react-py-agent.mdx +10 -16
  34. package/docs/guides/connection/react-smithy.mdx +5 -5
  35. package/docs/guides/connection/react-trpc.mdx +2 -2
  36. package/docs/guides/connection/react-ts-agent.mdx +9 -9
  37. package/docs/guides/connection/smithy-dynamodb.mdx +6 -6
  38. package/docs/guides/connection/smithy-rdb.mdx +10 -10
  39. package/docs/guides/connection/trpc-dynamodb.mdx +5 -5
  40. package/docs/guides/connection/trpc-rdb.mdx +6 -6
  41. package/docs/guides/connection/ts-agent-a2a.mdx +14 -11
  42. package/docs/guides/connection/ts-agent-dynamodb.mdx +5 -5
  43. package/docs/guides/connection/ts-agent-gateway.mdx +147 -0
  44. package/docs/guides/connection/ts-agent-mcp.mdx +12 -9
  45. package/docs/guides/connection/ts-agent-rdb.mdx +70 -25
  46. package/docs/guides/connection/ts-mcp-server-dynamodb.mdx +5 -5
  47. package/docs/guides/connection/ts-mcp-server-rdb.mdx +68 -18
  48. package/docs/guides/connection.mdx +122 -5
  49. package/docs/guides/docker-bundling.mdx +81 -12
  50. package/docs/guides/fastapi.mdx +252 -15
  51. package/docs/guides/local-development.mdx +87 -0
  52. package/docs/guides/nx-generator.mdx +4 -3
  53. package/docs/guides/nx-migration.mdx +165 -0
  54. package/docs/guides/py-agent.mdx +332 -55
  55. package/docs/guides/py-dynamodb.mdx +476 -0
  56. package/docs/guides/py-mcp-server.mdx +57 -2
  57. package/docs/guides/py-rdb.mdx +265 -0
  58. package/docs/guides/python-lambda-function.mdx +1 -1
  59. package/docs/guides/react-website-auth.mdx +104 -5
  60. package/docs/guides/react-website.mdx +413 -99
  61. package/docs/guides/runtime-config.mdx +1 -1
  62. package/docs/guides/security.mdx +75 -0
  63. package/docs/guides/smithy-project.mdx +167 -0
  64. package/docs/guides/terraform-project.mdx +2 -2
  65. package/docs/guides/trpc.mdx +54 -17
  66. package/docs/guides/ts-agent.mdx +207 -23
  67. package/docs/guides/ts-dcr-proxy.mdx +569 -0
  68. package/docs/guides/ts-dynamodb.mdx +66 -242
  69. package/docs/guides/ts-lambda-function.mdx +1 -1
  70. package/docs/guides/ts-mcp-server.mdx +111 -29
  71. package/docs/guides/ts-nx-plugin.mdx +4 -4
  72. package/docs/guides/ts-rdb.mdx +114 -468
  73. package/docs/guides/ts-smithy-api.mdx +259 -19
  74. package/docs/guides/typescript-infrastructure.mdx +46 -24
  75. package/docs/guides/typescript-project.mdx +134 -27
  76. package/docs/guides/workspace.mdx +10 -3
  77. package/docs/snippets/agent/architecture.mdx +1 -1
  78. package/docs/snippets/agent/bedrock-deployment.mdx +9 -5
  79. package/docs/snippets/agent/runtime-arn.mdx +23 -2
  80. package/docs/snippets/agent/securing-your-agent.mdx +39 -0
  81. package/docs/snippets/api/access-logging.mdx +38 -0
  82. package/docs/snippets/api/cors-configuration-cdk-note.mdx +1 -1
  83. package/docs/snippets/api/cors-configuration-terraform-note.mdx +1 -1
  84. package/docs/snippets/api/type-safe-api-integrations.mdx +69 -50
  85. package/docs/snippets/api/waf-configuration.mdx +3 -3
  86. package/docs/snippets/connection/a2a-infrastructure.mdx +1 -1
  87. package/docs/snippets/connection/dynamodb-local-development.mdx +2 -2
  88. package/docs/snippets/connection/lambda-dynamodb-access.mdx +1 -1
  89. package/docs/snippets/connection/py-dynamodb-local-development.mdx +7 -0
  90. package/docs/snippets/connection/py-lambda-rdb-ssl-requirements.mdx +7 -0
  91. package/docs/snippets/connection/rdb-api-infrastructure.mdx +51 -19
  92. package/docs/snippets/dynamodb/deploying-table.mdx +145 -0
  93. package/docs/snippets/dynamodb/encryption-options.mdx +168 -0
  94. package/docs/snippets/dynamodb/gsi-config.mdx +38 -0
  95. package/docs/snippets/dynamodb/infrastructure.mdx +33 -0
  96. package/docs/snippets/dynamodb/local-dev-start.mdx +13 -0
  97. package/docs/snippets/dynamodb/local-dev-windows.mdx +15 -0
  98. package/docs/snippets/lambda-function/deploying-your-function.mdx +3 -3
  99. package/docs/snippets/mcp/architecture.mdx +1 -1
  100. package/docs/snippets/mcp/bedrock-deployment.mdx +9 -5
  101. package/docs/snippets/mcp/config.mdx +3 -2
  102. package/docs/snippets/mcp/shared-constructs.mdx +4 -5
  103. package/docs/snippets/pdk-migration/example/01-migrate-api.mdx +7 -5
  104. package/docs/snippets/pdk-migration/example/02-migrate-website.mdx +29 -10
  105. package/docs/snippets/pdk-migration/example/03-migrate-infra.mdx +4 -4
  106. package/docs/snippets/pdk-migration/faq/type-safe-api.mdx +5 -111
  107. package/docs/snippets/prerequisites.mdx +1 -4
  108. package/docs/snippets/rdb/architecture.mdx +38 -0
  109. package/docs/snippets/rdb/cluster-instances.mdx +31 -0
  110. package/docs/snippets/rdb/deletion-protection.mdx +34 -0
  111. package/docs/snippets/rdb/deploying.mdx +187 -0
  112. package/docs/snippets/rdb/encryption-key-rotation.mdx +30 -0
  113. package/docs/snippets/rdb/engine-version.mdx +63 -0
  114. package/docs/snippets/rdb/infrastructure.mdx +35 -0
  115. package/docs/snippets/rdb/logging-mysql.mdx +5 -0
  116. package/docs/snippets/rdb/logging-postgres.mdx +5 -0
  117. package/docs/snippets/rdb/performance-insights.mdx +34 -0
  118. package/docs/snippets/rdb/rds-proxy.mdx +50 -0
  119. package/docs/snippets/rdb/removal-policy.mdx +57 -0
  120. package/docs/snippets/rdb/serverless-capacity.mdx +32 -0
  121. package/docs/snippets/recommended-prerequisites.mdx +10 -0
  122. package/docs/snippets/required-prerequisites.mdx +1 -4
  123. package/docs/snippets/runtime-config-app-id-note.mdx +8 -0
  124. package/docs/snippets/shared-constructs.mdx +1 -1
  125. package/docs/snippets/trivy-image-scan.mdx +37 -0
  126. package/generators.json +162 -10
  127. package/package.json +1 -1
  128. package/src/agentcore-gateway/agent-connection/schema.json +31 -0
  129. package/src/agentcore-gateway/gateway-connection/schema.json +31 -0
  130. package/src/agentcore-gateway/mcp-connection/schema.json +31 -0
  131. package/src/agentcore-gateway/react-connection/schema.json +31 -0
  132. package/src/agentcore-gateway/schema.json +72 -0
  133. package/src/agentcore-harness/schema.json +53 -0
  134. package/src/connection/schema.json +5 -0
  135. package/src/infra/app/schema.json +5 -0
  136. package/src/init/schema.json +35 -0
  137. package/src/internal/test-matrix/schema.json +21 -0
  138. package/src/license/schema.json +5 -0
  139. package/src/preset/schema.json +16 -5
  140. package/src/py/agent/a2a-connection/schema.json +5 -0
  141. package/src/py/agent/gateway-connection/schema.json +31 -0
  142. package/src/py/agent/mcp-connection/schema.json +5 -0
  143. package/src/py/agent/react-connection/schema.json +5 -0
  144. package/src/py/agent/schema.json +15 -1
  145. package/src/py/api/schema.json +5 -0
  146. package/src/py/dynamodb/agent-connection/schema.json +27 -0
  147. package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
  148. package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
  149. package/src/py/dynamodb/schema.json +76 -0
  150. package/src/py/fast-api/react/schema.json +5 -0
  151. package/src/py/fast-api/schema.json +6 -0
  152. package/src/py/lambda-function/schema.json +6 -1
  153. package/src/py/mcp-server/schema.json +6 -0
  154. package/src/py/project/schema.json +6 -0
  155. package/src/py/rdb/agent-connection/schema.json +27 -0
  156. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  157. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  158. package/src/py/rdb/schema.json +78 -0
  159. package/src/smithy/project/schema.json +28 -1
  160. package/src/smithy/react-connection/schema.json +5 -0
  161. package/src/smithy/ts/api/schema.json +6 -0
  162. package/src/terraform/project/schema.json +5 -0
  163. package/src/trpc/backend/schema.json +6 -0
  164. package/src/trpc/react/schema.json +5 -0
  165. package/src/ts/agent/a2a-connection/schema.json +5 -0
  166. package/src/ts/agent/gateway-connection/schema.json +31 -0
  167. package/src/ts/agent/mcp-connection/schema.json +5 -0
  168. package/src/ts/agent/react-connection/schema.json +5 -0
  169. package/src/ts/agent/schema.json +14 -0
  170. package/src/ts/api/schema.json +5 -0
  171. package/src/ts/astro-docs/schema.json +3 -3
  172. package/src/ts/dcr-proxy/schema.json +44 -0
  173. package/src/ts/docs/schema.json +3 -3
  174. package/src/ts/dynamodb/agent-connection/schema.json +5 -0
  175. package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
  176. package/src/ts/dynamodb/schema.json +26 -2
  177. package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
  178. package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
  179. package/src/ts/lambda-function/schema.json +5 -0
  180. package/src/ts/lib/schema.json +5 -0
  181. package/src/ts/mcp-server/schema.json +6 -0
  182. package/src/ts/nx-generator/schema.json +5 -0
  183. package/src/ts/nx-migration/schema.json +63 -0
  184. package/src/ts/nx-plugin/schema.json +5 -0
  185. package/src/ts/rdb/agent-connection/schema.json +5 -0
  186. package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
  187. package/src/ts/rdb/schema.json +7 -1
  188. package/src/ts/rdb/smithy-connection/schema.json +5 -0
  189. package/src/ts/rdb/trpc-connection/schema.json +5 -0
  190. package/src/ts/react-website/app/schema.json +12 -6
  191. package/src/ts/react-website/cognito-auth/schema.json +5 -0
  192. package/src/ts/react-website/runtime-config/schema.json +5 -0
  193. package/src/ts/website/app/schema.json +11 -6
  194. package/src/ts/website/auth/schema.json +5 -0
  195. /package/docs/snippets/connection/{lambda-rdb-ssl-requirements.mdx → ts-lambda-rdb-ssl-requirements.mdx} +0 -0
  196. /package/docs/snippets/connection/{mcp-server-rdb-ssl-requirements.mdx → ts-mcp-server-rdb-ssl-requirements.mdx} +0 -0
@@ -7,7 +7,7 @@ when:
7
7
  - ts#mcp-server
8
8
  - py#mcp-server
9
9
  ---
10
- import { FileTree } from '@astrojs/starlight/components';
10
+ import { FileTree, Tabs, TabItem } from '@astrojs/starlight/components';
11
11
  import Link from '@components/link.astro';
12
12
  import RunGenerator from '@components/run-generator.astro';
13
13
  import GeneratorParameters from '@components/generator-parameters.astro';
@@ -22,7 +22,7 @@ The generator sets up all the necessary wiring so your agent can discover and in
22
22
 
23
23
  Before using this generator, ensure you have:
24
24
 
25
- 1. A Python project with a <Link path="guides/py-agent">Strands Agent</Link> component
25
+ 1. A Python project with a <Link path="guides/py-agent">Python Agent</Link> component (Strands or LangChain)
26
26
  2. A project with an MCP server component (either <Link path="guides/ts-mcp-server">`ts#mcp-server`</Link> or <Link path="guides/py-mcp-server">`py#mcp-server`</Link>)
27
27
  3. Both components created with `infra: agentcore`
28
28
 
@@ -48,30 +48,37 @@ The generator creates a shared `agent_connection` Python project at `packages/co
48
48
  - \<scope>\_agent\_connection
49
49
  - \_\_init\_\_.py Re-exports per-connection clients
50
50
  - core
51
- - agentcore\_mcp\_client.py Core AgentCore MCP client
51
+ - agentcore\_endpoints.py Framework-agnostic ARN/URL resolution
52
+ - agentcore\_mcp\_transport.py Framework-agnostic MCP transport
53
+ - agentcore\_mcp\_client\_\<framework>.py MCP client wrapping the transport for your agent's framework
54
+ - auth/ Framework-agnostic SigV4 / session-forwarding `httpx.Auth`
52
55
  - app
53
- - \<mcp\_server\_name>\_client.py Per-connection client for each MCP server
56
+ - \<mcp\_server\_name>\_client\_\<framework>.py Per-connection client for each MCP server
54
57
 
55
58
  </FileTree>
56
59
 
60
+ The client suffix matches your agent's framework (`_strands` or `_langchain`).
61
+
57
62
  Additionally, the generator:
58
63
  - Transforms your agent's `agent.py` to import and use the MCP server's tools via a class-based client
59
64
  - Adds the `agent_connection` project as a workspace dependency of your agent project
60
- - Updates the agent's `serve-local` target to depend on the MCP server's serve target
65
+ - Updates the agent's `dev` target to depend on the MCP server's serve target
61
66
 
62
67
  ## Using the Connected MCP Server
63
68
 
64
69
  The generator transforms your agent's `agent.py` to use the MCP server's tools:
65
70
 
66
- ```python title="packages/my-project/my_module/agent/agent.py" {4,10-14}
71
+ <Tabs syncKey="agent-framework">
72
+ <TabItem label="Strands" _filter={{ framework: 'strands' }}>
73
+ ```python title="packages/my-project/my_module/agent/agent.py" {4,8,9-13}
67
74
  from contextlib import contextmanager
68
75
  from strands import Agent
69
76
 
70
- from my_scope_agent_connection import MyMcpServerClient
77
+ from my_scope_agent_connection import MyMcpServerClientStrands
71
78
 
72
79
  @contextmanager
73
- def get_agent(session_id: str):
74
- my_mcp_server = MyMcpServerClient.create(session_id=session_id)
80
+ def get_agent():
81
+ my_mcp_server = MyMcpServerClientStrands.create()
75
82
  with (
76
83
  my_mcp_server,
77
84
  ):
@@ -81,7 +88,29 @@ def get_agent(session_id: str):
81
88
  )
82
89
  ```
83
90
 
84
- The `session_id` parameter is plumbed through from the caller, ensuring consistency for [Bedrock AgentCore Observability](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/observability.html).
91
+ The Strands client is a context manager, entered in a `with` block around the agent.
92
+ </TabItem>
93
+ <TabItem label="LangChain" _filter={{ framework: 'langchain' }}>
94
+ ```python title="packages/my-project/my_module/agent/agent.py" {4,7,11}
95
+ from langchain.agents import create_agent
96
+ from langchain_aws import ChatBedrockConverse
97
+
98
+ from my_scope_agent_connection import MyMcpServerClientLangChain
99
+
100
+ def get_agent():
101
+ my_mcp_server = MyMcpServerClientLangChain.create()
102
+ return create_agent(
103
+ model=ChatBedrockConverse(model=MODEL_ID, region_name=REGION),
104
+ system_prompt="...",
105
+ tools=[*my_mcp_server],
106
+ )
107
+ ```
108
+
109
+ The LangChain client returns a list of tools loaded via [`langchain-mcp-adapters`](https://docs.langchain.com/oss/python/langchain/mcp). Each tool opens a fresh MCP session per call, so the tools stay usable for the agent's lifetime — no `with` block is needed.
110
+ </TabItem>
111
+ </Tabs>
112
+
113
+ The AgentCore session ID is propagated to the MCP server automatically via the `X-Amzn-Bedrock-AgentCore-Runtime-Session-Id` header for both frameworks, ensuring consistency for [Bedrock AgentCore Observability](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/observability.html).
85
114
 
86
115
  ## Infrastructure
87
116
 
@@ -102,7 +131,7 @@ The MCP server's AgentCore runtime ARN is automatically registered in the `agent
102
131
  <Fragment slot="terraform">
103
132
  After running the connection generator, you need to grant the agent permission to invoke the MCP server in your Terraform configuration:
104
133
 
105
- ```hcl title="packages/infra/src/main.tf" {12-24}
134
+ ```hcl title="packages/infra/src/main.tf" {9-25}
106
135
  module "inventory_mcp_server" {
107
136
  source = "../../common/terraform/src/app/mcp-servers/inventory-mcp"
108
137
  }
@@ -136,12 +165,12 @@ The MCP server's AgentCore runtime ARN is automatically registered in the `agent
136
165
 
137
166
  ## Local Development
138
167
 
139
- The generator configures the agent's `serve-local` target to:
168
+ The generator configures the agent's `dev` target to:
140
169
  1. Start the connected MCP server(s) automatically
141
- 2. Set `SERVE_LOCAL=true` so the generated client uses direct HTTP transport instead of AgentCore
170
+ 2. Set `LOCAL_DEV=true` so the generated client uses direct HTTP transport instead of AgentCore
142
171
 
143
172
  Run the agent locally with:
144
173
 
145
- <NxCommands commands={["<agent-name>-serve-local <project-name>"]} />
174
+ <NxCommands commands={["<agent-name>-dev <project-name>"]} />
146
175
 
147
176
  This will start both the agent and all connected MCP servers, with the agent connecting to the MCP servers directly via HTTP on their assigned local ports.
@@ -0,0 +1,178 @@
1
+ ---
2
+ title: Python Agent to Relational Database
3
+ description: Connect a Python Agent to a Relational Database
4
+ when:
5
+ sourceType: py#agent
6
+ targetType: py#rdb
7
+ ---
8
+ import { FileTree } from '@astrojs/starlight/components';
9
+ import Link from '@components/link.astro';
10
+ import RunGenerator from '@components/run-generator.astro';
11
+ import GeneratorParameters from '@components/generator-parameters.astro';
12
+ import NxCommands from '@components/nx-commands.astro';
13
+ import Infrastructure from '@components/infrastructure.astro';
14
+
15
+ The `connection` generator wires a <Link path="guides/py-agent">Python Agent</Link> to a <Link path="guides/py-rdb">Python Relational Database</Link> project, making the database session available inside your agent tools.
16
+
17
+ ## Prerequisites
18
+
19
+ Before using this generator, ensure you have:
20
+
21
+ 1. A <Link path="guides/py-agent">`py#agent`</Link> project
22
+ 2. A <Link path="guides/py-rdb">`py#rdb`</Link> project
23
+
24
+ ## Usage
25
+
26
+ ### Run the Generator
27
+
28
+ <RunGenerator generator="connection" />
29
+
30
+ Select your Agent project as the source and your relational database project as the target. If the project contains multiple agent components, specify `sourceComponent` to disambiguate.
31
+
32
+ ### Options
33
+
34
+ <GeneratorParameters generator="connection" />
35
+
36
+ ## Generator Output
37
+
38
+ <FileTree>
39
+
40
+ - packages/my\_service
41
+ - project.json Adds a dependency from `my_agent-dev` on the database's `dev` target
42
+ - pyproject.toml Adds the database package as a workspace dependency
43
+ - my\_service
44
+ - my\_agent
45
+ - Dockerfile Adds the RDS CA bundle used for direct Aurora connections
46
+
47
+ </FileTree>
48
+
49
+ ## Using the Database in Agent Tools
50
+
51
+ Import `session_context` from your database package and use it inside your agent tools:
52
+
53
+ ```python title="packages/my_service/my_service/my_agent/agent.py"
54
+ from sqlmodel import select
55
+ from my_scope.my_db import session_context
56
+ from my_scope.my_db.models.example import ExampleModel
57
+ from strands import tool
58
+
59
+ @tool
60
+ async def list_examples() -> list:
61
+ """List all example records."""
62
+ async with session_context() as session:
63
+ return [item.model_dump() for item in (await session.execute(select(ExampleModel))).all()]
64
+ ```
65
+
66
+ ## Infrastructure
67
+
68
+ The generated agent construct implements `IGrantable` and `IConnectable`, so you can grant network and IAM access to the database directly on the construct.
69
+
70
+ <Infrastructure>
71
+ <Fragment slot="cdk">
72
+
73
+ ```ts title="packages/infra/src/stacks/application-stack.ts"
74
+ import { SecurityGroup } from 'aws-cdk-lib/aws-ec2';
75
+ import { RuntimeNetworkConfiguration } from 'aws-cdk-lib/aws-bedrockagentcore';
76
+ import { MyDatabase } from '@my-scope/common-constructs';
77
+
78
+ const db = new MyDatabase(this, 'Db', { vpc, ... });
79
+
80
+ const myAgent = new MyAgent(this, 'MyAgent', {
81
+ networkConfiguration: RuntimeNetworkConfiguration.usingVpc(this, {
82
+ vpc,
83
+ vpcSubnets: { subnetType: SubnetType.PRIVATE_WITH_EGRESS },
84
+ securityGroups: [
85
+ new SecurityGroup(this, 'MyAgentSecurityGroup', { vpc, allowAllOutbound: true }),
86
+ ],
87
+ }),
88
+ });
89
+
90
+ db.allowDefaultPortFrom(myAgent);
91
+ db.grantConnect(myAgent);
92
+ ```
93
+
94
+ `allowDefaultPortFrom` opens the security group rule so the agent runtime can reach the database port. `grantConnect` grants IAM `rds-db:connect` permission to the agent's execution role.
95
+
96
+
97
+ </Fragment>
98
+ <Fragment slot="terraform">
99
+
100
+ Run the agent inside the same VPC as the database, grant it `rds-db:connect` via `additional_iam_policy_statements`, and open the network path with a pair of security group rules. The `aws_vpc.main` and `aws_subnet` resources are defined in the database deployment guide:
101
+
102
+ ```hcl title="packages/infra/src/main.tf"
103
+ module "my_database" {
104
+ source = "../../common/terraform/src/app/dbs/my-database"
105
+ vpc_id = aws_vpc.main.id
106
+ database_subnet_ids = aws_subnet.database[*].id
107
+ lambda_subnet_ids = aws_subnet.private[*].id
108
+ }
109
+
110
+ module "my_agent" {
111
+ source = "../../common/terraform/src/app/agents/my-agent"
112
+ enable_vpc = true
113
+ vpc_id = aws_vpc.main.id
114
+ subnet_ids = aws_subnet.private[*].id
115
+
116
+ appconfig_application_id = module.runtime_config_appconfig.application_id
117
+ appconfig_application_arn = module.runtime_config_appconfig.application_arn
118
+
119
+ additional_iam_policy_statements = [
120
+ {
121
+ Effect = "Allow"
122
+ Action = ["rds-db:connect"]
123
+ Resource = [
124
+ "arn:aws:rds-db:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:dbuser:${module.my_database.connect_resource_id}/${module.my_database.database_runtime_user}"
125
+ ]
126
+ }
127
+ ]
128
+ }
129
+
130
+ resource "aws_vpc_security_group_ingress_rule" "agent_to_database" {
131
+ description = "Allow the agent runtime to connect to the database"
132
+ security_group_id = module.my_database.security_group_id
133
+ referenced_security_group_id = module.my_agent.security_group_id
134
+ from_port = module.my_database.cluster_port
135
+ to_port = module.my_database.cluster_port
136
+ ip_protocol = "tcp"
137
+ }
138
+
139
+ resource "aws_vpc_security_group_egress_rule" "agent_to_database" {
140
+ description = "Allow outbound traffic from the agent runtime to the database"
141
+ security_group_id = module.my_agent.security_group_id
142
+ referenced_security_group_id = module.my_database.security_group_id
143
+ from_port = module.my_database.cluster_port
144
+ to_port = module.my_database.cluster_port
145
+ ip_protocol = "tcp"
146
+ }
147
+ ```
148
+
149
+ `appconfig_application_id`/`appconfig_application_arn` come from the shared <Link path="guides/runtime-config">runtime configuration</Link> AppConfig application declared once in your root module, not from the database module. Include the `database` namespace when instantiating it so the database module's runtime configuration entry is deployed:
150
+
151
+ ```hcl title="packages/infra/src/main.tf"
152
+ module "runtime_config_appconfig" {
153
+ source = "../../common/terraform/src/core/runtime-config/appconfig"
154
+
155
+ application_name = "my-app-runtime-config"
156
+ namespaces = ["connection", "agentcore", "database"]
157
+ }
158
+ ```
159
+
160
+ </Fragment>
161
+ </Infrastructure>
162
+
163
+ ### SSL Requirements When Connecting Without RDS Proxy
164
+
165
+ When the agent connects directly to the Aurora cluster (without RDS Proxy), the connection generator updates the generated agent Dockerfile to install the Amazon RDS CA bundle into the system trust store:
166
+
167
+ ```dockerfile
168
+ ADD https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem /usr/local/share/ca-certificates/rds-global-bundle.crt
169
+ RUN update-ca-certificates
170
+ ```
171
+
172
+ When using RDS Proxy, you do not need to configure the RDS CA bundle in the agent runtime.
173
+
174
+ ## Local Development
175
+
176
+ <NxCommands commands={["<agent-name>-dev <project-name>"]} />
177
+
178
+ This starts the agent and all connected databases. The `LOCAL_DEV=true` environment variable causes the database client to connect to its local Docker database instead of Aurora.
@@ -0,0 +1,56 @@
1
+ ---
2
+ title: FastAPI to DynamoDB
3
+ description: Connect a FastAPI to a Python DynamoDB project
4
+ when:
5
+ sourceType: py#fast-api
6
+ targetType: py#dynamodb
7
+ ---
8
+ import Link from '@components/link.astro';
9
+ import RunGenerator from '@components/run-generator.astro';
10
+ import GeneratorParameters from '@components/generator-parameters.astro';
11
+ import Snippet from '@components/snippet.astro';
12
+
13
+ The `connection` generator wires a <Link path="guides/fastapi">FastAPI</Link> to a <Link path="guides/py-dynamodb">Python DynamoDB</Link> project, configuring local development so both start together automatically.
14
+
15
+ ## Prerequisites
16
+
17
+ Before using this generator, ensure you have:
18
+
19
+ 1. A FastAPI project (generated with `py#api --framework=fastapi`), see the <Link path="guides/fastapi">`py#api`</Link> guide
20
+ 2. A <Link path="guides/py-dynamodb">`py#dynamodb`</Link> project
21
+
22
+ ## Usage
23
+
24
+ ### Run the Generator
25
+
26
+ <RunGenerator generator="connection" />
27
+
28
+ Select your FastAPI project as the source and your DynamoDB project as the target.
29
+
30
+ ### Options
31
+
32
+ <GeneratorParameters generator="connection" />
33
+
34
+ ## Generator Output
35
+
36
+ The generator updates the FastAPI's `project.json` to add a dependency from its `dev` target to the DynamoDB project's `dev` target, and adds the DynamoDB package as a workspace dependency. No source files are modified.
37
+
38
+ ## Using DynamoDB in Route Handlers
39
+
40
+ Import entity classes from the DynamoDB package and use them inside your route handlers:
41
+
42
+ ```python title="packages/my_api/my_api/api.py"
43
+ from my_scope.my_table.entities.example import ExampleModel
44
+
45
+ @app.get("/examples")
46
+ def list_examples():
47
+ return list(ExampleModel.scan())
48
+ ```
49
+
50
+ ## Infrastructure
51
+
52
+ <Snippet name="connection/lambda-dynamodb-access" />
53
+
54
+ ## Local Development
55
+
56
+ <Snippet name="connection/py-dynamodb-local-development" />
@@ -0,0 +1,184 @@
1
+ ---
2
+ title: FastAPI to Relational Database
3
+ description: Connect a FastAPI to a Python Relational Database
4
+ when:
5
+ sourceType: py#fast-api
6
+ targetType: py#rdb
7
+ ---
8
+ import { FileTree } from '@astrojs/starlight/components';
9
+ import Link from '@components/link.astro';
10
+ import RunGenerator from '@components/run-generator.astro';
11
+ import GeneratorParameters from '@components/generator-parameters.astro';
12
+ import NxCommands from '@components/nx-commands.astro';
13
+ import Infrastructure from '@components/infrastructure.astro';
14
+
15
+ The `connection` generator wires a <Link path="guides/fastapi">FastAPI</Link> to a <Link path="guides/py-rdb">Python Relational Database</Link> project, injecting a typed SQLModel session into your route handlers via a FastAPI dependency.
16
+
17
+ ## Prerequisites
18
+
19
+ Before using this generator, ensure you have:
20
+
21
+ 1. A FastAPI project (generated with `py#api --framework=fastapi`), see the <Link path="guides/fastapi">`py#api`</Link> guide
22
+ 2. A <Link path="guides/py-rdb">`py#rdb`</Link> project
23
+
24
+ ## Usage
25
+
26
+ ### Run the Generator
27
+
28
+ <RunGenerator generator="connection" />
29
+
30
+ Select your FastAPI project as the source and your relational database project as the target.
31
+
32
+ ### Options
33
+
34
+ <GeneratorParameters generator="connection" />
35
+
36
+ ## Generator Output
37
+
38
+ The generator modifies your FastAPI project:
39
+
40
+ <FileTree>
41
+
42
+ - packages/my_api
43
+ - project.json Adds a dependency from `dev` on the database's `dev` target
44
+ - pyproject.toml Adds the database package as a workspace dependency
45
+ - my_api
46
+ - dependencies
47
+ - my_db.py FastAPI `MyDbSession` dependency for the database session
48
+
49
+ </FileTree>
50
+
51
+ ## Using the Database in Route Handlers
52
+
53
+ This generator configures an injectable [FastAPI Dependency](https://fastapi.tiangolo.com/tutorial/dependencies/) which you can use in your route handlers:
54
+
55
+ ```python title="packages/my_api/my_api/api.py" {2,6,10}
56
+ from sqlmodel import select
57
+ from my_api.dependencies.my_db import MyDbSession
58
+ from my_scope.my_db.models.example import ExampleModel
59
+
60
+ @app.get("/examples")
61
+ async def list_examples(my_db: MyDbSession):
62
+ return (await my_db.execute(select(ExampleModel))).all()
63
+
64
+ @app.post("/examples")
65
+ async def create_example(name: str, my_db: MyDbSession):
66
+ item = ExampleModel(name=name)
67
+ my_db.add(item)
68
+ await my_db.commit()
69
+ await my_db.refresh(item)
70
+ return item
71
+ ```
72
+
73
+ FastAPI automatically opens a new session per request and closes it when the handler returns.
74
+
75
+ ## Infrastructure
76
+
77
+ To allow the FastAPI Lambda function to connect to the database at runtime, it must be deployed into the same VPC as the database and granted network and IAM access.
78
+
79
+ <Infrastructure>
80
+ <Fragment slot="cdk">
81
+
82
+ In your application stack, deploy the API into the same VPC as the database, then call `allowDefaultPortFrom` and `grantConnect` to open the network path and grant IAM `rds-db:connect` permission to the Lambda handler:
83
+
84
+ ```ts title="packages/infra/src/stacks/application-stack.ts"
85
+ import { MyDatabase } from '@my-scope/common-constructs';
86
+
87
+ const db = new MyDatabase(this, 'Db', { vpc, ... });
88
+
89
+ const api = new MyApi(this, 'Api', {
90
+ integrations: MyApi.defaultIntegrations(this)
91
+ .withDefaultOptions({
92
+ vpc,
93
+ vpcSubnets: { subnetType: SubnetType.PRIVATE_WITH_EGRESS },
94
+ })
95
+ .build(),
96
+ });
97
+
98
+ Object.entries(api.integrations).forEach(([operation, integration]) => {
99
+ db.allowDefaultPortFrom(integration.handler, `Allow ${operation} to connect to the database`);
100
+ db.grantConnect(integration.handler);
101
+ });
102
+ ```
103
+
104
+ Deploy the API Lambda functions into a **private subnet with egress**, not a private isolated subnet. At runtime, `session_context()` retrieves database configuration from AWS AppConfig, which is a public AWS service endpoint that requires outbound internet access.
105
+
106
+ :::note
107
+ This example grants every handler in your API access, but if only some handlers need access it's better to configure individually.
108
+ :::
109
+
110
+ </Fragment>
111
+ <Fragment slot="terraform">
112
+
113
+ Deploy the API into the same VPC as the database, grant it `rds-db:connect` via `additional_iam_policy_statements`, and open the network path with a pair of security group rules:
114
+
115
+ The example below references the VPC resources from the <Link path="guides/py-rdb">Python Relational Database</Link> deployment guide: `aws_subnet.database` subnets have no internet route, while `aws_subnet.private` subnets have NAT egress.
116
+
117
+ ```hcl title="packages/infra/src/main.tf"
118
+ module "my_database" {
119
+ source = "../../common/terraform/src/app/dbs/my-database"
120
+ vpc_id = aws_vpc.main.id
121
+ database_subnet_ids = aws_subnet.database[*].id
122
+ lambda_subnet_ids = aws_subnet.private[*].id
123
+ }
124
+
125
+ module "api" {
126
+ source = "../../common/terraform/src/app/apis/my-api"
127
+ enable_vpc = true
128
+ vpc_id = aws_vpc.main.id
129
+ subnet_ids = aws_subnet.private[*].id
130
+
131
+ appconfig_application_id = module.runtime_config_appconfig.application_id
132
+ appconfig_application_arn = module.runtime_config_appconfig.application_arn
133
+
134
+ additional_iam_policy_statements = [
135
+ {
136
+ Effect = "Allow"
137
+ Action = ["rds-db:connect"]
138
+ Resource = [
139
+ "arn:aws:rds-db:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:dbuser:${module.my_database.connect_resource_id}/${module.my_database.database_runtime_user}"
140
+ ]
141
+ }
142
+ ]
143
+ }
144
+
145
+ resource "aws_vpc_security_group_ingress_rule" "api_to_database" {
146
+ description = "Allow the API Lambda functions to connect to the database"
147
+ security_group_id = module.my_database.security_group_id
148
+ referenced_security_group_id = module.api.security_group_id
149
+ from_port = module.my_database.cluster_port
150
+ to_port = module.my_database.cluster_port
151
+ ip_protocol = "tcp"
152
+ }
153
+
154
+ resource "aws_vpc_security_group_egress_rule" "api_to_database" {
155
+ description = "Allow outbound traffic from the API Lambda functions to the database"
156
+ security_group_id = module.api.security_group_id
157
+ referenced_security_group_id = module.my_database.security_group_id
158
+ from_port = module.my_database.cluster_port
159
+ to_port = module.my_database.cluster_port
160
+ ip_protocol = "tcp"
161
+ }
162
+ ```
163
+
164
+ Deploy the API Lambda functions into **private subnets with egress**, not private isolated subnets. `appconfig_application_id`/`appconfig_application_arn` come from the shared <Link path="guides/runtime-config">runtime configuration</Link> AppConfig application declared once in your root module, not from the database module — passing them sets `RUNTIME_CONFIG_APP_ID` on the Lambda functions and grants them read access to the application.
165
+
166
+ The AppConfig application must expose the `database` namespace so the database module's runtime configuration entry is deployed. Include it in the `namespaces` when instantiating the `runtime-config/appconfig` module:
167
+
168
+ ```hcl title="packages/infra/src/main.tf"
169
+ module "runtime_config_appconfig" {
170
+ source = "../../common/terraform/src/core/runtime-config/appconfig"
171
+
172
+ application_name = "my-app-runtime-config"
173
+ namespaces = ["connection", "agentcore", "database"]
174
+ }
175
+ ```
176
+
177
+ </Fragment>
178
+ </Infrastructure>
179
+
180
+ ## Local Development
181
+
182
+ <NxCommands commands={["dev <project-name>"]} />
183
+
184
+ This starts the FastAPI and all connected databases. The `LOCAL_DEV=true` environment variable causes the database client to connect to its local Docker database instead of Aurora.
@@ -0,0 +1,116 @@
1
+ ---
2
+ title: Python MCP Server to DynamoDB
3
+ description: Connect a Python MCP Server to a Python DynamoDB project
4
+ when:
5
+ sourceType: py#mcp-server
6
+ targetType: py#dynamodb
7
+ ---
8
+ import Link from '@components/link.astro';
9
+ import RunGenerator from '@components/run-generator.astro';
10
+ import GeneratorParameters from '@components/generator-parameters.astro';
11
+ import Infrastructure from '@components/infrastructure.astro';
12
+ import Snippet from '@components/snippet.astro';
13
+
14
+ The `connection` generator wires a <Link path="guides/py-mcp-server">Python MCP Server</Link> to a <Link path="guides/py-dynamodb">Python DynamoDB</Link> project, configuring local development so both start together automatically.
15
+
16
+ ## Prerequisites
17
+
18
+ Before using this generator, ensure you have:
19
+
20
+ 1. A <Link path="guides/py-mcp-server">`py#mcp-server`</Link> project
21
+ 2. A <Link path="guides/py-dynamodb">`py#dynamodb`</Link> project
22
+
23
+ ## Usage
24
+
25
+ ### Run the Generator
26
+
27
+ <RunGenerator generator="connection" />
28
+
29
+ Select your MCP server project as the source and your DynamoDB project as the target. If the project contains multiple MCP server components, specify `sourceComponent` to disambiguate.
30
+
31
+ ### Options
32
+
33
+ <GeneratorParameters generator="connection" />
34
+
35
+ ## Generator Output
36
+
37
+ The generator updates the MCP server's `<mcp-server-name>-dev` target in `project.json` to depend on the DynamoDB project's `dev` target, and adds the DynamoDB package as a workspace dependency. No source files are modified.
38
+
39
+ ## Using DynamoDB in Tools
40
+
41
+ Import entity classes from the DynamoDB package and use them inside your MCP server tools:
42
+
43
+ ```python title="packages/my_project/my_project/my_mcp_server/server.py"
44
+ from my_scope.my_table.entities.example import ExampleModel
45
+
46
+ @mcp.tool()
47
+ def list_examples() -> str:
48
+ """List all example items."""
49
+ items = list(ExampleModel.scan())
50
+ return str([item.attribute_values for item in items])
51
+ ```
52
+
53
+ ## Infrastructure
54
+
55
+ To allow the MCP server's Lambda function to access the DynamoDB table, grant the necessary permissions in your infrastructure.
56
+
57
+ <Infrastructure>
58
+ <Fragment slot="cdk">
59
+
60
+ ```ts title="packages/infra/src/stacks/application-stack.ts"
61
+ import { MyTable } from '@my-scope/common-constructs';
62
+
63
+ const table = new MyTable(this, 'Table');
64
+ const myMcpServer = new MyMcpServer(this, 'MyMcpServer');
65
+
66
+ table.grantReadWriteData(myMcpServer);
67
+ ```
68
+
69
+ `grantReadWriteData` grants both the DynamoDB and KMS permissions to the MCP server's execution role.
70
+ </Fragment>
71
+ <Fragment slot="terraform">
72
+
73
+ ```hcl title="packages/infra/src/main.tf"
74
+ module "my_table" {
75
+ source = "../../common/terraform/src/app/dynamodb/my-table"
76
+ }
77
+
78
+ resource "aws_iam_role_policy" "dynamodb_access" {
79
+ role = module.my_mcp_server.lambda_role_name
80
+
81
+ policy = jsonencode({
82
+ Version = "2012-10-17"
83
+ Statement = [
84
+ {
85
+ Effect = "Allow"
86
+ Action = [
87
+ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem",
88
+ "dynamodb:DeleteItem", "dynamodb:Query", "dynamodb:Scan",
89
+ "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem",
90
+ ]
91
+ Resource = [
92
+ module.my_table.table_arn,
93
+ "${module.my_table.table_arn}/index/*",
94
+ ]
95
+ },
96
+ {
97
+ Effect = "Allow"
98
+ Action = [
99
+ "kms:Encrypt",
100
+ "kms:Decrypt",
101
+ "kms:ReEncrypt*",
102
+ "kms:GenerateDataKey*",
103
+ "kms:DescribeKey"
104
+ ]
105
+ Resource = [module.my_table.kms_key_arn]
106
+ },
107
+ ]
108
+ })
109
+ }
110
+ ```
111
+ </Fragment>
112
+ </Infrastructure>
113
+
114
+ ## Local Development
115
+
116
+ <Snippet name="connection/py-dynamodb-local-development" />