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.
- atlas/__init__.py +40 -0
- atlas/application/__init__.py +7 -0
- atlas/application/chat/__init__.py +7 -0
- atlas/application/chat/agent/__init__.py +10 -0
- atlas/application/chat/agent/act_loop.py +179 -0
- atlas/application/chat/agent/factory.py +142 -0
- atlas/application/chat/agent/protocols.py +46 -0
- atlas/application/chat/agent/react_loop.py +338 -0
- atlas/application/chat/agent/think_act_loop.py +171 -0
- atlas/application/chat/approval_manager.py +151 -0
- atlas/application/chat/elicitation_manager.py +191 -0
- atlas/application/chat/events/__init__.py +1 -0
- atlas/application/chat/events/agent_event_relay.py +112 -0
- atlas/application/chat/modes/__init__.py +1 -0
- atlas/application/chat/modes/agent.py +125 -0
- atlas/application/chat/modes/plain.py +74 -0
- atlas/application/chat/modes/rag.py +81 -0
- atlas/application/chat/modes/tools.py +179 -0
- atlas/application/chat/orchestrator.py +213 -0
- atlas/application/chat/policies/__init__.py +1 -0
- atlas/application/chat/policies/tool_authorization.py +99 -0
- atlas/application/chat/preprocessors/__init__.py +1 -0
- atlas/application/chat/preprocessors/message_builder.py +92 -0
- atlas/application/chat/preprocessors/prompt_override_service.py +104 -0
- atlas/application/chat/service.py +454 -0
- atlas/application/chat/utilities/__init__.py +6 -0
- atlas/application/chat/utilities/error_handler.py +367 -0
- atlas/application/chat/utilities/event_notifier.py +546 -0
- atlas/application/chat/utilities/file_processor.py +613 -0
- atlas/application/chat/utilities/tool_executor.py +789 -0
- atlas/atlas_chat_cli.py +347 -0
- atlas/atlas_client.py +238 -0
- atlas/core/__init__.py +0 -0
- atlas/core/auth.py +205 -0
- atlas/core/authorization_manager.py +27 -0
- atlas/core/capabilities.py +123 -0
- atlas/core/compliance.py +215 -0
- atlas/core/domain_whitelist.py +147 -0
- atlas/core/domain_whitelist_middleware.py +82 -0
- atlas/core/http_client.py +28 -0
- atlas/core/log_sanitizer.py +102 -0
- atlas/core/metrics_logger.py +59 -0
- atlas/core/middleware.py +131 -0
- atlas/core/otel_config.py +242 -0
- atlas/core/prompt_risk.py +200 -0
- atlas/core/rate_limit.py +0 -0
- atlas/core/rate_limit_middleware.py +64 -0
- atlas/core/security_headers_middleware.py +51 -0
- atlas/domain/__init__.py +37 -0
- atlas/domain/chat/__init__.py +1 -0
- atlas/domain/chat/dtos.py +85 -0
- atlas/domain/errors.py +96 -0
- atlas/domain/messages/__init__.py +12 -0
- atlas/domain/messages/models.py +160 -0
- atlas/domain/rag_mcp_service.py +664 -0
- atlas/domain/sessions/__init__.py +7 -0
- atlas/domain/sessions/models.py +36 -0
- atlas/domain/unified_rag_service.py +371 -0
- atlas/infrastructure/__init__.py +10 -0
- atlas/infrastructure/app_factory.py +135 -0
- atlas/infrastructure/events/__init__.py +1 -0
- atlas/infrastructure/events/cli_event_publisher.py +140 -0
- atlas/infrastructure/events/websocket_publisher.py +140 -0
- atlas/infrastructure/sessions/in_memory_repository.py +56 -0
- atlas/infrastructure/transport/__init__.py +7 -0
- atlas/infrastructure/transport/websocket_connection_adapter.py +33 -0
- atlas/init_cli.py +226 -0
- atlas/interfaces/__init__.py +15 -0
- atlas/interfaces/events.py +134 -0
- atlas/interfaces/llm.py +54 -0
- atlas/interfaces/rag.py +40 -0
- atlas/interfaces/sessions.py +75 -0
- atlas/interfaces/tools.py +57 -0
- atlas/interfaces/transport.py +24 -0
- atlas/main.py +564 -0
- atlas/mcp/api_key_demo/README.md +76 -0
- atlas/mcp/api_key_demo/main.py +172 -0
- atlas/mcp/api_key_demo/run.sh +56 -0
- atlas/mcp/basictable/main.py +147 -0
- atlas/mcp/calculator/main.py +149 -0
- atlas/mcp/code-executor/execution_engine.py +98 -0
- atlas/mcp/code-executor/execution_environment.py +95 -0
- atlas/mcp/code-executor/main.py +528 -0
- atlas/mcp/code-executor/result_processing.py +276 -0
- atlas/mcp/code-executor/script_generation.py +195 -0
- atlas/mcp/code-executor/security_checker.py +140 -0
- atlas/mcp/corporate_cars/main.py +437 -0
- atlas/mcp/csv_reporter/main.py +545 -0
- atlas/mcp/duckduckgo/main.py +182 -0
- atlas/mcp/elicitation_demo/README.md +171 -0
- atlas/mcp/elicitation_demo/main.py +262 -0
- atlas/mcp/env-demo/README.md +158 -0
- atlas/mcp/env-demo/main.py +199 -0
- atlas/mcp/file_size_test/main.py +284 -0
- atlas/mcp/filesystem/main.py +348 -0
- atlas/mcp/image_demo/main.py +113 -0
- atlas/mcp/image_demo/requirements.txt +4 -0
- atlas/mcp/logging_demo/README.md +72 -0
- atlas/mcp/logging_demo/main.py +103 -0
- atlas/mcp/many_tools_demo/main.py +50 -0
- atlas/mcp/order_database/__init__.py +0 -0
- atlas/mcp/order_database/main.py +369 -0
- atlas/mcp/order_database/signal_data.csv +1001 -0
- atlas/mcp/pdfbasic/main.py +394 -0
- atlas/mcp/pptx_generator/main.py +760 -0
- atlas/mcp/pptx_generator/requirements.txt +13 -0
- atlas/mcp/pptx_generator/run_test.sh +1 -0
- atlas/mcp/pptx_generator/test_pptx_generator_security.py +169 -0
- atlas/mcp/progress_demo/main.py +167 -0
- atlas/mcp/progress_updates_demo/QUICKSTART.md +273 -0
- atlas/mcp/progress_updates_demo/README.md +120 -0
- atlas/mcp/progress_updates_demo/main.py +497 -0
- atlas/mcp/prompts/main.py +222 -0
- atlas/mcp/public_demo/main.py +189 -0
- atlas/mcp/sampling_demo/README.md +169 -0
- atlas/mcp/sampling_demo/main.py +234 -0
- atlas/mcp/thinking/main.py +77 -0
- atlas/mcp/tool_planner/main.py +240 -0
- atlas/mcp/ui-demo/badmesh.png +0 -0
- atlas/mcp/ui-demo/main.py +383 -0
- atlas/mcp/ui-demo/templates/button_demo.html +32 -0
- atlas/mcp/ui-demo/templates/data_visualization.html +32 -0
- atlas/mcp/ui-demo/templates/form_demo.html +28 -0
- atlas/mcp/username-override-demo/README.md +320 -0
- atlas/mcp/username-override-demo/main.py +308 -0
- atlas/modules/__init__.py +0 -0
- atlas/modules/config/__init__.py +34 -0
- atlas/modules/config/cli.py +231 -0
- atlas/modules/config/config_manager.py +1096 -0
- atlas/modules/file_storage/__init__.py +22 -0
- atlas/modules/file_storage/cli.py +330 -0
- atlas/modules/file_storage/content_extractor.py +290 -0
- atlas/modules/file_storage/manager.py +295 -0
- atlas/modules/file_storage/mock_s3_client.py +402 -0
- atlas/modules/file_storage/s3_client.py +417 -0
- atlas/modules/llm/__init__.py +19 -0
- atlas/modules/llm/caller.py +287 -0
- atlas/modules/llm/litellm_caller.py +675 -0
- atlas/modules/llm/models.py +19 -0
- atlas/modules/mcp_tools/__init__.py +17 -0
- atlas/modules/mcp_tools/client.py +2123 -0
- atlas/modules/mcp_tools/token_storage.py +556 -0
- atlas/modules/prompts/prompt_provider.py +130 -0
- atlas/modules/rag/__init__.py +24 -0
- atlas/modules/rag/atlas_rag_client.py +336 -0
- atlas/modules/rag/client.py +129 -0
- atlas/routes/admin_routes.py +865 -0
- atlas/routes/config_routes.py +484 -0
- atlas/routes/feedback_routes.py +361 -0
- atlas/routes/files_routes.py +274 -0
- atlas/routes/health_routes.py +40 -0
- atlas/routes/mcp_auth_routes.py +223 -0
- atlas/server_cli.py +164 -0
- atlas/tests/conftest.py +20 -0
- atlas/tests/integration/test_mcp_auth_integration.py +152 -0
- atlas/tests/manual_test_sampling.py +87 -0
- atlas/tests/modules/mcp_tools/test_client_auth.py +226 -0
- atlas/tests/modules/mcp_tools/test_client_env.py +191 -0
- atlas/tests/test_admin_mcp_server_management_routes.py +141 -0
- atlas/tests/test_agent_roa.py +135 -0
- atlas/tests/test_app_factory_smoke.py +47 -0
- atlas/tests/test_approval_manager.py +439 -0
- atlas/tests/test_atlas_client.py +188 -0
- atlas/tests/test_atlas_rag_client.py +447 -0
- atlas/tests/test_atlas_rag_integration.py +224 -0
- atlas/tests/test_attach_file_flow.py +287 -0
- atlas/tests/test_auth_utils.py +165 -0
- atlas/tests/test_backend_public_url.py +185 -0
- atlas/tests/test_banner_logging.py +287 -0
- atlas/tests/test_capability_tokens_and_injection.py +203 -0
- atlas/tests/test_compliance_level.py +54 -0
- atlas/tests/test_compliance_manager.py +253 -0
- atlas/tests/test_config_manager.py +617 -0
- atlas/tests/test_config_manager_paths.py +12 -0
- atlas/tests/test_core_auth.py +18 -0
- atlas/tests/test_core_utils.py +190 -0
- atlas/tests/test_docker_env_sync.py +202 -0
- atlas/tests/test_domain_errors.py +329 -0
- atlas/tests/test_domain_whitelist.py +359 -0
- atlas/tests/test_elicitation_manager.py +408 -0
- atlas/tests/test_elicitation_routing.py +296 -0
- atlas/tests/test_env_demo_server.py +88 -0
- atlas/tests/test_error_classification.py +113 -0
- atlas/tests/test_error_flow_integration.py +116 -0
- atlas/tests/test_feedback_routes.py +333 -0
- atlas/tests/test_file_content_extraction.py +1134 -0
- atlas/tests/test_file_extraction_routes.py +158 -0
- atlas/tests/test_file_library.py +107 -0
- atlas/tests/test_file_manager_unit.py +18 -0
- atlas/tests/test_health_route.py +49 -0
- atlas/tests/test_http_client_stub.py +8 -0
- atlas/tests/test_imports_smoke.py +30 -0
- atlas/tests/test_interfaces_llm_response.py +9 -0
- atlas/tests/test_issue_access_denied_fix.py +136 -0
- atlas/tests/test_llm_env_expansion.py +836 -0
- atlas/tests/test_log_level_sensitive_data.py +285 -0
- atlas/tests/test_mcp_auth_routes.py +341 -0
- atlas/tests/test_mcp_client_auth.py +331 -0
- atlas/tests/test_mcp_data_injection.py +270 -0
- atlas/tests/test_mcp_get_authorized_servers.py +95 -0
- atlas/tests/test_mcp_hot_reload.py +512 -0
- atlas/tests/test_mcp_image_content.py +424 -0
- atlas/tests/test_mcp_logging.py +172 -0
- atlas/tests/test_mcp_progress_updates.py +313 -0
- atlas/tests/test_mcp_prompt_override_system_prompt.py +102 -0
- atlas/tests/test_mcp_prompts_server.py +39 -0
- atlas/tests/test_mcp_tool_result_parsing.py +296 -0
- atlas/tests/test_metrics_logger.py +56 -0
- atlas/tests/test_middleware_auth.py +379 -0
- atlas/tests/test_prompt_risk_and_acl.py +141 -0
- atlas/tests/test_rag_mcp_aggregator.py +204 -0
- atlas/tests/test_rag_mcp_service.py +224 -0
- atlas/tests/test_rate_limit_middleware.py +45 -0
- atlas/tests/test_routes_config_smoke.py +60 -0
- atlas/tests/test_routes_files_download_token.py +41 -0
- atlas/tests/test_routes_files_health.py +18 -0
- atlas/tests/test_runtime_imports.py +53 -0
- atlas/tests/test_sampling_integration.py +482 -0
- atlas/tests/test_security_admin_routes.py +61 -0
- atlas/tests/test_security_capability_tokens.py +65 -0
- atlas/tests/test_security_file_stats_scope.py +21 -0
- atlas/tests/test_security_header_injection.py +191 -0
- atlas/tests/test_security_headers_and_filename.py +63 -0
- atlas/tests/test_shared_session_repository.py +101 -0
- atlas/tests/test_system_prompt_loading.py +181 -0
- atlas/tests/test_token_storage.py +505 -0
- atlas/tests/test_tool_approval_config.py +93 -0
- atlas/tests/test_tool_approval_utils.py +356 -0
- atlas/tests/test_tool_authorization_group_filtering.py +223 -0
- atlas/tests/test_tool_details_in_config.py +108 -0
- atlas/tests/test_tool_planner.py +300 -0
- atlas/tests/test_unified_rag_service.py +398 -0
- atlas/tests/test_username_override_in_approval.py +258 -0
- atlas/tests/test_websocket_auth_header.py +168 -0
- atlas/version.py +6 -0
- atlas_chat-0.1.0.data/data/.env.example +253 -0
- atlas_chat-0.1.0.data/data/config/defaults/compliance-levels.json +44 -0
- atlas_chat-0.1.0.data/data/config/defaults/domain-whitelist.json +123 -0
- atlas_chat-0.1.0.data/data/config/defaults/file-extractors.json +74 -0
- atlas_chat-0.1.0.data/data/config/defaults/help-config.json +198 -0
- atlas_chat-0.1.0.data/data/config/defaults/llmconfig-buggy.yml +11 -0
- atlas_chat-0.1.0.data/data/config/defaults/llmconfig.yml +19 -0
- atlas_chat-0.1.0.data/data/config/defaults/mcp.json +138 -0
- atlas_chat-0.1.0.data/data/config/defaults/rag-sources.json +17 -0
- atlas_chat-0.1.0.data/data/config/defaults/splash-config.json +16 -0
- atlas_chat-0.1.0.dist-info/METADATA +236 -0
- atlas_chat-0.1.0.dist-info/RECORD +250 -0
- atlas_chat-0.1.0.dist-info/WHEEL +5 -0
- atlas_chat-0.1.0.dist-info/entry_points.txt +4 -0
- 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>
|