久久一级二级,日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕,中文字慕五区,欧美日韩精品一级,9干视频在线,一线在线不卡免费,亚洲天堂久久在线观看,亚洲天堂激情一区,丁香激情四月

?? MCP生態(tài)

MCP協(xié)議實(shí)戰(zhàn):用Python給AI Agent裝上萬能工具調(diào)用接口

發(fā)布時(shí)間:2026-05-06 分類: MCP生態(tài)
摘要:給你的Agent裝個(gè)“外掛”?別再被私有協(xié)議坑了最近在折騰AI Agent的工具調(diào)用,被各種私有協(xié)議搞得頭大。OpenAI的Function Calling一套規(guī)則,Claude又是另一套,等你對(duì)接完自家內(nèi)部的API,發(fā)現(xiàn)格式又不一樣了。每次換模型或者加新工具,都得重寫一遍適配層,這誰頂?shù)米??直到我發(fā)現(xiàn)了MCP(Model Context Protocol)協(xié)議——這玩意兒簡(jiǎn)直就是Agent...

封面

給你的Agent裝個(gè)“外掛”?別再被私有協(xié)議坑了

最近在折騰AI Agent的工具調(diào)用,被各種私有協(xié)議搞得頭大。OpenAI的Function Calling一套規(guī)則,Claude又是另一套,等你對(duì)接完自家內(nèi)部的API,發(fā)現(xiàn)格式又不一樣了。每次換模型或者加新工具,都得重寫一遍適配層,這誰頂?shù)米。?/p>

直到我發(fā)現(xiàn)了MCP(Model Context Protocol)協(xié)議——這玩意兒簡(jiǎn)直就是Agent工具調(diào)用的“萬能插座”。今天我就用踩坑記錄的方式,帶你用Python給Agent集成MCP協(xié)議,徹底告別重復(fù)造輪子。

MCP協(xié)議:Agent工具的“USB標(biāo)準(zhǔn)”

先說清楚MCP是什么。簡(jiǎn)單理解,它是一套讓AI模型和外部工具對(duì)話的標(biāo)準(zhǔn)化協(xié)議。就像USB接口一樣,不管你是插U盤、鍵盤還是手機(jī),接口都一樣。MCP讓不同模型(Claude、GPT、龍蝦模型)都能用同一套方式調(diào)用工具。

核心三件套:

  • MCP Server:工具提供方,比如你的天氣查詢API、數(shù)據(jù)庫(kù)接口
  • MCP Client:Agent側(cè),負(fù)責(zé)和模型溝通,轉(zhuǎn)發(fā)工具調(diào)用請(qǐng)求
  • 協(xié)議格式:JSON-RPC 2.0,定義了請(qǐng)求/響應(yīng)的標(biāo)準(zhǔn)結(jié)構(gòu)

對(duì)比Function Calling,MCP最大優(yōu)勢(shì)是解耦。Function Calling是模型廠商定義的,模型換了你就得改。MCP是中間層,模型和工具都通過這個(gè)標(biāo)準(zhǔn)接口對(duì)話,換模型不用動(dòng)工具代碼。

踩坑實(shí)錄:從環(huán)境配置到協(xié)議調(diào)試

第一步:環(huán)境配置的坑

# 我以為直接pip install mcp就行,結(jié)果...
pip install mcp

# 報(bào)錯(cuò):缺少依賴
# 實(shí)際需要:
pip install "mcp[cli]" httpx sse-starlette

坑點(diǎn)1:官方文檔沒明確說需要sse-starlette,但不用的話Server啟動(dòng)會(huì)報(bào)錯(cuò)。這是MCP支持流式傳輸?shù)囊蕾嚒?/p>

第二步:工具函數(shù)封裝

假設(shè)我們要封裝一個(gè)天氣查詢工具:

# weather_tool.py
from mcp.server import Server
from mcp.types import Tool, TextContent
import httpx

app = Server("weather-server")

@app.list_tools()
async def list_tools():
    return [
        Tool(
            name="get_weather",
            description="獲取指定城市的天氣",
            inputSchema={
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名稱"}
                },
                "required": ["city"]
            }
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "get_weather":
        city = arguments["city"]
        # 調(diào)用實(shí)際的天氣API
        async with httpx.AsyncClient() as client:
            resp = await client.get(
                f"https://api.weather.com/v1/{city}",
                headers={"Authorization": "Bearer your_key"}
            )
            data = resp.json()
        
        return [TextContent(type="text", text=f"{city}今天{data['temp']}℃,{data['condition']}")]

坑點(diǎn)2inputSchema必須嚴(yán)格符合JSON Schema規(guī)范。我第一次少寫了"type": "object",Client死活調(diào)不通,報(bào)錯(cuò)信息還不明確。

第三步:協(xié)議調(diào)試技巧

調(diào)試MCP最實(shí)用的幾招:

配圖

# 調(diào)試腳本:直接測(cè)試Server
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def test_server():
    server_params = StdioServerParameters(
        command="python",
        args=["weather_tool.py"]
    )
    
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            
            # 1. 先列工具,看Schema對(duì)不對(duì)
            tools = await session.list_tools()
            print("可用工具:", [t.name for t in tools.tools])
            
            # 2. 測(cè)試調(diào)用
            result = await session.call_tool("get_weather", {"city": "北京"})
            print("調(diào)用結(jié)果:", result.content[0].text)

asyncio.run(test_server())

坑點(diǎn)3:MCP默認(rèn)用stdio通信,但生產(chǎn)環(huán)境需要用SSE(Server-Sent Events)。切換時(shí)要注意:

# 生產(chǎn)環(huán)境用SSE
from mcp.server.sse import SseServerTransport
from starlette.applications import Starlette
from starlette.routing import 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())

app = Starlette(
    routes=[
        Route("/sse", endpoint=handle_sse, methods=["GET"]),
        Route("/messages/", endpoint=sse.handle_post_message, methods=["POST"]),
    ]
)

實(shí)戰(zhàn)對(duì)比:MCP vs Function Calling

我做了個(gè)簡(jiǎn)單測(cè)試,用同一個(gè)天氣工具:

維度Function CallingMCP
代碼量每個(gè)模型寫一套適配一套工具,多模型通用
調(diào)試難度得看各廠商文檔統(tǒng)一協(xié)議,調(diào)試工具一致
流式支持部分模型支持原生支持SSE
工具發(fā)現(xiàn)靜態(tài)定義動(dòng)態(tài)發(fā)現(xiàn),可運(yùn)行時(shí)增刪

實(shí)際場(chǎng)景:我們團(tuán)隊(duì)有個(gè)內(nèi)部知識(shí)庫(kù)查詢工具,之前用Function Calling給GPT用,后來想接Claude,重寫了兩天。換成MCP后,工具代碼一行沒改,只在Agent側(cè)換了Client實(shí)現(xiàn),半小時(shí)搞定。

商業(yè)價(jià)值:這不只是技術(shù)優(yōu)化

  1. 降低多模型切換成本:今天用GPT,明天換龍蝦模型,工具層完全不用動(dòng)
  2. 工具市場(chǎng)標(biāo)準(zhǔn)化:可以像npm/pip一樣發(fā)布MCP工具包,別人直接用
  3. 私有協(xié)議兼容:把內(nèi)部API包裝成MCP Server,對(duì)外就是標(biāo)準(zhǔn)接口

我們有個(gè)客戶做電商客服Agent,需要對(duì)接十幾個(gè)內(nèi)部系統(tǒng)(訂單、庫(kù)存、CRM)。之前每個(gè)系統(tǒng)一套接口,Agent代碼臃腫不堪。用MCP重構(gòu)后,每個(gè)系統(tǒng)變成一個(gè)MCP Server,Agent只管調(diào)用,維護(hù)成本降了70%。

下一步行動(dòng)

  1. 立即試水:把上面的天氣工具代碼跑通,10分鐘就能看到效果
  2. 改造現(xiàn)有工具:挑一個(gè)你正在用的API,包裝成MCP Server
  3. 加入生態(tài):去龍蝦官網(wǎng)(m.gsdl.org.cn)的MCP工具市場(chǎng)看看,已經(jīng)有現(xiàn)成的數(shù)據(jù)庫(kù)、搜索引擎工具包

關(guān)鍵提醒:MCP還在快速迭代,協(xié)議版本要鎖定。我用的是2024-11-05版本,生產(chǎn)環(huán)境建議固定版本號(hào),別用latest。

想深入交流MCP踩坑經(jīng)驗(yàn),或者需要具體場(chǎng)景的代碼示例,直接去龍蝦官網(wǎng)的開發(fā)者社區(qū)發(fā)帖,我都在。

返回首頁
玉门市| 阿拉善左旗| 小金县| 都昌县| 石嘴山市| 沙坪坝区| 天镇县| 大田县| 万盛区| 治多县| 金乡县| 南涧| 鄂尔多斯市| 洛扎县| 阜阳市| 南召县| 英吉沙县| 商都县| 舒兰市| 准格尔旗| 云和县| 星子县| 东乡县| 长泰县| 灵璧县| 桦南县| 交口县| 绥滨县| 黄骅市| 乌兰县| 罗江县| 鹤山市| 庐江县| 宁武县| 咸阳市| 卢龙县| 基隆市| 揭阳市| 神农架林区| 日照市| 满城县|