Skip to content

Commit b701bb1

Browse files
committed
Streamlined examples/stdio-logging-showcase
1 parent 4a8b33e commit b701bb1

File tree

2 files changed

+18
-186
lines changed

2 files changed

+18
-186
lines changed

examples/stdio-logging-showcase/LoggingShowcaseHandlers.php

Lines changed: 18 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,8 @@
1111

1212
namespace Mcp\Example\StdioLoggingShowcase;
1313

14-
use Mcp\Capability\Attribute\McpPrompt;
15-
use Mcp\Capability\Attribute\McpResource;
1614
use Mcp\Capability\Attribute\McpTool;
1715
use Mcp\Capability\Logger\McpLogger;
18-
use Psr\Log\LoggerInterface;
1916

2017
/**
2118
* Example handlers showcasing auto-injected MCP logging capabilities.
@@ -44,202 +41,40 @@ public function logMessage(string $message, string $level, McpLogger $logger): a
4441

4542
switch (strtolower($level)) {
4643
case 'debug':
47-
$logger->debug("🔍 Debug: $message", ['tool' => 'log_message']);
44+
$logger->debug("Debug: $message", ['tool' => 'log_message']);
4845
break;
4946
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']);
5151
break;
5252
case 'warning':
53-
$logger->warning("⚠️ Warning: $message", ['tool' => 'log_message']);
53+
$logger->warning("Warning: $message", ['tool' => 'log_message']);
5454
break;
5555
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']);
5766
break;
5867
default:
5968
$logger->warning("Unknown level '$level', defaulting to info");
60-
$logger->info("📝 $message", ['tool' => 'log_message']);
69+
$logger->info("Info: $message", ['tool' => 'log_message']);
6170
}
6271

63-
$logger->debug('log_message tool completed successfully');
72+
$logger->debug('log_message tool completed successfully');
6473

6574
return [
6675
'message' => "Logged message with level: $level",
6776
'logged_at' => date('Y-m-d H:i:s'),
6877
'level_used' => $level,
6978
];
7079
}
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-
}
24580
}

examples/stdio-logging-showcase/server.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,3 @@
3333

3434
logger()->info('Logging Showcase Server is ready!');
3535
logger()->info('This example demonstrates auto-injection of McpLogger into capability handlers.');
36-
logger()->info('Available tools: log_message, process_data');
37-
logger()->info('Available resources: config://logging/settings');
38-
logger()->info('Available prompts: logging_examples');

0 commit comments

Comments
 (0)