atlas-chat 0.1.0__py3-none-any.whl

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 (250) hide show
  1. atlas/__init__.py +40 -0
  2. atlas/application/__init__.py +7 -0
  3. atlas/application/chat/__init__.py +7 -0
  4. atlas/application/chat/agent/__init__.py +10 -0
  5. atlas/application/chat/agent/act_loop.py +179 -0
  6. atlas/application/chat/agent/factory.py +142 -0
  7. atlas/application/chat/agent/protocols.py +46 -0
  8. atlas/application/chat/agent/react_loop.py +338 -0
  9. atlas/application/chat/agent/think_act_loop.py +171 -0
  10. atlas/application/chat/approval_manager.py +151 -0
  11. atlas/application/chat/elicitation_manager.py +191 -0
  12. atlas/application/chat/events/__init__.py +1 -0
  13. atlas/application/chat/events/agent_event_relay.py +112 -0
  14. atlas/application/chat/modes/__init__.py +1 -0
  15. atlas/application/chat/modes/agent.py +125 -0
  16. atlas/application/chat/modes/plain.py +74 -0
  17. atlas/application/chat/modes/rag.py +81 -0
  18. atlas/application/chat/modes/tools.py +179 -0
  19. atlas/application/chat/orchestrator.py +213 -0
  20. atlas/application/chat/policies/__init__.py +1 -0
  21. atlas/application/chat/policies/tool_authorization.py +99 -0
  22. atlas/application/chat/preprocessors/__init__.py +1 -0
  23. atlas/application/chat/preprocessors/message_builder.py +92 -0
  24. atlas/application/chat/preprocessors/prompt_override_service.py +104 -0
  25. atlas/application/chat/service.py +454 -0
  26. atlas/application/chat/utilities/__init__.py +6 -0
  27. atlas/application/chat/utilities/error_handler.py +367 -0
  28. atlas/application/chat/utilities/event_notifier.py +546 -0
  29. atlas/application/chat/utilities/file_processor.py +613 -0
  30. atlas/application/chat/utilities/tool_executor.py +789 -0
  31. atlas/atlas_chat_cli.py +347 -0
  32. atlas/atlas_client.py +238 -0
  33. atlas/core/__init__.py +0 -0
  34. atlas/core/auth.py +205 -0
  35. atlas/core/authorization_manager.py +27 -0
  36. atlas/core/capabilities.py +123 -0
  37. atlas/core/compliance.py +215 -0
  38. atlas/core/domain_whitelist.py +147 -0
  39. atlas/core/domain_whitelist_middleware.py +82 -0
  40. atlas/core/http_client.py +28 -0
  41. atlas/core/log_sanitizer.py +102 -0
  42. atlas/core/metrics_logger.py +59 -0
  43. atlas/core/middleware.py +131 -0
  44. atlas/core/otel_config.py +242 -0
  45. atlas/core/prompt_risk.py +200 -0
  46. atlas/core/rate_limit.py +0 -0
  47. atlas/core/rate_limit_middleware.py +64 -0
  48. atlas/core/security_headers_middleware.py +51 -0
  49. atlas/domain/__init__.py +37 -0
  50. atlas/domain/chat/__init__.py +1 -0
  51. atlas/domain/chat/dtos.py +85 -0
  52. atlas/domain/errors.py +96 -0
  53. atlas/domain/messages/__init__.py +12 -0
  54. atlas/domain/messages/models.py +160 -0
  55. atlas/domain/rag_mcp_service.py +664 -0
  56. atlas/domain/sessions/__init__.py +7 -0
  57. atlas/domain/sessions/models.py +36 -0
  58. atlas/domain/unified_rag_service.py +371 -0
  59. atlas/infrastructure/__init__.py +10 -0
  60. atlas/infrastructure/app_factory.py +135 -0
  61. atlas/infrastructure/events/__init__.py +1 -0
  62. atlas/infrastructure/events/cli_event_publisher.py +140 -0
  63. atlas/infrastructure/events/websocket_publisher.py +140 -0
  64. atlas/infrastructure/sessions/in_memory_repository.py +56 -0
  65. atlas/infrastructure/transport/__init__.py +7 -0
  66. atlas/infrastructure/transport/websocket_connection_adapter.py +33 -0
  67. atlas/init_cli.py +226 -0
  68. atlas/interfaces/__init__.py +15 -0
  69. atlas/interfaces/events.py +134 -0
  70. atlas/interfaces/llm.py +54 -0
  71. atlas/interfaces/rag.py +40 -0
  72. atlas/interfaces/sessions.py +75 -0
  73. atlas/interfaces/tools.py +57 -0
  74. atlas/interfaces/transport.py +24 -0
  75. atlas/main.py +564 -0
  76. atlas/mcp/api_key_demo/README.md +76 -0
  77. atlas/mcp/api_key_demo/main.py +172 -0
  78. atlas/mcp/api_key_demo/run.sh +56 -0
  79. atlas/mcp/basictable/main.py +147 -0
  80. atlas/mcp/calculator/main.py +149 -0
  81. atlas/mcp/code-executor/execution_engine.py +98 -0
  82. atlas/mcp/code-executor/execution_environment.py +95 -0
  83. atlas/mcp/code-executor/main.py +528 -0
  84. atlas/mcp/code-executor/result_processing.py +276 -0
  85. atlas/mcp/code-executor/script_generation.py +195 -0
  86. atlas/mcp/code-executor/security_checker.py +140 -0
  87. atlas/mcp/corporate_cars/main.py +437 -0
  88. atlas/mcp/csv_reporter/main.py +545 -0
  89. atlas/mcp/duckduckgo/main.py +182 -0
  90. atlas/mcp/elicitation_demo/README.md +171 -0
  91. atlas/mcp/elicitation_demo/main.py +262 -0
  92. atlas/mcp/env-demo/README.md +158 -0
  93. atlas/mcp/env-demo/main.py +199 -0
  94. atlas/mcp/file_size_test/main.py +284 -0
  95. atlas/mcp/filesystem/main.py +348 -0
  96. atlas/mcp/image_demo/main.py +113 -0
  97. atlas/mcp/image_demo/requirements.txt +4 -0
  98. atlas/mcp/logging_demo/README.md +72 -0
  99. atlas/mcp/logging_demo/main.py +103 -0
  100. atlas/mcp/many_tools_demo/main.py +50 -0
  101. atlas/mcp/order_database/__init__.py +0 -0
  102. atlas/mcp/order_database/main.py +369 -0
  103. atlas/mcp/order_database/signal_data.csv +1001 -0
  104. atlas/mcp/pdfbasic/main.py +394 -0
  105. atlas/mcp/pptx_generator/main.py +760 -0
  106. atlas/mcp/pptx_generator/requirements.txt +13 -0
  107. atlas/mcp/pptx_generator/run_test.sh +1 -0
  108. atlas/mcp/pptx_generator/test_pptx_generator_security.py +169 -0
  109. atlas/mcp/progress_demo/main.py +167 -0
  110. atlas/mcp/progress_updates_demo/QUICKSTART.md +273 -0
  111. atlas/mcp/progress_updates_demo/README.md +120 -0
  112. atlas/mcp/progress_updates_demo/main.py +497 -0
  113. atlas/mcp/prompts/main.py +222 -0
  114. atlas/mcp/public_demo/main.py +189 -0
  115. atlas/mcp/sampling_demo/README.md +169 -0
  116. atlas/mcp/sampling_demo/main.py +234 -0
  117. atlas/mcp/thinking/main.py +77 -0
  118. atlas/mcp/tool_planner/main.py +240 -0
  119. atlas/mcp/ui-demo/badmesh.png +0 -0
  120. atlas/mcp/ui-demo/main.py +383 -0
  121. atlas/mcp/ui-demo/templates/button_demo.html +32 -0
  122. atlas/mcp/ui-demo/templates/data_visualization.html +32 -0
  123. atlas/mcp/ui-demo/templates/form_demo.html +28 -0
  124. atlas/mcp/username-override-demo/README.md +320 -0
  125. atlas/mcp/username-override-demo/main.py +308 -0
  126. atlas/modules/__init__.py +0 -0
  127. atlas/modules/config/__init__.py +34 -0
  128. atlas/modules/config/cli.py +231 -0
  129. atlas/modules/config/config_manager.py +1096 -0
  130. atlas/modules/file_storage/__init__.py +22 -0
  131. atlas/modules/file_storage/cli.py +330 -0
  132. atlas/modules/file_storage/content_extractor.py +290 -0
  133. atlas/modules/file_storage/manager.py +295 -0
  134. atlas/modules/file_storage/mock_s3_client.py +402 -0
  135. atlas/modules/file_storage/s3_client.py +417 -0
  136. atlas/modules/llm/__init__.py +19 -0
  137. atlas/modules/llm/caller.py +287 -0
  138. atlas/modules/llm/litellm_caller.py +675 -0
  139. atlas/modules/llm/models.py +19 -0
  140. atlas/modules/mcp_tools/__init__.py +17 -0
  141. atlas/modules/mcp_tools/client.py +2123 -0
  142. atlas/modules/mcp_tools/token_storage.py +556 -0
  143. atlas/modules/prompts/prompt_provider.py +130 -0
  144. atlas/modules/rag/__init__.py +24 -0
  145. atlas/modules/rag/atlas_rag_client.py +336 -0
  146. atlas/modules/rag/client.py +129 -0
  147. atlas/routes/admin_routes.py +865 -0
  148. atlas/routes/config_routes.py +484 -0
  149. atlas/routes/feedback_routes.py +361 -0
  150. atlas/routes/files_routes.py +274 -0
  151. atlas/routes/health_routes.py +40 -0
  152. atlas/routes/mcp_auth_routes.py +223 -0
  153. atlas/server_cli.py +164 -0
  154. atlas/tests/conftest.py +20 -0
  155. atlas/tests/integration/test_mcp_auth_integration.py +152 -0
  156. atlas/tests/manual_test_sampling.py +87 -0
  157. atlas/tests/modules/mcp_tools/test_client_auth.py +226 -0
  158. atlas/tests/modules/mcp_tools/test_client_env.py +191 -0
  159. atlas/tests/test_admin_mcp_server_management_routes.py +141 -0
  160. atlas/tests/test_agent_roa.py +135 -0
  161. atlas/tests/test_app_factory_smoke.py +47 -0
  162. atlas/tests/test_approval_manager.py +439 -0
  163. atlas/tests/test_atlas_client.py +188 -0
  164. atlas/tests/test_atlas_rag_client.py +447 -0
  165. atlas/tests/test_atlas_rag_integration.py +224 -0
  166. atlas/tests/test_attach_file_flow.py +287 -0
  167. atlas/tests/test_auth_utils.py +165 -0
  168. atlas/tests/test_backend_public_url.py +185 -0
  169. atlas/tests/test_banner_logging.py +287 -0
  170. atlas/tests/test_capability_tokens_and_injection.py +203 -0
  171. atlas/tests/test_compliance_level.py +54 -0
  172. atlas/tests/test_compliance_manager.py +253 -0
  173. atlas/tests/test_config_manager.py +617 -0
  174. atlas/tests/test_config_manager_paths.py +12 -0
  175. atlas/tests/test_core_auth.py +18 -0
  176. atlas/tests/test_core_utils.py +190 -0
  177. atlas/tests/test_docker_env_sync.py +202 -0
  178. atlas/tests/test_domain_errors.py +329 -0
  179. atlas/tests/test_domain_whitelist.py +359 -0
  180. atlas/tests/test_elicitation_manager.py +408 -0
  181. atlas/tests/test_elicitation_routing.py +296 -0
  182. atlas/tests/test_env_demo_server.py +88 -0
  183. atlas/tests/test_error_classification.py +113 -0
  184. atlas/tests/test_error_flow_integration.py +116 -0
  185. atlas/tests/test_feedback_routes.py +333 -0
  186. atlas/tests/test_file_content_extraction.py +1134 -0
  187. atlas/tests/test_file_extraction_routes.py +158 -0
  188. atlas/tests/test_file_library.py +107 -0
  189. atlas/tests/test_file_manager_unit.py +18 -0
  190. atlas/tests/test_health_route.py +49 -0
  191. atlas/tests/test_http_client_stub.py +8 -0
  192. atlas/tests/test_imports_smoke.py +30 -0
  193. atlas/tests/test_interfaces_llm_response.py +9 -0
  194. atlas/tests/test_issue_access_denied_fix.py +136 -0
  195. atlas/tests/test_llm_env_expansion.py +836 -0
  196. atlas/tests/test_log_level_sensitive_data.py +285 -0
  197. atlas/tests/test_mcp_auth_routes.py +341 -0
  198. atlas/tests/test_mcp_client_auth.py +331 -0
  199. atlas/tests/test_mcp_data_injection.py +270 -0
  200. atlas/tests/test_mcp_get_authorized_servers.py +95 -0
  201. atlas/tests/test_mcp_hot_reload.py +512 -0
  202. atlas/tests/test_mcp_image_content.py +424 -0
  203. atlas/tests/test_mcp_logging.py +172 -0
  204. atlas/tests/test_mcp_progress_updates.py +313 -0
  205. atlas/tests/test_mcp_prompt_override_system_prompt.py +102 -0
  206. atlas/tests/test_mcp_prompts_server.py +39 -0
  207. atlas/tests/test_mcp_tool_result_parsing.py +296 -0
  208. atlas/tests/test_metrics_logger.py +56 -0
  209. atlas/tests/test_middleware_auth.py +379 -0
  210. atlas/tests/test_prompt_risk_and_acl.py +141 -0
  211. atlas/tests/test_rag_mcp_aggregator.py +204 -0
  212. atlas/tests/test_rag_mcp_service.py +224 -0
  213. atlas/tests/test_rate_limit_middleware.py +45 -0
  214. atlas/tests/test_routes_config_smoke.py +60 -0
  215. atlas/tests/test_routes_files_download_token.py +41 -0
  216. atlas/tests/test_routes_files_health.py +18 -0
  217. atlas/tests/test_runtime_imports.py +53 -0
  218. atlas/tests/test_sampling_integration.py +482 -0
  219. atlas/tests/test_security_admin_routes.py +61 -0
  220. atlas/tests/test_security_capability_tokens.py +65 -0
  221. atlas/tests/test_security_file_stats_scope.py +21 -0
  222. atlas/tests/test_security_header_injection.py +191 -0
  223. atlas/tests/test_security_headers_and_filename.py +63 -0
  224. atlas/tests/test_shared_session_repository.py +101 -0
  225. atlas/tests/test_system_prompt_loading.py +181 -0
  226. atlas/tests/test_token_storage.py +505 -0
  227. atlas/tests/test_tool_approval_config.py +93 -0
  228. atlas/tests/test_tool_approval_utils.py +356 -0
  229. atlas/tests/test_tool_authorization_group_filtering.py +223 -0
  230. atlas/tests/test_tool_details_in_config.py +108 -0
  231. atlas/tests/test_tool_planner.py +300 -0
  232. atlas/tests/test_unified_rag_service.py +398 -0
  233. atlas/tests/test_username_override_in_approval.py +258 -0
  234. atlas/tests/test_websocket_auth_header.py +168 -0
  235. atlas/version.py +6 -0
  236. atlas_chat-0.1.0.data/data/.env.example +253 -0
  237. atlas_chat-0.1.0.data/data/config/defaults/compliance-levels.json +44 -0
  238. atlas_chat-0.1.0.data/data/config/defaults/domain-whitelist.json +123 -0
  239. atlas_chat-0.1.0.data/data/config/defaults/file-extractors.json +74 -0
  240. atlas_chat-0.1.0.data/data/config/defaults/help-config.json +198 -0
  241. atlas_chat-0.1.0.data/data/config/defaults/llmconfig-buggy.yml +11 -0
  242. atlas_chat-0.1.0.data/data/config/defaults/llmconfig.yml +19 -0
  243. atlas_chat-0.1.0.data/data/config/defaults/mcp.json +138 -0
  244. atlas_chat-0.1.0.data/data/config/defaults/rag-sources.json +17 -0
  245. atlas_chat-0.1.0.data/data/config/defaults/splash-config.json +16 -0
  246. atlas_chat-0.1.0.dist-info/METADATA +236 -0
  247. atlas_chat-0.1.0.dist-info/RECORD +250 -0
  248. atlas_chat-0.1.0.dist-info/WHEEL +5 -0
  249. atlas_chat-0.1.0.dist-info/entry_points.txt +4 -0
  250. atlas_chat-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,383 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Demo MCP server that demonstrates custom UI capabilities.
4
+
5
+ This server shows how MCP servers can return responses with custom_html
6
+ fields to modify the UI.
7
+ """
8
+
9
+ import os
10
+ from typing import Any, Dict
11
+
12
+ from fastmcp import FastMCP
13
+
14
+ # Create the MCP server instance
15
+ mcp = FastMCP("UI Demo Server")
16
+
17
+ def load_template(template_name: str) -> str:
18
+ """
19
+ Load HTML template from templates directory.
20
+
21
+ Args:
22
+ template_name: Name of the template file to load
23
+
24
+ Returns:
25
+ The HTML content of the template
26
+
27
+ Raises:
28
+ FileNotFoundError: If the template file doesn't exist
29
+ """
30
+ template_path = os.path.join(os.path.dirname(__file__), "templates", template_name)
31
+ with open(template_path, "r") as f:
32
+ return f.read()
33
+
34
+ @mcp.tool
35
+ def create_button_demo() -> Dict[str, Any]:
36
+ """
37
+ Generate interactive HTML demonstrations showcasing advanced UI customization and dynamic interface capabilities.
38
+
39
+ This UI prototyping tool creates sophisticated interactive demonstrations:
40
+
41
+ **Interactive UI Components:**
42
+ - Custom HTML button interfaces with advanced styling
43
+ - Dynamic interaction patterns and user feedback systems
44
+ - Professional design templates with modern aesthetics
45
+ - Responsive layouts optimized for different screen sizes
46
+
47
+ **UI Customization Features:**
48
+ - Advanced CSS styling with modern design patterns
49
+ - Interactive JavaScript functionality for user engagement
50
+ - Professional color schemes and typography
51
+ - Accessibility-compliant interface elements
52
+
53
+ **Demonstration Capabilities:**
54
+ - Real-time UI modification examples
55
+ - Interactive component behavior showcases
56
+ - Design pattern implementation demonstrations
57
+ - User experience optimization examples
58
+
59
+ **Technical Implementation:**
60
+ - Clean HTML5 structure with semantic elements
61
+ - Modern CSS3 styling with flexbox and grid layouts
62
+ - Vanilla JavaScript for cross-browser compatibility
63
+ - Base64 encoding for seamless artifact delivery
64
+
65
+ **Use Cases:**
66
+ - UI design prototyping and concept validation
67
+ - Client demonstration and stakeholder presentations
68
+ - Design system documentation and examples
69
+ - Interactive tutorial and training materials
70
+ - A/B testing interface variations
71
+ - User experience research and testing
72
+
73
+ **Professional Features:**
74
+ - Production-ready code quality and structure
75
+ - Cross-browser compatibility and standards compliance
76
+ - Performance-optimized implementation
77
+ - Maintainable and extensible code architecture
78
+
79
+ **Integration Capabilities:**
80
+ - Canvas viewer integration for immediate preview
81
+ - Downloadable HTML for offline use and sharing
82
+ - Framework-agnostic implementation
83
+ - Easy customization and extension
84
+
85
+ Returns:
86
+ Dictionary containing:
87
+ - results: Demo creation summary and success confirmation
88
+ - artifacts: Interactive HTML demonstration as downloadable content
89
+ - display: Optimized canvas viewer configuration for immediate preview
90
+ - Interactive elements ready for user testing and evaluation
91
+ Or error message if HTML generation or template loading fails
92
+ """
93
+ # Load the HTML template
94
+ html_content = load_template("button_demo.html")
95
+
96
+ # Convert to v2 MCP format with artifacts and display
97
+ import base64
98
+ html_base64 = base64.b64encode(html_content.encode('utf-8')).decode('utf-8')
99
+
100
+ return {
101
+ "results": {
102
+ "content": "Custom UI demo created successfully! Check the canvas panel for the interactive demo.",
103
+ "success": True
104
+ },
105
+ "artifacts": [
106
+ {
107
+ "name": "ui_demo.html",
108
+ "b64": html_base64,
109
+ "mime": "text/html",
110
+ "size": len(html_content.encode('utf-8')),
111
+ "description": "Interactive UI demo with buttons and styling",
112
+ "viewer": "html"
113
+ }
114
+ ],
115
+ "display": {
116
+ "open_canvas": True,
117
+ "primary_file": "ui_demo.html",
118
+ "mode": "replace",
119
+ "viewer_hint": "html"
120
+ }
121
+ }
122
+
123
+ @mcp.tool
124
+ def create_data_visualization() -> Dict[str, Any]:
125
+ """
126
+ Create a simple data visualization using HTML and CSS.
127
+
128
+ Returns:
129
+ Dictionary with custom HTML containing a bar chart visualization
130
+ """
131
+ # Load the HTML template
132
+ html_content = load_template("data_visualization.html")
133
+
134
+ # Convert to v2 MCP format with artifacts and display
135
+ import base64
136
+ import datetime
137
+ html_base64 = base64.b64encode(html_content.encode('utf-8')).decode('utf-8')
138
+
139
+ return {
140
+ "results": {
141
+ "content": "Data visualization created and displayed in the canvas panel.",
142
+ "data_points": {
143
+ "sales": 75,
144
+ "satisfaction": 92,
145
+ "market_share": 58
146
+ }
147
+ },
148
+ "artifacts": [
149
+ {
150
+ "name": "data_visualization.html",
151
+ "b64": html_base64,
152
+ "mime": "text/html",
153
+ "size": len(html_content.encode('utf-8')),
154
+ "description": "Sales and customer satisfaction data visualization",
155
+ "viewer": "html"
156
+ }
157
+ ],
158
+ "display": {
159
+ "open_canvas": True,
160
+ "primary_file": "data_visualization.html",
161
+ "mode": "replace",
162
+ "viewer_hint": "html"
163
+ },
164
+ "meta_data": {
165
+ "chart_type": "bar_chart",
166
+ "data_points": 3,
167
+ "metrics": ["sales", "satisfaction", "market_share"],
168
+ "tool_execution": "create_data_visualization executed successfully",
169
+ "timestamp": f"{datetime.datetime.now().isoformat()}"
170
+ }
171
+ }
172
+
173
+ @mcp.tool
174
+ def create_form_demo() -> Dict[str, Any]:
175
+ """
176
+ Create a demo form to show interactive UI capabilities.
177
+
178
+ Returns:
179
+ Dictionary with custom HTML containing an interactive form
180
+ """
181
+ # Load the HTML template
182
+ html_content = load_template("form_demo.html")
183
+
184
+ # Convert to v2 MCP format with artifacts and display
185
+ import base64
186
+ html_base64 = base64.b64encode(html_content.encode('utf-8')).decode('utf-8')
187
+
188
+ return {
189
+ "results": {
190
+ "content": "Interactive form demo created! You can interact with the form in the canvas panel.",
191
+ "form_type": "demo"
192
+ },
193
+ "artifacts": [
194
+ {
195
+ "name": "interactive_form.html",
196
+ "b64": html_base64,
197
+ "mime": "text/html",
198
+ "size": len(html_content.encode('utf-8')),
199
+ "description": "Interactive form demo with input validation",
200
+ "viewer": "html"
201
+ }
202
+ ],
203
+ "display": {
204
+ "open_canvas": True,
205
+ "primary_file": "interactive_form.html",
206
+ "mode": "replace",
207
+ "viewer_hint": "html"
208
+ },
209
+ "meta_data": {
210
+ "form_fields": ["name", "email", "message"],
211
+ "interactive": True,
212
+ "validation": "client_side"
213
+ }
214
+ }
215
+
216
+ @mcp.tool
217
+ def get_image() -> Dict[str, Any]:
218
+ """
219
+ Return the badmesh.png image from the ui-demo directory.
220
+
221
+ Returns:
222
+ Dictionary with the image data encoded in base64
223
+ """
224
+ # Get the path to the image file
225
+ image_path = os.path.join(os.path.dirname(__file__), "badmesh.png")
226
+
227
+ # Read the image file as binary
228
+ with open(image_path, "rb") as f:
229
+ image_data = f.read()
230
+
231
+ # Encode the image data in base64
232
+ import base64
233
+ image_base64 = base64.b64encode(image_data).decode('utf-8')
234
+
235
+ # Return the image data with appropriate MIME type
236
+ return {
237
+ "results": {
238
+ "content": "Image retrieved successfully!"
239
+ },
240
+ "artifacts": [
241
+ {
242
+ "name": "badmesh.png",
243
+ "b64": image_base64,
244
+ "mime": "image/png",
245
+ "size": len(image_data),
246
+ "description": "Bad mesh image for demonstration",
247
+ "viewer": "image"
248
+ }
249
+ ],
250
+ "display": {
251
+ "open_canvas": True,
252
+ "primary_file": "badmesh.png",
253
+ "mode": "replace",
254
+ "viewer_hint": "image"
255
+ }
256
+ }
257
+
258
+ @mcp.tool
259
+ def create_iframe_demo() -> Dict[str, Any]:
260
+ """
261
+ Create a demo showing how to embed external content using iframes.
262
+
263
+ This demonstrates the v2 MCP iframe capability for embedding interactive
264
+ external content like dashboards, visualizations, or web applications.
265
+
266
+ IMPORTANT - CSP Configuration Required:
267
+ To display external URLs in iframes, the SECURITY_CSP_VALUE environment
268
+ variable must include the iframe URL in the frame-src directive.
269
+
270
+ Example for https://www.sandia.gov/:
271
+ SECURITY_CSP_VALUE="... frame-src 'self' blob: data: https://www.sandia.gov/; ..."
272
+
273
+ Without proper CSP configuration, the browser will block the iframe.
274
+
275
+ Returns:
276
+ Dictionary with iframe display configuration
277
+ """
278
+ return {
279
+ "results": {
280
+ "content": "Iframe demo created! An external webpage will be displayed in the canvas panel.",
281
+ "iframe_url": "https://www.sandia.gov/"
282
+ },
283
+ "artifacts": [],
284
+ "display": {
285
+ "open_canvas": True,
286
+ "type": "iframe",
287
+ "url": "https://www.sandia.gov/",
288
+ "title": "Example Website",
289
+ "sandbox": "allow-scripts allow-same-origin",
290
+ "mode": "replace"
291
+ }
292
+ }
293
+
294
+ @mcp.tool
295
+ def create_html_with_iframe() -> Dict[str, Any]:
296
+ """
297
+ Create an HTML artifact that includes an embedded iframe.
298
+
299
+ This demonstrates how MCP tools can return HTML content with embedded
300
+ iframes that will be properly rendered in the canvas panel.
301
+
302
+ IMPORTANT - CSP Configuration Required:
303
+ To display external URLs in iframes, the SECURITY_CSP_VALUE environment
304
+ variable must include the iframe URL in the frame-src directive.
305
+
306
+ Example for https://www.sandia.gov/:
307
+ SECURITY_CSP_VALUE="... frame-src 'self' blob: data: https://www.sandia.gov/; ..."
308
+
309
+ Without proper CSP configuration, the browser will block the iframe.
310
+
311
+ Returns:
312
+ Dictionary with HTML artifact containing an iframe
313
+ """
314
+ html_content = """<!DOCTYPE html>
315
+ <html>
316
+ <head>
317
+ <style>
318
+ body {
319
+ margin: 0;
320
+ padding: 20px;
321
+ font-family: Arial, sans-serif;
322
+ background: #1a1a1a;
323
+ color: #fff;
324
+ }
325
+ .iframe-container {
326
+ width: 100%;
327
+ height: 600px;
328
+ border: 2px solid #444;
329
+ border-radius: 8px;
330
+ overflow: hidden;
331
+ }
332
+ h1 {
333
+ color: #4a9eff;
334
+ margin-bottom: 10px;
335
+ }
336
+ p {
337
+ color: #aaa;
338
+ margin-bottom: 20px;
339
+ }
340
+ </style>
341
+ </head>
342
+ <body>
343
+ <h1>Embedded Content Demo</h1>
344
+ <p>This HTML artifact includes an embedded iframe showing external content:</p>
345
+ <div class="iframe-container">
346
+ <iframe
347
+ src="https://www.sandia.gov/"
348
+ width="100%"
349
+ height="100%"
350
+ sandbox="allow-scripts allow-same-origin"
351
+ frameborder="0">
352
+ </iframe>
353
+ </div>
354
+ </body>
355
+ </html>"""
356
+
357
+ import base64
358
+ html_base64 = base64.b64encode(html_content.encode('utf-8')).decode('utf-8')
359
+
360
+ return {
361
+ "results": {
362
+ "content": "HTML with embedded iframe created! Check the canvas panel."
363
+ },
364
+ "artifacts": [
365
+ {
366
+ "name": "iframe_demo.html",
367
+ "b64": html_base64,
368
+ "mime": "text/html",
369
+ "size": len(html_content.encode('utf-8')),
370
+ "description": "HTML page with embedded iframe",
371
+ "viewer": "html"
372
+ }
373
+ ],
374
+ "display": {
375
+ "open_canvas": True,
376
+ "primary_file": "iframe_demo.html",
377
+ "mode": "replace",
378
+ "viewer_hint": "html"
379
+ }
380
+ }
381
+
382
+ if __name__ == "__main__":
383
+ mcp.run()
@@ -0,0 +1,32 @@
1
+ <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
2
+ padding: 28px 32px;
3
+ border-radius: 14px;
4
+ color: white;
5
+ font-family: Arial, sans-serif;
6
+ max-width: 800px;
7
+ margin: 32px auto;">
8
+ <h2 style="margin-top: 0;">🎨 Custom UI Demo</h2>
9
+ <p>This content was injected by an MCP server using the custom_html field!</p>
10
+ <div style="display: flex; gap: 10px; margin-top: 15px;">
11
+ <button onclick="alert('Hello from MCP!')"
12
+ style="background: #4CAF50; color: white; border: none; padding: 10px 20px; border-radius: 5px; cursor: pointer;">
13
+ Click Me!
14
+ </button>
15
+ <button onclick="document.getElementById('demo-text').style.color = 'yellow'"
16
+ style="background: #ff9800; color: white; border: none; padding: 10px 20px; border-radius: 5px; cursor: pointer;">
17
+ Change Text Color
18
+ </button>
19
+ </div>
20
+ <p id="demo-text" style="margin-top: 15px; font-size: 16px;">
21
+ This text can be modified by the button above!
22
+ </p>
23
+ <div style="margin-top: 20px; padding: 10px; background: rgba(255,255,255,0.2); border-radius: 5px;">
24
+ <strong>Capabilities Demonstrated:</strong>
25
+ <ul style="margin: 10px 0; padding-left: 20px;">
26
+ <li>Custom HTML injection</li>
27
+ <li>Interactive JavaScript buttons</li>
28
+ <li>Dynamic styling</li>
29
+ <li>Safe HTML sanitization</li>
30
+ </ul>
31
+ </div>
32
+ </div>
@@ -0,0 +1,32 @@
1
+ <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
2
+ padding: 28px 32px;
3
+ border-radius: 14px;
4
+ color: white;
5
+ font-family: Arial, sans-serif;
6
+ max-width: 800px;
7
+ margin: 32px auto;">
8
+ <h3 style="text-align: center; margin-top: 0; color: #63b3ed;">📊 Sample Data Visualization</h3>
9
+ <div style="margin: 20px 0;">
10
+ <div style="margin-bottom: 10px;">
11
+ <span style="color: #a0aec0;">Sales (Jan-Mar 2024)</span>
12
+ <div style="background: #1a202c; height: 30px; border-radius: 15px; position: relative; margin-top: 5px;">
13
+ <div style="background: linear-gradient(90deg, #4299e1, #63b3ed); height: 100%; width: 75%; border-radius: 15px; display: flex; align-items: center; justify-content: center; font-weight: bold;">75%</div>
14
+ </div>
15
+ </div>
16
+ <div style="margin-bottom: 10px;">
17
+ <span style="color: #a0aec0;">Customer Satisfaction</span>
18
+ <div style="background: #1a202c; height: 30px; border-radius: 15px; position: relative; margin-top: 5px;">
19
+ <div style="background: linear-gradient(90deg, #48bb78, #68d391); height: 100%; width: 92%; border-radius: 15px; display: flex; align-items: center; justify-content: center; font-weight: bold;">92%</div>
20
+ </div>
21
+ </div>
22
+ <div style="margin-bottom: 10px;">
23
+ <span style="color: #a0aec0;">Market Share</span>
24
+ <div style="background: #1a202c; height: 30px; border-radius: 15px; position: relative; margin-top: 5px;">
25
+ <div style="background: linear-gradient(90deg, #ed8936, #f6ad55); height: 100%; width: 58%; border-radius: 15px; display: flex; align-items: center; justify-content: center; font-weight: bold;">58%</div>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ <div style="text-align: center; margin-top: 20px; padding: 10px; background: rgba(99, 179, 237, 0.1); border-radius: 5px;">
30
+ <small style="color: #a0aec0;">Generated by MCP Server with custom HTML</small>
31
+ </div>
32
+ </div>
@@ -0,0 +1,28 @@
1
+ <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
2
+ padding: 28px 32px;
3
+ border-radius: 14px;
4
+ color: white;
5
+ font-family: Arial, sans-serif;
6
+ max-width: 800px;
7
+ margin: 32px auto;">
8
+ <h3 style="color: #63b3ed; margin-top: 0; text-align: center;">📋 Interactive Form Demo</h3>
9
+ <form onsubmit="event.preventDefault(); alert('Form submitted! Data: ' + JSON.stringify({name: this.name.value, email: this.email.value, message: this.message.value}));" style="display: flex; flex-direction: column; gap: 15px;">
10
+ <div>
11
+ <label style="display: block; color: #a0aec0; margin-bottom: 5px;">Name:</label>
12
+ <input type="text" name="name" style="width: 100%; padding: 8px 12px; border: 1px solid #4a5568; border-radius: 6px; background: #2d3748; color: white; box-sizing: border-box;" placeholder="Enter your name" />
13
+ </div>
14
+ <div>
15
+ <label style="display: block; color: #a0aec0; margin-bottom: 5px;">Email:</label>
16
+ <input type="email" name="email" style="width: 100%; padding: 8px 12px; border: 1px solid #4a5568; border-radius: 6px; background: #2d3748; color: white; box-sizing: border-box;" placeholder="Enter your email" />
17
+ </div>
18
+ <div>
19
+ <label style="display: block; color: #a0aec0; margin-bottom: 5px;">Message:</label>
20
+ <textarea name="message" rows="4" style="width: 100%; padding: 8px 12px; border: 1px solid #4a5568; border-radius: 6px; background: #2d3748; color: white; resize: vertical; box-sizing: border-box;" placeholder="Enter your message"></textarea>
21
+ </div>
22
+ <button type="submit" style="background: linear-gradient(45deg, #667eea, #764ba2); color: white; border: none; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; transition: transform 0.2s;" onmouseover="this.style.transform='scale(1.05)'" onmouseout="this.style.transform='scale(1)'">Submit Form</button>
23
+ </form>
24
+ <div style="margin-top: 20px; padding: 15px; background: rgba(72, 187, 120, 0.1); border-radius: 6px; border-left: 4px solid #48bb78;">
25
+ <strong style="color: #68d391;">Note:</strong>
26
+ <span style="color: #a0aec0;">This form demonstrates how MCP servers can create interactive UI elements. Form submission shows an alert with the entered data.</span>
27
+ </div>
28
+ </div>