UNPKG

@cloudbase/cloudbase-mcp

Version:

CloudBase MCP Server — operate Tencent CloudBase (database, auth, functions, storage, hosting) from AI coding tools via the Model Context Protocol. Part of CloudBase AI Toolkit.

579 lines (514 loc) 18.6 kB
import CloudBase from '@cloudbase/manager-node'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { Tool } from '@modelcontextprotocol/sdk/types.js'; import type { ToolAnnotations as ToolAnnotations_2 } from '@modelcontextprotocol/sdk/types.js'; export declare const ALL_SUPPORTED_RUNTIMES: ("Nodejs20.19" | "Nodejs18.15" | "Nodejs16.13" | "Nodejs14.18" | "Nodejs12.16" | "Nodejs10.15" | "Nodejs8.9" | "Python3.10" | "Python3.9" | "Python3.7" | "Python3.6" | "Python2.7" | "Php8.0" | "Php7.4" | "Php7.2" | "Java8" | "Java11" | "Golang1")[]; export declare type AuthFlowMode = "web" | "device"; export declare interface AuthOptions { authMode?: AuthFlowMode; clientId?: string; oauthEndpoint?: string; oauthCustom?: boolean; } /** * 自定义 API 请求函数,由外部注入,替代 TC3 签名发请求。 * 入参对齐 CAPI 模式:service + action + version + region + payload。 * 返回腾讯云 API 响应中 Response 字段的内容(已解包)。 */ export declare type CloudApiRequestFn = (params: { service: string; action: string; version: string; region: string; payload: Record<string, any>; }) => Promise<any>; declare type CloudBaseConfigBase = NonNullable<ConstructorParameters<typeof CloudBase>[0]>; export declare type CloudBaseOptions = CloudBaseConfigBase & { requestFn?: CloudApiRequestFn; }; /** * registerTool config with CloudBase `annotations.category` retained after * MCP SDK >=1.26 closed ToolAnnotations to strip unknown keys at the type level. */ export declare type CloudBaseRegisterToolConfig = { title?: string; description?: string; inputSchema?: any; outputSchema?: any; annotations?: ToolAnnotations; _meta?: Record<string, unknown>; }; /** * Create a manager with the provided CloudBase options, without using cache * @param cloudBaseOptions Provided CloudBase options * @returns CloudBase manager instance */ export declare function createCloudBaseManagerWithOptions(cloudBaseOptions: CloudBaseOptions): CloudBase; /** * Create and configure a CloudBase MCP Server instance * @param options Server configuration options * @returns Configured McpServer instance * * @example * import { createCloudBaseMcpServer } from "@cloudbase/mcp-server"; * import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; * * const server = createCloudBaseMcpServer({ cloudBaseOptions: { * envId, // 环境ID * secretId, // 腾讯云密钥ID * secretKey, // 腾讯云密钥 * region, // 地域,默认是 ap-shanghai * token // 临时密钥,有有效期限制,生成密钥时可控制 * } }); * * const transport = new StdioServerTransport(); * await server.connect(transport); */ export declare function createCloudBaseMcpServer(options?: { name?: string; version?: string; enableTelemetry?: boolean; cloudBaseOptions?: CloudBaseOptions; authOptions?: AuthOptions; cloudMode?: boolean; ide?: string; logger?: Logger; pluginsEnabled?: string[]; pluginsDisabled?: string[]; pluginOptions?: PluginOptions; }): Promise<ExtendedMcpServer>; export declare interface DataModel { id?: string; name: string; title: string; schema: DataModelSchema; envId?: string; status?: 'draft' | 'published'; createdAt?: string; updatedAt?: string; } export declare interface DataModelField { name: string; type: 'string' | 'number' | 'boolean' | 'date' | 'array' | 'object' | 'objectId' | 'file' | 'image'; required?: boolean; default?: any; description?: string; validation?: { min?: number; max?: number; pattern?: string; enum?: any[]; }; } export declare interface DataModelSchema { type: 'object'; properties: Record<string, { type: string; description?: string; required?: boolean; default?: any; validation?: any; }>; required?: string[]; } export declare const DEFAULT_NODEJS_RUNTIME = "Nodejs18.15"; export declare const DEFAULT_RUNTIME = "Nodejs18.15"; export declare interface DeleteFileParams { cloudPath: string; } export declare interface DeviceFlowAuthInfo { user_code: string; verification_uri?: string; verification_uri_complete?: string; device_code: string; expires_in: number; } /** * Enable cloud mode by setting environment variable */ export declare function enableCloudMode(): void; export declare interface EnsureLoginOptions extends AuthOptions { fromCloudBaseLoginPage?: boolean; ignoreEnvVars?: boolean; region?: string; serverAuthOptions?: AuthOptions; onDeviceCode?: (info: DeviceFlowAuthInfo) => void; } declare class EnvironmentManager { private cachedEnvId; private envIdPromise; reset(): void; getEnvId(): Promise<string>; private _fetchEnvId; private _setCachedEnvId; setEnvId(envId: string): Promise<void>; getCachedEnvId(): string | null; } export declare const envManager: EnvironmentManager; export declare const error: (message: string, data?: object | Error) => void; export declare interface ExtendedMcpServer extends McpServer { cloudBaseOptions?: CloudBaseOptions; authOptions?: AuthOptions; ide?: string; logger?: Logger; enabledPlugins?: string[]; pluginOptions?: PluginOptions; /** Registered tools for external hosts (e.g. WeChat IDE) to re-register. */ toolDefs: Array<{ name: string; description: string; inputSchema: any; handler: (input: any) => Promise<any>; }>; setLogger(logger: Logger): void; /** * Same as MCP SDK registerTool, but annotations may include CloudBase `category`. * Handler typing stays intentionally loose to match existing tool call sites. */ registerTool(name: string, config: CloudBaseRegisterToolConfig, cb: (...args: any[]) => any): RegisteredTool; } export declare function formatRuntimeList(): string; /** * manageFunctions 工具中部分 action 的 override 钩子 * 参数使用 CloudBase 领域语言,与 MCP 内部 DTO 解耦 * 实现方(如微信 IDE)负责在内部做参数适配 * * - createFunction / updateFunctionCode:有默认实现,override 后可走外部专有接口 * - incrementalDeployFunction:无默认实现,必须通过 pluginOptions 注入 */ export declare interface FunctionDeployOverrides { createFunction?: (params: { functionName: string; functionRootPath: string; runtime?: string; force?: boolean; installDependency?: boolean; }) => Promise<any>; updateFunctionCode?: (params: { functionName: string; functionRootPath: string; force?: boolean; installDependency?: boolean; }) => Promise<any>; incrementalDeployFunction?: (params: { functionName: string; functionRootPath: string; incrementalFile: string; }) => Promise<any>; } /** * 每次都实时获取最新的 token/secretId/secretKey */ export declare function getCloudBaseManager(options?: GetManagerOptions): Promise<CloudBase>; /** * Get cloud mode status for logging/debugging */ export declare function getCloudModeStatus(): { enabled: boolean; source: string | null; }; /** * Get the default configured CloudBase MCP Server */ export declare function getDefaultServer(): Promise<ExtendedMcpServer>; export declare function getEnvId(cloudBaseOptions?: CloudBaseOptions): Promise<string>; export declare interface GetFileInfoParams { cloudPath: string; } /** * Get interactive server instance (CommonJS compatible) */ export declare function getInteractiveServerAsync(): Promise<InteractiveServer>; export declare function getLoginState(options?: EnsureLoginOptions): Promise<LoginState | null>; declare interface GetManagerOptions { requireEnvId?: boolean; cloudBaseOptions?: CloudBaseOptions; mcpServer?: any; authStrategy?: 'fail_fast' | 'ensure'; } declare interface IdeFileDescriptor { path: string; isMcpConfig?: boolean; } export declare const info: (message: string, data?: object | Error) => void; export declare interface InteractiveResult { type: "envId" | "clarification" | "confirmation"; data: any; cancelled?: boolean; switch?: boolean; timeout?: boolean; timeoutDuration?: number; } declare class InteractiveServer { private app; private server; private wss; private port; private isRunning; private currentResolver; private sessionData; private _mcpServer; get mcpServer(): any; set mcpServer(server: any); private readonly DEFAULT_PORT; private readonly FALLBACK_PORTS; /** Idle timeout for HTTP/WS connections (e.g. long login). Avoids "connection disconnected" after ~1 min. */ private static readonly SERVER_IDLE_MS; /** WebSocket ping interval to keep connection alive past proxies/firewalls. */ private static readonly WS_PING_INTERVAL_MS; constructor(mcpServer?: any); private cleanup; /** Apply timeouts so long-lived login does not cause "connection disconnected". */ private applyServerTimeouts; private setupExpress; private setupWebSocket; start(): Promise<number>; stop(): Promise<void>; collectEnvId(availableEnvs: any[], accountInfo?: { uin?: string; }, errorContext?: any, // EnvSetupContext manager?: any, // CloudBase manager instance for refreshing env list mcpServer?: any): Promise<InteractiveResult>; clarifyRequest(message: string, options?: string[]): Promise<InteractiveResult>; private escapeHtml; private getEnvSetupHTML; private getEnvSetupHTML_OLD; private getClarificationHTML; private getConfirmationHTML; get running(): boolean; get currentPort(): number; } /** * Check if MCP is running in cloud mode * Cloud mode is enabled by: * 1. Command line argument --cloud-mode * 2. Environment variable CLOUDBASE_MCP_CLOUD_MODE=true * 3. Environment variable MCP_CLOUD_MODE=true * * Intentionally does not import logger: logger.ts calls isCloudMode() during * module init, so importing logger here creates a circular dependency that * crashes `node dist/cli.cjs --cloud-mode` with `debug is not a function`. */ export declare function isCloudMode(): boolean; export declare interface ListFilesParams { prefix: string; marker?: string; } declare type Logger = (data: { type: string; requestId?: string; result?: any; toolName?: string; args?: any; message?: string; duration?: number; [key: string]: any; }) => void; declare interface LoginState { secretId: string; secretKey: string; token?: string; envId?: string; } export declare function logout(): Promise<void>; /** MCP initialize clientInfo fields available after handshake via Server.getClientVersion(). */ declare type McpClientInfo = { name?: string; version?: string; title?: string; }; export { McpServer } /** 各插件的可选配置 */ export declare interface PluginOptions { functions?: FunctionDeployOverrides; storage?: StorageOverrides; } export declare const RAW_IDE_FILE_MAPPINGS: Record<string, IdeFileDescriptor[]>; export declare const RECOMMENDED_RUNTIMES: { readonly nodejs: "Nodejs18.15"; readonly python: "Python3.9"; readonly php: "Php7.4"; readonly java: "Java11"; readonly golang: "Golang1"; }; export declare const reportToolCall: (params: { toolName: string; success: boolean; requestId?: string; duration?: number; error?: string; inputParams?: any; cloudBaseOptions?: CloudBaseOptions; ide?: string; mcpClientInfo?: McpClientInfo; }) => Promise<void>; export declare const reportToolkitLifecycle: (params: { event: "start" | "exit"; duration?: number; exitCode?: number; error?: string; cloudBaseOptions?: CloudBaseOptions; ide?: string; mcpClientInfo?: McpClientInfo; }) => Promise<void>; export declare function resetCloudBaseManagerCache(): void; /** * Check if a tool should be registered in cloud mode * @param toolName - The name of the tool * @returns true if the tool should be registered in current mode */ export declare function shouldRegisterTool(toolName: string): boolean; /** * Simplify environment list data by keeping only essential fields for AI assistant * This reduces token consumption when returning environment lists via MCP tools * @param envList - Full environment list from API * @returns Simplified environment list with only essential fields */ export declare function simplifyEnvList(envList: any[]): any[]; export { StdioServerTransport } /** * 存储工具中需要 COS SDK 操作的 override 钩子 * 实现方(如微信 IDE)负责在内部通过 /route/getcosauth 获取临时签名并操作 COS * * - listFiles / getFileInfo / downloadFile:queryStorage 只读操作 * - uploadFile / deleteFiles / deleteDirectory:manageStorage 写操作 * - getFileUrl:获取文件临时下载链接(可选,未提供时使用 CAPI 默认实现) */ declare interface StorageOverrides { /** 列出目录下的文件,替代 storageService.listDirectoryFiles() */ listFiles?: (params: { cloudPath: string; }) => Promise<Array<Record<string, any>>>; /** 获取文件元信息,替代 storageService.getFileInfo() */ getFileInfo?: (params: { cloudPath: string; }) => Promise<Record<string, any>>; /** 下载文件到本地,替代 storageService.downloadFile() */ downloadFile?: (params: { cloudPath: string; localPath: string; }) => Promise<void>; /** 下载目录到本地,替代 storageService.downloadDirectory() */ downloadDirectory?: (params: { cloudPath: string; localPath: string; }) => Promise<void>; /** 上传单个文件,替代 storageService.uploadFile() */ uploadFile?: (params: { localPath: string; cloudPath: string; }) => Promise<void>; /** 上传目录,替代 storageService.uploadDirectory() */ uploadDirectory?: (params: { localPath: string; cloudPath: string; }) => Promise<void>; /** * 获取文件临时下载链接,替代 storageService.getTemporaryUrl() * 可通过 COS getObjectUrl 实现;未提供时走 manager-node 默认路径 */ getFileUrl?: (params: { cloudPath: string; maxAge?: number; }) => Promise<{ url: string; fileId?: string; }>; /** 删除文件(支持批量),替代 storageService.deleteFile() */ deleteFiles?: (params: { cloudPaths: string[]; }) => Promise<void>; /** 删除目录,替代 storageService.deleteDirectory() */ deleteDirectory?: (params: { cloudPath: string; }) => Promise<void>; } export declare const SUPPORTED_NODEJS_RUNTIMES: readonly ["Nodejs20.19", "Nodejs18.15", "Nodejs16.13", "Nodejs14.18", "Nodejs12.16", "Nodejs10.15", "Nodejs8.9"]; export declare const SUPPORTED_RUNTIMES: { readonly nodejs: readonly ["Nodejs20.19", "Nodejs18.15", "Nodejs16.13", "Nodejs14.18", "Nodejs12.16", "Nodejs10.15", "Nodejs8.9"]; readonly python: readonly ["Python3.10", "Python3.9", "Python3.7", "Python3.6", "Python2.7"]; readonly php: readonly ["Php8.0", "Php7.4", "Php7.2"]; readonly java: readonly ["Java8", "Java11"]; readonly golang: readonly ["Golang1"]; }; /** * 数据上报类 * 用于收集 MCP 工具使用情况和错误信息,帮助改进产品 * * 隐私保护: * - 可通过环境变量 CLOUDBASE_MCP_TELEMETRY_DISABLED=true 完全关闭 * - 不收集敏感信息(代码内容、具体文件路径等) * - 使用设备指纹而非真实用户信息 * - 所有数据仅用于产品改进,不用于其他用途 */ declare class TelemetryReporter { private deviceId; private userAgent; private additionalParams; private enabled; constructor(); /** * 获取用户运行环境信息 * 包含操作系统、Node版本和MCP版本等信息 */ getUserAgent(): { userAgent: string; deviceId: string; osType: string; osRelease: string; nodeVersion: string; arch: string; mcpVersion: string; }; /** * 获取设备唯一标识 * 基于主机名、CPU信息和MAC地址生成匿名设备指纹 */ private getDeviceId; /** * 发送HTTP请求 */ private postFetch; /** * 上报事件 * @param eventCode 事件代码 * @param eventData 事件数据 */ report(eventCode: string, eventData?: { [key: string]: any; }): Promise<void>; /** * 设置公共参数 */ addAdditionalParams(params: { [key: string]: any; }): void; /** * 检查是否启用 */ isEnabled(): boolean; } export declare const telemetryReporter: TelemetryReporter; export { Tool } /** * CloudBase extends MCP ToolAnnotations with a stable `category` hint used by * IDE UIs for grouping. SDK >=1.26 types annotations as a closed/strip object, * so we keep category via an intersection while still passing it through at * runtime (listTools returns registered annotations without schema stripping). */ export declare type ToolAnnotations = ToolAnnotations_2 & { category?: string; }; export declare interface ToolResponse { success: boolean; [key: string]: any; } export declare interface UploadFileParams { cloudPath: string; fileContent: string; } export declare function validateTimerCron(config: string): string; export declare const warn: (message: string, data?: object | Error) => void; export { }