Bisheng插件体系:MCP协议与工具扩展机制

Bisheng插件体系:MCP协议与工具扩展机制

【免费下载链接】bisheng BISHENG毕昇 是一款 开源 LLM应用开发平台,主攻企业场景。 【免费下载链接】bisheng 项目地址: https://gitcode.com/dataelem/bisheng

引言:企业级AI应用的工具生态挑战

在企业级AI应用开发中,工具扩展能力是决定平台灵活性和实用性的关键因素。传统AI平台往往面临工具集成复杂、协议不统一、扩展性受限等痛点。Bisheng毕昇作为开源LLM应用开发平台,通过深度集成MCP(Model Context Protocol)协议,构建了一套完整的工具扩展体系,为企业用户提供了灵活、标准化的插件开发方案。

本文将深入解析Bisheng的MCP插件体系,从协议原理到实战应用,帮助开发者全面掌握企业级AI工具扩展的最佳实践。

一、MCP协议核心概念与架构

1.1 MCP协议概述

MCP(Model Context Protocol)是一种标准化的协议,旨在为AI模型提供统一的上下文管理和工具调用接口。在Bisheng平台中,MCP协议充当了LLM与外部工具之间的桥梁,实现了工具的标准发现、调用和管理。

mermaid

1.2 MCP核心组件

Bisheng的MCP实现包含以下核心组件:

组件类型实现类功能描述适用场景
基础客户端BaseMcpClientMCP协议抽象基类所有MCP连接的基础
SSE客户端SseClient基于Server-Sent Events的传输HTTP/RESTful工具服务
Stdio客户端StdioClient标准输入输出传输本地命令行工具
工具包装器McpToolLangChain工具适配器与LangChain生态集成

1.3 协议通信流程

MCP协议在Bisheng中的完整工作流程如下:

mermaid

二、Bisheng MCP插件体系详解

2.1 客户端管理机制

Bisheng通过ClientManager类统一管理MCP客户端的生命周期:

class ClientManager:
    @classmethod
    def sync_connect_mcp_from_json(cls, client_json: dict | str) -> BaseMcpClient:
        """同步方式从JSON配置创建MCP连接"""
        if isinstance(client_json, str):
            client_json = json.loads(client_json)
        
        mcp_servers = client_json['mcpServers']
        client_type = McpClientType.SSE.value
        client_kwargs = {}
        
        for _, kwargs in mcp_servers.items():
            if 'command' in kwargs:
                client_type = McpClientType.STDIO.value
            kwargs.pop('name', '')
            kwargs.pop('description', '')
            client_kwargs = kwargs
            break
        
        return cls.sync_connect_mcp(client_type, **client_kwargs)

2.2 工具发现与注册

Bisheng支持动态工具发现机制,通过MCP协议的list_tools方法自动获取可用工具:

async def list_tools(self):
    async with self.initialize() as client_session:
        tools = await client_session.list_tools()
    return tools.tools

2.3 工具调用执行

工具调用通过统一的call_tool方法实现,支持同步和异步两种模式:

async def call_tool(self, name: str, arguments: dict[str, Any] | None = None) -> str:
    """调用MCP工具"""
    async with self.initialize() as client_session:
        try:
            resp = await client_session.call_tool(name, arguments)
        except Exception as e:
            return f"Tool call failed: {str(e)}"
    return resp.model_dump_json()

三、MCP工具集成实战

3.1 配置MCP服务器

Bisheng支持两种MCP服务器配置方式:

SSE模式配置(HTTP服务)

{
  "mcpServers": {
    "weather_service": {
      "url": "https://api.weather.com/mcp",
      "name": "天气预报服务",
      "description": "提供实时天气信息查询"
    }
  }
}

Stdio模式配置(本地命令)

{
  "mcpServers": {
    "file_processor": {
      "command": "python",
      "args": ["-m", "file_processor_mcp"],
      "name": "文件处理工具",
      "description": "本地文件处理服务"
    }
  }
}

3.2 工具Schema转换

Bisheng自动将OpenAPI格式的工具参数转换为Pydantic模型:

def convert_openai_params_to_model(params: list[dict]) -> Type[BaseModel]:
    """将OpenAPI参数转换为Pydantic模型"""
    model_params = {}
    for one in params:
        field_type = one['schema']['type']
        if field_type == 'number':
            field_type = float
        elif field_type == 'integer':
            field_type = int
        # ... 其他类型转换
        model_params[one['name']] = (field_type, Field(description=one['description']))
    
    return create_model('InputArgs', **model_params)

3.3 LangChain工具集成

通过McpTool类将MCP工具无缝集成到LangChain生态:

@classmethod
def get_mcp_tool(cls, name: str, description: str, mcp_client: BaseMcpClient,
                 mcp_tool_name: str, arg_schema: Any, **kwargs) -> StructuredTool:
    """创建LangChain兼容的MCP工具"""
    c = cls(name=name, description=description, mcp_client=mcp_client,
            mcp_tool_name=mcp_tool_name)
    return StructuredTool(name=c.name,
                          description=c.description,
                          func=c.run,
                          coroutine=c.arun,
                          args_schema=arg_schema,
                          **kwargs)

四、企业级应用场景与最佳实践

4.1 典型应用场景

场景分类具体应用MCP传输方式优势
数据查询数据库查询、API调用SSE实时性高、易于扩展
文件处理文档转换、图像处理Stdio本地执行、安全性强
系统管理服务器监控、日志分析混合模式灵活适配不同环境
业务集成业务系统对接SSE标准化接口、易于维护

4.2 性能优化策略

连接池管理

# 实现MCP客户端连接池
class McpClientPool:
    def __init__(self, max_size=10):
        self.pool = Queue(max_size)
        self.client_config = None
    
    async def get_client(self):
        if not self.pool.empty():
            return self.pool.get_nowait()
        return await ClientManager.connect_mcp_from_json(self.client_config)
    
    async def release_client(self, client):
        if self.pool.qsize() < self.max_size:
            self.pool.put_nowait(client)

异步批量处理

async def batch_call_tools(self, tool_calls: List[ToolCall]):
    """批量调用MCP工具"""
    async with asyncio.TaskGroup() as tg:
        tasks = []
        for call in tool_calls:
            task = tg.create_task(
                self.call_tool(call.name, call.arguments)
            )
            tasks.append(task)
    
    return [task.result() for task in tasks]

4.3 安全性与监控

工具调用审计

class AuditedMcpClient(BaseMcpClient):
    def __init__(self, base_client: BaseMcpClient, audit_logger):
        self.base_client = base_client
        self.audit_logger = audit_logger
    
    async def call_tool(self, name: str, arguments: dict = None):
        start_time = time.time()
        try:
            result = await self.base_client.call_tool(name, arguments)
            self.audit_logger.log_success(name, arguments, result, time.time() - start_time)
            return result
        except Exception as e:
            self.audit_logger.log_failure(name, arguments, str(e), time.time() - start_time)
            raise

五、开发指南:自定义MCP工具

5.1 创建MCP服务器

Python示例(Stdio模式)

#!/usr/bin/env python3
import asyncio
import json
import sys
from mcp.server import Server
from mcp.server.stdio import stdio_server

server = Server("my-custom-tools")

@server.list_tools()
async def handle_list_tools() -> List[Tool]:
    return [
        Tool(
            name="calculate_risk",
            description="计算投资风险评分",
            inputSchema={
                "type": "object",
                "properties": {
                    "investment_amount": {"type": "number", "description": "投资金额"},
                    "risk_tolerance": {"type": "string", "description": "风险承受能力"}
                }
            }
        )
    ]

@server.call_tool()
async def handle_call_tool(name: str, arguments: dict) -> List[TextContent]:
    if name == "calculate_risk":
        amount = arguments.get("investment_amount", 0)
        tolerance = arguments.get("risk_tolerance", "medium")
        # 计算逻辑...
        score = calculate_risk_score(amount, tolerance)
        return [TextContent(type="text", text=str(score))]
    
    raise ValueError(f"Unknown tool: {name}")

async def main():
    async with stdio_server() as (read, write):
        await server.run(read, write)

if __name__ == "__main__":
    asyncio.run(main())

5.2 工具配置与部署

Docker化部署

FROM python:3.9-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

COPY mcp_server.py .
RUN chmod +x mcp_server.py

ENTRYPOINT ["python", "-m", "mcp_server"]

Bisheng工具注册

  1. 将工具服务部署到服务器
  2. 在Bisheng管理界面添加MCP服务器配置
  3. 系统自动发现并注册可用工具
  4. 在AI应用流程中调用工具

六、总结与展望

【免费下载链接】bisheng BISHENG毕昇 是一款 开源 LLM应用开发平台,主攻企业场景。 【免费下载链接】bisheng 项目地址: https://gitcode.com/dataelem/bisheng

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值