@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
@@ -0,0 +1,187 @@
1
+ ---
2
+ title: Python MCP Server to Relational Database
3
+ description: Connect a Python MCP Server to a Relational Database
4
+ when:
5
+ sourceType: py#mcp-server
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-mcp-server">Python MCP Server</Link> to a <Link path="guides/py-rdb">Python Relational Database</Link> project, making the database session available to all tools registered in the server.
16
+
17
+ ## Prerequisites
18
+
19
+ Before using this generator, ensure you have:
20
+
21
+ 1. A <Link path="guides/py-mcp-server">`py#mcp-server`</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 MCP server project as the source and your relational database project as the target. If the project contains multiple MCP server 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_mcp_server-dev` on the database's `dev` target
42
+ - pyproject.toml Adds the database package as a workspace dependency
43
+ - my\_service
44
+ - my\_mcp\_server
45
+ - Dockerfile Adds the RDS CA bundle used for direct Aurora connections
46
+
47
+ </FileTree>
48
+
49
+ ## Using the Database in MCP Tools
50
+
51
+ Import `session_context` from your database package and use it inside your MCP server tools:
52
+
53
+ ```python title="packages/my_service/my_service/my_mcp_server/server.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
+
58
+ @mcp.tool()
59
+ async def list_examples() -> str:
60
+ """List all example records."""
61
+ async with session_context() as session:
62
+ items = (await session.execute(select(ExampleModel))).all()
63
+ return str([item.model_dump() for item in items])
64
+ ```
65
+
66
+ ## Multiple Databases
67
+
68
+ Running the generator again with a different target adds the second database alongside the first. Both session contexts are available to all tools:
69
+
70
+ ```python title="packages/my_service/my_service/my_mcp_server/server.py"
71
+ from my_scope.my_db import session_context as my_db_session_context
72
+ from my_scope.other_db import session_context as other_db_session_context
73
+ ```
74
+
75
+ ## Infrastructure
76
+
77
+ The generated MCP server construct implements `IGrantable` and `IConnectable`, so you can grant network and IAM access to the database directly on the construct.
78
+
79
+ <Infrastructure>
80
+ <Fragment slot="cdk">
81
+
82
+ ```ts title="packages/infra/src/stacks/application-stack.ts"
83
+ import { SecurityGroup } from 'aws-cdk-lib/aws-ec2';
84
+ import { RuntimeNetworkConfiguration } from 'aws-cdk-lib/aws-bedrockagentcore';
85
+ import { MyDatabase } from '@my-scope/common-constructs';
86
+
87
+ const db = new MyDatabase(this, 'Db', { vpc, ... });
88
+
89
+ const myMcpServer = new MyMcpServer(this, 'MyMcpServer', {
90
+ networkConfiguration: RuntimeNetworkConfiguration.usingVpc(this, {
91
+ vpc,
92
+ vpcSubnets: { subnetType: SubnetType.PRIVATE_WITH_EGRESS },
93
+ securityGroups: [
94
+ new SecurityGroup(this, 'MyMcpServerSecurityGroup', { vpc, allowAllOutbound: true }),
95
+ ],
96
+ }),
97
+ });
98
+
99
+ db.allowDefaultPortFrom(myMcpServer);
100
+ db.grantConnect(myMcpServer);
101
+ ```
102
+
103
+ `allowDefaultPortFrom` opens the security group rule so the MCP server runtime can reach the database port. `grantConnect` grants IAM `rds-db:connect` permission to the server's execution role.
104
+
105
+
106
+ </Fragment>
107
+ <Fragment slot="terraform">
108
+
109
+ Run the MCP server 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:
110
+
111
+ ```hcl title="packages/infra/src/main.tf"
112
+ module "my_database" {
113
+ source = "../../common/terraform/src/app/dbs/my-database"
114
+ vpc_id = aws_vpc.main.id
115
+ database_subnet_ids = aws_subnet.database[*].id
116
+ lambda_subnet_ids = aws_subnet.private[*].id
117
+ }
118
+
119
+ module "my_mcp_server" {
120
+ source = "../../common/terraform/src/app/mcp-servers/my-mcp-server"
121
+ enable_vpc = true
122
+ vpc_id = aws_vpc.main.id
123
+ subnet_ids = aws_subnet.private[*].id
124
+
125
+ appconfig_application_id = module.runtime_config_appconfig.application_id
126
+ appconfig_application_arn = module.runtime_config_appconfig.application_arn
127
+
128
+ additional_iam_policy_statements = [
129
+ {
130
+ Effect = "Allow"
131
+ Action = ["rds-db:connect"]
132
+ Resource = [
133
+ "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}"
134
+ ]
135
+ }
136
+ ]
137
+ }
138
+
139
+ resource "aws_vpc_security_group_ingress_rule" "mcp_server_to_database" {
140
+ description = "Allow the MCP server runtime to connect to the database"
141
+ security_group_id = module.my_database.security_group_id
142
+ referenced_security_group_id = module.my_mcp_server.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
+ resource "aws_vpc_security_group_egress_rule" "mcp_server_to_database" {
149
+ description = "Allow outbound traffic from the MCP server runtime to the database"
150
+ security_group_id = module.my_mcp_server.security_group_id
151
+ referenced_security_group_id = module.my_database.security_group_id
152
+ from_port = module.my_database.cluster_port
153
+ to_port = module.my_database.cluster_port
154
+ ip_protocol = "tcp"
155
+ }
156
+ ```
157
+
158
+ `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:
159
+
160
+ ```hcl title="packages/infra/src/main.tf"
161
+ module "runtime_config_appconfig" {
162
+ source = "../../common/terraform/src/core/runtime-config/appconfig"
163
+
164
+ application_name = "my-app-runtime-config"
165
+ namespaces = ["connection", "agentcore", "database"]
166
+ }
167
+ ```
168
+
169
+ </Fragment>
170
+ </Infrastructure>
171
+
172
+ ### SSL Requirements When Connecting Without RDS Proxy
173
+
174
+ When the MCP server connects directly to the Aurora cluster (without RDS Proxy), the connection generator updates the generated MCP server Dockerfile to install the Amazon RDS CA bundle into the system trust store:
175
+
176
+ ```dockerfile
177
+ ADD https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem /usr/local/share/ca-certificates/rds-global-bundle.crt
178
+ RUN update-ca-certificates
179
+ ```
180
+
181
+ When using RDS Proxy, you do not need to configure the RDS CA bundle in the MCP server runtime.
182
+
183
+ ## Local Development
184
+
185
+ <NxCommands commands={["<mcp-server-name>-dev <project-name>"]} />
186
+
187
+ This starts the MCP server 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,112 @@
1
+ ---
2
+ title: React Website to AgentCore Gateway
3
+ description: Connect a React website to agents through an AgentCore Gateway
4
+ when:
5
+ sourceType: ts#react-website
6
+ targetType: agentcore-gateway
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 can connect a <Link path="guides/react-website">React website</Link> to the agents fronted by an <Link path="guides/agentcore-gateway">AgentCore Gateway</Link> generated with `protocol: http`.
16
+
17
+ The browser talks only to the Gateway — requests to `<gatewayUrl>/<targetName>/invocations` are proxied to the agent runtime behind it. Because the website never needs to reach the runtimes directly, the agents can be deployed inside a VPC, with the Gateway as the single governed entry point providing authentication and observability.
18
+
19
+ ## Prerequisites
20
+
21
+ Before using this generator, ensure you have:
22
+
23
+ 1. A <Link path="guides/react-website">React website</Link> project
24
+ 2. An <Link path="guides/agentcore-gateway">`agentcore-gateway`</Link> project generated with `protocol: http`
25
+ 3. At least one AG-UI or HTTP agent attached to the Gateway via the <Link path="guides/connection/agentcore-gateway-agent">Gateway to agent connection generator</Link>
26
+
27
+ The generator creates a website client for **each** AG-UI or HTTP agent attached to the Gateway (A2A targets are skipped — they speak agent-to-agent JSON-RPC, not a browser protocol). It generates the same clients as connecting the website to each agent directly (<Link path="guides/connection/react-agui">AG-UI/CopilotKit</Link> for AG-UI agents, an <Link path="guides/connection/react-py-agent">OpenAPI client</Link> for Python HTTP agents), routed through the Gateway rather than at the runtime.
28
+
29
+ :::note[Authentication]
30
+ The browser authenticates with the **Gateway**, not the agents: SigV4 for an IAM Gateway (via the website's Cognito identity pool), or a JWT bearer token for a Cognito Gateway.
31
+ :::
32
+
33
+ ## Usage
34
+
35
+ ### Run the Generator
36
+
37
+ <RunGenerator generator="connection" />
38
+
39
+ Select the website project as the source and the Gateway project as the target.
40
+
41
+ ### Options
42
+
43
+ <GeneratorParameters generator="connection" />
44
+
45
+ ## Generator Output
46
+
47
+ For each fronted AG-UI agent, the same files as the <Link path="guides/connection/react-agui">React to AG-UI agent connection</Link> are generated (an `AguiProvider`, a `useAgui<Agent>` hook and a themed CopilotKit component module), with the hook reading the Gateway's URL from runtime configuration:
48
+
49
+ <FileTree>
50
+
51
+ - packages/\<website>/src
52
+ - components
53
+ - AguiProvider.tsx CopilotKit provider registering each agent
54
+ - copilot/ Themed chat components
55
+ - hooks
56
+ - useAgui\<Agent>.tsx Connects to the agent via the Gateway's `/<targetName>/invocations` route
57
+
58
+ </FileTree>
59
+
60
+ For each fronted Python HTTP agent, the same files as the <Link path="guides/connection/react-py-agent">React to Python agent connection</Link> are generated (a type-safe OpenAPI client, hooks, and a provider), with the client's base URL routed through the Gateway.
61
+
62
+ The Gateway's URL is registered in the `connection.gateways.<GatewayClassName>` namespace of <Link path="guides/runtime-config">Runtime Configuration</Link>, so it is published to the website's `runtime-config.json`.
63
+
64
+ ## Granting website users access
65
+
66
+ For an **IAM** Gateway, grant the website's authenticated users permission to invoke it (a **Cognito** Gateway needs no grant — the browser authenticates with its JWT bearer token instead):
67
+
68
+ <Infrastructure>
69
+ <Fragment slot="cdk">
70
+ ```ts title="packages/infra/src/stacks/application-stack.ts" {6}
71
+ const identity = new UserIdentity(this, 'UserIdentity');
72
+ new Website(this, 'Website');
73
+
74
+ const myGateway = new MyGateway(this, 'MyGateway');
75
+ myGateway.addAgent(myAgent);
76
+ myGateway.grantInvokeAccess(identity.identityPool.authenticatedRole);
77
+ ```
78
+ </Fragment>
79
+ <Fragment slot="terraform">
80
+ ```hcl title="packages/infra/src/main.tf"
81
+ resource "aws_iam_policy" "gateway_invoke_policy" {
82
+ name = "GatewayInvokePolicy"
83
+
84
+ policy = jsonencode({
85
+ Version = "2012-10-17"
86
+ Statement = [
87
+ {
88
+ Effect = "Allow"
89
+ Action = ["bedrock-agentcore:InvokeGateway"]
90
+ Resource = [module.my_gateway.gateway_arn]
91
+ }
92
+ ]
93
+ })
94
+ }
95
+
96
+ resource "aws_iam_role_policy_attachment" "authenticated_gateway_access" {
97
+ role = module.user_identity.authenticated_role_name
98
+ policy_arn = aws_iam_policy.gateway_invoke_policy.arn
99
+ }
100
+ ```
101
+ </Fragment>
102
+ </Infrastructure>
103
+
104
+ ## Local Development
105
+
106
+ The website's `dev` target gains a dependency on the Gateway project's `dev` target, which starts the local gateway plus every attached agent. The website's runtime configuration is overridden in `local-dev` mode to point the Gateway's URL at the local gateway, so the browser exercises the same `/<targetName>/invocations` routes locally:
107
+
108
+ <NxCommands commands={["dev <website-name>"]} />
109
+
110
+ ## Connecting new agents
111
+
112
+ The generator connects the website to the agents attached to the Gateway **at the time it runs**. After attaching another agent to the Gateway, re-run the connection generator to generate its website client — existing clients are left untouched.
@@ -2,7 +2,7 @@
2
2
  title: React to AG-UI Agent
3
3
  description: Connect a React website to an Agent via the AG-UI protocol using CopilotKit
4
4
  when:
5
- sourceType: react
5
+ sourceType: ts#react-website
6
6
  targetType:
7
7
  - ts#agent
8
8
  - py#agent
@@ -22,7 +22,7 @@ Nx Plugin for AWS provides a generator to connect a React website to an Agent th
22
22
  Before using this generator, ensure you have:
23
23
 
24
24
  1. A React website (generated using the <Link path="guides/react-website">`ts#website` generator</Link>)
25
- 2. A TypeScript or Python Agent with `protocol=AG-UI` (generated using the <Link path="guides/ts-agent">`ts#agent`</Link> or <Link path="guides/py-agent">`py#agent`</Link> generator)
25
+ 2. A TypeScript or Python Agent with `protocol=ag-ui` (generated using the <Link path="guides/ts-agent">`ts#agent`</Link> or <Link path="guides/py-agent">`py#agent`</Link> generator)
26
26
  3. For deployed agents, Cognito Auth added via the <Link path="/guides/react-website-auth">`ts#website#auth` generator</Link>
27
27
 
28
28
  ## Usage
@@ -47,8 +47,8 @@ The generator creates a **single shared** `AguiProvider` component, one hook per
47
47
  - components
48
48
  - AguiProvider.tsx Single `CopilotKitProvider` for every AG-UI agent. Created on the first `connection` run and updated on subsequent runs to register each new agent.
49
49
  - copilot
50
- - index.tsx Re-exports `CopilotChat`, `CopilotSidebar` and `CopilotPopup` with slot defaults that match your website's `uxProvider` (Cloudscape, Shadcn, or no theme at all).
51
- - *ThemeComponents*.tsx Per-slot theme components (e.g. `CloudscapeAssistantMessage.tsx`, `ShadcnChatInput.tsx`). Only vended when `uxProvider` is `Cloudscape` or `Shadcn`.
50
+ - index.tsx Re-exports `CopilotChat`, `CopilotSidebar` and `CopilotPopup` with slot defaults that match your website's `ux` (Cloudscape, Shadcn, or no theme at all).
51
+ - *ThemeComponents*.tsx Per-slot theme components (e.g. `CloudscapeAssistantMessage.tsx`, `ShadcnChatInput.tsx`). Only vended when `ux` is `cloudscape` or `shadcn`.
52
52
  - hooks
53
53
  - useAgui\<AgentName>.tsx Registers one AG-UI agent. One file per `connection` run.
54
54
  - useSigV4.tsx SigV4 signing (IAM only)
@@ -71,7 +71,7 @@ The following dependencies are added to the root `package.json`:
71
71
  Each `useAgui<AgentName>` hook reads its agent's runtime value from <Link path="guides/runtime-config">Runtime Configuration</Link> and instantiates an `@ag-ui/client` `HttpAgent`:
72
72
 
73
73
  - **Deployed**: the runtime value is a Bedrock AgentCore Runtime ARN, which is converted to the AgentCore HTTPS endpoint: `https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<encoded-arn>/invocations?qualifier=DEFAULT`
74
- - **Local development**: `serve-local` overrides the value to the agent's local URL (e.g. `http://localhost:8081`)
74
+ - **Local development**: `dev` overrides the value to the agent's local URL (e.g. `http://localhost:8081`)
75
75
 
76
76
  The shared `AguiProvider` calls every generated hook and spreads each one into `selfManagedAgents` on a single `CopilotKitProvider`, which exposes them all to CopilotKit components.
77
77
 
@@ -92,6 +92,25 @@ The generated code handles authentication depending on your agent's configuratio
92
92
  - **IAM** (default): uses AWS SigV4-signed HTTP requests. Credentials are obtained from the Cognito Identity Pool configured with your website's auth.
93
93
  - **Cognito**: embeds the JWT access token in the `Authorization` header as a Bearer token.
94
94
 
95
+ ### Sessions and Threads
96
+
97
+ AG-UI and AgentCore Runtime each identify a conversation differently, and the generated hook ties them together:
98
+
99
+ - **`threadId`** — the AG-UI conversation identifier, sent in the request body. CopilotKit generates a random UUID per chat unless you pass an explicit `threadId`.
100
+ - **Session ID** — the AgentCore Runtime session, sent in the `X-Amzn-Bedrock-AgentCore-Runtime-Session-Id` header. It selects the [microVM](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-how-it-works.html) serving the request, and is what your agent's `session.ts` / `session.py` keys conversation state on.
101
+
102
+ The hook derives the session ID from the thread ID, right-padding it to the 33 characters AgentCore Runtime requires:
103
+
104
+ ```ts
105
+ function agentCoreSessionId(input: RunAgentInput): string {
106
+ return (input.threadId ?? '').padEnd(33, '0');
107
+ }
108
+ ```
109
+
110
+ Leaving `threadId` unset is simplest — CopilotKit's generated UUID is already 36 characters. If you pass one explicitly, make it at least 33 characters, since padding maps thread IDs that differ only in trailing characters onto the same session.
111
+
112
+ Both Session ID and Thread ID are provided by the browser. To restrict each user to their own conversations, refer to the <Link path="guides/py-agent">`py#agent`</Link> or <Link path="guides/ts-agent">`ts#agent`</Link> guide.
113
+
95
114
  ## Infrastructure
96
115
 
97
116
  <Snippet name="connection/react-agent-infrastructure" parentHeading="Infrastructure" />
@@ -102,7 +121,7 @@ The generated code handles authentication depending on your agent's configuratio
102
121
 
103
122
  Instantiate CopilotKit components with `agentId` to select which agent to use. The id is the agent's name — the same one you chose when you ran the <Link path="guides/ts-agent">`ts#agent`</Link> or <Link path="guides/py-agent">`py#agent`</Link> generator — and you can also find it in the generated hook file (e.g. the key returned from `packages/web/src/hooks/useAgui<AgentName>.tsx`).
104
123
 
105
- Import the chat components from the generated `./components/copilot` module so the theme that matches your website's `uxProvider` is applied automatically:
124
+ Import the chat components from the generated `./components/copilot` module so the theme that matches your website's `ux` is applied automatically:
106
125
 
107
126
  ```tsx
108
127
  import { CopilotChat } from './components/copilot';
@@ -137,13 +156,13 @@ import { CopilotChat } from './components/copilot';
137
156
 
138
157
  ### Built-in Themes
139
158
 
140
- The generator reads `metadata.uxProvider` from your React website project and vends a themed wrapper module at `src/components/copilot/index.tsx` so the chat components match the rest of your UI without any extra configuration:
159
+ The generator reads `metadata.ux` from your React website project and vends a themed wrapper module at `src/components/copilot/index.tsx` so the chat components match the rest of your UI without any extra configuration:
141
160
 
142
- | `uxProvider` | Styling applied to `CopilotChat` / `CopilotSidebar` / `CopilotPopup` |
161
+ | `ux` | Styling applied to `CopilotChat` / `CopilotSidebar` / `CopilotPopup` |
143
162
  | ------------ | -------------------------------------------------------------------- |
144
- | `Cloudscape` | Messages render inside Cloudscape `ChatBubble`s with gen-AI `Avatar`s (matching the [Cloudscape generative AI chat pattern](https://cloudscape.design/patterns/genai/generative-AI-chat/)); the typing indicator becomes a `LoadingBar` and the input is a `PromptInput`. Built from `@cloudscape-design/components` and `@cloudscape-design/chat-components`. |
145
- | `Shadcn` | Assistant messages render in a `bg-muted` bubble with a `Sparkles` avatar; user messages render right-aligned in a `bg-primary` bubble with a `User` avatar. The input is a rounded `Textarea` + pill-shaped send/stop `Button` (Enter submits, Shift+Enter newlines). Uses shadcn primitives from the shared `common-shadcn` package. |
146
- | `None` (or anything else) | No theme — the module just re-exports the default CopilotKit components. |
163
+ | `cloudscape` | Messages render inside Cloudscape `ChatBubble`s with gen-AI `Avatar`s (matching the [Cloudscape generative AI chat pattern](https://cloudscape.design/patterns/genai/generative-AI-chat/)); the typing indicator becomes a `LoadingBar` and the input is a `PromptInput`. Built from `@cloudscape-design/components` and `@cloudscape-design/chat-components`. |
164
+ | `shadcn` | Assistant messages render in a `bg-muted` bubble with a `Sparkles` avatar; user messages render right-aligned in a `bg-primary` bubble with a `User` avatar. The input is a rounded `Textarea` + pill-shaped send/stop `Button` (Enter submits, Shift+Enter newlines). Uses shadcn primitives from the shared `common-shadcn` package. |
165
+ | `none` (or anything else) | No theme — the module just re-exports the default CopilotKit components. |
147
166
 
148
167
  Import the themed components from the **local theme module** (not `@copilotkit/react-core/v2` directly) so the theme is applied automatically:
149
168
 
@@ -218,13 +237,13 @@ Deeper overrides follow the same shape — e.g. replace just the copy button on
218
237
 
219
238
  ## Local Development
220
239
 
221
- The connection generator automatically configures `serve-local` integration:
240
+ The connection generator automatically configures `dev` integration:
222
241
 
223
- 1. Running `nx serve-local <website>` will also start the agent's local server
242
+ 1. Running `nx dev <website>` will also start the agent's local server
224
243
  2. The runtime config is overridden to point to the local AG-UI URL (e.g. `http://localhost:8081`)
225
244
  3. Both the website and the agent hot-reload together
226
245
 
227
- <NxCommands commands={['serve-local <WebsiteProject>']} />
246
+ <NxCommands commands={['dev <WebsiteProject>']} />
228
247
 
229
248
  :::tip[Hot Reloading]
230
249
  The website and connected agent hot-reload together, enabling you to quickly iterate on both sides without deploying to AWS.
@@ -2,7 +2,7 @@
2
2
  title: React to FastAPI
3
3
  description: Connect a React website to a Python FastAPI
4
4
  when:
5
- sourceType: react
5
+ sourceType: ts#react-website
6
6
  targetType: py#fast-api
7
7
  ---
8
8
 
@@ -115,9 +115,9 @@ Whenever you make changes to your FastAPI, you need to rebuild your project in o
115
115
  :::
116
116
 
117
117
  :::tip[Auto-Regeneration]
118
- If you're actively working on both your React application and FastAPI together, use the React application's `serve-local` target which will automatically regenerate the client whenever your API changes, as well as hot-reloading your website and local FastAPI server:
118
+ If you're actively working on both your React application and FastAPI together, use the React application's `dev` target which will automatically regenerate the client whenever your API changes, as well as hot-reloading your website and local FastAPI server:
119
119
 
120
- <NxCommands commands={['serve-local <WebsiteProject>']} />
120
+ <NxCommands commands={['dev <WebsiteProject>']} />
121
121
 
122
122
  For more fine-grained control, you can use the `watch-generate:<ApiName>-client` target for your React application to regenerate the client every time you make API changes:
123
123
 
@@ -312,6 +312,42 @@ function CreateItemForm() {
312
312
  ```
313
313
  </Drawer>
314
314
 
315
+ ### File Uploads
316
+
317
+ For endpoints that accept a file upload, the generated client sends the request as `FormData`. Define an operation with a `multipart/form-data` body in your FastAPI, for example using `UploadFile`:
318
+
319
+ ```python
320
+ from fastapi import UploadFile
321
+
322
+ @app.post("/files")
323
+ async def upload_file(file: UploadFile, description: str = "") -> FileMetadata:
324
+ contents = await file.read()
325
+ ...
326
+ ```
327
+
328
+ Binary fields are typed as `Blob` on the generated client, and other fields (such as `description` above) keep their modelled types. Pass a `Blob` or `File` — for example one obtained from an `<input type="file">`:
329
+
330
+ ```tsx {9-12}
331
+ import { useMutation } from '@tanstack/react-query';
332
+ import { useMyApi } from './hooks/useMyApi';
333
+
334
+ function UploadForm() {
335
+ const api = useMyApi();
336
+ const uploadFile = useMutation(api.uploadFile.mutationOptions());
337
+
338
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
339
+ const file = e.target.files?.[0];
340
+ if (file) {
341
+ uploadFile.mutate({ file, description: file.name });
342
+ }
343
+ };
344
+
345
+ return <input type="file" onChange={handleChange} />;
346
+ }
347
+ ```
348
+
349
+ The client builds a `FormData` body and lets `fetch` set the `Content-Type` (including the multipart boundary) automatically.
350
+
315
351
  ### Pagination with Infinite Queries
316
352
 
317
353
  For endpoints that accept a `cursor` parameter as input, the generated hooks provide support for infinite queries using TanStack Query's `useInfiniteQuery` hook. This makes it easy to implement "load more" or infinite scrolling functionality.
@@ -2,7 +2,7 @@
2
2
  title: React to Python Agent
3
3
  description: Connect a React website to a Python Agent
4
4
  when:
5
- sourceType: react
5
+ sourceType: ts#react-website
6
6
  targetType: py#agent
7
7
  protocol: http
8
8
  ---
@@ -16,7 +16,7 @@ import Snippet from '@components/snippet.astro';
16
16
  Nx Plugin for AWS provides a generator to quickly integrate your <Link path="guides/py-agent">Python Agent</Link> with a React website. It sets up all necessary configuration for connecting to your agent via a type-safe OpenAPI-generated client, including AWS IAM and Cognito authentication support.
17
17
 
18
18
  :::tip[AG-UI agents]
19
- If your Python Agent was generated with `protocol=AG-UI`, the connection generator instead wires up [CopilotKit](https://docs.copilotkit.ai/aws-strands) and an [`@ag-ui/client`](https://docs.ag-ui.com/) `HttpAgent` on the React website. See the <Link path="guides/connection/react-agui">React to AG-UI Agent</Link> guide for details.
19
+ If your Python Agent was generated with `protocol=ag-ui`, the connection generator instead wires up [CopilotKit](https://docs.copilotkit.ai/aws-strands) and an [`@ag-ui/client`](https://docs.ag-ui.com/) `HttpAgent` on the React website. See the <Link path="guides/connection/react-agui">React to AG-UI Agent</Link> guide for details.
20
20
  :::
21
21
 
22
22
  ## Prerequisites
@@ -24,7 +24,7 @@ If your Python Agent was generated with `protocol=AG-UI`, the connection generat
24
24
  Before using this generator, ensure you have:
25
25
 
26
26
  1. A React website (generated using the <Link path="guides/react-website">`ts#website` generator</Link>)
27
- 2. A Python Agent with `protocol=HTTP` (generated using the <Link path="guides/py-agent">`py#agent` generator</Link>)
27
+ 2. A Python Agent with `protocol=http` (generated using the <Link path="guides/py-agent">`py#agent` generator</Link>)
28
28
  3. Cognito Auth added via the <Link path="/guides/react-website-auth">`ts#website#auth` generator</Link>
29
29
 
30
30
  ## Usage
@@ -122,11 +122,8 @@ function ChatComponent() {
122
122
  },
123
123
  }));
124
124
 
125
- const handleSend = (message: string) => {
126
- invoke.mutate({
127
- prompt: message,
128
- sessionId: 'my-session',
129
- });
125
+ const handleSend = (prompt: string) => {
126
+ invoke.mutate({ prompt });
130
127
  };
131
128
 
132
129
  return (
@@ -154,12 +151,9 @@ function ChatComponent() {
154
151
  const client = useMyAgentClient();
155
152
  const [chunks, setChunks] = useState<StreamChunk[]>([]);
156
153
 
157
- const handleSend = async (message: string) => {
154
+ const handleSend = async (prompt: string) => {
158
155
  setChunks([]);
159
- for await (const chunk of client.invoke({
160
- prompt: message,
161
- sessionId: 'my-session',
162
- })) {
156
+ for await (const chunk of client.invoke({ prompt })) {
163
157
  setChunks((prev) => [...prev, chunk]);
164
158
  }
165
159
  };
@@ -177,13 +171,13 @@ function ChatComponent() {
177
171
 
178
172
  ## Local Development
179
173
 
180
- The connection generator automatically configures `serve-local` integration:
174
+ The connection generator automatically configures `dev` integration:
181
175
 
182
- 1. Running `nx serve-local <website>` will also start the agent's local FastAPI server
176
+ 1. Running `nx dev <website>` will also start the agent's local FastAPI server
183
177
  2. The runtime config is overridden to point to the local HTTP URL (e.g., `http://localhost:8081/`)
184
178
  3. The TypeScript client is automatically regenerated when the agent's API changes
185
179
 
186
- <NxCommands commands={['serve-local <WebsiteProject>']} />
180
+ <NxCommands commands={['dev <WebsiteProject>']} />
187
181
 
188
182
  :::tip[Hot Reloading]
189
183
  The website and connected agent will hot-reload, enabling you to quickly iterate on both together without deploying to AWS.
@@ -2,8 +2,8 @@
2
2
  title: React to Smithy API
3
3
  description: Connect a React website to a Smithy TypeScript API
4
4
  when:
5
- sourceType: react
6
- targetType: smithy
5
+ sourceType: ts#react-website
6
+ targetType: ts#smithy-api
7
7
  ---
8
8
 
9
9
  import { FileTree, Steps } from '@astrojs/starlight/components';
@@ -21,7 +21,7 @@ The `connection` generator provides a way to quickly integrate your React websit
21
21
  Before using this generator, ensure your React application has:
22
22
 
23
23
  1. A `main.tsx` file that renders your application
24
- 2. A working Smithy TypeScript API backend (generated using the <Link path="/guides/ts-smithy-api">`ts#smithy-api` generator</Link>)
24
+ 2. A working Smithy TypeScript API backend (generated using the <Link path="/guides/ts-smithy-api">`ts#api` generator</Link> with `--framework=smithy`)
25
25
  3. Cognito Auth added via the <Link path="/guides/react-website-auth">`ts#website#auth` generator</Link> if connecting an API which uses Cognito or IAM auth
26
26
 
27
27
  <details>
@@ -116,9 +116,9 @@ Whenever you make changes to your Smithy API model, you need to rebuild your pro
116
116
  :::
117
117
 
118
118
  :::tip[Auto-Regeneration]
119
- If you're actively working on both your React application and Smithy API together, use the React application's `serve-local` target which will automatically regenerate the client whenever your API changes, as well as hot-reloading your website and local Smithy API server:
119
+ If you're actively working on both your React application and Smithy API together, use the React application's `dev` target which will automatically regenerate the client whenever your API changes, as well as hot-reloading your website and local Smithy API server:
120
120
 
121
- <NxCommands commands={['serve-local <WebsiteProject>']} />
121
+ <NxCommands commands={['dev <WebsiteProject>']} />
122
122
 
123
123
  For more fine-grained control, you can use the `watch-generate:<ApiName>-client` target for your React application to regenerate the client every time you make API changes:
124
124
 
@@ -2,7 +2,7 @@
2
2
  title: React to tRPC
3
3
  description: Connect a React website to a tRPC API
4
4
  when:
5
- sourceType: react
5
+ sourceType: ts#react-website
6
6
  targetType: ts#trpc-api
7
7
  ---
8
8
  import { FileTree } from '@astrojs/starlight/components';
@@ -175,7 +175,7 @@ Subscriptions are only supported when the tRPC API uses `rest-lambda` (REST API)
175
175
 
176
176
  When connecting to a REST API tRPC backend, the generated client is automatically configured with a `splitLink` that routes subscription operations through `httpSubscriptionLink` (using SSE) and regular queries/mutations through `httpLink`. This means subscriptions work out of the box with no additional configuration.
177
177
 
178
- For information on how to define subscription procedures in your backend, see the <Link path="guides/trpc">`ts#trpc-api` generator guide</Link>.
178
+ For information on how to define subscription procedures in your backend, see the <Link path="guides/trpc">tRPC API generator guide</Link>.
179
179
 
180
180
  #### Using the useSubscription Hook
181
181