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)
  ),
];
相关推荐
罗罗攀11 分钟前
PyTorch学习笔记|张量的广播和科学运算
人工智能·pytorch·笔记·python·学习
傻啦嘿哟31 分钟前
Python 操作 Excel 条件格式指南
开发语言·python·excel
2301_8073671932 分钟前
Python日志记录(Logging)最佳实践
jvm·数据库·python
2301_7957417944 分钟前
构建一个基于命令行的待办事项应用
jvm·数据库·python
小鸡吃米…1 小时前
Python 网络爬虫 —— 环境设置
开发语言·爬虫·python
sw1213891 小时前
Python字典与集合:高效数据管理的艺术
jvm·数据库·python
进击的小头1 小时前
第13篇:基于伯德图的超前_滞后校正器深度设计
python·算法
胡少侠71 小时前
RAG 向量持久化:用 ChromaDB 替换内存存储,支持 Metadata 溯源
ai·agent·rag·chromadb
智算菩萨1 小时前
多目标超启发式算法系统文献综述:人机协同大语言模型方法论深度精读
论文阅读·人工智能·深度学习·ai·多目标·综述
m0_738098022 小时前
使用Python操作文件和目录(os, pathlib, shutil)
jvm·数据库·python