
我认为,MCP(Model Context Protocol)或许会成为AI时代新的组件(building blocks),它能够在一定程度帮助开发者以搭积木的形式打造AI原生应用。
为了更好地复用MCP,企业和社区可搭建发布、注册和获取MCP的Hub。就好似Docker的Hub或者Github这样,每个人和组织都可以成为MCP的贡献者,都可以提交自己开发的MCP Server和MCP Tool。
我在过去几天突然想到这样一个idea。可惜,这个idea并非我的创见,因为,社区早有这样的Hub存在了,也就是MCP Server Hub,其口号就是“Discover The Best MCP Servers & Tools”。
发现是为了更好的“消费”!用户可以按照各自类别或通过关键字寻找自己心仪的MCP Server & Tools,就像购买自己想要的爆款产品一般。
这种新一代的“组件”是一种更智能的工具。AI大模型赋予了它更大的自主性,更强的判断能力,更智能的内容生成能力;同时,它更加规范,更加统一,所有的MCP Server都遵循了完全一致的协议(这也是MCP的由来)。变化主要体现在MCP Server的transport类型(选择stdio或Streamable HTTP),这会决定MCP Host和Client的调用方式。另一个变化是注册MCP Server需要配置的command和对应的参数和环境变量。
以MCP Server Hub公开的SQLite为例(SQLite | MCP Server Hub)。它为SQLite提供了类似BI一般的数据库智能交互能力。该Server定义了六种核心工具,内容涵盖查询、样式管理和数据分析。用户可以将Claude Desktop作为Host,只需要将如下内容添加到claude_desktop_config.json文件中即可:
"mcpServers": {
"sqlite": {
"command": "uv",
"args": [
"--directory",
"parent_of_servers_repo/servers/src/sqlite",
"run",
"mcp-server-sqlite",
"--db-path",
"~/test.db"
]
}
}从配置的命令看,它使用了uv,说明这个MCP Server是用python开发的,因而通过uv run来执行。当然也可以直接调用python命令。如果是Node.js开发的MCP Server,如MCP Server Hub公开了一个调用EverArt API用于生成图片的MCP Server:EverArt,就采用了Node.js进行开发,在Claude Desktop使用它时,配置则为:
{
"mcpServers": {
"everart": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-everart"],
"env": {
"EVERART_API_KEY": "your_key_here"
}
}
}
}一旦拥有这样的MCP Server Hub,MCP就真正成为了AI原生应用开发的building block。在开发以智能体(Agent)为核心的应用时,尤有价值。
对于智能体而言,每个智能体就是赋予它角色的控制者,LLM是决策者,MCP Tool则是真正的执行者,定义在MCP Tool函数中清晰的文档字符串,是告知LLM该如何选择正确工具的指令。如果是多智能体应用,则需要在智能体之上建立一个更高层次的Team或Crew,并通过专门的Flow或Process规定多个智能体之间的执行流程。
这意味着在设计智能体应用程序时,经典的“职责分离”原则同样具有极高价值。我们要善于识别哪些功能应该“分离”到智能体之外,定义为单独的MCP Tool,这样既可以实现更好的复用,又能降低智能体的开发难度和工作量。
我发现有些团队在开发智能体应用时,习惯于通过继承框架(如langchain或MetaGPT)的智能体基类来开发智能体。这一做法未必错误,毕竟不同的框架有自己的设计模式;但是,面向对象的设计原则在此依旧有效:遵循“聚合/组合优先复用”原则,如前所述,就应该把负责具体执行工作的逻辑分离出去,转移给Tool,如此能让智能体变得更加内聚,也更加简单。
如下代码所示:
from llama_index.core.agent.workflow import FunctionAgent
async def get_agent(tools: McpToolSpec):
"""Create and return a FunctionAgent with the given tools."""
tools = await tools.to_tool_list_async()
agent = FunctionAgent(
name="Agent",
description="An agent that can work with Our Database software.",
tools=tools,
llm=llm,
system_prompt=SYSTEM_PROMPT,
)
return agent
mcp_tool = McpToolSpec(client=mcp_client)
agent = await get_agent(mcp_tool)这里创建的智能体(Agent)是一个通用的Agent,但它组合了MCP Tools和LLM,使得它可以通过输入的系统提示词,由LLM根据每个tool的描述信息选择符合用户请求的工具,并调用它。显然,MCP让复用变得更容易,更让智能体变得更轻,变得更小,前提是我们要学会分辨职责,并做好合理的职责分离。
