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)
  ),
];
相关推荐
AI、少年郎几秒前
如何用个人电脑快速训练自己的语言模型?MiniMind 全流程实战指南
人工智能·python·神经网络·ai·自然语言处理·大模型·模型训练微调
枫叶林FYL3 分钟前
【Python高级工程与架构实战】项目四 现代ETL编排平台:Airflow + dbt + Snowflake 企业级数据管道架构与实现
人工智能·python·架构·etl
源码之屋4 分钟前
计算机毕业设计:Python天气数据采集与可视化分析平台 Django框架 线性回归 数据分析 大数据 机器学习 大模型 气象数据(建议收藏)✅
人工智能·python·深度学习·算法·django·线性回归·课程设计
鸿乃江边鸟9 分钟前
Nanobot 从 gateway 启动命令来看个人助理Agent的实现
人工智能·ai
捧月华如10 分钟前
React vs Vue vs Angular:三大前端框架深度对比
python·github
AI_Claude_code11 分钟前
安全与合规核心:匿名化、日志策略与法律风险规避
网络·爬虫·python·tcp/ip·安全·http·网络爬虫
杜子不疼.11 分钟前
用 Python 实现 RAG:从文档加载到语义检索全流程
开发语言·人工智能·python
Eiceblue13 分钟前
Python 如何实现 Excel 数据分列?一列拆分为多列
python·microsoft·excel
不是株14 分钟前
FastAPI
python·fastapi