From fb680ce7645bfd1283e90c64b353f009f46a7f15 Mon Sep 17 00:00:00 2001 From: SongSong <32863696+SmallSongSong@users.noreply.github.com> Date: Fri, 17 Oct 2025 10:37:07 +0800 Subject: [PATCH] feat: add built-in DiDi MCP server integration (#10318) * feat: add built-in DiDi MCP server integration - Add DiDi MCP server implementation with ride-hailing services - Support map search, price estimation, order management, and driver tracking - Add multilingual translations for DiDi MCP server descriptions - Available only in mainland China, requires DIDI_API_KEY environment variable * fix: resolve code formatting issues in DiDi MCP server fixes code formatting issues in the DiDi MCP server implementation to resolve CI format check failures. --------- Co-authored-by: BillySong --- src/main/mcpServers/didi-mcp.ts | 473 +++++++++++++++++++++ src/main/mcpServers/factory.ts | 5 + src/renderer/src/i18n/label.ts | 3 +- src/renderer/src/i18n/locales/en-us.json | 1 + src/renderer/src/i18n/locales/zh-cn.json | 1 + src/renderer/src/i18n/locales/zh-tw.json | 1 + src/renderer/src/i18n/translate/el-gr.json | 1 + src/renderer/src/i18n/translate/es-es.json | 1 + src/renderer/src/i18n/translate/fr-fr.json | 1 + src/renderer/src/i18n/translate/ja-jp.json | 1 + src/renderer/src/i18n/translate/pt-pt.json | 1 + src/renderer/src/i18n/translate/ru-ru.json | 1 + src/renderer/src/store/mcp.ts | 12 + src/renderer/src/types/index.ts | 3 +- 14 files changed, 503 insertions(+), 2 deletions(-) create mode 100644 src/main/mcpServers/didi-mcp.ts diff --git a/src/main/mcpServers/didi-mcp.ts b/src/main/mcpServers/didi-mcp.ts new file mode 100644 index 000000000..905fc4ff8 --- /dev/null +++ b/src/main/mcpServers/didi-mcp.ts @@ -0,0 +1,473 @@ +/** + * DiDi MCP Server Implementation + * + * Based on official DiDi MCP API capabilities. + * API Documentation: https://mcp.didichuxing.com/api?tap=api + * + * Provides ride-hailing services including map search, price estimation, + * order management, and driver tracking. + * + * Note: Only available in Mainland China. + */ + +import { loggerService } from '@logger' +import { Server } from '@modelcontextprotocol/sdk/server/index.js' +import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js' + +const logger = loggerService.withContext('DiDiMCPServer') + +export class DiDiMcpServer { + private _server: Server + private readonly baseUrl = 'http://mcp.didichuxing.com/mcp-servers' + private apiKey: string + + constructor(apiKey?: string) { + this._server = new Server( + { + name: 'didi-mcp-server', + version: '0.1.0' + }, + { + capabilities: { + tools: {} + } + } + ) + + // Get API key from parameter or environment variables + this.apiKey = apiKey || process.env.DIDI_API_KEY || '' + if (!this.apiKey) { + logger.warn('DIDI_API_KEY environment variable is not set') + } + + this.setupRequestHandlers() + } + + get server(): Server { + return this._server + } + + private setupRequestHandlers() { + // List available tools + this._server.setRequestHandler(ListToolsRequestSchema, async () => { + return { + tools: [ + { + name: 'maps_textsearch', + description: 'Search for POI locations based on keywords and city', + inputSchema: { + type: 'object', + properties: { + city: { + type: 'string', + description: 'Query city' + }, + keywords: { + type: 'string', + description: 'Search keywords' + }, + location: { + type: 'string', + description: 'Location coordinates, format: longitude,latitude' + } + }, + required: ['keywords', 'city'] + } + }, + { + name: 'taxi_cancel_order', + description: 'Cancel a taxi order', + inputSchema: { + type: 'object', + properties: { + order_id: { + type: 'string', + description: 'Order ID from order creation or query results' + }, + reason: { + type: 'string', + description: + 'Cancellation reason (optional). Examples: no longer needed, waiting too long, urgent matter' + } + }, + required: ['order_id'] + } + }, + { + name: 'taxi_create_order', + description: 'Create taxi order directly via API without opening any app interface', + inputSchema: { + type: 'object', + properties: { + caller_car_phone: { + type: 'string', + description: 'Caller phone number (optional)' + }, + estimate_trace_id: { + type: 'string', + description: 'Estimation trace ID from estimation results' + }, + product_category: { + type: 'string', + description: 'Vehicle category ID from estimation results, comma-separated for multiple types' + } + }, + required: ['product_category', 'estimate_trace_id'] + } + }, + { + name: 'taxi_estimate', + description: 'Get available ride-hailing vehicle types and fare estimates', + inputSchema: { + type: 'object', + properties: { + from_lat: { + type: 'string', + description: 'Departure latitude, must be from map tools' + }, + from_lng: { + type: 'string', + description: 'Departure longitude, must be from map tools' + }, + from_name: { + type: 'string', + description: 'Departure location name' + }, + to_lat: { + type: 'string', + description: 'Destination latitude, must be from map tools' + }, + to_lng: { + type: 'string', + description: 'Destination longitude, must be from map tools' + }, + to_name: { + type: 'string', + description: 'Destination name' + } + }, + required: ['from_lng', 'from_lat', 'from_name', 'to_lng', 'to_lat', 'to_name'] + } + }, + { + name: 'taxi_generate_ride_app_link', + description: 'Generate deep links to open ride-hailing apps based on origin, destination and vehicle type', + inputSchema: { + type: 'object', + properties: { + from_lat: { + type: 'string', + description: 'Departure latitude, must be from map tools' + }, + from_lng: { + type: 'string', + description: 'Departure longitude, must be from map tools' + }, + product_category: { + type: 'string', + description: 'Vehicle category IDs from estimation results, comma-separated for multiple types' + }, + to_lat: { + type: 'string', + description: 'Destination latitude, must be from map tools' + }, + to_lng: { + type: 'string', + description: 'Destination longitude, must be from map tools' + } + }, + required: ['from_lng', 'from_lat', 'to_lng', 'to_lat'] + } + }, + { + name: 'taxi_get_driver_location', + description: 'Get real-time driver location for a taxi order', + inputSchema: { + type: 'object', + properties: { + order_id: { + type: 'string', + description: 'Taxi order ID' + } + }, + required: ['order_id'] + } + }, + { + name: 'taxi_query_order', + description: 'Query taxi order status and information such as driver contact, license plate, ETA', + inputSchema: { + type: 'object', + properties: { + order_id: { + type: 'string', + description: 'Order ID from order creation results, if available; otherwise queries incomplete orders' + } + } + } + } + ] + } + }) + + // Handle tool calls + this._server.setRequestHandler(CallToolRequestSchema, async (request) => { + const { name, arguments: args } = request.params + + try { + switch (name) { + case 'maps_textsearch': + return await this.handleMapsTextSearch(args) + case 'taxi_cancel_order': + return await this.handleTaxiCancelOrder(args) + case 'taxi_create_order': + return await this.handleTaxiCreateOrder(args) + case 'taxi_estimate': + return await this.handleTaxiEstimate(args) + case 'taxi_generate_ride_app_link': + return await this.handleTaxiGenerateRideAppLink(args) + case 'taxi_get_driver_location': + return await this.handleTaxiGetDriverLocation(args) + case 'taxi_query_order': + return await this.handleTaxiQueryOrder(args) + default: + throw new Error(`Unknown tool: ${name}`) + } + } catch (error) { + logger.error(`Error calling tool ${name}:`, error as Error) + throw error + } + }) + } + + private async handleMapsTextSearch(args: any) { + const { city, keywords, location } = args + + const params = { + name: 'maps_textsearch', + arguments: { + keywords, + city, + ...(location && { location }) + } + } + + try { + const response = await this.makeRequest('tools/call', params) + return { + content: [ + { + type: 'text', + text: JSON.stringify(response, null, 2) + } + ] + } + } catch (error) { + logger.error('Maps text search error:', error as Error) + throw error + } + } + + private async handleTaxiCancelOrder(args: any) { + const { order_id, reason } = args + + const params = { + name: 'taxi_cancel_order', + arguments: { + order_id, + ...(reason && { reason }) + } + } + + try { + const response = await this.makeRequest('tools/call', params) + return { + content: [ + { + type: 'text', + text: JSON.stringify(response, null, 2) + } + ] + } + } catch (error) { + logger.error('Taxi cancel order error:', error as Error) + throw error + } + } + + private async handleTaxiCreateOrder(args: any) { + const { caller_car_phone, estimate_trace_id, product_category } = args + + const params = { + name: 'taxi_create_order', + arguments: { + product_category, + estimate_trace_id, + ...(caller_car_phone && { caller_car_phone }) + } + } + + try { + const response = await this.makeRequest('tools/call', params) + return { + content: [ + { + type: 'text', + text: JSON.stringify(response, null, 2) + } + ] + } + } catch (error) { + logger.error('Taxi create order error:', error as Error) + throw error + } + } + + private async handleTaxiEstimate(args: any) { + const { from_lng, from_lat, from_name, to_lng, to_lat, to_name } = args + + const params = { + name: 'taxi_estimate', + arguments: { + from_lng, + from_lat, + from_name, + to_lng, + to_lat, + to_name + } + } + + try { + const response = await this.makeRequest('tools/call', params) + return { + content: [ + { + type: 'text', + text: JSON.stringify(response, null, 2) + } + ] + } + } catch (error) { + logger.error('Taxi estimate error:', error as Error) + throw error + } + } + + private async handleTaxiGenerateRideAppLink(args: any) { + const { from_lng, from_lat, to_lng, to_lat, product_category } = args + + const params = { + name: 'taxi_generate_ride_app_link', + arguments: { + from_lng, + from_lat, + to_lng, + to_lat, + ...(product_category && { product_category }) + } + } + + try { + const response = await this.makeRequest('tools/call', params) + return { + content: [ + { + type: 'text', + text: JSON.stringify(response, null, 2) + } + ] + } + } catch (error) { + logger.error('Taxi generate ride app link error:', error as Error) + throw error + } + } + + private async handleTaxiGetDriverLocation(args: any) { + const { order_id } = args + + const params = { + name: 'taxi_get_driver_location', + arguments: { + order_id + } + } + + try { + const response = await this.makeRequest('tools/call', params) + return { + content: [ + { + type: 'text', + text: JSON.stringify(response, null, 2) + } + ] + } + } catch (error) { + logger.error('Taxi get driver location error:', error as Error) + throw error + } + } + + private async handleTaxiQueryOrder(args: any) { + const { order_id } = args + + const params = { + name: 'taxi_query_order', + arguments: { + ...(order_id && { order_id }) + } + } + + try { + const response = await this.makeRequest('tools/call', params) + return { + content: [ + { + type: 'text', + text: JSON.stringify(response, null, 2) + } + ] + } + } catch (error) { + logger.error('Taxi query order error:', error as Error) + throw error + } + } + + private async makeRequest(method: string, params: any): Promise { + const requestData = { + jsonrpc: '2.0', + method: method, + id: Date.now(), + ...(Object.keys(params).length > 0 && { params }) + } + + // API key is passed as URL parameter + const url = `${this.baseUrl}?key=${this.apiKey}` + + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestData) + }) + + if (!response.ok) { + const errorText = await response.text() + throw new Error(`HTTP ${response.status}: ${errorText}`) + } + + const data = await response.json() + + if (data.error) { + throw new Error(`API Error: ${JSON.stringify(data.error)}`) + } + + return data.result + } +} + +export default DiDiMcpServer diff --git a/src/main/mcpServers/factory.ts b/src/main/mcpServers/factory.ts index 46d3bb87d..74266d7d3 100644 --- a/src/main/mcpServers/factory.ts +++ b/src/main/mcpServers/factory.ts @@ -3,6 +3,7 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js' import { BuiltinMCPServerName, BuiltinMCPServerNames } from '@types' import BraveSearchServer from './brave-search' +import DiDiMcpServer from './didi-mcp' import DifyKnowledgeServer from './dify-knowledge' import FetchServer from './fetch' import FileSystemServer from './filesystem' @@ -42,6 +43,10 @@ export function createInMemoryMCPServer( case BuiltinMCPServerNames.python: { return new PythonServer().server } + case BuiltinMCPServerNames.didiMCP: { + const apiKey = envs.DIDI_API_KEY + return new DiDiMcpServer(apiKey).server + } default: throw new Error(`Unknown in-memory MCP server: ${name}`) } diff --git a/src/renderer/src/i18n/label.ts b/src/renderer/src/i18n/label.ts index 376aec32e..c2ac69f1b 100644 --- a/src/renderer/src/i18n/label.ts +++ b/src/renderer/src/i18n/label.ts @@ -329,7 +329,8 @@ const builtInMcpDescriptionKeyMap: Record = { [BuiltinMCPServerNames.fetch]: 'settings.mcp.builtinServersDescriptions.fetch', [BuiltinMCPServerNames.filesystem]: 'settings.mcp.builtinServersDescriptions.filesystem', [BuiltinMCPServerNames.difyKnowledge]: 'settings.mcp.builtinServersDescriptions.dify_knowledge', - [BuiltinMCPServerNames.python]: 'settings.mcp.builtinServersDescriptions.python' + [BuiltinMCPServerNames.python]: 'settings.mcp.builtinServersDescriptions.python', + [BuiltinMCPServerNames.didiMCP]: 'settings.mcp.builtinServersDescriptions.didi_mcp' } as const export const getBuiltInMcpServerDescriptionLabel = (key: string): string => { diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 1f7ec61e2..ee3d0ff11 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -3574,6 +3574,7 @@ "builtinServers": "Builtin Servers", "builtinServersDescriptions": { "brave_search": "An MCP server implementation integrating the Brave Search API, providing both web and local search functionalities. Requires configuring the BRAVE_API_KEY environment variable", + "didi_mcp": "DiDi MCP server providing ride-hailing services including map search, price estimation, order management, and driver tracking. Only available in Mainland China. Requires configuring the DIDI_API_KEY environment variable", "dify_knowledge": "Dify's MCP server implementation provides a simple API to interact with Dify. Requires configuring the Dify Key", "fetch": "MCP server for retrieving URL web content", "filesystem": "A Node.js server implementing the Model Context Protocol (MCP) for file system operations. Requires configuration of directories allowed for access.", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 7926e7396..e5573221e 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -3574,6 +3574,7 @@ "builtinServers": "内置服务器", "builtinServersDescriptions": { "brave_search": "一个集成了Brave 搜索 API 的 MCP 服务器实现,提供网页与本地搜索双重功能。需要配置 BRAVE_API_KEY 环境变量", + "didi_mcp": "一个集成了滴滴 MCP 服务器实现,提供网约车服务包括地图搜索、价格预估、订单管理和司机跟踪。仅支持中国大陆地区。需要配置 DIDI_API_KEY 环境变量", "dify_knowledge": "Dify 的 MCP 服务器实现,提供了一个简单的 API 来与 Dify 进行交互。需要配置 Dify Key", "fetch": "用于获取 URL 网页内容的 MCP 服务器", "filesystem": "实现文件系统操作的模型上下文协议(MCP)的 Node.js 服务器。需要配置允许访问的目录", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index ab96bff08..8634254e5 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -3574,6 +3574,7 @@ "builtinServers": "內置伺服器", "builtinServersDescriptions": { "brave_search": "一個集成了Brave 搜索 API 的 MCP 伺服器實現,提供網頁與本地搜尋雙重功能。需要配置 BRAVE_API_KEY 環境變數", + "didi_mcp": "一個集成了滴滴 MCP 伺服器實現,提供網約車服務包括地圖搜尋、價格預估、訂單管理和司機追蹤。僅支援中國大陸地區。需要配置 DIDI_API_KEY 環境變數", "dify_knowledge": "Dify 的 MCP 伺服器實現,提供了一個簡單的 API 來與 Dify 進行互動。需要配置 Dify Key", "fetch": "用於獲取 URL 網頁內容的 MCP 伺服器", "filesystem": "實現文件系統操作的模型上下文協議(MCP)的 Node.js 伺服器。需要配置允許訪問的目錄", diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index a39c429d1..370f3ce65 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -3574,6 +3574,7 @@ "builtinServers": "Ενσωματωμένοι Διακομιστές", "builtinServersDescriptions": { "brave_search": "μια εφαρμογή διακομιστή MCP που ενσωματώνει το Brave Search API, παρέχοντας δυνατότητες αναζήτησης στον ιστό και τοπικής αναζήτησης. Απαιτείται η ρύθμιση της μεταβλητής περιβάλλοντος BRAVE_API_KEY", + "didi_mcp": "Διακομιστής DiDi MCP που παρέχει υπηρεσίες μεταφοράς συμπεριλαμβανομένης της αναζήτησης χαρτών, εκτίμησης τιμών, διαχείρισης παραγγελιών και παρακολούθησης οδηγών. Διαθέσιμο μόνο στην ηπειρωτική Κίνα. Απαιτεί διαμόρφωση της μεταβλητής περιβάλλοντος DIDI_API_KEY", "dify_knowledge": "Η υλοποίηση του Dify για τον διακομιστή MCP, παρέχει μια απλή API για να αλληλεπιδρά με το Dify. Απαιτείται η ρύθμιση του κλειδιού Dify", "fetch": "Εξυπηρετητής MCP για λήψη περιεχομένου ιστοσελίδας URL", "filesystem": "Εξυπηρετητής Node.js για το πρωτόκολλο περιβάλλοντος μοντέλου (MCP) που εφαρμόζει λειτουργίες συστήματος αρχείων. Απαιτείται διαμόρφωση για την επιτροπή πρόσβασης σε καταλόγους", diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index 219f80918..0c923c973 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -3574,6 +3574,7 @@ "builtinServers": "Servidores integrados", "builtinServersDescriptions": { "brave_search": "Una implementación de servidor MCP que integra la API de búsqueda de Brave, proporcionando funciones de búsqueda web y búsqueda local. Requiere configurar la variable de entorno BRAVE_API_KEY", + "didi_mcp": "Servidor DiDi MCP que proporciona servicios de transporte incluyendo búsqueda de mapas, estimación de precios, gestión de pedidos y seguimiento de conductores. Disponible solo en China Continental. Requiere configurar la variable de entorno DIDI_API_KEY", "dify_knowledge": "Implementación del servidor MCP de Dify, que proporciona una API sencilla para interactuar con Dify. Se requiere configurar la clave de Dify.", "fetch": "Servidor MCP para obtener el contenido de la página web de una URL", "filesystem": "Servidor Node.js que implementa el protocolo de contexto del modelo (MCP) para operaciones del sistema de archivos. Requiere configuración del directorio permitido para el acceso", diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index 72899c3c1..9e36984cb 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -3574,6 +3574,7 @@ "builtinServers": "Serveurs intégrés", "builtinServersDescriptions": { "brave_search": "Une implémentation de serveur MCP intégrant l'API de recherche Brave, offrant des fonctionnalités de recherche web et locale. Nécessite la configuration de la variable d'environnement BRAVE_API_KEY", + "didi_mcp": "Serveur DiDi MCP fournissant des services de transport incluant la recherche de cartes, l'estimation des prix, la gestion des commandes et le suivi des conducteurs. Disponible uniquement en Chine continentale. Nécessite la configuration de la variable d'environnement DIDI_API_KEY", "dify_knowledge": "Implémentation du serveur MCP de Dify, fournissant une API simple pour interagir avec Dify. Nécessite la configuration de la clé Dify", "fetch": "serveur MCP utilisé pour récupérer le contenu des pages web URL", "filesystem": "Serveur Node.js implémentant le protocole de contexte de modèle (MCP) pour les opérations de système de fichiers. Nécessite une configuration des répertoires autorisés à être accédés.", diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json index 5c7e77400..d9db953ae 100644 --- a/src/renderer/src/i18n/translate/ja-jp.json +++ b/src/renderer/src/i18n/translate/ja-jp.json @@ -3574,6 +3574,7 @@ "builtinServers": "組み込みサーバー", "builtinServersDescriptions": { "brave_search": "Brave検索APIを統合したMCPサーバーの実装で、ウェブ検索とローカル検索の両機能を提供します。BRAVE_API_KEY環境変数の設定が必要です", + "didi_mcp": "DiDi MCPサーバーは、地図検索、料金見積もり、注文管理、ドライバー追跡を含むライドシェアサービスを提供します。中国本土でのみ利用可能です。DIDI_API_KEY環境変数の設定が必要です", "dify_knowledge": "DifyのMCPサーバー実装は、Difyと対話するためのシンプルなAPIを提供します。Dify Keyの設定が必要です。", "fetch": "URLのウェブページコンテンツを取得するためのMCPサーバー", "filesystem": "Node.jsサーバーによるファイルシステム操作を実現するモデルコンテキストプロトコル(MCP)。アクセスを許可するディレクトリの設定が必要です", diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index f10aea90d..8f46afda0 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -3574,6 +3574,7 @@ "builtinServers": "Servidores integrados", "builtinServersDescriptions": { "brave_search": "uma implementação de servidor MCP integrada com a API de pesquisa Brave, fornecendo funcionalidades de pesquisa web e local. Requer a configuração da variável de ambiente BRAVE_API_KEY", + "didi_mcp": "Servidor DiDi MCP que fornece serviços de transporte incluindo pesquisa de mapas, estimativa de preços, gestão de pedidos e rastreamento de motoristas. Disponível apenas na China Continental. Requer configuração da variável de ambiente DIDI_API_KEY", "dify_knowledge": "Implementação do servidor MCP do Dify, que fornece uma API simples para interagir com o Dify. Requer a configuração da chave Dify", "fetch": "servidor MCP para obter o conteúdo da página web do URL", "filesystem": "Servidor Node.js do protocolo de contexto de modelo (MCP) para implementar operações de sistema de ficheiros. Requer configuração do diretório permitido para acesso", diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index bf4533a4a..8bf1b823c 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -3574,6 +3574,7 @@ "builtinServers": "Встроенные серверы", "builtinServersDescriptions": { "brave_search": "реализация сервера MCP с интеграцией API поиска Brave, обеспечивающая функции веб-поиска и локального поиска. Требуется настройка переменной среды BRAVE_API_KEY", + "didi_mcp": "Сервер DiDi MCP, предоставляющий услуги такси, включая поиск на карте, оценку стоимости, управление заказами и отслеживание водителей. Доступен только в материковом Китае. Требует настройки переменной окружения DIDI_API_KEY", "dify_knowledge": "Реализация сервера MCP Dify, предоставляющая простой API для взаимодействия с Dify. Требуется настройка ключа Dify", "fetch": "MCP-сервер для получения содержимого веб-страниц по URL", "filesystem": "Node.js-сервер протокола контекста модели (MCP) для реализации операций файловой системы. Требуется настройка каталогов, к которым разрешён доступ", diff --git a/src/renderer/src/store/mcp.ts b/src/renderer/src/store/mcp.ts index 2bae82c14..eb659399b 100644 --- a/src/renderer/src/store/mcp.ts +++ b/src/renderer/src/store/mcp.ts @@ -144,6 +144,18 @@ export const builtinMCPServers: BuiltinMCPServer[] = [ type: 'inMemory', isActive: false, provider: 'CherryAI' + }, + { + id: nanoid(), + name: '@cherry/didi-mcp', + reference: 'https://mcp.didichuxing.com/', + type: 'inMemory', + isActive: false, + env: { + DIDI_API_KEY: 'YOUR_DIDI_API_KEY' + }, + shouldConfig: true, + provider: 'CherryAI' } ] as const diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 7bdf186e6..82df2c1f2 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -691,7 +691,8 @@ export const BuiltinMCPServerNames = { fetch: '@cherry/fetch', filesystem: '@cherry/filesystem', difyKnowledge: '@cherry/dify-knowledge', - python: '@cherry/python' + python: '@cherry/python', + didiMCP: '@cherry/didi-mcp' } as const export type BuiltinMCPServerName = (typeof BuiltinMCPServerNames)[keyof typeof BuiltinMCPServerNames]