大语言模型 19 - MCP FastAPI-MCP 实现自己的MCP服务 快速接入API

MCP

基本介绍

官方地址:

  • https://modelcontextprotocol.io/introduction
    “MCP 是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种标准化的方式,让你的设备能够连接各种外设和配件一样,MCP 也提供了一种标准化的方式,让 AI 模型能够连接不同的数据源和工具。”

在这里插入图片描述

● MCP 主机(MCP Hosts):像 Claude Desktop、IDE 或 AI 工具等程序,它们希望通过 MCP 访问数据。
● MCP 客户端(MCP Clients):维护与服务器 1:1 连接的协议客户端。
● MCP 服务器(MCP Servers):轻量级程序,它们通过标准化的模型上下文协议(Model Context Protocol)公开特定的功能。
● 本地数据源(Local Data Sources):你的计算机上的文件、数据库和服务,MCP 服务器可以安全地访问这些数据。
● 远程服务(Remote Services):通过互联网可用的外部系统(例如 API),MCP 服务器可以与其连接。

https://www.anthropic.com/news/model-context-protocol

在这里插入图片描述

MCP

之前已经介绍过了,这里就不做复杂介绍了。
重点要提一下,MCP的 Server 和 Client 有两种交互方式:
● 标准输入输出(stdio)通信:在本地环境中,MCP 客户端通常将服务器程序作为子进程启动,双方通过标准输入(stdin)和标准输出(stdout)进行数据交换,采用 JSON-RPC 2.0 格式的消息进行通信。
● 服务器发送事件(SSE)通信:在远程环境中,MCP 客户端与服务器通过 HTTP 协议进行通信,利用 SSE 实现服务器向客户端的实时数据推送,同样使用 JSON-RPC 2.0 格式的消息进行交互。

平常通过标准的输入输出通信,但是可能有些环境本地是没有的,就算有我们也需要自己实现。
所以如果有别人封装好的 SSE 的 Server,我们就可以直接调用了。

FastAPI

FastAPI 是一个用于构建 API 的现代化、高性能的 Python Web 框架。
https://fastapi.tiangolo.com/

该项目的特性:
● 高性能:得益于 Starlette 和 Pydantic 的支持,FastAPI 的性能可与 NodeJS 和 Go 相媲美,是最快的 Python Web 框架之一。
● 高效编码:通过自动生成交互式 API 文档、数据验证和序列化等功能,开发效率可提高约 200% 至 300%。
● 减少错误:利用标准的 Python 类型提示,减少约 40% 的人为错误,并提供出色的编辑器支持,如自动补全和类型检查,降低调试时间。
● 自动生成文档:FastAPI 自动为您的 API 生成交互式文档,支持 Swagger UI 和 ReDoc,方便测试和使用。

FastAPI-MCP

将 FastAPI + MCP 组合起来,可以快速实现 SSE:

  • https://github.com/tadata-org/fastapi_mcp
    在这里插入图片描述
    两这结合后:
    ● 直接集成:直接将 MCP 服务器挂载到您的 FastAPI 应用中。
    ● 无需配置:只需指向您的 FastAPI 应用即可运行,无需额外配置。
    ● 自动发现并转换:自动发现所有 FastAPI 的端点,并将其转换为 MCP 工具。
    ● 保留模式:保留您的请求模型和响应模型的模式。
    ● 保留文档:保留所有端点的文档,与 Swagger 中的保持一致。
    ● 扩展功能:除了自动生成的工具外,还可添加自定义的 MCP 工具。

安装配置

默认你已经配置好了 uv,如果没有用pip也可以。

uv init fastapimcp
cd fastapimcpuv venv
source .venv/bin/activateuv add fastapi-mcp

对应的结果如下所示:
在这里插入图片描述

测试服务端

回顾之前

我们上次在 MCP 中写了一个 Client 和 Server,这里进行改写。
放一段上次的 Server 代码,帮助你回忆,这里的代码我们不动:
在这里插入图片描述

编写代码

我们修改 main.py,写入如下的内容:

from fastapi import FastAPI
from fastapi_mcp import add_mcp_serverapp = FastAPI()mcp_server = add_mcp_server(app,# 路径mount_path="/now",# 名字name="wzk-icu API MCP",
)# 编写一个获取时间戳的服务
@mcp_server.tool()
async def get_server_time() -> str:"""获取服务器当前时间"""from datetime import datetimereturn datetime.now().isoformat()if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)

如下所示:
在这里插入图片描述

启动测试

# 当前在 fastapimcp 目录下
python main.py

效果如下:
在这里插入图片描述

我们直接访问:

http://127.0.0.1:8000/now

可以看到标准的访问格式:
在这里插入图片描述

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

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

相关文章

用Matlab对单目相机参数的标定步骤(保姆级教程)

前言 在图像测量及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。   在大多数条件下这些参数必须通过实验与计算才能得到&#xff…

【后端高阶面经:架构篇】46、分布式架构:如何应对高并发的用户请求

一、架构设计原则:构建可扩展的系统基石 在分布式系统中,高并发场景对架构设计提出了极高要求。 分层解耦与模块化是应对复杂业务的核心策略,通过将系统划分为客户端、CDN/边缘节点、API网关、微服务集群、缓存层和数据库层等多个层次,实现各模块的独立演进与维护。 1.1 …

SQL每日一题(5)

前言:五更!五更琉璃!不对!是,五更佩可! 原始数据: new_hires reasonother_column1other_column2校园招聘信息 11社会招聘信息 22内部推荐信息 33猎头推荐信息 44校园招聘信息 55社会招聘信息…

Kafka Kraft模式集群 + ssl

文章目录 启用集群资源规划准备证书创建相关文件夹配置文件启动各Kafka节点 故障转移测试spring boot集成 启用集群 配置集群时关键就是提前梳理好需要的网络资源,完成对应server.properties文件的配置。在执行前先把这些梳理好,可以方便后面的配置&…

watchEffect

在处理复杂异步逻辑时,Vue 3 的 watchEffect 相比传统的 watch 具有以下优势: 1. 自动追踪依赖 watchEffect 会自动收集其回调中使用的所有响应式依赖,无需手动指定监听源: import { ref, watchEffect } from vue;const count …

Linux系统平均负载与top、uptime命令详解

介绍 在Linux系统运维中,系统平均负载是一个重要的性能指标。通过 top和 uptime命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决系统性能问题。本文将详细介绍Linux系统平均负载的概念及其计算方法,并深入解析 top和…

前端配置nginx代理

一、定义静态文件的路径的两种方式 1. root 指令 (1)作用 指定文件系统的 基础路径,location 的 URI 会 追加到该路径后 形成完整路径。 (2)语法 location /uri/ {root /path/to/files; } (3&#xf…

语音识别技术在人工智能中的应用

姓名:成杰 学号:21021210653 学院:电子工程学院 【嵌牛导读】 应用语音智能这项识别技术是为了使计算机可以听懂人类的语言,并执行人类的某项操作。现阶段这项技术已经成为人工智能领域的重点研究方向和实现人机语音交互的…

uniapp实现大视频文件上传-- 阿里云oss直传方式 - app、H5、微信小程序

之前的项目文件上传比较慢,使用预签名方式上传H5正常,微信小程序和app使用axios时出现了各种报错,配置完后还是不行。所以换一种oss直传方式。 找到一个 实现了的 参考:https://blog.csdn.net/qq_44860866/article/details/129670188

【Java学习笔记】抽象类

抽象类 引入关键字:abstract 应用场景:当子类中共有的部分 / 特性可以放到抽象类中 1. 通过子类的方法重写实现不同的功能 2. 编写一个方法把共有的部分放入其中,在该方法中调用抽象方法(动态绑定机制) 3. 便可以实…

EPT(Efficient Prompt Tuning)方法,旨在解决提示调优(Prompt Tuning)中效率与准确性平衡和跨任务一致性的问题

EPT(Efficient Prompt Tuning)方法,旨在解决提示调优(Prompt Tuning)中效率与准确性平衡和跨任务一致性的问题 一、核心原理:分解提示与多空间投影 1. 提示分解:用低秩矩阵压缩长提示 传统问题: 长提示(如100个token)精度高但训练慢,短提示(如20个token)速度快但…

深入剖析Java中的伪共享:原理、检测与解决方案

在高性能Java应用的开发中,尤其是多线程环境下,开发者往往会关注锁竞争、线程调度等显性问题,但有一个隐蔽的性能杀手——伪共享(False Sharing)​,却容易被忽视。本文将通过原理分析、代码案例与实战工具&…

JMeter 教程:响应断言

目录 JMeter 教程:响应断言的简单介绍【轻松上手】 ✅ 什么是响应断言? 📌 使用场景示例 🛠️ 添加响应断言步骤 1. 选中 HTTP 请求 → 右键 → Add → Assertions → Response Assertion 2. 设置断言内容: ✅ …

11.11 TypedDict与Pydantic实战:Python高效状态管理秘籍

使用 TypedDict 和 Pydantic 管理状态 关键词:LangGraph 状态管理, TypedDict 类型化字典, Pydantic 数据模型, 状态持久化, 多轮对话设计 1. 状态管理的核心挑战 在复杂 AI Agent 系统中,状态管理需要解决三个关键问题: #mermaid-svg-0sX3763L7VP2RvuX {font-family:&quo…

ThreadLocal线程本地变量在dubbo服务使用时候遇到的一个坑

我昨天遇到一个问题,就是我springboot项目里面有一个提供代办服务审核的dubbo接口,这个接口给房源项目调用,但是碰到一个问题就是,房源项目每天凌晨5点会查询满足条件过期的数据,然后调用我这边的代办审核dubbo接口&am…

[Java实战]Spring Boot整合达梦数据库连接池配置(三十四)

[Java实战]Spring Boot整合达梦数据库连接池配置(三十四) 一、HikariCP连接池配置(默认) 1. 基础配置(application.yml) spring:datasource:driver-class-name: dm.jdbc.driver.DmDriverurl: jdbc:dm://…

【MySQL】08.视图

视图就是一个由查询到的内容定义的虚拟表。它和真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。 1. 基本使用 mysql> select * from user; -------------------- | id | age | name …

4 通道1250MSPS‐16bit DAC 回放板

简介 4 通道1250MSPS‐16bit DAC 回放板 是一款4 路转换速率最高为1250MSPS 的DAC 回放板, DAC 位数16bit;板卡支持触发输出/触发输入;DAC 采样时钟源支持内部参考时 钟、外部参考时钟、外部采样时钟三种方式,可通过SPI 总线实现时…

C/C++---类型转换运算符

在C中,类型转换运算符(Type Conversion Operator)允许类对象在需要时自动转换为其他类型。这是一种特殊的成员函数,能够增强类的灵活性和交互性。 1. 基本语法 类型转换运算符的声明格式为: operator 目标类型() co…

大模型Agent

手撕 Agent 1、功能描述 设计一个 Agent,自动选择使用以下工具回答用户的问题: 查看目录下的文件基于给定的文档回答用户问题查看与分析 Excel 文件撰写文档调用 Email 客户端发邮件2、演示用例 实验中使用三个文档演示 Agent 的能力 ./data|__2023年8月-9月销售记录.xlsx…