awslabs.cdk-mcp-server 0.1.2__tar.gz → 0.1.3__tar.gz

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 (74) hide show
  1. awslabs_cdk_mcp_server-0.1.3/Dockerfile +74 -0
  2. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/PKG-INFO +24 -1
  3. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/README.md +23 -0
  4. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/core/resources.py +104 -15
  5. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/core/server.py +4 -3
  6. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/core/tools.py +6 -1
  7. awslabs_cdk_mcp_server-0.1.3/awslabs/cdk_mcp_server/data/genai_cdk_loader.py +596 -0
  8. awslabs_cdk_mcp_server-0.1.3/docker-healthcheck.sh +12 -0
  9. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/pyproject.toml +1 -1
  10. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/tests/core/test_resources.py +65 -24
  11. awslabs_cdk_mcp_server-0.1.3/tests/core/test_resources_enhanced.py +257 -0
  12. awslabs_cdk_mcp_server-0.1.3/tests/core/test_search_utils.py +200 -0
  13. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/tests/core/test_server.py +11 -0
  14. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/tests/core/test_tools.py +1 -0
  15. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/tests/data/test_cdk_nag_parser.py +11 -0
  16. awslabs_cdk_mcp_server-0.1.3/tests/data/test_genai_cdk_loader.py +448 -0
  17. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/tests/data/test_lambda_powertools_loader.py +11 -0
  18. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/tests/data/test_schema_generator.py +11 -0
  19. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/tests/data/test_solutions_constructs_parser.py +11 -0
  20. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/uv.lock +1 -1
  21. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/data/genai_cdk_loader.py +0 -437
  22. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/agent/actiongroups.md +0 -137
  23. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/agent/alias.md +0 -39
  24. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/agent/collaboration.md +0 -91
  25. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/agent/creation.md +0 -149
  26. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/agent/custom_orchestration.md +0 -74
  27. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/agent/overview.md +0 -78
  28. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/agent/prompt_override.md +0 -70
  29. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/bedrockguardrails.md +0 -188
  30. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/chunking.md +0 -137
  31. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/datasources.md +0 -225
  32. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/kendra.md +0 -81
  33. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/overview.md +0 -116
  34. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/parsing.md +0 -36
  35. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/transformation.md +0 -30
  36. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/vector/aurora.md +0 -185
  37. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/vector/creation.md +0 -80
  38. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/vector/opensearch.md +0 -56
  39. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/knowledgebases/vector/pinecone.md +0 -66
  40. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/bedrock/profiles.md +0 -153
  41. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/opensearch-vectorindex/overview.md +0 -135
  42. awslabs_cdk_mcp_server-0.1.2/awslabs/cdk_mcp_server/static/genai_cdk/opensearchserverless/overview.md +0 -17
  43. awslabs_cdk_mcp_server-0.1.2/tests/core/test_search_utils.py +0 -77
  44. awslabs_cdk_mcp_server-0.1.2/tests/data/test_genai_cdk_loader.py +0 -345
  45. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/.gitignore +0 -0
  46. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/.pre-commit-config.yaml +0 -0
  47. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/.python-version +0 -0
  48. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/CHANGELOG.md +0 -0
  49. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/LICENSE +0 -0
  50. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/NOTICE +0 -0
  51. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/__init__.py +0 -0
  52. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/__init__.py +0 -0
  53. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/core/__init__.py +0 -0
  54. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/core/search_utils.py +0 -0
  55. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/data/__init__.py +0 -0
  56. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/data/cdk_nag_parser.py +0 -0
  57. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/data/construct_descriptions.py +0 -0
  58. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/data/lambda_layer_parser.py +0 -0
  59. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/data/lambda_powertools_loader.py +0 -0
  60. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/data/schema_generator.py +0 -0
  61. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/data/solutions_constructs_parser.py +0 -0
  62. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/server.py +0 -0
  63. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/CDK_GENERAL_GUIDANCE.md +0 -0
  64. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/CDK_NAG_GUIDANCE.md +0 -0
  65. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/__init__.py +0 -0
  66. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/lambda_powertools/bedrock.md +0 -0
  67. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/lambda_powertools/cdk.md +0 -0
  68. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/lambda_powertools/dependencies.md +0 -0
  69. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/lambda_powertools/index.md +0 -0
  70. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/lambda_powertools/insights.md +0 -0
  71. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/lambda_powertools/logging.md +0 -0
  72. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/lambda_powertools/metrics.md +0 -0
  73. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/awslabs/cdk_mcp_server/static/lambda_powertools/tracing.md +0 -0
  74. {awslabs_cdk_mcp_server-0.1.2 → awslabs_cdk_mcp_server-0.1.3}/tests/__init__.py +0 -0
@@ -0,0 +1,74 @@
1
+ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
4
+ # with the License. A copy of the License is located at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
9
+ # OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
10
+ # and limitations under the License.
11
+
12
+ #FROM public.ecr.aws/sam/build-python3.10:1.137.1-20250411084548
13
+ FROM public.ecr.aws/sam/build-python3.10@sha256:04cdbe84bec08d17d621192bc3f0a9e4a85a83f2ac99aa9241659dfac0d845ea AS uv
14
+
15
+ # Install the project into `/app`
16
+ WORKDIR /app
17
+
18
+ # Enable bytecode compilation
19
+ ENV UV_COMPILE_BYTECODE=1
20
+
21
+ # Copy from the cache instead of linking since it's a mounted volume
22
+ ENV UV_LINK_MODE=copy
23
+
24
+ # Prefer the system python
25
+ ENV UV_PYTHON_PREFERENCE=only-system
26
+
27
+ # Run without updating the uv.lock file like running with `--frozen`
28
+ ENV UV_FROZEN=true
29
+
30
+ # Install the project's dependencies using the lockfile and settings
31
+ RUN --mount=type=cache,target=/root/.cache/uv \
32
+ --mount=type=bind,source=uv.lock,target=uv.lock \
33
+ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
34
+ pip install uv && \
35
+ uv sync --frozen --no-install-project --no-dev --no-editable
36
+
37
+ # Then, add the rest of the project source code and install it
38
+ # Installing separately from its dependencies allows optimal layer caching
39
+ COPY . /app
40
+ RUN --mount=type=cache,target=/root/.cache/uv \
41
+ uv sync --frozen --no-dev --no-editable
42
+
43
+ # Make the directory just in case it doesn't exist
44
+ RUN mkdir -p /root/.local
45
+
46
+ FROM public.ecr.aws/sam/build-python3.10@sha256:04cdbe84bec08d17d621192bc3f0a9e4a85a83f2ac99aa9241659dfac0d845ea
47
+
48
+ # Place executables in the environment at the front of the path and include other binaries
49
+ ENV PATH="/app/.venv/bin:$PATH:/usr/sbin"
50
+
51
+ # Install lsof for the healthcheck
52
+ # Install other tools as needed for the MCP server
53
+ # Add non-root user and ability to change directory into /root
54
+ RUN yum update -y && \
55
+ yum install -y lsof && \
56
+ yum clean all -y && \
57
+ rm -rf /var/cache/yum && \
58
+ groupadd --force --system app && \
59
+ useradd app -g app -d /app && \
60
+ chmod o+x /root
61
+
62
+ # Get the project from the uv layer
63
+ COPY --from=uv --chown=app:app /root/.local /root/.local
64
+ COPY --from=uv --chown=app:app /app/.venv /app/.venv
65
+
66
+ # Get healthcheck script
67
+ COPY ./docker-healthcheck.sh /usr/local/bin/docker-healthcheck.sh
68
+
69
+ # Run as non-root
70
+ USER app
71
+
72
+ # When running the container, add --db-path and a bind mount to the host's db file
73
+ HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD [ "docker-healthcheck.sh" ]
74
+ ENTRYPOINT ["awslabs.cdk-mcp-server"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: awslabs.cdk-mcp-server
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: An AWS CDK MCP server that provides guidance on AWS Cloud Development Kit best practices, infrastructure as code patterns, and security compliance with CDK Nag. This server offers tools to validate infrastructure designs, explain CDK Nag rules, analyze suppressions, generate Bedrock Agent schemas, and discover Solutions Constructs patterns.
5
5
  Project-URL: Homepage, https://awslabs.github.io/mcp/
6
6
  Project-URL: Documentation, https://awslabs.github.io/mcp/servers/cdk-mcp-server/
@@ -186,6 +186,29 @@ Here are some ways you can work with MCP across AWS, and we'll be adding support
186
186
  }
187
187
  ```
188
188
 
189
+ or docker after a succesful `docker build -t awslabs/cdk-mcp-server .`:
190
+
191
+ ```json
192
+ {
193
+ "mcpServers": {
194
+ "awslabs.cdk-mcp-server": {
195
+ "command": "docker",
196
+ "args": [
197
+ "run",
198
+ "--rm",
199
+ "--interactive",
200
+ "--env",
201
+ "FASTMCP_LOG_LEVEL=ERROR",
202
+ "awslabs/cdk-mcp-server:latest"
203
+ ],
204
+ "env": {},
205
+ "disabled": false,
206
+ "autoApprove": []
207
+ }
208
+ }
209
+ }
210
+ ```
211
+
189
212
  ## Security Considerations
190
213
 
191
214
  When using this MCP server, you should consider:
@@ -156,6 +156,29 @@ Here are some ways you can work with MCP across AWS, and we'll be adding support
156
156
  }
157
157
  ```
158
158
 
159
+ or docker after a succesful `docker build -t awslabs/cdk-mcp-server .`:
160
+
161
+ ```json
162
+ {
163
+ "mcpServers": {
164
+ "awslabs.cdk-mcp-server": {
165
+ "command": "docker",
166
+ "args": [
167
+ "run",
168
+ "--rm",
169
+ "--interactive",
170
+ "--env",
171
+ "FASTMCP_LOG_LEVEL=ERROR",
172
+ "awslabs/cdk-mcp-server:latest"
173
+ ],
174
+ "env": {},
175
+ "disabled": false,
176
+ "autoApprove": []
177
+ }
178
+ }
179
+ }
180
+ ```
181
+
159
182
  ## Security Considerations
160
183
 
161
184
  When using this MCP server, you should consider:
@@ -14,10 +14,8 @@
14
14
  import logging
15
15
  from awslabs.cdk_mcp_server.data.cdk_nag_parser import get_errors, get_rule_pack, get_warnings
16
16
  from awslabs.cdk_mcp_server.data.genai_cdk_loader import (
17
- get_genai_cdk_construct,
18
- get_genai_cdk_construct_section,
19
- get_genai_cdk_overview,
20
- list_available_sections,
17
+ get_section,
18
+ list_sections,
21
19
  )
22
20
  from awslabs.cdk_mcp_server.data.lambda_powertools_loader import get_lambda_powertools_section
23
21
  from awslabs.cdk_mcp_server.data.solutions_constructs_parser import get_pattern_raw
@@ -182,19 +180,29 @@ async def get_genai_cdk_construct_section_resource(
182
180
  """Get a specific section of documentation for a GenAI CDK construct.
183
181
 
184
182
  Example URIs:
185
- - genai-cdk-constructs://bedrock/agent/actiongroups
186
- - genai-cdk-constructs://bedrock/agent/alias
183
+ - genai-cdk-constructs://bedrock/agents/actiongroups
184
+ - genai-cdk-constructs://bedrock/agents/alias
187
185
  - genai-cdk-constructs://bedrock/knowledgebases/chunking
188
186
 
189
187
  Args:
190
188
  construct_type: Type of the construct (e.g., 'bedrock')
191
- construct_name: Name of the construct (e.g., 'agent', 'knowledgebases')
189
+ construct_name: Name of the construct (e.g., 'agents', 'knowledgebases')
192
190
  section: Section of the documentation (e.g., 'actiongroups', 'chunking')
193
191
 
194
192
  Returns:
195
193
  String containing the requested section of documentation
196
194
  """
197
- return get_genai_cdk_construct_section(construct_type, construct_name, section)
195
+ # Fetch section from GitHub
196
+ result = await get_section(construct_type, construct_name, section)
197
+
198
+ # Check for error
199
+ if result.get('status') == 'error' or result.get('status') == 'not_found':
200
+ if 'error' in result:
201
+ return f'Error fetching section from GitHub: {result["error"]}'
202
+ else:
203
+ return f"Error: Section '{section}' not found in {construct_type}/{construct_name}"
204
+
205
+ return result['content']
198
206
 
199
207
 
200
208
  async def get_genai_cdk_construct_nested_section_resource(
@@ -215,26 +223,55 @@ async def get_genai_cdk_construct_nested_section_resource(
215
223
  Returns:
216
224
  String containing the requested nested section of documentation
217
225
  """
226
+ # First try to use parent as the section name and child as a subsection
218
227
  section = f'{parent}/{child}'
219
- return get_genai_cdk_construct_section(construct_type, construct_name, section)
228
+ result = await get_section(construct_type, construct_name, section)
229
+
230
+ # Check if the first attempt succeeded
231
+ if result.get('status') == 'success':
232
+ return result['content']
233
+
234
+ # If that fails, try as a combined section name
235
+ section = f'{parent} {child}'
236
+ result = await get_section(construct_type, construct_name, section)
237
+
238
+ # Check for errors in both attempts
239
+ if result.get('status') == 'error' or result.get('status') == 'not_found':
240
+ if 'error' in result:
241
+ return f'Error fetching nested section from GitHub: {result["error"]}'
242
+ else:
243
+ return (
244
+ f"Error: Section '{parent}/{child}' not found in {construct_type}/{construct_name}"
245
+ )
246
+
247
+ return result['content']
220
248
 
221
249
 
222
250
  async def get_available_sections_resource(construct_type: str, construct_name: str) -> str:
223
251
  """Get available sections for a specific construct.
224
252
 
225
253
  Example URI:
226
- - genai-cdk-constructs://bedrock/agent/sections
254
+ - genai-cdk-constructs://bedrock/agents/sections
227
255
  - genai-cdk-constructs://bedrock/knowledgebases/sections
228
256
 
229
257
  Args:
230
258
  construct_type: Type of the construct (e.g., 'bedrock')
231
- construct_name: Name of the construct (e.g., 'agent', 'knowledgebases')
259
+ construct_name: Name of the construct (e.g., 'agents', 'knowledgebases')
232
260
 
233
261
  Returns:
234
262
  String containing available sections in markdown format
235
263
  """
236
- sections = list_available_sections(construct_type, construct_name)
264
+ # Handle singular/plural conversion for agent
265
+ if construct_name.lower() == 'agent':
266
+ construct_name = 'agents'
237
267
 
268
+ # List sections from GitHub
269
+ result = await list_sections(construct_type, construct_name)
270
+
271
+ if 'error' in result:
272
+ return f'Error fetching sections from GitHub: {result["error"]}'
273
+
274
+ sections = result['sections']
238
275
  if not sections:
239
276
  return f'No sections found for {construct_name} in {construct_type}.'
240
277
 
@@ -252,8 +289,9 @@ async def get_genai_cdk_construct_resource(construct_type: str, construct_name:
252
289
  """Get essential information about a GenAI CDK construct.
253
290
 
254
291
  Example URIs:
255
- - genai-cdk-constructs://bedrock/Agent
292
+ - genai-cdk-constructs://bedrock/Agents
256
293
  - genai-cdk-constructs://bedrock/KnowledgeBase
294
+ - genai-cdk-constructs://bedrock/Amazon Bedrock Knowledge BasesVectorKnowledgeBase (from search results)
257
295
 
258
296
  Args:
259
297
  construct_type: Type of the construct (e.g., 'bedrock')
@@ -262,7 +300,50 @@ async def get_genai_cdk_construct_resource(construct_type: str, construct_name:
262
300
  Returns:
263
301
  String containing formatted properties and code examples in markdown
264
302
  """
265
- return get_genai_cdk_construct(construct_type, construct_name)
303
+ from awslabs.cdk_mcp_server.data.genai_cdk_loader import fetch_readme as get_readme
304
+
305
+ # Handle search result format (e.g., "Amazon Bedrock Knowledge BasesVectorKnowledgeBase")
306
+ if construct_name.startswith('Amazon Bedrock Knowledge Bases'):
307
+ # Extract the section name that comes after "Amazon Bedrock Knowledge Bases"
308
+ # This is for the special case of knowledge-bases subdirectory in bedrock
309
+ section_name = construct_name.replace('Amazon Bedrock Knowledge Bases', '').strip()
310
+ if section_name:
311
+ # Get the section from the knowledge-bases README
312
+ result = await get_section('bedrock', 'knowledge-bases', section_name)
313
+ if 'error' not in result:
314
+ return result['content']
315
+
316
+ # If no section specified or section not found, get the whole README
317
+ result = await get_readme('bedrock', 'knowledge-bases')
318
+ if 'error' not in result:
319
+ return result['content']
320
+
321
+ # Normalize construct name
322
+ construct_name_lower = construct_name.lower()
323
+
324
+ # If the construct is Agent, use agents for GitHub
325
+ if construct_name_lower == 'agent':
326
+ construct_name_lower = 'agents'
327
+
328
+ # If it looks like a "knowledge base" reference, try the subdirectory
329
+ if 'knowledge' in construct_name_lower and 'base' in construct_name_lower:
330
+ result = await get_readme('bedrock', 'knowledge-bases')
331
+ if 'error' not in result:
332
+ return result['content']
333
+
334
+ # Fetch the entire README from GitHub
335
+ result = await get_readme(construct_type)
336
+
337
+ if 'error' not in result:
338
+ return result['content']
339
+
340
+ # If that fails, try to fetch a specific construct README
341
+ result = await get_readme(construct_type, construct_name_lower)
342
+
343
+ if 'error' in result:
344
+ return f'Error fetching construct from GitHub: {result["error"]}'
345
+
346
+ return result['content']
266
347
 
267
348
 
268
349
  async def get_genai_cdk_overview_resource(construct_type: str) -> str:
@@ -279,4 +360,12 @@ async def get_genai_cdk_overview_resource(construct_type: str) -> str:
279
360
  Returns:
280
361
  String containing overview documentation in markdown
281
362
  """
282
- return get_genai_cdk_overview(construct_type)
363
+ from awslabs.cdk_mcp_server.data.genai_cdk_loader import fetch_readme as get_readme
364
+
365
+ # Fetch README from GitHub
366
+ result = await get_readme(construct_type)
367
+
368
+ if 'error' in result:
369
+ return f'Error fetching overview from GitHub: {result["error"]}'
370
+
371
+ return result['content']
@@ -41,15 +41,16 @@ mcp.resource('lambda-powertools://')(resources.get_lambda_powertools_index)
41
41
  mcp.resource('aws-solutions-constructs://{pattern_name}')(
42
42
  resources.get_solutions_construct_pattern_resource
43
43
  )
44
+ # Fixed the ordering - more specific routes first
45
+ mcp.resource('genai-cdk-constructs://{construct_type}/{construct_name}/sections')(
46
+ resources.get_available_sections_resource
47
+ )
44
48
  mcp.resource('genai-cdk-constructs://{construct_type}/{construct_name}/{section}')(
45
49
  resources.get_genai_cdk_construct_section_resource
46
50
  )
47
51
  mcp.resource('genai-cdk-constructs://{construct_type}/{construct_name}/{parent}/{child}')(
48
52
  resources.get_genai_cdk_construct_nested_section_resource
49
53
  )
50
- mcp.resource('genai-cdk-constructs://{construct_type}/{construct_name}/sections')(
51
- resources.get_available_sections_resource
52
- )
53
54
  mcp.resource('genai-cdk-constructs://{construct_type}/{construct_name}')(
54
55
  resources.get_genai_cdk_construct_resource
55
56
  )
@@ -396,11 +396,16 @@ async def search_genai_cdk_constructs(
396
396
 
397
397
  The search is flexible and will match any of your search terms (OR logic).
398
398
  It handles common variations like singular/plural forms and terms with/without spaces.
399
+ Content is fetched dynamically from GitHub to ensure the most up-to-date documentation.
399
400
 
400
401
  Examples:
401
402
  - "bedrock agent" - Returns all agent-related constructs
402
403
  - "knowledgebase vector" - Returns knowledge base constructs related to vector stores
403
404
  - "agent actiongroups" - Returns action groups for agents
405
+ - "opensearch vector" - Returns OpenSearch vector constructs
406
+
407
+ The search supports subdirectory content (like knowledge bases and their sections)
408
+ and will find matches across all available content.
404
409
 
405
410
  Args:
406
411
  ctx: MCP context
@@ -412,7 +417,7 @@ async def search_genai_cdk_constructs(
412
417
  """
413
418
  try:
414
419
  # Get list of constructs
415
- constructs = list_available_constructs(construct_type)
420
+ constructs = await list_available_constructs(construct_type)
416
421
 
417
422
  # If no query, return all constructs
418
423
  if not query: