"""
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_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
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", ""))
_config = RagConfig().get_config()
port = _config.private_config.port
host = "0.0.0.0"
mcp = FastMCP("Copilot-0 Knowledge Base MCP Server", host=host, port=port)
@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.run(transport='sse')