diff --git a/mcp_center/config/private/rag/config.toml b/mcp_center/config/private/rag/config.toml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..8981173d2fb12576dd480d15c9658755d1576fb9 --- /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("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/mcp_config/rag_mcp/config.json b/mcp_center/mcp_config/rag_mcp/config.json new file mode 100644 index 0000000000000000000000000000000000000000..d11c2ef75fe1e5d9ba06b6773fefbf6119e9303d --- /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 0000000000000000000000000000000000000000..bc6dba96656b276c99848af8564d3a089a4b8377 --- /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 0000000000000000000000000000000000000000..f372512cd07f48fc4ce8ee730d6801a4f22e3e03 --- /dev/null +++ b/mcp_center/service/rag.service @@ -0,0 +1,20 @@ +[Unit] +Description=Rag 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/rag/src/server.py +Restart=always +RestartSec=5 +KillMode=control-group +KillSignal=SIGTERM +TimeoutStopSec=30 +SuccessExitStatus=143 + +[Install] +WantedBy=multi-user.target