|
11 | 11 |
|
12 | 12 | namespace Mcp\Example\StdioLoggingShowcase; |
13 | 13 |
|
14 | | -use Mcp\Capability\Attribute\McpPrompt; |
15 | | -use Mcp\Capability\Attribute\McpResource; |
16 | 14 | use Mcp\Capability\Attribute\McpTool; |
17 | 15 | use Mcp\Capability\Logger\McpLogger; |
18 | | -use Psr\Log\LoggerInterface; |
19 | 16 |
|
20 | 17 | /** |
21 | 18 | * Example handlers showcasing auto-injected MCP logging capabilities. |
@@ -44,202 +41,40 @@ public function logMessage(string $message, string $level, McpLogger $logger): a |
44 | 41 |
|
45 | 42 | switch (strtolower($level)) { |
46 | 43 | case 'debug': |
47 | | - $logger->debug("🔍 Debug: $message", ['tool' => 'log_message']); |
| 44 | + $logger->debug("Debug: $message", ['tool' => 'log_message']); |
48 | 45 | break; |
49 | 46 | case 'info': |
50 | | - $logger->info("ℹ️ Info: $message", ['tool' => 'log_message']); |
| 47 | + $logger->info("Info: $message", ['tool' => 'log_message']); |
| 48 | + break; |
| 49 | + case 'notice': |
| 50 | + $logger->notice("Notice: $message", ['tool' => 'log_message']); |
51 | 51 | break; |
52 | 52 | case 'warning': |
53 | | - $logger->warning("⚠️ Warning: $message", ['tool' => 'log_message']); |
| 53 | + $logger->warning("Warning: $message", ['tool' => 'log_message']); |
54 | 54 | break; |
55 | 55 | case 'error': |
56 | | - $logger->error("❌ Error: $message", ['tool' => 'log_message']); |
| 56 | + $logger->error("Error: $message", ['tool' => 'log_message']); |
| 57 | + break; |
| 58 | + case 'critical': |
| 59 | + $logger->critical("Critical: $message", ['tool' => 'log_message']); |
| 60 | + break; |
| 61 | + case 'alert': |
| 62 | + $logger->alert("Alert: $message", ['tool' => 'log_message']); |
| 63 | + break; |
| 64 | + case 'emergency': |
| 65 | + $logger->emergency("Emergency: $message", ['tool' => 'log_message']); |
57 | 66 | break; |
58 | 67 | default: |
59 | 68 | $logger->warning("Unknown level '$level', defaulting to info"); |
60 | | - $logger->info("📝 $message", ['tool' => 'log_message']); |
| 69 | + $logger->info("Info: $message", ['tool' => 'log_message']); |
61 | 70 | } |
62 | 71 |
|
63 | | - $logger->debug('✅ log_message tool completed successfully'); |
| 72 | + $logger->debug('log_message tool completed successfully'); |
64 | 73 |
|
65 | 74 | return [ |
66 | 75 | 'message' => "Logged message with level: $level", |
67 | 76 | 'logged_at' => date('Y-m-d H:i:s'), |
68 | 77 | 'level_used' => $level, |
69 | 78 | ]; |
70 | 79 | } |
71 | | - |
72 | | - /** |
73 | | - * Tool that simulates a complex operation with detailed logging. |
74 | | - * |
75 | | - * @param array<mixed> $data Input data to process |
76 | | - * @param LoggerInterface $logger Auto-injected logger (will be McpLogger) |
77 | | - * |
78 | | - * @return array<string, mixed> |
79 | | - */ |
80 | | - #[McpTool(name: 'process_data', description: 'Processes data with comprehensive logging')] |
81 | | - public function processData(array $data, LoggerInterface $logger): array |
82 | | - { |
83 | | - $logger->info('🔄 Starting data processing', ['input_count' => \count($data)]); |
84 | | - |
85 | | - $results = []; |
86 | | - $errors = []; |
87 | | - |
88 | | - foreach ($data as $index => $item) { |
89 | | - $logger->debug("Processing item $index", ['item' => $item]); |
90 | | - |
91 | | - try { |
92 | | - if (!\is_string($item) && !is_numeric($item)) { |
93 | | - throw new \InvalidArgumentException('Item must be string or numeric'); |
94 | | - } |
95 | | - |
96 | | - $processed = strtoupper((string) $item); |
97 | | - $results[] = $processed; |
98 | | - |
99 | | - $logger->debug("✅ Successfully processed item $index", [ |
100 | | - 'original' => $item, |
101 | | - 'processed' => $processed, |
102 | | - ]); |
103 | | - } catch (\Exception $e) { |
104 | | - $logger->error("❌ Failed to process item $index", [ |
105 | | - 'item' => $item, |
106 | | - 'error' => $e->getMessage(), |
107 | | - ]); |
108 | | - $errors[] = "Item $index: ".$e->getMessage(); |
109 | | - } |
110 | | - } |
111 | | - |
112 | | - if (empty($errors)) { |
113 | | - $logger->info('🎉 Data processing completed successfully', [ |
114 | | - 'processed_count' => \count($results), |
115 | | - ]); |
116 | | - } else { |
117 | | - $logger->warning('⚠️ Data processing completed with errors', [ |
118 | | - 'processed_count' => \count($results), |
119 | | - 'error_count' => \count($errors), |
120 | | - ]); |
121 | | - } |
122 | | - |
123 | | - return [ |
124 | | - 'processed_items' => $results, |
125 | | - 'errors' => $errors, |
126 | | - 'summary' => [ |
127 | | - 'total_input' => \count($data), |
128 | | - 'successful' => \count($results), |
129 | | - 'failed' => \count($errors), |
130 | | - ], |
131 | | - ]; |
132 | | - } |
133 | | - |
134 | | - /** |
135 | | - * Resource that provides logging configuration with auto-injected logger. |
136 | | - * |
137 | | - * @param McpLogger $logger Auto-injected MCP logger |
138 | | - * |
139 | | - * @return array<string, mixed> |
140 | | - */ |
141 | | - #[McpResource( |
142 | | - uri: 'config://logging/settings', |
143 | | - name: 'logging_config', |
144 | | - description: 'Current logging configuration and auto-injection status.', |
145 | | - mimeType: 'application/json' |
146 | | - )] |
147 | | - public function getLoggingConfig(McpLogger $logger): array |
148 | | - { |
149 | | - $logger->info('📋 Retrieving logging configuration'); |
150 | | - |
151 | | - $config = [ |
152 | | - 'auto_injection' => 'enabled', |
153 | | - 'supported_types' => ['McpLogger', 'LoggerInterface'], |
154 | | - 'levels' => ['debug', 'info', 'warning', 'error'], |
155 | | - 'features' => [ |
156 | | - 'auto_injection', |
157 | | - 'mcp_transport', |
158 | | - 'fallback_logging', |
159 | | - 'structured_data', |
160 | | - ], |
161 | | - ]; |
162 | | - |
163 | | - $logger->debug('Configuration retrieved', $config); |
164 | | - |
165 | | - return $config; |
166 | | - } |
167 | | - |
168 | | - /** |
169 | | - * Prompt that generates logging examples with auto-injected logger. |
170 | | - * |
171 | | - * @param string $example_type Type of logging example to generate |
172 | | - * @param LoggerInterface $logger Auto-injected logger |
173 | | - * |
174 | | - * @return array<string, mixed> |
175 | | - */ |
176 | | - #[McpPrompt(name: 'logging_examples', description: 'Generates logging code examples')] |
177 | | - public function generateLoggingExamples(string $example_type, LoggerInterface $logger): array |
178 | | - { |
179 | | - $logger->info('📝 Generating logging examples', ['type' => $example_type]); |
180 | | - |
181 | | - $examples = match (strtolower($example_type)) { |
182 | | - 'tool' => [ |
183 | | - 'title' => 'Tool Handler with Auto-Injected Logger', |
184 | | - 'code' => ' |
185 | | -#[McpTool(name: "my_tool")] |
186 | | -public function myTool(string $input, McpLogger $logger): array |
187 | | -{ |
188 | | - $logger->info("Tool called", ["input" => $input]); |
189 | | - // Your tool logic here |
190 | | - return ["result" => "processed"]; |
191 | | -}', |
192 | | - 'description' => 'McpLogger is automatically injected - no configuration needed!', |
193 | | - ], |
194 | | - |
195 | | - 'resource' => [ |
196 | | - 'title' => 'Resource Handler with Logger Interface', |
197 | | - 'code' => ' |
198 | | -#[McpResource(uri: "my://resource")] |
199 | | -public function getResource(LoggerInterface $logger): string |
200 | | -{ |
201 | | - $logger->debug("Resource accessed"); |
202 | | - return "resource content"; |
203 | | -}', |
204 | | - 'description' => 'Works with both McpLogger and LoggerInterface types', |
205 | | - ], |
206 | | - |
207 | | - 'function' => [ |
208 | | - 'title' => 'Function Handler with Auto-Injection', |
209 | | - 'code' => ' |
210 | | -function myHandler(array $params, McpLogger $logger): array |
211 | | -{ |
212 | | - $logger->warning("Function handler called"); |
213 | | - return $params; |
214 | | -}', |
215 | | - 'description' => 'Even function handlers get auto-injection!', |
216 | | - ], |
217 | | - |
218 | | - default => [ |
219 | | - 'title' => 'Basic Logging Pattern', |
220 | | - 'code' => ' |
221 | | -// Just declare McpLogger as a parameter |
222 | | -public function handler($data, McpLogger $logger) |
223 | | -{ |
224 | | - $logger->info("Handler started"); |
225 | | - // Auto-injected, no setup required! |
226 | | -}', |
227 | | - 'description' => 'The simplest way to get MCP logging', |
228 | | - ], |
229 | | - }; |
230 | | - |
231 | | - $logger->info('✅ Generated logging example', ['type' => $example_type]); |
232 | | - |
233 | | - return [ |
234 | | - 'prompt' => "Here's how to use auto-injected MCP logging:", |
235 | | - 'example' => $examples, |
236 | | - 'tips' => [ |
237 | | - 'Just add McpLogger or LoggerInterface as a parameter', |
238 | | - 'No configuration or setup required', |
239 | | - 'Logger is automatically provided by the MCP SDK', |
240 | | - 'Logs are sent to connected MCP clients', |
241 | | - 'Fallback logger used if MCP transport unavailable', |
242 | | - ], |
243 | | - ]; |
244 | | - } |
245 | 80 | } |
0 commit comments