微信扫码
添加专属顾问
我要投稿
掌握MCP Server,让你的大模型应用如虎添翼。 核心内容: 1. MCP协议的开源特性及其对大模型应用的重要性 2. MCP的基本架构和客户端-服务器模型 3. MCP提供的两种传输实现:stdio和SSE的应用场景
玩大模型的同学应该对MCP(Model Context Protocol)都不陌生。去年Anthropic发布该大模型协议之后,就引起了广泛关注,因为有了它,大模型就可以插上翅膀。
MCP是一个开源协议,它规定了应用程序如何向LLM提供上下文。可以把MCP想象成AI应用的Type C数据线。就像Type C数据线为将您的设备连接到各种外部设备和配件提供了标准化方式一样,MCP也为将AI模型连接到不同的数据源和工具提供了标准化方法。
借助python SDK,我们可以定义Resources、 Tools、 Roots、Sampling 以及 Prompt。
MCP提供了Standard Input/Output (stdio)和Server-Sent Events (SSE)两种传输实现。
stdio传输通过标准输入和输出流进行通信。这在本地集成和命令行工具中尤其有用。
使用 stdio 的场景包括:
(Claude就是基于这个能力实现电脑控制的)
服务器发送事件(SSE)使服务器能够通过HTTP POST请求向客户端进行流式传输,用于客户端与服务器之间的通信。
使用SSE的情况包括:
本文以介绍如何构建MCP Server为例,主要内容为基于Python SDK自定义SSE传输类型的MCP Server,并向外部应用提供tools的能力。
Python SDK的github地址为 https://github.com/modelcontextprotocol/python-sdk ,其提供了一系列的demo实例,例如可以通过fastmcp创建:
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
然后直接启动:
mcp dev server.py
或者,也可通过lowlevel的Server创建
import anyio
import click
import httpx
import mcp.types as types
from mcp.server.lowlevel import Server
# 此处代码省略,完整代码参考:https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/servers/simple-tool/mcp_simple_tool/server.py
# ...
@click.command()
@click.option("--port", default=8000, help="Port to listen on for SSE")
@click.option(
"--transport",
type=click.Choice(["stdio", "sse"]),
default="stdio",
help="Transport type",
)
def main(port: int, transport: str) -> int:
app = Server("mcp-website-fetcher")
@app.call_tool()
async def fetch_tool(
name: str, arguments: dict
) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]:
if name != "fetch":
raise ValueError(f"Unknown tool: {name}")
if "url" not in arguments:
raise ValueError("Missing required argument 'url'")
return await fetch_website(arguments["url"])
@app.list_tools()
async def list_tools() -> list[types.Tool]:
return [
types.Tool(
name="fetch",
description="Fetches a website and returns its content",
inputSchema={
"type": "object",
"required": ["url"],
"properties": {
"url": {
"type": "string",
"description": "URL to fetch",
}
},
},
)
]
if transport == "sse":
from mcp.server.sse import SseServerTransport
from starlette.applications import Starlette
from starlette.routing import Mount, Route
sse = SseServerTransport("/messages/")
async def handle_sse(request):
async with sse.connect_sse(
request.scope, request.receive, request._send
) as streams:
await app.run(
streams[0], streams[1], app.create_initialization_options()
)
starlette_app = Starlette(
debug=True,
routes=[
Route("/sse", endpoint=handle_sse),
Mount("/messages/", app=sse.handle_post_message),
],
)
import uvicorn
uvicorn.run(starlette_app, host="0.0.0.0", port=port)
else:
from mcp.server.stdio import stdio_server
async def arun():
async with stdio_server() as streams:
await app.run(
streams[0], streams[1], app.create_initialization_options()
)
anyio.run(arun)
return 0
然后启动该main函数。(具体介绍可参考代码中链接)
当你完成Server构建之后,即可使用MCP Inspector工具进行调试。如果你使用fastMCP进行构建,那么mcp dev server.py
命令默认会启动MCP Inspector。而如果使用lowlevel的Server创建,则默认不会,那么此时可通过额外启动MCP Inspector来进行调试。可执行如下命令:
npx @modelcontextprotocol/inspector然后打开本地5173端口,即可得到:
本文使用到的mcp server代码地址:
https://github.com/xiaozhch5/chatdata-mcp-server
修改URL地址,连接MCP Server:现在我们已经定义好了MCP Server,且通过sse的方式将tools暴露出来。接着,便可以通过此sse将这些tools接近来。
McpTransport transport =
new HttpMcpTransport.Builder()
.sseUrl("http://127.0.0.1:8099/sse")
.logRequests(true) // if you want to see the traffic in the log
.logResponses(true)
.build();
McpClient mcpClient = new DefaultMcpClient.Builder().transport(transport).build();
ToolProvider toolProvider = McpToolProvider.builder().mcpClients(List.of(mcpClient)).build();
ChatAgentAssistant bot =
AiServices.builder(ChatAgentAssistant.class)
.chatLanguageModel(openAiCompatibleModel.getChatModel("gpt-3.5-turbo"))
.toolProvider(toolProvider)
.build();
String res = bot.chat("""
帮我查一下广州的天气
""");
System.out.println(res);
执行上述代码,即可得到:通过构建基于MCP协议的服务器并向外部系统暴露工具服务,我们不仅实现了与不同语言的大模型应用无缝对接,还提供了高效的调试路径及最佳实践。从快速搭建服务器到详细地使用MNP Inspector进行功能验证,再到在实际项目中测试和优化,整个过程帮助开发者高效集成和管理大模型组件,从而为用户提供更丰富、更友好的交互体验。
本文使用的MCP Server相关代码地址(纯用cursor写的):
https://github.com/xiaozhch5/chatdata-mcp-server
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-03-10
Markify:专为 LLM 优化的开源文档解析神器,轻松破解 PDF 难题!
2025-03-10
Manus太火爆MetaGPT又开源OpenManus-RL引入强化学习;多智能体协作框架OWL
2025-03-10
一键包:新开源TTS,零样本克隆声音,还能自主创建声音,只需要6G显存,文末一键包
2025-03-09
LLM运行框架对比:ollama与vllm浅析
2025-03-09
真·企业级方案!MindSQL开源:四种训练方式+私有数据+RAG+生产高并发
2025-03-09
智能体的互联网时代来临,相当于http协议的MCP协议让智能体与数据源无缝连接
2025-03-09
Manus背后的核心技术:如何通过MCP简化AI集成
2025-03-08
5 个人、3 小时,开源复刻 Manus?
2025-01-01
2024-07-25
2024-05-06
2025-01-21
2024-09-20
2024-07-20
2024-06-12
2024-08-13
2024-12-26
2024-07-11
2025-03-08
2025-03-03
2025-03-02
2025-03-01
2025-02-26
2025-02-23
2025-02-18
2025-02-15