fastmcp构建mcp server和client

文章目录

项目官网

fastmcp

Server

mcp_server.py

python 复制代码
# 新建实例,这个一定要是一个单独的文件
from fastmcp import FastMCP

mcp = FastMCP(name="MyAssistantServer")

weather_tools.py

python 复制代码
# 工具集需要导入之前的server实列
from typing import Annotated
from mcp_server import mcp
import datetime
from dataclasses import dataclass, field

@dataclass
class WeatherResult:
    date: datetime.date=field(metadata={"description": "日期"})
    temperature: float=field(metadata={"description": "温度,摄氏度"})
    weather:str=field(metadata={"description": "天气:小雨,晴,阴,雾等等"})

@dataclass
class CityWeahterResult:
    city: str=field(metadata={"description": "城市"})
    results: list[WeatherResult]=field(metadata={"description": "几天的天气集合"})

@mcp.tool(
        name="Get city weather",
        description="获取某个城市未来几天的天气",)
def get_weather(
    city: Annotated[str,"城市名"],
    days:Annotated[int,"想要预测的天数"]) -> CityWeahterResult:
    return CityWeahterResult()

run_server.py

python 复制代码
from mcp_server import mcp
import weather_tools #只要导入的工具集,就会自动注册

if __name__ == "__main__":
    mcp.run(transport="http",host="127.0.0.1", port=8765)

客户端

client.py

python 复制代码
import asyncio
from fastmcp import Client


client = Client("http://127.0.0.1:8765/mcp")

async def main():
    async with client:
        # Basic server interaction
        await client.ping()
        
        # List available operations
        tools = await client.list_tools()
        resources = await client.list_resources()
        prompts = await client.list_prompts()
        
        # Execute operations
        print(tools)

asyncio.run(main())

扫描到的工具集

javascript 复制代码
[
  Tool(
    (name = "Get city weather"),
    (title = None),
    (description = "获取某个城市未来几天的天气"),
    (inputSchema = {
      properties: {
        city: { description: "城市名", type: "string" },
        days: { description: "想要预测的天数", type: "integer" },
      },
      required: ["city", "days"],
      type: "object",
    }),
    (outputSchema = {
      $defs: {
        WeatherResult: {
          properties: {
            date: { description: "日期", format: "date", type: "string" },
            temperature: { description: "温度,摄氏度", type: "number" },
            weather: {
              description: "天气:小雨,晴,阴,雾等等",
              type: "string",
            },
          },
          required: ["date", "temperature", "weather"],
          type: "object",
        },
      },
      properties: {
        city: { description: "城市", type: "string" },
        results: {
          description: "几天的天气集合",
          items: { $ref: "#/$defs/WeatherResult" },
          type: "array",
        },
      },
      required: ["city", "results"],
      type: "object",
    }),
    (icons = None),
    (annotations = None),
    (meta = { _fastmcp: { tags: [] } }),
    (execution = None)
  ),
];
相关推荐
alvin_200525 分钟前
python之OpenGL应用(二)Hello Triangle
python·opengl
铁蛋AI编程实战33 分钟前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
jiang_changsheng1 小时前
RTX 2080 Ti魔改22GB显卡的最优解ComfyUI教程
python·comfyui
0思必得01 小时前
[Web自动化] Selenium处理滚动条
前端·爬虫·python·selenium·自动化
csdn_life182 小时前
openclaw mcporter 操作 chome 在 window10/linux chrome-devtools-mcp
chrome·mcp·openclaw
沈浩(种子思维作者)2 小时前
系统要活起来就必须开放包容去中心化
人工智能·python·flask·量子计算
2301_790300962 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
m0_736919102 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
getapi2 小时前
实时音视频传输与屏幕共享(投屏)
python
慢半拍iii2 小时前
从零搭建CNN:如何高效调用ops-nn算子库
人工智能·神经网络·ai·cnn·cann