Bisheng插件体系:MCP协议与工具扩展机制
【免费下载链接】bisheng BISHENG毕昇 是一款 开源 LLM应用开发平台,主攻企业场景。 项目地址: 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与外部工具之间的桥梁,实现了工具的标准发现、调用和管理。
1.2 MCP核心组件
Bisheng的MCP实现包含以下核心组件:
| 组件类型 | 实现类 | 功能描述 | 适用场景 |
|---|---|---|---|
| 基础客户端 | BaseMcpClient | MCP协议抽象基类 | 所有MCP连接的基础 |
| SSE客户端 | SseClient | 基于Server-Sent Events的传输 | HTTP/RESTful工具服务 |
| Stdio客户端 | StdioClient | 标准输入输出传输 | 本地命令行工具 |
| 工具包装器 | McpTool | LangChain工具适配器 | 与LangChain生态集成 |
1.3 协议通信流程
MCP协议在Bisheng中的完整工作流程如下:
二、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工具注册:
- 将工具服务部署到服务器
- 在Bisheng管理界面添加MCP服务器配置
- 系统自动发现并注册可用工具
- 在AI应用流程中调用工具
六、总结与展望
【免费下载链接】bisheng BISHENG毕昇 是一款 开源 LLM应用开发平台,主攻企业场景。 项目地址: https://gitcode.com/dataelem/bisheng
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



