@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
60 lines (50 loc) • 1.91 kB
text/typescript
import debug from 'debug';
import { z } from 'zod';
import { isServerMode } from '@/const/version';
import { passwordProcedure } from '@/libs/trpc/edge';
import { authedProcedure, router } from '@/libs/trpc/lambda';
import { mcpService } from '@/server/services/mcp';
const log = debug('lobe-mcp:router');
const stdioParamsSchema = z.object({
args: z.array(z.string()).optional().default([]),
command: z.string().min(1),
env: z.any().optional(),
metadata: z
.object({
avatar: z.string().optional(),
description: z.string().optional(),
})
.optional(),
name: z.string().min(1),
type: z.literal('stdio').default('stdio'),
});
const mcpProcedure = isServerMode ? authedProcedure : passwordProcedure;
export const mcpRouter = router({
getStdioMcpServerManifest: mcpProcedure.input(stdioParamsSchema).query(async ({ input }) => {
log('getStdioMcpServerManifest input: %O', input);
return await mcpService.getStdioMcpServerManifest(input, input.metadata);
}),
/* eslint-disable sort-keys-fix/sort-keys-fix */
// --- MCP Interaction ---
// listTools now accepts MCPClientParams directly
listTools: mcpProcedure
.input(stdioParamsSchema) // Use the unified schema
.query(async ({ input }) => {
// Pass the validated MCPClientParams to the service
return await mcpService.listTools(input);
}),
// callTool now accepts MCPClientParams, toolName, and args
callTool: mcpProcedure
.input(
z.object({
params: stdioParamsSchema, // Use the unified schema for client params
args: z.any(), // Arguments for the tool call
toolName: z.string(),
}),
)
.mutation(async ({ input }) => {
// Pass the validated params, toolName, and args to the service
const data = await mcpService.callTool(input.params, input.toolName, input.args);
return JSON.stringify(data);
}),
});