@aws/nx-plugin-mcp 1.0.0-rc.7 → 1.0.0-rc.71

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 (195) hide show
  1. package/bin/aws-nx-mcp.js +12317 -10933
  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 +1301 -0
  9. package/docs/get_started/tutorials/dungeon-game/2.mdx +237 -0
  10. package/docs/get_started/tutorials/dungeon-game/3.mdx +76 -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/tutorials/existing-project.mdx +4 -0
  15. package/docs/get_started/upgrading.mdx +147 -0
  16. package/docs/guides/agentcore-gateway.mdx +490 -0
  17. package/docs/guides/agentcore-harness.mdx +275 -0
  18. package/docs/guides/astro-docs.mdx +8 -0
  19. package/docs/guides/connection/agentcore-gateway-agent.mdx +222 -0
  20. package/docs/guides/connection/agentcore-gateway-gateway.mdx +154 -0
  21. package/docs/guides/connection/agentcore-gateway-mcp.mdx +134 -0
  22. package/docs/guides/connection/py-agent-a2a.mdx +48 -16
  23. package/docs/guides/connection/py-agent-dynamodb.mdx +116 -0
  24. package/docs/guides/connection/py-agent-gateway.mdx +178 -0
  25. package/docs/guides/connection/py-agent-mcp.mdx +43 -14
  26. package/docs/guides/connection/py-agent-rdb.mdx +178 -0
  27. package/docs/guides/connection/py-fast-api-dynamodb.mdx +56 -0
  28. package/docs/guides/connection/py-fast-api-rdb.mdx +184 -0
  29. package/docs/guides/connection/py-mcp-server-dynamodb.mdx +116 -0
  30. package/docs/guides/connection/py-mcp-server-rdb.mdx +187 -0
  31. package/docs/guides/connection/react-agentcore-gateway.mdx +112 -0
  32. package/docs/guides/connection/react-agui.mdx +13 -13
  33. package/docs/guides/connection/react-fastapi.mdx +38 -2
  34. package/docs/guides/connection/react-py-agent.mdx +9 -15
  35. package/docs/guides/connection/react-smithy.mdx +3 -3
  36. package/docs/guides/connection/react-trpc.mdx +1 -1
  37. package/docs/guides/connection/react-ts-agent.mdx +8 -8
  38. package/docs/guides/connection/smithy-dynamodb.mdx +5 -5
  39. package/docs/guides/connection/smithy-rdb.mdx +9 -9
  40. package/docs/guides/connection/trpc-dynamodb.mdx +5 -5
  41. package/docs/guides/connection/trpc-rdb.mdx +6 -6
  42. package/docs/guides/connection/ts-agent-a2a.mdx +14 -11
  43. package/docs/guides/connection/ts-agent-dynamodb.mdx +5 -5
  44. package/docs/guides/connection/ts-agent-gateway.mdx +143 -0
  45. package/docs/guides/connection/ts-agent-mcp.mdx +12 -9
  46. package/docs/guides/connection/ts-agent-rdb.mdx +70 -25
  47. package/docs/guides/connection/ts-mcp-server-dynamodb.mdx +5 -5
  48. package/docs/guides/connection/ts-mcp-server-rdb.mdx +68 -18
  49. package/docs/guides/connection.mdx +122 -5
  50. package/docs/guides/docker-bundling.mdx +69 -12
  51. package/docs/guides/fastapi.mdx +249 -9
  52. package/docs/guides/local-development.mdx +87 -0
  53. package/docs/guides/nx-generator.mdx +4 -3
  54. package/docs/guides/nx-migration.mdx +165 -0
  55. package/docs/guides/py-agent.mdx +264 -49
  56. package/docs/guides/py-dynamodb.mdx +476 -0
  57. package/docs/guides/py-mcp-server.mdx +61 -2
  58. package/docs/guides/py-rdb.mdx +265 -0
  59. package/docs/guides/python-lambda-function.mdx +1 -1
  60. package/docs/guides/react-website-auth.mdx +65 -4
  61. package/docs/guides/react-website.mdx +149 -30
  62. package/docs/guides/runtime-config.mdx +1 -1
  63. package/docs/guides/security.mdx +75 -0
  64. package/docs/guides/smithy-project.mdx +167 -0
  65. package/docs/guides/terraform-project.mdx +2 -2
  66. package/docs/guides/trpc.mdx +53 -16
  67. package/docs/guides/ts-agent.mdx +183 -10
  68. package/docs/guides/ts-dcr-proxy.mdx +569 -0
  69. package/docs/guides/ts-dynamodb.mdx +66 -242
  70. package/docs/guides/ts-lambda-function.mdx +1 -1
  71. package/docs/guides/ts-mcp-server.mdx +109 -29
  72. package/docs/guides/ts-nx-plugin.mdx +3 -3
  73. package/docs/guides/ts-rdb.mdx +113 -467
  74. package/docs/guides/ts-smithy-api.mdx +258 -18
  75. package/docs/guides/typescript-infrastructure.mdx +46 -24
  76. package/docs/guides/typescript-project.mdx +134 -27
  77. package/docs/guides/workspace.mdx +10 -3
  78. package/docs/snippets/agent/architecture.mdx +1 -1
  79. package/docs/snippets/agent/bedrock-deployment.mdx +9 -5
  80. package/docs/snippets/agent/runtime-arn.mdx +23 -2
  81. package/docs/snippets/agent/securing-your-agent.mdx +39 -0
  82. package/docs/snippets/api/access-logging.mdx +33 -0
  83. package/docs/snippets/api/cors-configuration-cdk-note.mdx +1 -1
  84. package/docs/snippets/api/cors-configuration-terraform-note.mdx +1 -1
  85. package/docs/snippets/api/type-safe-api-integrations.mdx +33 -2
  86. package/docs/snippets/api/waf-configuration.mdx +3 -3
  87. package/docs/snippets/connection/a2a-infrastructure.mdx +1 -1
  88. package/docs/snippets/connection/dynamodb-local-development.mdx +2 -2
  89. package/docs/snippets/connection/lambda-dynamodb-access.mdx +1 -1
  90. package/docs/snippets/connection/py-dynamodb-local-development.mdx +7 -0
  91. package/docs/snippets/connection/py-lambda-rdb-ssl-requirements.mdx +7 -0
  92. package/docs/snippets/connection/rdb-api-infrastructure.mdx +51 -19
  93. package/docs/snippets/dynamodb/deploying-table.mdx +166 -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/pdk-migration/example/01-migrate-api.mdx +7 -5
  103. package/docs/snippets/pdk-migration/example/02-migrate-website.mdx +29 -10
  104. package/docs/snippets/pdk-migration/example/03-migrate-infra.mdx +4 -4
  105. package/docs/snippets/pdk-migration/faq/type-safe-api.mdx +5 -111
  106. package/docs/snippets/prerequisites.mdx +1 -4
  107. package/docs/snippets/rdb/architecture.mdx +38 -0
  108. package/docs/snippets/rdb/cluster-instances.mdx +31 -0
  109. package/docs/snippets/rdb/deletion-protection.mdx +34 -0
  110. package/docs/snippets/rdb/deploying.mdx +187 -0
  111. package/docs/snippets/rdb/encryption-key-rotation.mdx +30 -0
  112. package/docs/snippets/rdb/engine-version.mdx +63 -0
  113. package/docs/snippets/rdb/infrastructure.mdx +35 -0
  114. package/docs/snippets/rdb/logging-mysql.mdx +5 -0
  115. package/docs/snippets/rdb/logging-postgres.mdx +5 -0
  116. package/docs/snippets/rdb/performance-insights.mdx +34 -0
  117. package/docs/snippets/rdb/rds-proxy.mdx +50 -0
  118. package/docs/snippets/rdb/removal-policy.mdx +57 -0
  119. package/docs/snippets/rdb/serverless-capacity.mdx +32 -0
  120. package/docs/snippets/recommended-prerequisites.mdx +10 -0
  121. package/docs/snippets/required-prerequisites.mdx +1 -4
  122. package/docs/snippets/runtime-config-app-id-note.mdx +8 -0
  123. package/docs/snippets/shared-constructs.mdx +1 -1
  124. package/docs/snippets/trivy-image-scan.mdx +37 -0
  125. package/generators.json +152 -10
  126. package/package.json +1 -1
  127. package/src/agentcore-gateway/agent-connection/schema.json +31 -0
  128. package/src/agentcore-gateway/gateway-connection/schema.json +31 -0
  129. package/src/agentcore-gateway/mcp-connection/schema.json +31 -0
  130. package/src/agentcore-gateway/react-connection/schema.json +31 -0
  131. package/src/agentcore-gateway/schema.json +72 -0
  132. package/src/agentcore-harness/schema.json +53 -0
  133. package/src/connection/schema.json +5 -0
  134. package/src/infra/app/schema.json +5 -0
  135. package/src/init/schema.json +35 -0
  136. package/src/internal/test-matrix/schema.json +21 -0
  137. package/src/license/schema.json +5 -0
  138. package/src/preset/schema.json +16 -5
  139. package/src/py/agent/a2a-connection/schema.json +5 -0
  140. package/src/py/agent/gateway-connection/schema.json +31 -0
  141. package/src/py/agent/mcp-connection/schema.json +5 -0
  142. package/src/py/agent/react-connection/schema.json +5 -0
  143. package/src/py/agent/schema.json +15 -1
  144. package/src/py/api/schema.json +5 -0
  145. package/src/py/dynamodb/agent-connection/schema.json +27 -0
  146. package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
  147. package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
  148. package/src/py/dynamodb/schema.json +76 -0
  149. package/src/py/fast-api/react/schema.json +5 -0
  150. package/src/py/fast-api/schema.json +6 -0
  151. package/src/py/lambda-function/schema.json +5 -0
  152. package/src/py/mcp-server/schema.json +6 -0
  153. package/src/py/project/schema.json +5 -0
  154. package/src/py/rdb/agent-connection/schema.json +27 -0
  155. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  156. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  157. package/src/py/rdb/schema.json +78 -0
  158. package/src/smithy/project/schema.json +28 -1
  159. package/src/smithy/react-connection/schema.json +5 -0
  160. package/src/smithy/ts/api/schema.json +6 -0
  161. package/src/terraform/project/schema.json +5 -0
  162. package/src/trpc/backend/schema.json +6 -0
  163. package/src/trpc/react/schema.json +5 -0
  164. package/src/ts/agent/a2a-connection/schema.json +5 -0
  165. package/src/ts/agent/gateway-connection/schema.json +31 -0
  166. package/src/ts/agent/mcp-connection/schema.json +5 -0
  167. package/src/ts/agent/react-connection/schema.json +5 -0
  168. package/src/ts/agent/schema.json +14 -0
  169. package/src/ts/api/schema.json +5 -0
  170. package/src/ts/astro-docs/schema.json +3 -3
  171. package/src/ts/dcr-proxy/schema.json +44 -0
  172. package/src/ts/docs/schema.json +3 -3
  173. package/src/ts/dynamodb/agent-connection/schema.json +5 -0
  174. package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
  175. package/src/ts/dynamodb/schema.json +26 -2
  176. package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
  177. package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
  178. package/src/ts/lambda-function/schema.json +5 -0
  179. package/src/ts/lib/schema.json +5 -0
  180. package/src/ts/mcp-server/schema.json +6 -0
  181. package/src/ts/nx-generator/schema.json +5 -0
  182. package/src/ts/nx-migration/schema.json +63 -0
  183. package/src/ts/nx-plugin/schema.json +5 -0
  184. package/src/ts/rdb/agent-connection/schema.json +5 -0
  185. package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
  186. package/src/ts/rdb/schema.json +7 -1
  187. package/src/ts/rdb/smithy-connection/schema.json +5 -0
  188. package/src/ts/rdb/trpc-connection/schema.json +5 -0
  189. package/src/ts/react-website/app/schema.json +12 -6
  190. package/src/ts/react-website/cognito-auth/schema.json +5 -0
  191. package/src/ts/react-website/runtime-config/schema.json +5 -0
  192. package/src/ts/website/app/schema.json +11 -6
  193. package/src/ts/website/auth/schema.json +5 -0
  194. /package/docs/snippets/connection/{lambda-rdb-ssl-requirements.mdx → ts-lambda-rdb-ssl-requirements.mdx} +0 -0
  195. /package/docs/snippets/connection/{mcp-server-rdb-ssl-requirements.mdx → ts-mcp-server-rdb-ssl-requirements.mdx} +0 -0
@@ -0,0 +1,275 @@
1
+ ---
2
+ title: AgentCore Harness
3
+ description: Create an Amazon Bedrock AgentCore Harness project
4
+ generator: agentcore-harness
5
+ ---
6
+
7
+ import { FileTree } from '@astrojs/starlight/components';
8
+ import GeneratorParameters from '@components/generator-parameters.astro';
9
+ import Infrastructure from '@components/infrastructure.astro';
10
+ import Link from '@components/link.astro';
11
+ import NxCommands from '@components/nx-commands.astro';
12
+ import RunGenerator from '@components/run-generator.astro';
13
+ import Snippet from '@components/snippet.astro';
14
+
15
+ Generate an [Amazon Bedrock AgentCore Harness](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/harness.html) project. A Harness is a managed agent loop powered by Strands Agents: it owns deployment defaults for the model, system prompt, tools, memory, skills, environments, truncation, authorization, and execution limits, while the service accepts per-invocation overrides for supported fields. Reusing the same Runtime Session ID continues the same Harness session.
16
+
17
+ ## Usage
18
+
19
+ ### Generate an AgentCore Harness
20
+
21
+ <RunGenerator generator="agentcore-harness" />
22
+
23
+ ### Options
24
+
25
+ <GeneratorParameters generator="agentcore-harness" />
26
+
27
+ ## Generator Output
28
+
29
+ The generator creates a standalone project at `packages/<name>/`. Because AWS runs the agent loop for you, the project holds only the prompt that shapes it and a script for talking to it:
30
+
31
+ <FileTree>
32
+ - packages/\<name>/
33
+ - src/PROMPT.md The Harness system prompt
34
+ - scripts/chat.ts Multi-turn chat client for the deployed Harness
35
+ - project.json Adds the `chat` target
36
+ - README.md Chat and customization instructions
37
+ </FileTree>
38
+
39
+ ### Infrastructure
40
+
41
+ Infrastructure is generated when `infra` is `agentcore` (the default). With `infra: none` no infrastructure is generated — set `HARNESS_ARN` to invoke a Harness managed elsewhere, and re-run the generator with `infra: agentcore` later to add infrastructure; existing project files (including your edits) are preserved.
42
+
43
+ <Snippet name="shared-constructs" />
44
+
45
+ <Infrastructure>
46
+ <Fragment slot="cdk">
47
+ <FileTree>
48
+ - packages/common/constructs/src/app/harnesses/\<name>/
49
+ - \<name>.ts CDK construct containing the Harness and execution role
50
+ </FileTree>
51
+ </Fragment>
52
+ <Fragment slot="terraform">
53
+ <FileTree>
54
+ - packages/common/terraform/src/app/harnesses/\<name>/
55
+ - \<name>.tf Terraform module containing the Harness and execution role
56
+ </FileTree>
57
+ </Fragment>
58
+ </Infrastructure>
59
+
60
+ The generated infrastructure manages the Harness through the native resource (CDK `aws_bedrockagentcore.CfnHarness`, Terraform `aws_bedrockagentcore_harness`) with your generated defaults, creates an IAM execution role with the baseline permissions described below, and uses IAM inbound authorization (no custom JWT authorizer is configured by default).
61
+
62
+ The Harness ARN is registered at `agentcore.harnesses.<ClassName>` in <Link path="guides/runtime-config">Runtime Configuration</Link>, preserving any existing entries.
63
+
64
+ ## Deploying your AgentCore Harness
65
+
66
+ The generator creates CDK or Terraform infrastructure as code based on your selected `iac` provider. You can use this to deploy your Harness through your usual infrastructure workflow.
67
+
68
+ <Infrastructure>
69
+ <Fragment slot="cdk">
70
+ The CDK construct for deploying your Harness lives in the `common/constructs` folder. Instantiate it from a CDK application:
71
+
72
+ ```ts title="packages/infra/src/stacks/application-stack.ts"
73
+ import { MyHarness } from '@my-scope/common-constructs';
74
+ import { Stack, type StackProps } from 'aws-cdk-lib';
75
+ import type { Construct } from 'constructs';
76
+
77
+ export class ApplicationStack extends Stack {
78
+ constructor(scope: Construct, id: string, props?: StackProps) {
79
+ super(scope, id, props);
80
+
81
+ new MyHarness(this, 'MyHarness');
82
+ }
83
+ }
84
+ ```
85
+
86
+ The construct's props interface (`MyHarnessProps`) extends `Partial<Omit<CfnHarnessProps, 'executionRoleArn' | 'allowedTools'>>`, so any native Harness property can be supplied and takes precedence over the generated defaults:
87
+
88
+ ```ts
89
+ const harness = new MyHarness(this, 'MyHarness', {
90
+ maxIterations: 20,
91
+ timeoutSeconds: 600,
92
+ });
93
+ ```
94
+
95
+ The construct also accepts:
96
+
97
+ - `allowedTools` — the tools the Harness may use. The Harness deploys with none unless you supply them, see <a href="#configuring-tools">Configuring tools</a>.
98
+ - `executionRole` — an existing IAM role to use instead of the generated role. A supplied role is used as-is: the baseline permissions are not added to it, and its ARN always feeds the Harness (the raw `executionRoleArn` string cannot be overridden).
99
+ - `modelResourceArns` — the Bedrock model and inference-profile ARNs the generated execution role may invoke, replacing the default list.
100
+ - `vpc`, `vpcSubnets` and `securityGroups` — run the Harness in a VPC so it can reach private resources, see <a href="#running-in-a-vpc">Running in a VPC</a>.
101
+
102
+ Its public members are `harness` (the `CfnHarness`), `executionRole`, `grantPrincipal`, the `harnessArn` getter, `connections` (in a VPC), `addToRolePolicy(statement)` for execution role extensions, and `grantInvokeAccess(grantee)` for authorizing callers.
103
+
104
+ Deploy the stack with your infrastructure project as usual — see the <Link path="guides/typescript-infrastructure">CDK infrastructure guide</Link>.
105
+ </Fragment>
106
+ <Fragment slot="terraform">
107
+ The Terraform module for deploying your Harness is in the `common/terraform` folder. Reference it from a Terraform configuration:
108
+
109
+ ```hcl title="packages/infra/src/main.tf"
110
+ module "my_harness" {
111
+ source = "../../common/terraform/src/app/harnesses/my-harness"
112
+ }
113
+ ```
114
+
115
+ The module exposes three variables:
116
+
117
+ - `model_id` — the Bedrock model or inference profile the Harness uses by default.
118
+ - `model_resource_arns` — the Bedrock model and inference-profile ARNs the execution role may invoke, replacing the default list.
119
+ - `additional_execution_role_policy_statements` — a list of IAM statement objects (`Effect`, `Action`, `Resource`, optional `Sid` and `Condition`) appended to the execution role policy.
120
+
121
+ Everything else is configured on the generated `aws_bedrockagentcore_harness` resource in the module itself.
122
+
123
+ The module outputs `harness_id`, `harness_arn`, and `execution_role_arn`.
124
+
125
+ Deploy with your Terraform project's plan/apply workflow as usual — see the <Link path="guides/terraform-project">Terraform project guide</Link>.
126
+ </Fragment>
127
+ </Infrastructure>
128
+
129
+ :::note[System prompt visibility]
130
+ Your infrastructure reads `packages/<name>/src/PROMPT.md` when you synthesize (CDK) or plan (Terraform), so the prompt is deployment configuration rather than secret storage: its contents appear in the synthesized CloudFormation template or in Terraform state.
131
+ :::
132
+
133
+ ## Granting access to invoke the harness
134
+
135
+ You can grant a caller permissions to invoke the harness as follows:
136
+
137
+ <Infrastructure>
138
+ <Fragment slot="cdk">
139
+ ```ts
140
+ const harness = new MyHarness(this, 'MyHarness');
141
+
142
+ harness.grantInvokeAccess(caller);
143
+ ```
144
+ </Fragment>
145
+ <Fragment slot="terraform">
146
+ ```hcl
147
+ # Attach to the calling principal's role
148
+ resource "aws_iam_role_policy" "invoke_my_harness" {
149
+ name = "InvokeMyHarness"
150
+ role = aws_iam_role.caller.id
151
+
152
+ policy = jsonencode({
153
+ Version = "2012-10-17"
154
+ Statement = [{
155
+ Effect = "Allow"
156
+ Action = [
157
+ "bedrock-agentcore:InvokeHarness",
158
+ "bedrock-agentcore:InvokeAgentRuntime",
159
+ ]
160
+ Resource = [module.my_harness.harness_arn]
161
+ }]
162
+ })
163
+ }
164
+ ```
165
+ </Fragment>
166
+ </Infrastructure>
167
+
168
+ A caller needs both `bedrock-agentcore:InvokeHarness` and `bedrock-agentcore:InvokeAgentRuntime` on the Harness ARN, which is exactly what `grantInvokeAccess` grants.
169
+
170
+ ## Chatting with your Harness
171
+
172
+ The generated `chat` target runs `scripts/chat.ts`, dropping you into an interactive terminal chat with your deployed Harness:
173
+
174
+ <NxCommands commands={['run <project>:chat']} />
175
+
176
+ Every turn of a run shares one session, so the Harness keeps the conversation context until you exit. Credentials come from the standard AWS SDK credential provider chain, and the AWS Region is derived from the Harness ARN.
177
+
178
+ The Harness ARN is resolved in this order:
179
+
180
+ 1. `HARNESS_ARN` (non-empty): used directly, without reading Runtime Configuration:
181
+
182
+ <NxCommands commands={['run <project>:chat']} env={{ HARNESS_ARN: '<harness-arn>' }} />
183
+
184
+ 2. `RUNTIME_CONFIG_APP_ID`: resolves the ARN from the `agentcore.harnesses.<ClassName>` entry published by the deployed infrastructure:
185
+
186
+ <NxCommands commands={['run <project>:chat']} env={{ RUNTIME_CONFIG_APP_ID: '<application-id>' }} />
187
+
188
+ With neither set, the script fails with an error naming both options.
189
+
190
+ ## Customizing your Harness
191
+
192
+ `src/PROMPT.md` is the Harness system prompt: edit it and redeploy to change how the Harness behaves. Everything else is configured where you instantiate the infrastructure, or by editing the generated construct or module directly. Re-running the generator never overwrites existing files (it only adds missing files and merges project metadata), so your edits to the prompt and to the generated infrastructure are preserved.
193
+
194
+ <Infrastructure>
195
+ <Fragment slot="cdk">
196
+ Every native Harness property of the pinned `aws-cdk-lib/aws-bedrockagentcore` module is available through the construct's props — alternate model providers, tool definitions, memory, skills, environment configuration, truncation, custom JWT authorization, and execution limits — and explicit props take precedence over the generated defaults. Alternatively, edit the generated construct in `packages/common/constructs/src/app/harnesses/<name>/<name>.ts`.
197
+ </Fragment>
198
+ <Fragment slot="terraform">
199
+ The generated module keeps the native `aws_bedrockagentcore_harness` resource directly editable, so provider-native fields — alternate model providers (`gemini_model_config`, `openai_model_config`), `tool` blocks, `memory`, `skill` blocks, environments (`environment`, `environment_variables`, `environment_artifact`), `truncation`, and `authorizer_configuration` with a `custom_jwt_authorizer` — are configured by editing `packages/common/terraform/src/app/harnesses/<name>/<name>.tf`.
200
+ </Fragment>
201
+ </Infrastructure>
202
+
203
+ Omitting authorizer configuration (the default) means IAM inbound authorization; configure a custom JWT authorizer through the native field to change that.
204
+
205
+ ### Configuring tools
206
+
207
+ The Harness deploys with no tools, so it starts with the least capability. Opt in to the tools it may use:
208
+
209
+ <Infrastructure>
210
+ <Fragment slot="cdk">
211
+ ```ts
212
+ new MyHarness(this, 'Harness', { allowedTools: ['@builtin'] });
213
+ ```
214
+ </Fragment>
215
+ <Fragment slot="terraform">
216
+ ```hcl title="packages/common/terraform/src/app/harnesses/my-harness/my-harness.tf"
217
+ resource "aws_bedrockagentcore_harness" "this" {
218
+ # ...
219
+ allowed_tools = ["@builtin"]
220
+ }
221
+ ```
222
+
223
+ Add an `allowed_tools` variable to the module if you would rather set it as a module argument where you reference the module.
224
+ </Fragment>
225
+ </Infrastructure>
226
+
227
+ Narrow `@builtin` to specific patterns such as `@builtin/file_operations` to restrict what the agent loop can do. See [Harness tools](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/harness-tools.html) for the built-in tools you can add.
228
+
229
+ ### Running in a VPC
230
+
231
+ <Infrastructure>
232
+ <Fragment slot="cdk">
233
+ Supply a `vpc` to run the Harness inside it, so it can reach private resources such as a database. The construct implements `IConnectable`, so those resources grant it access the same way they would any other:
234
+
235
+ ```ts
236
+ const harness = new MyHarness(this, 'MyHarness', { vpc });
237
+
238
+ database.connections.allowDefaultPortFrom(harness, 'Harness to database');
239
+ ```
240
+
241
+ The Harness is placed in the VPC's private subnets with egress, in a security group created for it. Override either with `vpcSubnets` and `securityGroups`. Both require `vpc`, and `connections` is only available when the Harness runs in a VPC.
242
+ </Fragment>
243
+ <Fragment slot="terraform">
244
+ Add a `network_configuration` block to the generated `aws_bedrockagentcore_harness` resource's `environment.agent_core_runtime_environment`, then reference the security group you place it in from your other resources' rules:
245
+
246
+ ```hcl title="packages/common/terraform/src/app/harnesses/my-harness/my-harness.tf"
247
+ resource "aws_security_group" "harness" {
248
+ vpc_id = var.vpc_id
249
+ }
250
+
251
+ resource "aws_bedrockagentcore_harness" "this" {
252
+ # ...
253
+ environment {
254
+ agent_core_runtime_environment {
255
+ network_configuration {
256
+ network_mode = "VPC"
257
+ network_mode_config {
258
+ security_groups = [aws_security_group.harness.id]
259
+ subnets = var.subnet_ids
260
+ }
261
+ }
262
+ }
263
+ }
264
+ }
265
+ ```
266
+ </Fragment>
267
+ </Infrastructure>
268
+
269
+ ### Per-invocation overrides
270
+
271
+ The values configured in infrastructure are deployment defaults. The service also accepts per-invocation overrides for supported Harness fields (such as models, tools, and skills) in the `InvokeHarness` request; deployment defaults apply wherever a field is not overridden.
272
+
273
+ :::caution[Validate invocation overrides]
274
+ Per-invocation overrides are trusted inputs at the service boundary: any authorized caller can override supported fields. If untrusted users can reach an application that forwards overrides to `InvokeHarness`, validate and authorize them at the application layer (for example, allowlist models and tools), keep the execution role scoped to required resources, and do not grant `bedrock-agentcore:InvokeAgentRuntimeCommand` unless you specifically need it.
275
+ :::
@@ -86,6 +86,14 @@ When run without `--all`, the script only translates files that have changed
86
86
  since the last translation commit on the current branch — meaning you can
87
87
  safely re-run it on every docs PR without re-translating the whole site.
88
88
 
89
+ Translations whose source file no longer exists are deleted, so renaming or
90
+ removing a page does not leave stale copies behind in each locale.
91
+
92
+ Each translation is written as a whole file. The agent is given the source, the
93
+ existing translation, and a diff of what changed, and reuses the existing
94
+ wording for sections the diff left alone — so only prose the diff touched is
95
+ retranslated, and code blocks are copied from the source as-is.
96
+
89
97
  ### Configuring translation
90
98
 
91
99
  Edit `scripts/translate.config.json` to change:
@@ -0,0 +1,222 @@
1
+ ---
2
+ title: AgentCore Gateway to Agent
3
+ description: Front an agent with an AgentCore Gateway as a runtime target
4
+ when:
5
+ sourceType: agentcore-gateway
6
+ targetType:
7
+ - ts#agent
8
+ - py#agent
9
+ ---
10
+ import { FileTree } from '@astrojs/starlight/components';
11
+ import Link from '@components/link.astro';
12
+ import RunGenerator from '@components/run-generator.astro';
13
+ import GeneratorParameters from '@components/generator-parameters.astro';
14
+ import NxCommands from '@components/nx-commands.astro';
15
+ import Infrastructure from '@components/infrastructure.astro';
16
+
17
+ The `connection` generator can register an agent (either <Link path="guides/ts-agent">TypeScript</Link> or <Link path="guides/py-agent">Python</Link>) as an [AgentCore Runtime target](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-http-runtime.html) of an <Link path="guides/agentcore-gateway">AgentCore Gateway</Link> generated with `protocol: http`.
18
+
19
+ Once connected, the Gateway proxies requests for the agent under `<gatewayUrl>/<targetName>/invocations`, signing outbound traffic to the runtime with IAM SigV4. This gives your agents a single governed entry point — and since callers only need to reach the Gateway, the agent runtimes themselves can be deployed inside a VPC behind it.
20
+
21
+ ## Prerequisites
22
+
23
+ Before using this generator, ensure you have:
24
+
25
+ 1. An <Link path="guides/agentcore-gateway">`agentcore-gateway`</Link> project generated with `protocol: http`
26
+ 2. An agent component (<Link path="guides/ts-agent">`ts#agent`</Link> or <Link path="guides/py-agent">`py#agent`</Link>) created with `infra: agentcore`. Either `auth: iam` (the Gateway invokes it with its own role) or `auth: cognito` (the Gateway forwards the caller's JWT — see [Forwarding caller identity](#forwarding-caller-identity-to-the-runtime)) works.
27
+
28
+ :::caution[TypeScript HTTP agents]
29
+ A TypeScript `http` agent serves tRPC over WebSocket, and AgentCore Gateway does not support WebSocket or bidirectional streaming — the generator rejects this combination. Generate the agent with the `ag-ui` protocol instead.
30
+ :::
31
+
32
+ ## Usage
33
+
34
+ ### Run the Generator
35
+
36
+ <RunGenerator generator="connection" />
37
+
38
+ Select the Gateway project as the source and the agent project as the target. If the agent project contains multiple components, specify `targetComponent` to disambiguate.
39
+
40
+ ### Options
41
+
42
+ <GeneratorParameters generator="connection" />
43
+
44
+ ## Generator Output
45
+
46
+ The generator wires existing projects together rather than emitting new source files. The following files are modified:
47
+
48
+ <FileTree>
49
+
50
+ - packages/\<gateway>
51
+ - project.json the Gateway's `dev` target gains a dependency on the agent's `<agent>-dev`
52
+ - local-dev.ts `ATTACHED_AGENTS` updated so the local gateway proxies to the agent
53
+
54
+ </FileTree>
55
+
56
+ ## Adding the agent target to your stack
57
+
58
+ The generator **cannot** automatically wire the agent target into your infrastructure because it doesn't know which stack or module instantiates the Gateway. Add a single call to `gateway.addAgent(agent)` yourself.
59
+
60
+ <Infrastructure>
61
+ <Fragment slot="cdk">
62
+ In the stack where you instantiate the Gateway, register the agent as a target:
63
+
64
+ ```ts title="packages/infra/src/stacks/application-stack.ts" {5-8}
65
+ const myAgent = new MyAgent(this, 'MyAgent');
66
+ const myGateway = new MyGateway(this, 'MyGateway');
67
+
68
+ // Register the agent as a runtime target of the Gateway. The target name
69
+ // defaults to the agent's `agentName` (its class name in kebab-case,
70
+ // e.g. `MyAgent` -> `my-agent`), and forms the target's invocation path:
71
+ // <gatewayUrl>/my-agent/invocations
72
+ myGateway.addAgent(myAgent);
73
+ ```
74
+
75
+ To override the default target name, pass `gatewayTargetName`:
76
+
77
+ ```ts
78
+ myGateway.addAgent(myAgent, { gatewayTargetName: 'my-target' });
79
+ ```
80
+
81
+ The construct grants the Gateway's execution role invoke access to the agent runtime and configures the target with the `GATEWAY_IAM_ROLE` credential provider, so the Gateway signs outbound calls with its own role.
82
+
83
+ :::tip[Deploying agents into a VPC]
84
+ Fronting an agent with a Gateway is what makes a VPC-deployed agent reachable: callers talk to the Gateway's public endpoint, and the Gateway reaches the runtime internally. Pass a VPC network configuration to the agent construct:
85
+
86
+ ```ts
87
+ import { RuntimeNetworkConfiguration } from 'aws-cdk-lib/aws-bedrockagentcore';
88
+
89
+ const myAgent = new MyAgent(this, 'MyAgent', {
90
+ // Give each agent its own scope for the network configuration — usingVpc
91
+ // creates a security group named `SecurityGroup` under the scope you pass,
92
+ // so passing `this` for more than one agent collides on the construct id.
93
+ networkConfiguration: RuntimeNetworkConfiguration.usingVpc(
94
+ new Construct(this, 'MyAgentNetwork'),
95
+ {
96
+ vpc,
97
+ vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
98
+ },
99
+ ),
100
+ });
101
+ ```
102
+
103
+ Use a **private subnet with egress**, not a private isolated subnet: the runtime needs outbound internet access to reach Bedrock and read its configuration from AWS AppConfig.
104
+
105
+ AgentCore Runtime VPC deployments are only supported in certain availability zones. If a deploy fails with `subnets are in unsupported availability zones`, restrict the VPC (or the subnet selection) to the supported zones for your region.
106
+ :::
107
+ </Fragment>
108
+ <Fragment slot="terraform">
109
+ In the Terraform file where you instantiate the Gateway, wire the agent target in:
110
+
111
+ ```hcl title="packages/infra/src/main.tf" {9-20,24-40}
112
+ module "my_agent" {
113
+ source = "../../common/terraform/src/app/agents/my-agent"
114
+ # ...
115
+ }
116
+
117
+ module "my_gateway" {
118
+ source = "../../common/terraform/src/app/gateways/my-gateway"
119
+
120
+ # The Gateway signs outbound calls to the runtime with its own role and
121
+ # validates access at target creation, so it needs invoke access first.
122
+ additional_iam_policy_statements = [
123
+ {
124
+ Effect = "Allow"
125
+ Action = [
126
+ "bedrock-agentcore:InvokeAgentRuntime",
127
+ "bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream",
128
+ # A2A targets additionally serve their agent card via the gateway
129
+ "bedrock-agentcore:GetAgentCard",
130
+ ]
131
+ Resource = [
132
+ module.my_agent.agent_core_runtime_arn,
133
+ "${module.my_agent.agent_core_runtime_arn}/*",
134
+ ]
135
+ }
136
+ ]
137
+ }
138
+
139
+ # Register the agent as a runtime target of the Gateway. The target name
140
+ # forms the invocation path: <gatewayUrl>/my-agent/invocations
141
+ resource "aws_bedrockagentcore_gateway_target" "my_agent" {
142
+ gateway_identifier = module.my_gateway.gateway_id
143
+ name = "my-agent"
144
+ # AgentCore fills in a description when none is set, which the provider
145
+ # reports as an inconsistent result after apply — so always set one.
146
+ description = "Agent runtime target my-agent"
147
+
148
+ target_configuration {
149
+ http {
150
+ agentcore_runtime {
151
+ arn = module.my_agent.agent_core_runtime_arn
152
+ }
153
+ }
154
+ }
155
+
156
+ credential_provider_configuration {
157
+ gateway_iam_role {}
158
+ }
159
+ }
160
+ ```
161
+
162
+ :::tip[Deploying agents into a VPC]
163
+ Fronting an agent with a Gateway is what makes a VPC-deployed agent reachable: callers talk to the Gateway's public endpoint, and the Gateway reaches the runtime internally. Set the agent module's VPC variables:
164
+
165
+ ```hcl
166
+ module "my_agent" {
167
+ source = "../../common/terraform/src/app/agents/my-agent"
168
+
169
+ enable_vpc = true
170
+ vpc_id = aws_vpc.my_vpc.id
171
+ subnet_ids = [aws_subnet.private_a.id, aws_subnet.private_b.id]
172
+ }
173
+ ```
174
+
175
+ Use private subnets with egress (a route to a NAT gateway), not private isolated subnets: the runtime needs outbound internet access to reach Bedrock and read its configuration from AWS AppConfig.
176
+ :::
177
+ </Fragment>
178
+ </Infrastructure>
179
+
180
+ ## Invoking the agent through the Gateway
181
+
182
+ Requests to `<gatewayUrl origin>/<targetName>/invocations` are forwarded to the agent runtime without protocol translation, so callers use the same request shape they'd use against the runtime directly — SSE streams (AG-UI), JSON streaming (Python HTTP) and A2A JSON-RPC all proxy through. Callers authenticate with the Gateway (IAM SigV4 or Cognito JWT depending on the Gateway's `auth`) rather than with the agent.
183
+
184
+ To connect a website to the Gateway's agents, use the <Link path="guides/connection/react-agentcore-gateway">`connection` generator</Link>.
185
+
186
+ ## Forwarding caller identity to the runtime
187
+
188
+ By default the Gateway signs outbound calls with its own IAM role (the `GATEWAY_IAM_ROLE` credential provider), so the runtime sees the _Gateway's_ identity, not the caller's. If instead you want the agent to authorize on the caller — for example to read the user's `sub` or `scope` claims — front a **Cognito** agent with a **Cognito** Gateway. The Gateway then forwards the caller's JWT to the runtime unchanged (the `JWT_PASSTHROUGH` credential provider), and the runtime revalidates it.
189
+
190
+ Generate both ends with `auth: cognito` and connect them as above:
191
+
192
+ - an agent (<Link path="guides/ts-agent">`ts#agent`</Link> or <Link path="guides/py-agent">`py#agent`</Link>) created with `auth: cognito`, and
193
+ - a Gateway created with `auth: cognito` fronting the **same** Cognito user pool.
194
+
195
+ Everything else is automatic — `gateway.addAgent(agent)` (CDK) and the generated Terraform runtime module handle the wiring for you based on the agent's `auth`:
196
+
197
+ - the target is created with the `JWT_PASSTHROUGH` credential provider (rather than `GATEWAY_IAM_ROLE`), and
198
+ - the runtime allowlists the `Authorization` header so the forwarded token reaches your agent code. Without this allowlist AgentCore validates the token but strips the header before your container.
199
+
200
+ Callers invoke the Gateway with `Authorization: Bearer <jwt>` (no SigV4), and the agent reads the claims from the `Authorization` header — skipping signature validation, since the runtime's inbound authorizer has already verified the token:
201
+
202
+ ```python title="packages/py_project/.../my_agent/main.py"
203
+ import jwt # PyJWT
204
+
205
+ @app.post('/invocations')
206
+ async def invoke(input: InvokeInput, request: Request):
207
+ token = request.headers['authorization'].removeprefix('Bearer ')
208
+ claims = jwt.decode(token, options={'verify_signature': False})
209
+ # authorize on claims['sub'], claims['scope'], ...
210
+ ```
211
+
212
+ :::note
213
+ JWT passthrough suits a single identity provider whose token audience already covers the runtime. If one Gateway fronts agents across multiple tenants or audiences, use OAuth [on-behalf-of token exchange](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-building-adding-targets-authorization.html) instead.
214
+ :::
215
+
216
+ ## Local Development
217
+
218
+ Running the Gateway locally with:
219
+
220
+ <NxCommands commands={["dev <gateway-name>"]} />
221
+
222
+ starts a local gateway plus every attached agent on its assigned local port. The local gateway proxies `/<targetName>/...` paths to each agent's local server, matching the deployed Gateway's path-based routing.
@@ -0,0 +1,154 @@
1
+ ---
2
+ title: AgentCore Gateway to AgentCore Gateway
3
+ description: Connect an AgentCore Gateway to another AgentCore Gateway
4
+ when:
5
+ sourceType: agentcore-gateway
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 register an <Link path="guides/agentcore-gateway">AgentCore Gateway</Link> as a target of another AgentCore Gateway. This lets you compose gateways hierarchically — for example a team-level gateway aggregating several domain gateways, each of which fronts its own MCP servers.
16
+
17
+ Once connected, the source Gateway aggregates the target Gateway's tools into its single MCP endpoint. Since the target Gateway already prefixes its tools with its own target names, tools surface through the source Gateway as `<gateway-target-name>___<target-name>___<tool-name>` — each gateway in the chain adds one prefix. Both gateways evaluate their own Cedar policies: the source Gateway authorizes the caller for the prefixed action, then the target Gateway authorizes the source Gateway's execution role for the inner action.
18
+
19
+ ## Prerequisites
20
+
21
+ Before using this generator, ensure you have:
22
+
23
+ 1. Two <Link path="guides/agentcore-gateway">`agentcore-gateway`</Link> projects
24
+
25
+ Both gateways must have `protocol: mcp`, and the target gateway must have `auth: iam` — the source gateway invokes the target signing with its own execution role, so only the target's inbound auth needs to be IAM. The generator validates this, and also rejects connections that would create a cycle between gateways, which would otherwise recurse infinitely on `tools/list`.
26
+
27
+ ## Usage
28
+
29
+ ### Run the Generator
30
+
31
+ <RunGenerator generator="connection" />
32
+
33
+ Select the aggregating Gateway project as the source and the Gateway to be aggregated as the target.
34
+
35
+ ### Options
36
+
37
+ <GeneratorParameters generator="connection" />
38
+
39
+ ## Generator Output
40
+
41
+ The generator wires existing projects together rather than emitting new source files. The following files are modified:
42
+
43
+ <FileTree>
44
+
45
+ - packages/\<source-gateway>
46
+ - project.json the source Gateway's `dev` target gains a dependency on the target gateway's `dev` target
47
+ - local-dev.ts `ATTACHED_MCP_SERVERS` updated so the local gateway aggregates the target gateway
48
+
49
+ </FileTree>
50
+
51
+ The source Gateway project's `dev` target gains a dependency on the target Gateway's `dev` target, so running the source Gateway locally also starts the target gateway (and, transitively, every MCP server attached to it). The target gateway is also registered in the source Gateway project's `local-dev.ts` so the local gateway aggregates its tools.
52
+
53
+ ## Adding the gateway target to your stack
54
+
55
+ The generator **cannot** automatically wire the gateway target into your infrastructure because it doesn't know which stack or module instantiates the Gateways. Add a single call to `gateway.addGateway(targetGateway)` yourself.
56
+
57
+ <Infrastructure>
58
+ <Fragment slot="cdk">
59
+ In the stack where you instantiate the Gateways, register the target gateway as a target of the source gateway:
60
+
61
+ ```ts title="packages/infra/src/stacks/application-stack.ts" {4-7}
62
+ const innerGateway = new InnerGateway(this, 'InnerGateway');
63
+ const outerGateway = new OuterGateway(this, 'OuterGateway');
64
+
65
+ // Register the inner gateway as a target of the outer gateway. The target
66
+ // name defaults to the inner gateway's `gatewayName` (its class name in
67
+ // kebab-case, e.g. `InnerGateway` -> `inner-gateway`).
68
+ outerGateway.addGateway(innerGateway);
69
+ ```
70
+
71
+ The Gateway target name (the target gateway's `gatewayName` by default) prefixes Cedar action names on the source gateway — the action format is ``AgentCore::Action::"<gatewayTargetName>___<targetName>___<toolName>"``. See the <Link path="guides/agentcore-gateway">Writing Policies section</Link>. Keep the target name short and stable; changing it later invalidates any Cedar policies that reference the old name.
72
+
73
+ To override the default target name, pass `gatewayTargetName`:
74
+
75
+ ```ts
76
+ outerGateway.addGateway(innerGateway, { gatewayTargetName: 'inner' });
77
+ ```
78
+
79
+ The construct grants the source gateway's execution role `bedrock-agentcore:InvokeGateway` access to the target gateway, and configures the target with `iamCredentialProvider.service = 'bedrock-agentcore'` so the source gateway signs outbound calls using its own execution role. The target is created after the target gateway and all of its own targets, since AgentCore fetches the target's tools during creation.
80
+ </Fragment>
81
+ <Fragment slot="terraform">
82
+ In the Terraform file where you instantiate the Gateways, wire the gateway target in:
83
+
84
+ ```hcl title="packages/infra/src/main.tf" {4-6,11,13-19,22-40}
85
+ module "inner_gateway" {
86
+ source = "../../common/terraform/src/app/gateways/inner-gateway"
87
+
88
+ # Target ids of the inner gateway's own targets (e.g. its MCP servers), so
89
+ # its gateway_url is not consumed until it serves their tools.
90
+ tool_dependencies = [aws_bedrockagentcore_gateway_target.my_mcp_server.target_id]
91
+ }
92
+
93
+ module "outer_gateway" {
94
+ source = "../../common/terraform/src/app/gateways/outer-gateway"
95
+ policy_dependencies = [aws_bedrockagentcore_gateway_target.inner_gateway.target_id]
96
+
97
+ additional_iam_policy_statements = [
98
+ {
99
+ Effect = "Allow"
100
+ Action = ["bedrock-agentcore:InvokeGateway"]
101
+ Resource = [module.inner_gateway.gateway_arn]
102
+ }
103
+ ]
104
+ }
105
+
106
+ # Register the inner gateway as a target of the outer gateway
107
+ resource "aws_bedrockagentcore_gateway_target" "inner_gateway" {
108
+ gateway_identifier = module.outer_gateway.gateway_id
109
+ name = "inner-gateway"
110
+
111
+ target_configuration {
112
+ mcp {
113
+ mcp_server {
114
+ endpoint = module.inner_gateway.gateway_url
115
+ }
116
+ }
117
+ }
118
+
119
+ credential_provider_configuration {
120
+ gateway_iam_role {
121
+ service = "bedrock-agentcore"
122
+ }
123
+ }
124
+ }
125
+ ```
126
+
127
+ The target `name` (`inner-gateway` above) prefixes Cedar action names on the outer gateway — see the <Link path="guides/agentcore-gateway">Writing Policies section</Link>. The `additional_iam_policy_statements` entry grants the outer gateway's execution role invoke access to the inner gateway, which is required both to fetch the inner gateway's tools at target creation time and to route calls at runtime. `policy_dependencies` ensures Cedar policies referencing this target's actions are created after the target has registered them.
128
+
129
+ :::note[Target ordering]
130
+ AgentCore fetches the inner gateway's tools when the `aws_bedrockagentcore_gateway_target` is created, so the inner gateway must already be serving them. Set the inner gateway's `tool_dependencies` to its own targets' ids: its `gateway_url` then flows through a readiness probe that polls `tools/list` until those tools are served, so the outer gateway's target waits for the inner gateway to be ready.
131
+ :::
132
+ </Fragment>
133
+ </Infrastructure>
134
+
135
+ ## Cedar policies across chained gateways
136
+
137
+ Each gateway in the chain evaluates its own policy set:
138
+
139
+ 1. The **source gateway** evaluates the original caller (e.g. an agent's execution role) against the prefixed action, e.g. `AgentCore::Action::"inner-gateway___my-mcp___add"`.
140
+ 2. The **target gateway** evaluates the source gateway's execution role against the inner action, e.g. `AgentCore::Action::"my-mcp___add"`.
141
+
142
+ This means a tool call through a gateway chain must be permitted at every hop. The default `permit-all.cedar` permits any caller in the same AWS account, which includes the source gateway's role; if you write narrower policies on the target gateway, remember that the principal it sees is the *source gateway's* role, not the original caller.
143
+
144
+ ## Local Development
145
+
146
+ Running the source Gateway locally with:
147
+
148
+ <NxCommands commands={["dev <source-gateway-name>"]} />
149
+
150
+ starts the local source gateway, the local target gateway, and every MCP server attached to either, each on its assigned local port. Tool names are prefixed at each hop exactly as deployed (`<gateway-target-name>___<target-name>___<tool-name>`), so agent prompts and Cedar action names remain consistent across local and deployed runs.
151
+
152
+ :::caution[Local fidelity]
153
+ Local development uses **local stand-in gateways** — lightweight MCP aggregators started by each Gateway project, not the AgentCore Gateway service. As a consequence, **Cedar policies are not evaluated locally** at either hop. To exercise Cedar policies, run the agent's `serve` target instead (see the <Link path="guides/connection/ts-agent-gateway">TypeScript</Link> / <Link path="guides/connection/py-agent-gateway">Python</Link> agent-connection guides) so the locally-running agent calls the deployed Gateway.
154
+ :::