Files
n8n/packages/@n8n/nodes-langchain/nodes/mcp/McpTrigger/protocol/MessageParser.ts
T
alighasami 3d5eaf9445
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled
first commit
2026-03-17 16:22:57 +03:30

77 lines
1.8 KiB
TypeScript

import {
JSONRPCMessageSchema,
ListToolsRequestSchema,
CallToolRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
import type { McpToolCallInfo } from './types';
export class MessageParser {
static parse(body: string): JSONRPCMessage | undefined {
try {
const message: unknown = JSON.parse(body);
return JSONRPCMessageSchema.parse(message);
} catch {
return undefined;
}
}
static isToolCall(body: string): boolean {
const message = this.parse(body);
if (!message) return false;
return (
'method' in message &&
'id' in message &&
message.method === CallToolRequestSchema.shape.method.value
);
}
static isListToolsRequest(body: string): boolean {
const message = this.parse(body);
if (!message) return false;
return (
'method' in message &&
'id' in message &&
message.method === ListToolsRequestSchema.shape.method.value
);
}
static getRequestId(message: unknown): string | undefined {
try {
const parsed = JSONRPCMessageSchema.parse(message);
return 'id' in parsed ? String(parsed.id) : undefined;
} catch {
return undefined;
}
}
static extractToolCallInfo(body: string): McpToolCallInfo | undefined {
const message = this.parse(body);
if (!message) return undefined;
if (
'method' in message &&
'params' in message &&
message.method === CallToolRequestSchema.shape.method.value
) {
const params = message.params;
if (
typeof params === 'object' &&
params !== null &&
'name' in params &&
typeof params.name === 'string' &&
'arguments' in params &&
typeof params.arguments === 'object' &&
params.arguments !== null
) {
return {
toolName: params.name,
arguments: params.arguments as Record<string, unknown>,
};
}
}
return undefined;
}
}