@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.
252 lines (231 loc) • 5.39 kB
text/typescript
import { PluginQueryParams, SystemDependency } from '@lobehub/market-sdk';
import { z } from 'zod';
import { MCPErrorType } from '@/libs/mcp';
import { CustomPluginMetadata } from '../tool/plugin';
/* eslint-disable typescript-sort-keys/string-enum */
export enum MCPInstallStep {
FETCHING_MANIFEST = 'FETCHING_MANIFEST',
CHECKING_INSTALLATION = 'CHECKING_INSTALLATION',
DEPENDENCIES_REQUIRED = 'DEPENDENCIES_REQUIRED',
GETTING_SERVER_MANIFEST = 'GETTING_SERVER_MANIFEST',
CONFIGURATION_REQUIRED = 'CONFIGURATION_REQUIRED',
INSTALLING_PLUGIN = 'INSTALLING_PLUGIN',
COMPLETED = 'COMPLETED',
ERROR = 'Error',
}
/* eslint-enable */
export interface CheckMcpInstallParams {
/**
* 安装详情
*/
installationDetails: {
packageName?: string;
repositoryUrlToClone?: string;
setupSteps?: string[];
};
/**
* 安装方法
*/
installationMethod: string;
/**
* 系统依赖项
*/
systemDependencies?: SystemDependency[];
}
export interface CheckMcpInstallResult {
allDependenciesMet?: boolean;
/**
* 所有部署选项的检查结果
*/
allOptions?: Array<{
allDependenciesMet?: boolean;
/**
* 连接信息,用于后续连接使用
*/
connection?: {
args?: string[];
command?: string;
installationMethod: string;
packageName?: string;
repositoryUrl?: string;
};
isRecommended?: boolean;
packageInstalled?: boolean;
systemDependencies?: Array<{
error?: string;
installed: boolean;
meetRequirement: boolean;
name: string;
version?: string;
}>;
}>;
/**
* 配置模式,提到顶层方便访问
*/
configSchema?: any;
/**
* 连接信息,用于后续连接使用
*/
connection?: {
args?: string[];
command?: string;
type: 'stdio' | 'http';
url?: string;
};
/**
* 如果检测失败,提供错误信息
*/
error?: string;
/**
* 是否为推荐选项
*/
isRecommended?: boolean;
/**
* 是否需要配置(如 API key 等)
*/
needsConfig?: boolean;
/**
* 插件安装检测结果
*/
packageInstalled?: boolean;
platform: string;
/**
* 检测结果是否成功
*/
success: boolean;
/**
* 系统依赖检测结果
*/
systemDependencies?: Array<{
error?: string;
installed: boolean;
meetRequirement: boolean;
name: string;
version?: string;
}>;
}
export type MCPPluginListParams = Pick<PluginQueryParams, 'locale' | 'pageSize' | 'page' | 'q'>;
export interface MCPErrorInfoMetadata {
errorLog?: string;
/**
* 原始错误信息
*/
originalError?: string;
/**
* MCP 连接参数
*/
params?: {
args?: string[];
command?: string;
type?: string;
};
/**
* 进程相关信息
*/
process?: {
exitCode?: number;
signal?: string;
};
/**
* 错误发生的步骤
*/
step?: string;
/**
* 时间戳
*/
timestamp?: number;
}
/**
* 结构化的错误信息
*/
export interface MCPErrorInfo {
/**
* 核心错误信息(用户友好的简短描述)
*/
message: string;
/**
* 结构化的错误元数据
*/
metadata?: MCPErrorInfoMetadata;
/**
* 错误类型
*/
type: MCPErrorType;
}
export interface MCPInstallProgress {
checkResult?: CheckMcpInstallResult;
configSchema?: any;
// connection info from checkInstallation
connection?: any;
// 结构化的错误信息,当安装失败时显示
errorInfo?: MCPErrorInfo;
manifest?: any;
// LobeChatPluginManifest
needsConfig?: boolean;
// 0-100
progress: number;
step: MCPInstallStep;
// 系统依赖检测结果,当需要安装依赖时显示
systemDependencies?: Array<{
error?: string;
installInstructions?: {
current?: string; // 当前系统的安装指令
manual?: string; // 手动安装指令
};
installed: boolean;
meetRequirement: boolean;
name: string;
requiredVersion?: string;
type?: string;
version?: string;
versionParsingRequired?: boolean;
}>;
}
export interface McpConnection {
args?: string[];
auth?: {
accessToken?: string;
token?: string;
type: 'none' | 'bearer' | 'oauth2';
};
// STDIO 连接参数
command?: string;
env?: Record<string, string>;
headers?: Record<string, string>;
type: 'http' | 'stdio';
// HTTP 连接参数
url?: string;
}
// 测试连接参数类型
export interface McpConnectionParams {
connection: McpConnection;
identifier: string;
metadata?: CustomPluginMetadata;
}
export type MCPInstallProgressMap = Record<string, MCPInstallProgress | undefined>;
// ============ Zod Schemas ============
/**
* Zod schema for HTTP MCP authentication
*/
export const StreamableHTTPAuthSchema = z
.object({
accessToken: z.string().optional(), // OAuth2 Access Token
token: z.string().optional(), // Bearer Token
type: z.enum(['none', 'bearer', 'oauth2']),
})
.optional();
/**
* Zod schema for getStreamableMcpServerManifest input
*/
export const GetStreamableMcpServerManifestInputSchema = z.object({
auth: StreamableHTTPAuthSchema,
headers: z.record(z.string()).optional(),
identifier: z.string(),
metadata: z
.object({
avatar: z.string().optional(),
description: z.string().optional(),
})
.optional(),
url: z.string().url(),
});