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

news2025/5/26 7:17:01

什么是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 的所有文件和子目录”,效果如下:

在这里插入图片描述

参考

  • https://mcpservers.org/
  • https://docs.anthropic.com/en/home
  • https://modelcontextprotocol.io/introduction
  • https://mcp-docs.cn/introduction
  • https://github.com/modelcontextprotocol/python-sdk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java与C在典型场景下的性能对比深度剖析

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 【前言】 在计算机编程领域,Java和C语言都是举足轻重的编程语言。Java以其跨平台性、自动内存管理和丰富…

多智能体 AI 游戏框架(开源程序):竞争、发展、适应

一、软件介绍 文末提供程序和源码下载 SamoAI 在人类和 AI 之间创建了一个无缝的多代理叙事层,实现了跨多个平台的自然协作。通过一致的身份保留和情境记忆,它允许通过一系列行动随着时间的推移而演变的交互,就像人际关系一样。 二、核心概念…

java实现二叉树的前序、中序、后序遍历(递归和非递归方式)以及层级遍历

java实现二叉树的前序、中序、后序遍历以及层级遍历 一、二叉树节点定义二、递归方式1.前序遍历2.中序遍历3.后序遍历 三、非递归方式1.前序遍历2.中序遍历3.后序遍历4.层级遍历5.分层打印 四、测试用例 一、二叉树节点定义 class TreeNode {int val;TreeNode left;TreeNode r…

Solr admin 更新文档

<add><doc><field name"id">1904451090351546368</field><field name"companyName" update"set">测试科技有限公司</field></doc> </add>

【Netty篇】EventLoopGroup 与 EventLoop 详解

目录 开场白&#xff1a;话说 Netty 江湖第一段&#xff1a;EventLoopGroup——“包工头”的角色第二段&#xff1a;EventLoop——“身怀绝技的工人”第三段&#xff1a;EventLoop 如何处理 I/O 事件、普通任务和定时任务第四段&#xff1a;Handler 执行中如何换人&#xff1f;…

操作系统之shell实现(上)

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…

数据结构与算法——链表OJ题详解(2)

文章目录 一、前言二、OJ续享2.1相交链表2.2环形链表12.2环形链表2 三、总结 一、前言 哦了兄弟们&#xff0c;咱们上次在详解链表OJ题的时候&#xff0c;有一部分OJ题呢up并没有整理完&#xff0c;这一个星期呢&#xff0c;up也是在不断的学习并且沉淀着&#xff0c;也是终于…

Linux 基础知识详解

Linux 基础知识详解 一、快照与克隆 1. &#x1f4f8;快照&#xff08;Snapshot&#xff09; 快照是虚拟机当前运行状态的一次“瞬间拷贝”&#xff0c;包括内存、磁盘、配置等信息。这使得管理员能够快速恢复到某个特定的时间点。 用途&#xff1a; 安全实验前保存状态&am…

centOs7配置有限网络

最简单快速的是使用nmtui命令&#xff0c;采用图形页面修改。 点击编辑连接并回车&#xff1a; 选中编辑然后回车&#xff1a; 千万记住DNS服务器就是子网掩码&#xff0c;不是常说的DNS域名。把地址&#xff0c;网关&#xff0c;子网掩码配置好。只要ip不冲突&#xff0c;网…

C语言 —— 指尖跃迁 刻印永恒 - 文件操作

目录 1. 什么是文件 1.1 程序文件 1.2 数据文件 1.3 文件名 2. 二进制文件和文本文件 3. 文件的打开与关闭 3.1 流和标准流 3.2 文件指针 3.3 文件的打开与关闭 fopen fclose 4. 文件的顺序读写 4.1 fgetc和fputc fgetc fputc 4.2 fgets和fputs fgets fputs…

网络安全与信息安全的区别​及共通

在数字化时代&#xff0c;网络安全与信息安全已成为保障个人、企业乃至国家正常运转的重要防线。尽管二者紧密相关且常被混为一谈&#xff0c;但实则存在显著差异。当然&#xff0c;它们也有一些相同点&#xff0c;比如都以保障数字环境下的安全为核心目标&#xff0c;均需要通…

【愚公系列】《Python网络爬虫从入门到精通》052-Scrapy 编写 Item Pipeline

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

【AI News | 20250416】每日AI进展

AI Repos 1、Tutorial-Codebase-Knowledge 自动分析 GitHub 仓库并生成适合初学者的通俗易懂教程&#xff0c;清晰解释代码如何运行&#xff0c;还能生成可视化内容来展示核心功能。爬取 GitHub 仓库并从代码中构建知识库&#xff1b;分析整个代码库以识别核心抽象概念及其交互…

GIS开发笔记(6)结合osg及osgEarth实现半球形区域绘制

一、实现效果 输入中心点坐标及半径&#xff0c;绘制半球形区域&#xff0c;地下部分不显示。 二、实现原理 根据中心点及半径绘制半球形区域&#xff0c;将其挂接到地球节点。 三、参考代码 void GlobeWidget::drawSphericalRegion(osg::Vec3d point,double radius) {// 使…

element-ui自定义主题

此处的element-ui为基于vue2.x的 由于https://element.eleme.cn/#/zh-CN/theme/preview&#xff08;element的主题&#xff09;报错503&#xff0c; 所以使用https://element.eleme.cn/#/zh-CN/component/custom-theme 自定义主题文档中&#xff0c;在项目中改变scss变量的方…

windows下使用nginx + waitress 部署django

架构介绍 linux一般采用nginx uwsgi部署django&#xff0c;在Windows下&#xff0c;可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django&#xff0c;,他们的关系如下 django是WEB应用…

MySQL-多版本并发控制MVCC

文章目录 一、多版本并发控制MVCC二、undo log&#xff08;回滚日志&#xff09;二、已提交读三、可重复读总结 一、多版本并发控制MVCC MVCC是多版本并发控制&#xff08;Multi-Version Concurrency Control&#xff09;&#xff0c;是MySQL中基于乐观锁理论实现隔离级别的方…

目标检测与分割:深度学习在视觉中的应用

&#x1f50d; PART 1&#xff1a;目标检测&#xff08;Object Detection&#xff09; 1️⃣ 什么是目标检测&#xff1f; 目标检测是计算机视觉中的一个任务&#xff0c;目标是让模型“在图像中找到物体”&#xff0c;并且判断&#xff1a; 它是什么类别&#xff08;classif…

杰弗里·辛顿:深度学习教父

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 杰弗里辛顿&#xff1a;当坚持遇见突破&#xff0c;AI迎来新纪元 一、人物简介 杰弗…

STM32蓝牙连接Android实现云端数据通信(电机控制-开源)

引言 基于 STM32F103C8T6 最小系统板完成电机控制。这个小项目采用 HAL 库方法实现&#xff0c;通过 CubeMAX 配置相关引脚&#xff0c;步进电机使用 28BYJ-48 &#xff08;四相五线式步进电机&#xff09;&#xff0c;程序通过蓝牙连接手机 APP 端进行数据收发&#xff0c; OL…