【Ai】MCP实战:手写 client 和 server [Python版本]

什么是mcp

MCP 是一个开放协议,它为应用程序向 LLM 提供上下文的方式进行了标准化。你可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化的方式一样,MCP 为 AI 模型连接各种数据源和工具提供了标准化的接口。

MCP 核心采用客户端-服务器架构,主机应用可以连接多个服务器:
在这里插入图片描述

  • MCP Hosts: 如 Claude Desktop、IDE 或 AI 工具,希望通过 MCP 访问数据的程序
  • MCP Clients: 维护与服务器一对一连接的协议客户端
  • MCP Servers: 轻量级程序,通过标准的 Model Context Protocol 提供特定能力
  • 本地数据源: MCP 服务器可安全访问的计算机文件、数据库和服务
  • 远程服务: MCP 服务器可连接的互联网上的外部系统(如通过 APIs)

初始化环境

Python 需要是 3.11+ 版本

安装uv

mcp默认使用uv作为第三方库管理工具,如果还没有安装,执行如下命令安装即可

pip install uv

执行命令 uv version 查看是否成功安装

在这里插入图片描述

使用 uv 创建项目

uv init mcp-server-demo
cd mcp-server-demo

在这里插入图片描述

执行 uv add "mcp[cli]" 添加mcp依赖到项目中

在这里插入图片描述

创建 MCP server

编写server端代码

from pathlib import Path
from mcp.server import FastMCP

mcp = FastMCP(name="demo1", log_level='ERROR')


# 添加一个工具
@mcp.tool()
def list_file(path: str):
    """
    列出指定目录的所有文件和子目录
    参数:
        path:  根目录
    返回:
    文件列表
    """
    try:
        path = Path(path)
        if not path.exists():
            print(f"错误:目录 '{path}' 不存在")
            return []

        contents = []
        for item in path.iterdir():
            contents.append({
                'name': item.name,
                'type': 'file' if item.is_file() else 'directory',
                'size': item.stat().st_size if item.is_file() else 0,
                'modified': item.stat().st_mtime
            })

        return contents
    except PermissionError:
        print(f"错误:没有权限访问目录 '{path}'")
        return []



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

创建 MCP client

编写client代码

import asyncio

from dotenv import load_dotenv
from mcp import StdioServerParameters, ClientSession, stdio_client

load_dotenv()  # 从.env加载环境变量

# Client 会使用这里的配置来启动本地MCP Server

server_params = StdioServerParameters(
    command='python',
    args=["./server_demo.py"],
    env=None
)


async def main():
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(
                read, write, sampling_callback=None
        ) as session:
            await session.initialize()
            print('\n 正在调用工具...')
            result = await session.call_tool("list_file", {"path": "D:/pic"})
            print(result.content)


asyncio.run(main())

测试使用

1、直接运行client_demo.py代码

正在调用工具...
[TextContent(type='text', text='{"name": "01.jpg", "type": "file", "size": 192323, "modified": 1697902736.3849685}', annotations=None), TextContent(type='text', text='{"name": "05.jpg", "type": "file", "size": 379369, "modified": 1697819759.6860936}', annotations=None), TextContent(type='text', text='{"name": "22.jpg", "type": "file", "size": 249651, "modified": 1698055119.5418005}', annotations=None), TextContent(type='text', text='{"name": "cheetah.jpg", "type": "file", "size": 20552, "modified": 1717745181.0207932}', annotations=None), TextContent(type='text', text='{"name": "dog", "type": "directory", "size": 0, "modified": 1718097770.096676}', annotations=None), TextContent(type='text', text='{"name": "dog.jpg", "type": "file", "size": 44733, "modified": 1711027923.611414}', annotations=None), TextContent(type='text', text='{"name": "dog.png", "type": "file", "size": 351610, "modified": 1711027861.5564046}', annotations=None), TextContent(type='text', text='{"name": "\\u5b81\\u6ce2\\u56db\\u660e\\u5c71", "type": "directory", "size": 0, "modified": 1696489530.0600708}', annotations=None)]

2、启动 mcp server 在浏览器端使用

uv run mcp dev server_demo.py

出现如下日志,代表正常启动

Starting MCP inspector...
⚙️ Proxy server listening on port 6277
🔍 MCP Inspector is up and running at http://127.0.0.1:6274 🚀

浏览器中打开 http://127.0.0.1:6274,可以看见如下页面:

在这里插入图片描述

然后点击 “Connect” 按钮,点击“Tools - List Tools”,可以看见后台MCP Server提供的服务,在右边输入参数后,点击“Run Tool”可以看见正常调用的后端接口

在这里插入图片描述

3、在VS code插件“Cline”中使用

打开插件 Cline ,点击顶部的 “MCP Servers” 按钮,

打开配置文件 “cline_mcp_settings.json”,输入如下配置,出现绿灯代表配置成功

{
  "mcpServers": {
    "myMcpDemo1": {
      "disabled": false,
      "timeout": 60,
      "command": "cmd",
      "args": [
        "/c",
        "python",
        "C:/workspace/py/mcp-demo/demo2/server_demo.py"
      ],
      "env": {},
      "transportType": "stdio"
    }
  }
}

在这里插入图片描述

注意:如果出现错误“Processing request of type server.py:534 ListToolsRequest 534 ListResourcesRequest ListResourceTemplatesRequest”,则需要调整日志输出级别 log_level='ERROR'

mcp = FastMCP(name="demo1", log_level='ERROR')

接下来就可以在对话框中直接对话使用了,列入我输入“列出目录 C:\workspace\py 的所有文件和子目录”,效果如下:

在这里插入图片描述

参考

### 关于 MCP Inspector 的使用与下载 MCP Inspector 是一种交互式的开发工具,主要用于测试调试 MCP(Model Context Protocol)服务器。通过该工具,开发者能够更高效地验证其服务的功能性兼容性[^2]。 #### 工具安装与基础命令 要启动并运行 MCP Inspector,需先确认已正确安装 `mcp` 开发工具链。以下是具体操作方法: 1. **查看帮助文档** 使用以下命令可获取有关 `mcp` 命令的帮助信息以及可用子命令列表: ```bash mcp --help ``` 返回的结果表明可通过 `mcp dev` 子命令来运行带有 MCP Inspector 功能的服务实例[^1]。 2. **运行 MCP Inspector** 执行如下命令即可启用 MCP Inspector 并连接到指定的 MCP 服务器环境: ```bash mcp dev ``` 此命令会启动一个本地 MCP 服务器,并自动加载 MCP Inspector 用户界面以便实时监控调整配置参数[^1]。 #### 下载资源位置 目前官方并未提供独立版本MCP Inspector 下载链接;它通常被集成至完整的 `mcp` SDK 或 CLI 软件包之中。因此建议访问项目官方网站或者 GitHub 仓库页面以获取最新发行版文件及其配套说明文档。 如果尚未完成初始设置流程,则需要按照官方指引逐步执行依赖项安装过程直至成功部署整个框架结构为止。 ```python import subprocess def check_mcp_version(): try: result = subprocess.run(['mcp', 'version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) if result.returncode == 0: print(f"MCP Version Installed: {result.stdout.strip()}") else: print("Error checking MCP version:", result.stderr) except FileNotFoundError: print("The 'mcp' command is not found. Please ensure it's installed.") check_mcp_version() ``` 以上脚本可用于检测当前环境中是否存在有效版本号标记过的正式发布型态下的 `mcp` 实体程序副本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顽石九变

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值