Skip to content

Commit 6276550

Browse files
committed
feat: implement mcp logging set level request handler
1 parent 83ea92e commit 6276550

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

package-lock.json

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"dependencies": {
3838
"@apify/datastructures": "^2.0.3",
3939
"@apify/log": "^2.5.16",
40-
"@modelcontextprotocol/sdk": "^1.13.2",
40+
"@modelcontextprotocol/sdk": "^1.17.4",
4141
"@types/turndown": "^5.0.5",
4242
"ajv": "^8.17.1",
4343
"algoliasearch": "^5.31.0",

src/mcp/const.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
11
export const MAX_TOOL_NAME_LENGTH = 64;
22
export const SERVER_ID_LENGTH = 8;
33
export const EXTERNAL_TOOL_CALL_TIMEOUT_MSEC = 120_000; // 2 minutes
4+
5+
export const LOG_LEVEL_MAP: Record<string, number> = {
6+
debug: 0,
7+
info: 1,
8+
notice: 2,
9+
warning: 3,
10+
error: 4,
11+
critical: 5,
12+
alert: 6,
13+
emergency: 7,
14+
};

src/mcp/server.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
ListToolsRequestSchema,
1515
McpError,
1616
ServerNotificationSchema,
17+
SetLevelRequestSchema,
1718
} from '@modelcontextprotocol/sdk/types.js';
1819
import type { ValidateFunction } from 'ajv';
1920
import { type ActorCallOptions, ApifyApiError } from 'apify-client';
@@ -31,7 +32,7 @@ import type { ActorMcpTool, ActorTool, HelperTool, ToolEntry } from '../types.js
3132
import { createProgressTracker } from '../utils/progress.js';
3233
import { getToolPublicFieldOnly } from '../utils/tools.js';
3334
import { connectMCPClient } from './client.js';
34-
import { EXTERNAL_TOOL_CALL_TIMEOUT_MSEC } from './const.js';
35+
import { EXTERNAL_TOOL_CALL_TIMEOUT_MSEC, LOG_LEVEL_MAP } from './const.js';
3536
import { processParamsGetTools } from './utils.js';
3637

3738
type ToolsChangedHandler = (toolNames: string[]) => void;
@@ -44,6 +45,7 @@ export class ActorsMcpServer {
4445
public readonly tools: Map<string, ToolEntry>;
4546
private toolsChangedHandler: ToolsChangedHandler | undefined;
4647
private sigintHandler: (() => Promise<void>) | undefined;
48+
private currentLogLevel = 'info';
4749

4850
constructor(setupSigintHandler = true) {
4951
this.server = new Server(
@@ -59,8 +61,10 @@ export class ActorsMcpServer {
5961
},
6062
},
6163
);
64+
this.setupLoggingProxy();
6265
this.tools = new Map();
6366
this.setupErrorHandling(setupSigintHandler);
67+
this.setupLoggingHandlers();
6468
this.setupToolHandlers();
6569
this.setupPromptHandlers();
6670
}
@@ -264,6 +268,31 @@ export class ActorsMcpServer {
264268
}
265269
}
266270

271+
private setupLoggingProxy(): void {
272+
// Store original sendLoggingMessage
273+
const originalSendLoggingMessage = this.server.sendLoggingMessage.bind(this.server);
274+
275+
// Proxy sendLoggingMessage to filter logs
276+
this.server.sendLoggingMessage = async (params: { level: string; data?: unknown; [key: string]: unknown }) => {
277+
const messageLevelValue = LOG_LEVEL_MAP[params.level] ?? -1; // Unknown levels get -1, discard
278+
const currentLevelValue = LOG_LEVEL_MAP[this.currentLogLevel] ?? 1; // Default to info if invalid
279+
if (messageLevelValue >= currentLevelValue) {
280+
await originalSendLoggingMessage(params as Parameters<typeof originalSendLoggingMessage>[0]);
281+
}
282+
};
283+
}
284+
285+
private setupLoggingHandlers(): void {
286+
this.server.setRequestHandler(SetLevelRequestSchema, (request) => {
287+
const { level } = request.params;
288+
if (LOG_LEVEL_MAP[level] !== undefined) {
289+
this.currentLogLevel = level;
290+
}
291+
// Sending empty result based on MCP spec
292+
return {};
293+
});
294+
}
295+
267296
/**
268297
* Sets up MCP request handlers for prompts.
269298
*/

0 commit comments

Comments
 (0)