MCP (Model Context Protocol)协议学习记录 (一)

498 阅读2分钟

本文章记录下个人学习MCP(# Model Context Protocol)协议的一些心得。

一、MCP协议的描述参见官方文档:Specification (Latest) – Model Context Protocol Specification 本文档使用的是python作为开发语言, python sdk地址: github.com/modelcontex…

二、安装python sdk 首先需要将python升级到3.10.x以上版本,然后使用pip3 install mcp

我使用的是linux开发环境,直接从python官网下载了Python-3.13.2.tgz(网址: www.python.org/downloads/r…) 安装到本地环境。linux支持多个python版本,所以我的环境就变成这样

image.png

三、客户端代码

import asyncio

from mcp.client.stdio import stdio_client
from mcp import ClientSession, StdioServerParameters
# 为 stdio 连接创建服务器参数
server_params = StdioServerParameters(
    # 服务器执行的命令,这里我们使用 uv 来运行 web_search.py
    command='python3.13',
    # 运行的参数
    args=['web_search.py'],
    # 环境变量,默认为 None,表示使用当前环境变量
    # env=None
)


async def main():
    # 创建 stdio 客户端
    async with stdio_client(server_params) as (stdio, write):
        # 创建 ClientSession 对象
        async with ClientSession(stdio, write) as session:
            # 初始化 ClientSession
            await session.initialize()

            # 列出可用的工具
            response = await session.list_tools()
            print("tools=============: ", response)

            # 调用工具
            # response = await session.call_tool('web_search', {'query': '今天南京天气'})
            response = await session.call_tool('get_tool_list', {})
            print(response)


if __name__ == '__main__':
    asyncio.run(main())

四、服务端代码

import httpx
from mcp.server import FastMCP
from mcp.server.fastmcp import FastMCP
from dataclasses import dataclass

# # 初始化 FastMCP 服务器
app = FastMCP('web-search')

@dataclass
class FieldDescription:
    name: str
    data_type: str
    description: str


@dataclass
class Field:
    name: str
    value: any

@dataclass
class ToolDescription:
    name: str
    description: str
    params: [FieldDescription]
    result: [FieldDescription]

@app.tool()
async def get_tool_list() -> [ToolDescription]:
    """
    Methond: get speed

    Args:
        None

    Returns:
       world
    """
    return [{
        "name": "get_vehicle_speed",
        "description": "vehicle speed",
        "params": None,
        "result": [
            {
                "name": "speed",
                "data_type": "float",
                "description": "current speed"
            }
        ]
    }]

@app.tool()
async def web_search(query: str) -> str:
    """
    搜索互联网内容

    Args:
        query: 要搜索内容

    Returns:
        搜索结果的总结
    """

    async with httpx.AsyncClient() as client:
        print("call server web_search")
        response = await client.post(
            'https://open.bigmodel.cn/api/paas/v4/tools',
            headers={'Authorization': '6c79b711c21c4c48adc00b4899b9a8e6.xeqkK7lzETMC0btK'},
            json={
                'tool': 'web-search-pro',
                'messages': [
                    {'role': 'user', 'content': query}
                ],
                'stream': False
            }
        )

        res_data = []
        for choice in response.json()['choices']:
            for message in choice['message']['tool_calls']:
                search_results = message.get('search_result')
                if not search_results:
                    continue
                for result in search_results:
                    res_data.append(result['content'])

        return '\n\n\n'.join(res_data)



if __name__ == "__main__":
    app.run(transport='stdio')


五、运行结果

image.png