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,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()
|