From bafb1fc8a107aa8767409c5e680c637ad00acc08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=9F=B3=E7=9F=B3?= Date: Wed, 3 Dec 2025 09:50:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9rag=E4=B8=BAmcp-server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcp_center/config/private/rag/config.toml | 0 .../config/private/rag/config_loader.py | 26 +++ mcp_center/mcp_config/rag_mcp/config.json | 15 ++ .../rag_tools => rag/src}/base/config.py | 0 .../rag_tools => rag/src}/base/embedding.py | 0 .../src}/base/manager/database_manager.py | 0 .../src}/base/manager/document_manager.py | 0 .../rag_tools => rag/src}/base/models.py | 0 .../rag_tools => rag/src}/base/parser/doc.py | 0 .../src}/base/parser/parser.py | 0 .../rag_tools => rag/src}/base/parser/pdf.py | 0 .../rag_tools => rag/src}/base/parser/txt.py | 0 .../rag_tools => rag/src}/base/rerank.py | 0 .../src}/base/search/keyword.py | 0 .../src}/base/search/vector.py | 0 .../weighted_keyword_and_vector_search.py | 0 .../rag_tools => rag/src}/base/token_tool.py | 0 .../rag_tools => rag/src}/config.json | 0 .../mcp_tools/rag_tools => rag/src}/deps.toml | 0 .../rag_tools => rag/src}/rag_config.json | 0 .../rag_tools => rag/src}/requirements.txt | 0 mcp_center/servers/rag/src/server.py | 172 ++++++++++++++++++ .../mcp_tools/rag_tools => rag/src}/tool.py | 0 mcp_center/service/rag.service | 20 ++ 24 files changed, 233 insertions(+) create mode 100644 mcp_center/config/private/rag/config.toml create mode 100644 mcp_center/config/private/rag/config_loader.py create mode 100644 mcp_center/mcp_config/rag_mcp/config.json rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/config.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/embedding.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/manager/database_manager.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/manager/document_manager.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/models.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/parser/doc.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/parser/parser.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/parser/pdf.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/parser/txt.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/rerank.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/search/keyword.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/search/vector.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/search/weighted_keyword_and_vector_search.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/base/token_tool.py (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/config.json (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/deps.toml (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/rag_config.json (100%) rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/requirements.txt (100%) create mode 100644 mcp_center/servers/rag/src/server.py rename mcp_center/servers/{oe-cli-mcp-server/mcp_tools/rag_tools => rag/src}/tool.py (100%) create mode 100644 mcp_center/service/rag.service diff --git a/mcp_center/config/private/rag/config.toml b/mcp_center/config/private/rag/config.toml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mcp_center/config/private/rag/config_loader.py b/mcp_center/config/private/rag/config_loader.py new file mode 100644 index 0000000000..023c850985 --- /dev/null +++ b/mcp_center/config/private/rag/config_loader.py @@ -0,0 +1,26 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2023-2025. All rights reserved. +from config.public.base_config_loader import BaseConfig +import os +from pydantic import BaseModel, Field +import toml + + +class RemoteInfoConfigModel(BaseModel): + """顶层配置模型""" + port: int = Field(default=12311, description="MCP服务端口") + + +class RemoteInfoConfig(BaseConfig): + """顶层配置文件读取和使用Class""" + + def __init__(self) -> None: + """读取配置文件""" + super().__init__() + self.load_private_config() + + def load_private_config(self) -> None: + """加载私有配置文件""" + config_file = os.getenv("REMOTE_INFO_CONFIG") + if config_file is None: + config_file = os.path.join("config", "private", "rag", "config.toml") + self._config.private_config = RemoteInfoConfigModel.model_validate(toml.load(config_file)) diff --git a/mcp_center/mcp_config/rag_mcp/config.json b/mcp_center/mcp_config/rag_mcp/config.json new file mode 100644 index 0000000000..d11c2ef75f --- /dev/null +++ b/mcp_center/mcp_config/rag_mcp/config.json @@ -0,0 +1,15 @@ +{ + "mcpServers": { + "mcp_server": { + "headers": {}, + "autoApprove": [], + "autoInstall": false, + "timeout": 60, + "url": "http://127.0.0.1:12311/sse" + } + }, + "name": "轻量化知识库", + "overview": "轻量化知识库", + "description": "轻量化知识库", + "mcpType": "sse" +} \ No newline at end of file diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/config.py b/mcp_center/servers/rag/src/base/config.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/config.py rename to mcp_center/servers/rag/src/base/config.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/embedding.py b/mcp_center/servers/rag/src/base/embedding.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/embedding.py rename to mcp_center/servers/rag/src/base/embedding.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/manager/database_manager.py b/mcp_center/servers/rag/src/base/manager/database_manager.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/manager/database_manager.py rename to mcp_center/servers/rag/src/base/manager/database_manager.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/manager/document_manager.py b/mcp_center/servers/rag/src/base/manager/document_manager.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/manager/document_manager.py rename to mcp_center/servers/rag/src/base/manager/document_manager.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/models.py b/mcp_center/servers/rag/src/base/models.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/models.py rename to mcp_center/servers/rag/src/base/models.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/parser/doc.py b/mcp_center/servers/rag/src/base/parser/doc.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/parser/doc.py rename to mcp_center/servers/rag/src/base/parser/doc.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/parser/parser.py b/mcp_center/servers/rag/src/base/parser/parser.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/parser/parser.py rename to mcp_center/servers/rag/src/base/parser/parser.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/parser/pdf.py b/mcp_center/servers/rag/src/base/parser/pdf.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/parser/pdf.py rename to mcp_center/servers/rag/src/base/parser/pdf.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/parser/txt.py b/mcp_center/servers/rag/src/base/parser/txt.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/parser/txt.py rename to mcp_center/servers/rag/src/base/parser/txt.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/rerank.py b/mcp_center/servers/rag/src/base/rerank.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/rerank.py rename to mcp_center/servers/rag/src/base/rerank.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/search/keyword.py b/mcp_center/servers/rag/src/base/search/keyword.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/search/keyword.py rename to mcp_center/servers/rag/src/base/search/keyword.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/search/vector.py b/mcp_center/servers/rag/src/base/search/vector.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/search/vector.py rename to mcp_center/servers/rag/src/base/search/vector.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/search/weighted_keyword_and_vector_search.py b/mcp_center/servers/rag/src/base/search/weighted_keyword_and_vector_search.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/search/weighted_keyword_and_vector_search.py rename to mcp_center/servers/rag/src/base/search/weighted_keyword_and_vector_search.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/token_tool.py b/mcp_center/servers/rag/src/base/token_tool.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/base/token_tool.py rename to mcp_center/servers/rag/src/base/token_tool.py diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/config.json b/mcp_center/servers/rag/src/config.json similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/config.json rename to mcp_center/servers/rag/src/config.json diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/deps.toml b/mcp_center/servers/rag/src/deps.toml similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/deps.toml rename to mcp_center/servers/rag/src/deps.toml diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/rag_config.json b/mcp_center/servers/rag/src/rag_config.json similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/rag_config.json rename to mcp_center/servers/rag/src/rag_config.json diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/requirements.txt b/mcp_center/servers/rag/src/requirements.txt similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/requirements.txt rename to mcp_center/servers/rag/src/requirements.txt diff --git a/mcp_center/servers/rag/src/server.py b/mcp_center/servers/rag/src/server.py new file mode 100644 index 0000000000..bc6dba9665 --- /dev/null +++ b/mcp_center/servers/rag/src/server.py @@ -0,0 +1,172 @@ +""" +MCP Server for Copilot-0 Knowledge Base Management +将 copilot-0 项目启动为 MCP 服务 +""" +import os +import sys +import json +from typing import Optional, Dict, Any, List +from mcp.server import FastMCP + +# 添加当前目录到路径 +current_dir = os.path.dirname(os.path.abspath(__file__)) +if current_dir not in sys.path: + sys.path.append(current_dir) + +# 添加 mcp_center 目录到路径(用于导入配置模块) +mcp_center_dir = os.path.abspath(os.path.join(current_dir, '../../..')) +if mcp_center_dir not in sys.path: + sys.path.insert(0, mcp_center_dir) + +# 导入配置加载器 +from config.public.base_config_loader import LanguageEnum +from config.private.rag.config_loader import RemoteInfoConfig as RagConfig + +# 导入 tool.py 中的所有函数 +from tool import ( + create_knowledge_base, + delete_knowledge_base, + list_knowledge_bases, + select_knowledge_base, + import_document, + search, + list_documents, + delete_document, + update_document, + export_database, + import_database +) + +# 加载配置文件 +config_path = os.path.join(current_dir, "config.json") +with open(config_path, 'r', encoding='utf-8') as f: + tool_configs = json.load(f)["tools"] + +# 获取语言配置 +_config = RagConfig().get_config() +_language = _config.public_config.language + +# 辅助函数:根据语言获取工具描述 +def get_tool_description(tool_name: str) -> str: + """根据配置的语言获取工具描述""" + tool_desc = tool_configs.get(tool_name, {}) + if _language == LanguageEnum.ZH: + return tool_desc.get("zh", tool_desc.get("en", "")) + else: + return tool_desc.get("en", tool_desc.get("zh", "")) + +# 创建 MCP 服务器 +mcp = FastMCP("Copilot-0 Knowledge Base MCP Server") + +# 注册同步函数 +@mcp.tool( + name="create_knowledge_base", + description=get_tool_description("create_knowledge_base") +) +def mcp_create_knowledge_base( + kb_name: str, + chunk_size: int, + embedding_model: Optional[str] = None, + embedding_endpoint: Optional[str] = None, + embedding_api_key: Optional[str] = None +) -> Dict[str, Any]: + """创建知识库""" + return create_knowledge_base(kb_name, chunk_size, embedding_model, embedding_endpoint, embedding_api_key) + + +@mcp.tool( + name="delete_knowledge_base", + description=get_tool_description("delete_knowledge_base") +) +def mcp_delete_knowledge_base(kb_name: str) -> Dict[str, Any]: + """删除知识库""" + return delete_knowledge_base(kb_name) + + +@mcp.tool( + name="list_knowledge_bases", + description=get_tool_description("list_knowledge_bases") +) +def mcp_list_knowledge_bases() -> Dict[str, Any]: + """列出所有知识库""" + return list_knowledge_bases() + + +@mcp.tool( + name="select_knowledge_base", + description=get_tool_description("select_knowledge_base") +) +def mcp_select_knowledge_base(kb_name: str) -> Dict[str, Any]: + """选择知识库""" + return select_knowledge_base(kb_name) + + +@mcp.tool( + name="list_documents", + description=get_tool_description("list_documents") +) +def mcp_list_documents() -> Dict[str, Any]: + """列出文档""" + return list_documents() + + +@mcp.tool( + name="delete_document", + description=get_tool_description("delete_document") +) +def mcp_delete_document(doc_name: str) -> Dict[str, Any]: + """删除文档""" + return delete_document(doc_name) + + +@mcp.tool( + name="export_database", + description=get_tool_description("export_database") +) +def mcp_export_database(export_path: str) -> Dict[str, Any]: + """导出数据库""" + return export_database(export_path) + + +@mcp.tool( + name="import_database", + description=get_tool_description("import_database") +) +def mcp_import_database(source_db_path: str) -> Dict[str, Any]: + """导入数据库""" + return import_database(source_db_path) + + +# 注册异步函数 +@mcp.tool( + name="import_document", + description=get_tool_description("import_document") +) +async def mcp_import_document(file_paths: List[str], chunk_size: Optional[int] = None) -> Dict[str, Any]: + """导入文档(异步,支持多文件并发导入)""" + return await import_document(file_paths, chunk_size) + + +@mcp.tool( + name="search", + description=get_tool_description("search") +) +async def mcp_search(query: str, top_k: Optional[int] = None) -> Dict[str, Any]: + """搜索(异步)""" + return await search(query, top_k) + + +@mcp.tool( + name="update_document", + description=get_tool_description("update_document") +) +async def mcp_update_document(doc_name: str, chunk_size: int) -> Dict[str, Any]: + """更新文档(异步)""" + return await update_document(doc_name, chunk_size) + + +if __name__ == "__main__": + # 启动 MCP 服务器 + # 使用 stdio transport,这是 MCP 工具的标准方式 + mcp.run(transport='sse') + diff --git a/mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/tool.py b/mcp_center/servers/rag/src/tool.py similarity index 100% rename from mcp_center/servers/oe-cli-mcp-server/mcp_tools/rag_tools/tool.py rename to mcp_center/servers/rag/src/tool.py diff --git a/mcp_center/service/rag.service b/mcp_center/service/rag.service new file mode 100644 index 0000000000..6dfaad8cbd --- /dev/null +++ b/mcp_center/service/rag.service @@ -0,0 +1,20 @@ +[Unit] +Description=Remote Info Server for MCP Center +After=network.target + +[Service] +User=root +WorkingDirectory=/usr/lib/euler-copilot-framework/mcp_center +# 关键:添加 PYTHONPATH,将工作目录加入模块搜索路径 +Environment=PYTHONUNBUFFERED=1 +Environment=PYTHONPATH=/usr/lib/euler-copilot-framework/mcp_center +ExecStart=/usr/bin/python3 servers/remote_info/src/server.py +Restart=always +RestartSec=5 +KillMode=control-group +KillSignal=SIGTERM +TimeoutStopSec=30 +SuccessExitStatus=143 + +[Install] +WantedBy=multi-user.target -- Gitee From c2e3e3d76b884b1653749030ad9189d8d93daceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=9F=B3=E7=9F=B3?= Date: Wed, 3 Dec 2025 10:02:08 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8D=E5=AD=97?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcp_center/config/private/rag/config_loader.py | 2 +- mcp_center/service/rag.service | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mcp_center/config/private/rag/config_loader.py b/mcp_center/config/private/rag/config_loader.py index 023c850985..8981173d2f 100644 --- a/mcp_center/config/private/rag/config_loader.py +++ b/mcp_center/config/private/rag/config_loader.py @@ -20,7 +20,7 @@ class RemoteInfoConfig(BaseConfig): def load_private_config(self) -> None: """加载私有配置文件""" - config_file = os.getenv("REMOTE_INFO_CONFIG") + config_file = os.getenv("RAG_CONFIG") if config_file is None: config_file = os.path.join("config", "private", "rag", "config.toml") self._config.private_config = RemoteInfoConfigModel.model_validate(toml.load(config_file)) diff --git a/mcp_center/service/rag.service b/mcp_center/service/rag.service index 6dfaad8cbd..f372512cd0 100644 --- a/mcp_center/service/rag.service +++ b/mcp_center/service/rag.service @@ -1,5 +1,5 @@ [Unit] -Description=Remote Info Server for MCP Center +Description=Rag Server for MCP Center After=network.target [Service] @@ -8,7 +8,7 @@ WorkingDirectory=/usr/lib/euler-copilot-framework/mcp_center # 关键:添加 PYTHONPATH,将工作目录加入模块搜索路径 Environment=PYTHONUNBUFFERED=1 Environment=PYTHONPATH=/usr/lib/euler-copilot-framework/mcp_center -ExecStart=/usr/bin/python3 servers/remote_info/src/server.py +ExecStart=/usr/bin/python3 servers/rag/src/server.py Restart=always RestartSec=5 KillMode=control-group -- Gitee