最近,AI技术圈中一个概念迅速走红——MCP[1](模型上下文协议,Model Context Protocol)。许多初次接触的开发者会疑惑:这不就是大模型调用外部工具吗?没错,其核心本质正是工具调用,但与以往的集成方式相比,差异非常显著。
过去,每当需要调用外部工具,开发人员必须手动编写大量适配代码,将工具强行嵌入应用中。如今,MCP的推出带来了一套标准化的调用协议——可以理解为给AI生态安装了一个“USB Type-C”接口。所有支持MCP的工具都能实现即插即用,直接对接大模型,开发者从此无需重复造轮子。
MCP协议定义及其对AI领域的影响
在深入探讨之前,先澄清一个可能的误解:此前Langchain曾发布过Agent Protocol,但该协议主要用于智能体之间的互操作,相对复杂。而MCP,凭借Cursor、Cline等编程工具的广泛采用,以及多智能体应用Manus的火爆,正在成为事实上的行业标准。

如上图所示,MCP协议采用客户端-服务器架构。大模型作为调用工具的一方扮演客户端角色,而提供工具的企业或个人则作为服务器端。在此之前,调用各类官方工具都需要自行编写代码。随着MCP的普及,工具提供方将主动融入该生态,直接提供MCP Server,为开发人员节省大量时间。至此,你应该对MCP有了基本了解。
1. 只有Claude能用?
先说结论:并非如此,绝大多数主流大模型都支持。MCP是一个通用协议,兼容多种模型。通过MCP SDK,我们可以获取可用工具列表,并将其提供给LLM——比如封装为OpenAI API调用的一部分,或者直接写入Prompt传给模型。示例代码如下:
response = await self.session.list_tools()
a vailable_tools = [{
"name": tool.name,
"description": tool.description,
"input_schema": tool.inputSchema
} for tool in response.tools]
# Initial Claude API call
response = self.anthropic.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1000,
messages=messages,
tools=a vailable_tools
)
2. 都有哪些MCP Server工具
目前,Anthropic官方已推出几类常见工具,包括数据存储、开发工具、Web与浏览器访问、Slack通讯、AI工具等。

此外,还有大量官方和社区维护的MCP Server,例如Obsidian Markdown Notes[3]、Qdrant[4]、Cloudflare[5]、Docker[6]、Kubernetes[7]、Todoist[8],甚至Spotify[9]。据聚合网站[10]统计,目前已收录3251个MCP Server和98个Clients,生态扩张速度惊人。

3. 怎么开发自己的MCP Server
以下示例摘自官方教程,演示如何开发一个天气查询服务。首先配置开发环境:
# Create a new directory for our project
uv init weather
cd weather
# Create virtual environment and activate it
uv venv
source .venv/bin/activate
# Install dependencies
uv add "mcp[cli]" httpx
# Create our server file
touch weather.py
然后初始化服务器:
from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP
# Initialize FastMCP server
mcp = FastMCP("weather")
# Constants
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"
接着编写工具函数,与常规大模型工具类似,需要明确函数描述和参数说明,最终返回字符串供大模型理解:
@mcp.tool()
async def get_alerts(state: str) -> str:
"""Get weather alerts for a US state.
Args:
state: Two-letter US state code (e.g. CA, NY)
"""
url = f"{NWS_API_BASE}/alerts/active/area/{state}"
data = await make_nws_request(url)
if not data or "features" not in data:
return "Unable to fetch alerts or no alerts found."
if not data["features"]:
return "No active alerts for this state."
alerts = [format_alert(feature) for feature in data["features"]]
return "n---n".join(alerts)
运行服务器:
if __name__ == "__main__":
# Initialize and run the server
mcp.run(transport='stdio')
启动后,MCP Server即可对外提供服务。注意,实际应用中工具服务通常不会持续运行,而是在大模型需要调用时,由MCP客户端自动拉起。
客户端的实现更直接——即大模型应用端。通过MCP客户端初始化一个连接,指向上述脚本地址后,它会自动启动天气查询服务:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
...
class MCPClient:
def __init__(self):
# Initialize session and client objects
self.session: Optional[ClientSession] = None
self.exit_stack = AsyncExitStack()
self.anthropic = Anthropic()
# methods will go here
async def connect_to_server(self, server_script_path: str):
"""Connect to an MCP server
Args:
server_script_path: Path to the server script (.py or .js)
"""
...
command = "python" if is_python else "node"
server_params = StdioServerParameters(
command=command,
args=[server_script_path],
env=None
)
stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))
self.stdio, self.write = stdio_transport
self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))
await self.session.initialize()
# List a vailable tools
response = await self.session.list_tools()
tools = response.tools
print("nConnected to server with tools:", [tool.name for tool in tools])
再往下便是调用逻辑——通过这套协议SDK获取工具列表,然后传递给大模型即可。本质并不复杂,MCP所做的,就是让大模型应用能够自动通过这套通信机制调用外部工具。简言之,核心仍是工具调用,只不过将外部工具的通信协议标准化与自动化了。
async def process_query(self, query: str) -> str:
"""Process a query using Claude and a vailable tools"""
messages = [
{
"role": "user",
"content": query
}
]
response = await self.session.list_tools()
a vailable_tools = [{
"name": tool.name,
"description": tool.description,
"input_schema": tool.inputSchema
} for tool in response.tools]
# Initial Claude API call
response = self.anthropic.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1000,
messages=messages,
tools=a vailable_tools
)
# Process response and handle tool calls
final_text = []
assistant_message_content = []
for content in response.content:
if content.type == 'text':
...
elif content.type == 'tool_use':
tool_name = content.name
tool_args = content.input
# Execute tool call
result = await self.session.call_tool(tool_name, tool_args)
final_text.append(f"[Calling tool {tool_name} with args {tool_args}]")
....
return "n".join(final_text)
前因后果已经清晰,无需再深入展开。
5. 是否只支持Python
当然不止。官方除Python SDK外,还提供了Typescript-sdk[11]、Java-sdk[12]、Kotlin-sdk[13]。其他语言也可根据标准specification[14]自行实现。
6. 底层通信协议
底层通信采用JSON-RPC[15],更多细节可查阅官方文档Transports[16]。
7. 总结
展望未来,随着大模型应用不断深入,MCP Server将变得更加丰富和强大,各类应用也会逐步适配该协议,进一步降低AI接入门槛。正如OpenAI CEO Sam Altman所言,2025年将是“AI Agent之年”。或许用不了多久,我们只需一句话,就能让AI远程操控电脑、管理手机,彻底改变人机交互的方式。
