当前位置: 首页 > news >正文

MCP实战-本地MCP Server + Client实战

概述

本文开发一个MCP的Client和Server。然后通过本地模式来运行,并获取到server的结果。

MCP Server开发

import anyio
import click
import mcp.types as types
from mcp.server.lowlevel import Server
from pydantic import FileUrlSAMPLE_RESOURCES = {"greeting": "Hello! This is a sample text resource.","help": "This server provides a few sample text resources for testing.","about": "This is the simple-resource MCP server implementation.",
}@click.command()
@click.option("--port", default=10005, 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-simple-resource")@app.list_resources()async def list_resources() -> list[types.Resource]:return [types.Resource(uri=FileUrl(f"file:///var/domcp/{name}.txt"),name=name,description=f"A sample text resource named {name}",mimeType="text/plain",)for name in SAMPLE_RESOURCES.keys()]@app.read_resource()async def read_resource(uri: FileUrl) -> str | bytes:name = uri.path.replace(".txt", "").lstrip("/")if name not in SAMPLE_RESOURCES:raise ValueError(f"Unknown resource: {uri}")return SAMPLE_RESOURCES[name]if transport == "sse":from mcp.server.sse import SseServerTransportfrom starlette.applications import Starlettefrom starlette.routing import Mount, Routesse = 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 uvicornuvicorn.run(starlette_app, host="0.0.0.0", port=port)else:from mcp.server.stdio import stdio_serverasync def arun():async with stdio_server() as streams:await app.run(streams[0], streams[1], app.create_initialization_options())anyio.run(arun)return 0if __name__ == "__main__":main()

MCP Client开发

这里使用

import asyncio
from mcp.types import AnyUrl
from mcp.client.session import ClientSession
from mcp.client.stdio import StdioServerParameters, stdio_clientasync def main():async with stdio_client(StdioServerParameters(command="python", args=["/root/domcp/server2.py"])) as (read, write):async with ClientSession(read, write) as session:await session.initialize()# List available resourcesresources = await session.list_resources()print(resources)print("----------------------")# Get a specific resourceresource = await session.read_resource(AnyUrl("file:///greeting.txt"))print(resource)asyncio.run(main())

运行MCP Client

运行Client后输出如下内容:

(ailab) root@tra:~/domcp# python client2.py 
meta=None nextCursor=None resources=[Resource(uri=Url('file:///root/domcp/greeting.txt'), name='greeting', description='A sample text resource named greeting', mimeType='text/plain', size=None, annotations=None), Resource(uri=Url('file:///root/domcp/help.txt'), name='help', description='A sample text resource named help', mimeType='text/plain', size=None, annotations=None), Resource(uri=Url('file:///root/domcp/about.txt'), name='about', description='A sample text resource named about', mimeType='text/plain', size=None, annotations=None)]----------------------
meta=None contents=[TextResourceContents(uri=Url('file:///greeting.txt'), mimeType='text/plain', text='Hello! This is a sample text resource.')]
http://www.xdnf.cn/news/179695.html

相关文章:

  • 创建一个开机自启的服务
  • 题海拾贝:P2858 [USACO06FEB] Treats for the Cows G/S
  • 大模型图像编辑那家强?
  • 多模态常见面试题
  • 新魔百和CM311-5_CH/YST/ZG代工_GK6323V100C_2+8G蓝牙版_强刷卡刷固件包(可救砖)
  • SpringMVC 前后端数据交互 中文乱码
  • 【深度剖析】贵州茅台的数字化转型(2025)(上篇)
  • 第7章 内部类与异常类
  • 【蓝桥杯省赛真题57】Scratch穿越病毒区 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
  • Vue.js 核心特性解析:响应式原理与组合式API实践
  • 论文检索相关网站
  • ‌RISC-V架构的低功耗MCU多电压域优化设计
  • final static 中是什么final static联合使用呢
  • 【算法刷题】
  • MySQL 8.0 忘记登录密码 mysqld --init-file重置
  • AG32 MCU系列三合一芯片,MCU+ 2K cpld + 64Mbit PSRAM,一颗芯片同时满足多种需求。
  • 清华团队提出时序聚类数据库内高效方案,已被SIGMOD 2025接收
  • 【Tools】chezmoi 跨多台不同的机器管理 dotfiles 的工具
  • 缓存并发更新的挑战
  • Python生活手册-元组:保险柜与瑞士军刀
  • 基于javaweb的SpringBoot新闻发布系统设计与实现(源码+文档+部署讲解)
  • 业务中台与数据中台:企业数字化转型的核心引擎
  • 解决qnn htp 后端不支持boolean 数据类型的方法。
  • C语言-- 深入理解指针(4)
  • 学习spark总结
  • 基于SSM的“融资租赁管理系统”的设计与实现(源码+数据库+文档)
  • QT开发技术【QChart添加跟随鼠标的十字线】
  • 信号量函数
  • MySQL快速入门篇---增删改查(下)
  • Neowise Labs Contest 1 (Codeforces Round 1018, Div. 1 + Div. 2)