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,369 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Order Database MCP Server using FastMCP
4
+ Provides customer order retrieval and status update functionality.
5
+ """
6
+
7
+ import base64
8
+ import os
9
+ import time
10
+ from dataclasses import dataclass
11
+ from enum import Enum
12
+ from typing import Any, Dict, List
13
+
14
+ from fastmcp import FastMCP
15
+
16
+ # Initialize the MCP server
17
+ mcp = FastMCP("OrderDatabase")
18
+
19
+ class OrderStatus(Enum):
20
+ SUBMITTED = "submitted"
21
+ PACKAGED = "items-packaged"
22
+ SHIPPED = "items-shipped"
23
+ DELIVERED = "delivered"
24
+
25
+ @dataclass
26
+ class Order:
27
+ order_number: str
28
+ items: List[str]
29
+ customer: str
30
+ customer_address: str
31
+ status: OrderStatus
32
+
33
+ # In-memory database (simulated)
34
+ ORDERS: Dict[str, Order] = {
35
+ "ORD001": Order(
36
+ order_number="ORD001",
37
+ items=["Laptop", "Mouse", "Keyboard"],
38
+ customer="John Doe",
39
+ customer_address="123 Main St, Anytown, ST 12345",
40
+ status=OrderStatus.SUBMITTED
41
+ ),
42
+ "ORD002": Order(
43
+ order_number="ORD002",
44
+ items=["Phone", "Case", "Charger"],
45
+ customer="Jane Smith",
46
+ customer_address="456 Oak Ave, Somewhere, ST 67890",
47
+ status=OrderStatus.PACKAGED
48
+ ),
49
+ "ORD003": Order(
50
+ order_number="ORD003",
51
+ items=["Tablet", "Stylus"],
52
+ customer="Bob Johnson",
53
+ customer_address="789 Pine Rd, Elsewhere, ST 54321",
54
+ status=OrderStatus.SHIPPED
55
+ )
56
+ }
57
+
58
+ def _finalize_meta(meta: Dict[str, Any], start: float) -> Dict[str, Any]:
59
+ """Attach timing info and return meta_data dict."""
60
+ meta = dict(meta) # shallow copy
61
+ meta["elapsed_ms"] = round((time.perf_counter() - start) * 1000, 3)
62
+ return meta
63
+
64
+ @mcp.tool
65
+ def get_order(order_number: str) -> Dict[str, Any]:
66
+ """
67
+ Retrieve comprehensive customer order information with complete order details and tracking status.
68
+
69
+ This order management tool provides full access to customer order data:
70
+
71
+ **Order Information Retrieved:**
72
+ - Complete order identification and reference numbers
73
+ - Detailed item list with all products in the order
74
+ - Customer contact information and profile data
75
+ - Shipping address and delivery location details
76
+ - Current order status and processing stage
77
+
78
+ **Order Status Tracking:**
79
+ - Real-time order processing status updates
80
+ - Order lifecycle stage identification (submitted → packaged → shipped → delivered)
81
+ - Processing timestamps and status change history
82
+ - Delivery tracking and fulfillment progress
83
+
84
+ **Customer Data Access:**
85
+ - Customer identification and contact information
86
+ - Shipping address validation and formatting
87
+ - Order history and customer relationship data
88
+ - Account status and customer profile integration
89
+
90
+ **Business Intelligence:**
91
+ - Order value and item composition analysis
92
+ - Customer ordering patterns and preferences
93
+ - Geographic distribution of orders
94
+ - Order processing efficiency metrics
95
+
96
+ **Use Cases:**
97
+ - Customer service inquiries and support
98
+ - Order status verification and tracking
99
+ - Shipping and logistics coordination
100
+ - Customer relationship management
101
+ - Order fulfillment and warehouse operations
102
+ - Returns and refund processing
103
+ - Business analytics and reporting
104
+
105
+ **Data Security:**
106
+ - Secure order number validation
107
+ - Customer data privacy protection
108
+ - Access control and audit logging
109
+ - Error handling for invalid requests
110
+
111
+ **Integration Features:**
112
+ - Compatible with CRM and ERP systems
113
+ - Real-time inventory and shipping updates
114
+ - Customer communication triggers
115
+ - Analytics and reporting integration
116
+
117
+ Args:
118
+ order_number: Unique order identifier (string format, e.g., "ORD001")
119
+
120
+ Returns:
121
+ Dictionary containing:
122
+ - order_number: Confirmed order identification
123
+ - items: Complete list of ordered products
124
+ - customer: Customer name and identification
125
+ - customer_address: Shipping address and location
126
+ - status: Current order processing status
127
+ - meta_data: Processing timing and system information
128
+ Or error message if order not found or access denied
129
+ """
130
+ start = time.perf_counter()
131
+ meta: Dict[str, Any] = {}
132
+
133
+ try:
134
+ if order_number not in ORDERS:
135
+ meta.update({"is_error": True, "reason": "not_found"})
136
+ return {
137
+ "results": {"error": f"Order {order_number} not found"},
138
+ "meta_data": _finalize_meta(meta, start)
139
+ }
140
+
141
+ order = ORDERS[order_number]
142
+ meta.update({"is_error": False})
143
+ return {
144
+ "results": {
145
+ "order_number": order.order_number,
146
+ "items": order.items,
147
+ "customer": order.customer,
148
+ "customer_address": order.customer_address,
149
+ "status": order.status.value
150
+ },
151
+ "meta_data": _finalize_meta(meta, start)
152
+ }
153
+ except Exception as e:
154
+ meta.update({"is_error": True, "reason": type(e).__name__})
155
+ return {
156
+ "results": {"error": f"Error retrieving order: {str(e)}"},
157
+ "meta_data": _finalize_meta(meta, start)
158
+ }
159
+
160
+ @mcp.tool
161
+ def update_order_status(order_number: str, new_status: str) -> Dict[str, Any]:
162
+ """
163
+ Update customer order status with workflow validation and tracking throughout the order lifecycle.
164
+
165
+ This order management tool provides controlled status updates with business logic validation:
166
+
167
+ **Order Status Management:**
168
+ - Secure order status updates with validation
169
+ - Order lifecycle workflow enforcement
170
+ - Status change tracking and audit logging
171
+ - Business rule validation for status transitions
172
+
173
+ **Supported Order Statuses:**
174
+ - "submitted": Initial order placement and validation
175
+ - "items-packaged": Inventory picked and packaged for shipping
176
+ - "items-shipped": Order dispatched and in transit
177
+ - "delivered": Successfully delivered to customer
178
+
179
+ **Workflow Validation:**
180
+ - Status progression logic enforcement
181
+ - Invalid status change prevention
182
+ - Order state consistency validation
183
+ - Business rule compliance checking
184
+
185
+ **Operational Features:**
186
+ - Real-time order tracking updates
187
+ - Customer notification triggers
188
+ - Inventory management integration
189
+ - Shipping system coordination
190
+
191
+ **Use Cases:**
192
+ - Warehouse fulfillment operations
193
+ - Shipping and logistics coordination
194
+ - Customer service status updates
195
+ - Order processing workflow management
196
+ - Returns and exchange processing
197
+ - Quality control and inspection checkpoints
198
+
199
+ **Business Integration:**
200
+ - ERP and inventory system updates
201
+ - Customer communication automation
202
+ - Analytics and reporting triggers
203
+ - Performance metrics tracking
204
+
205
+ **Data Integrity:**
206
+ - Order validation before status changes
207
+ - Audit trail maintenance
208
+ - Error handling and rollback capabilities
209
+ - Concurrent update protection
210
+
211
+ **Automation Support:**
212
+ - API-driven status updates
213
+ - Scheduled batch processing
214
+ - Event-driven workflow triggers
215
+ - Integration with shipping carriers
216
+
217
+ Args:
218
+ order_number: Unique order identifier to update (string format, e.g., "ORD001")
219
+ new_status: Target status value (must be valid status: submitted, items-packaged, items-shipped, delivered)
220
+
221
+ Returns:
222
+ Dictionary containing:
223
+ - success: Boolean indicating successful status update
224
+ - order_number: Confirmed order identification
225
+ - old_status: Previous order status for reference
226
+ - new_status: Updated order status confirmation
227
+ - meta_data: Processing timing and system information
228
+ Or error message if order not found, invalid status, or update failed
229
+ """
230
+ start = time.perf_counter()
231
+ meta: Dict[str, Any] = {}
232
+
233
+ try:
234
+ if order_number not in ORDERS:
235
+ meta.update({"is_error": True, "reason": "not_found"})
236
+ return {
237
+ "results": {"error": f"Order {order_number} not found"},
238
+ "meta_data": _finalize_meta(meta, start)
239
+ }
240
+
241
+ # Validate status
242
+ try:
243
+ status_enum = OrderStatus(new_status)
244
+ except ValueError:
245
+ valid_statuses = [status.value for status in OrderStatus]
246
+ meta.update({"is_error": True, "reason": "invalid_status"})
247
+ return {
248
+ "results": {
249
+ "error": f"Invalid status: {new_status}",
250
+ "valid_statuses": valid_statuses
251
+ },
252
+ "meta_data": _finalize_meta(meta, start)
253
+ }
254
+
255
+ # Update order status
256
+ ORDERS[order_number].status = status_enum
257
+ meta.update({"is_error": False})
258
+ return {
259
+ "results": {
260
+ "success": True,
261
+ "order_number": order_number,
262
+ "new_status": new_status
263
+ },
264
+ "meta_data": _finalize_meta(meta, start)
265
+ }
266
+ except Exception as e:
267
+ meta.update({"is_error": True, "reason": type(e).__name__})
268
+ return {
269
+ "results": {"error": f"Error updating order status: {str(e)}"},
270
+ "meta_data": _finalize_meta(meta, start)
271
+ }
272
+
273
+ @mcp.tool
274
+ def list_all_orders() -> Dict[str, Any]:
275
+ """
276
+ List all customer orders with their basic information.
277
+
278
+ Returns:
279
+ Dictionary with list of all orders
280
+ """
281
+ start = time.perf_counter()
282
+ meta: Dict[str, Any] = {}
283
+
284
+ try:
285
+ orders_list = []
286
+ for order in ORDERS.values():
287
+ orders_list.append({
288
+ "order_number": order.order_number,
289
+ "customer": order.customer,
290
+ "status": order.status.value,
291
+ "item_count": len(order.items)
292
+ })
293
+
294
+ meta.update({"is_error": False})
295
+ return {
296
+ "results": {
297
+ "orders": orders_list,
298
+ "total_count": len(orders_list)
299
+ },
300
+ "meta_data": _finalize_meta(meta, start)
301
+ }
302
+ except Exception as e:
303
+ meta.update({"is_error": True, "reason": type(e).__name__})
304
+ return {
305
+ "results": {"error": f"Error listing orders: {str(e)}"},
306
+ "meta_data": _finalize_meta(meta, start)
307
+ }
308
+
309
+ @mcp.tool
310
+ def get_signal_data_csv() -> Dict[str, Any]:
311
+ """
312
+ Return the signal_data.csv file from the same directory as this MCP.
313
+
314
+ Returns:
315
+ Dictionary with the CSV file as a base64 encoded artifact
316
+ """
317
+ start = time.perf_counter()
318
+ meta: Dict[str, Any] = {}
319
+
320
+ try:
321
+ # Get the directory where this script is located
322
+ script_dir = os.path.dirname(os.path.abspath(__file__))
323
+ csv_path = os.path.join(script_dir, "signal_data.csv")
324
+
325
+ if not os.path.exists(csv_path):
326
+ meta.update({"is_error": True, "reason": "file_not_found"})
327
+ return {
328
+ "results": {"error": "signal_data.csv file not found"},
329
+ "meta_data": _finalize_meta(meta, start)
330
+ }
331
+
332
+ # Read the CSV file
333
+ with open(csv_path, 'rb') as f:
334
+ csv_content = f.read()
335
+
336
+ # Encode as base64
337
+ csv_b64 = base64.b64encode(csv_content).decode('utf-8')
338
+
339
+ meta.update({"is_error": False, "file_size_bytes": len(csv_content)})
340
+ return {
341
+ "results": {
342
+ "message": "Signal data CSV file retrieved successfully",
343
+ "filename": "signal_data.csv",
344
+ "file_size_bytes": len(csv_content)
345
+ },
346
+ "artifacts": [
347
+ {
348
+ "name": "signal_data.csv",
349
+ "b64": csv_b64,
350
+ "mime": "text/csv",
351
+ }
352
+ ],
353
+ "display": {
354
+ "open_canvas": True,
355
+ "primary_file": "signal_data.csv",
356
+ "mode": "replace",
357
+ "viewer_hint": "code",
358
+ },
359
+ "meta_data": _finalize_meta(meta, start)
360
+ }
361
+ except Exception as e:
362
+ meta.update({"is_error": True, "reason": type(e).__name__})
363
+ return {
364
+ "results": {"error": f"Error reading CSV file: {str(e)}"},
365
+ "meta_data": _finalize_meta(meta, start)
366
+ }
367
+
368
+ if __name__ == "__main__":
369
+ mcp.run()