【MCP】FastAPI-MCP: 为AI模型赋能的零配置API工具

引言

在当前AI快速发展的时代,如何让AI模型更便捷地与后端服务交互成为了开发者面临的重要挑战。Model Context Protocol (MCP)作为一个新兴协议,为AI模型提供了调用外部工具的能力,而FastAPI-MCP则是一个革命性的工具,它能够自动将现有的FastAPI应用转换为MCP服务器,实现AI与API的无缝集成。本文将深入探讨FastAPI-MCP的核心功能、使用方法及应用场景。

什么是FastAPI-MCP?

FastAPI-MCP是一个零配置工具,能够自动将FastAPI应用的所有端点转换为符合Model Context Protocol(MCP)规范的工具。它的主要特点包括:

  • 零配置:只需几行代码即可集成,无需额外开发工作
  • 自动发现:自动识别并转换FastAPI应用中的所有端点
  • 完整兼容:保留原有API的请求模型、响应模型和文档
  • 灵活部署:可以直接挂载到FastAPI应用中,也可以单独部署

MCP协议允许AI模型(如Claude、GPT等)调用外部工具来完成复杂任务,而FastAPI-MCP则简化了这些工具的创建过程,让开发者能够快速将现有服务暴露给AI模型使用。

安装与基本使用

安装

推荐使用uv(一个快速的Python包安装工具)进行安装:

uv add fastapi-mcp

或者使用传统的pip安装:

pip install fastapi-mcp

基本使用

FastAPI-MCP的基本使用非常简单,只需几行代码即可完成:

from fastapi import FastAPI
from fastapi_mcp import FastApiMCP

app = FastAPI()

# 创建MCP服务器
mcp = FastApiMCP(
    app,
    name="My API MCP",
    description="My API description",
    base_url="http://localhost:8000",
)

# 将MCP服务器挂载到FastAPI应用
mcp.mount()

完成上述配置后,一个自动生成的MCP服务器将在/mcp路径上可用。值得注意的是,虽然base_url参数是可选的,但强烈建议提供,因为它告诉MCP服务器在调用工具时要发送API请求的位置。

高级功能与配置

工具命名

FastAPI-MCP使用FastAPI路由的operation_id作为MCP工具名称。如果没有指定operation_id,FastAPI会自动生成一个,但这些自动生成的名称可能不够直观。

比较以下两种端点定义:

# 自动生成的operation_id(类似于"read_user_users__user_id__get")
@app.get("/users/{user_id}")
async def read_user(user_id: int):
    return {"user_id": user_id}

# 显式指定operation_id(工具将被命名为"get_user_info")
@app.get("/users/{user_id}", operation_id="get_user_info")
async def read_user(user_id: int):
    return {"user_id": user_id}

为了更清晰、更直观的工具名称,建议在FastAPI路由定义中添加显式的operation_id参数。

自定义架构描述

from fastapi import FastAPI
from fastapi_mcp import FastApiMCP

app = FastAPI()

mcp = FastApiMCP(
    app,
    name="My API MCP",
    base_url="http://localhost:8000",
    describe_all_responses=True,  # 在工具描述中包含所有可能的响应架构
    describe_full_response_schema=True  # 在工具描述中包含完整的JSON架构
)

mcp.mount()

自定义暴露的端点

可以通过OpenAPI操作ID或标签控制哪些FastAPI端点作为MCP工具暴露:

from fastapi import FastAPI
from fastapi_mcp import FastApiMCP

app = FastAPI()

# 仅包含特定操作
mcp = FastApiMCP(
    app,
    include_operations=["get_user", "create_user"]
)

# 排除特定操作
mcp = FastApiMCP(
    app,
    exclude_operations=["delete_user"]
)

# 仅包含具有特定标签的操作
mcp = FastApiMCP(
    app,
    include_tags=["users", "public"]
)

# 排除具有特定标签的操作
mcp = FastApiMCP(
    app,
    exclude_tags=["admin", "internal"]
)

# 组合操作ID和标签(包含模式)
mcp = FastApiMCP(
    app,
    include_operations=["user_login"],
    include_tags=["public"]
)

mcp.mount()

关于过滤的注意事项:

  • 不能同时使用include_operationsexclude_operations
  • 不能同时使用include_tagsexclude_tags
  • 可以组合操作过滤和标签过滤(例如,同时使用include_operationsinclude_tags
  • 组合过滤器时,将采用贪婪方法,匹配任一条件的端点将被包含

与原始FastAPI应用分离部署

不限于在创建MCP的同一FastAPI应用中提供服务,可以从一个FastAPI应用创建MCP服务器,并将其挂载到另一个应用:

from fastapi import FastAPI
from fastapi_mcp import FastApiMCP

# 你的API应用
api_app = FastAPI()
# ... 在api_app上定义API端点 ...

# 用于MCP服务器的单独应用
mcp_app = FastAPI()

# 从API应用创建MCP服务器
mcp = FastApiMCP(
    api_app,
    base_url="http://api-host:8001",  # API应用将运行的URL
)

# 将MCP服务器挂载到单独的应用
mcp.mount(mcp_app)

# 现在可以分别运行两个应用:
# uvicorn main:api_app --host api-host --port 8001
# uvicorn main:mcp_app --host mcp-host --port 8000

MCP服务器创建后添加端点

如果在创建MCP服务器后向FastAPI应用添加端点,需要刷新服务器以包含它们:

from fastapi import FastAPI
from fastapi_mcp import FastApiMCP

app = FastAPI()
# ... 定义初始端点 ...

# 创建MCP服务器
mcp = FastApiMCP(app)
mcp.mount()

# 在MCP服务器创建后添加新端点
@app.get("/new/endpoint/", operation_id="new_endpoint")
async def new_endpoint():
    return {"message": "Hello, world!"}

# 刷新MCP服务器以包含新端点
mcp.setup_server()

连接到MCP服务器

使用SSE连接

一旦集成了MCP的FastAPI应用运行起来,可以使用任何支持SSE的MCP客户端(如Cursor)连接到它:

  1. 运行应用
  2. 在Cursor -> Settings -> MCP中,使用MCP服务器端点URL(例如http://localhost:8000/mcp)作为sse
  3. Cursor将自动发现所有可用的工具和资源

使用mcp-proxy stdio连接

如果MCP客户端不支持SSE(例如Claude Desktop):

  1. 运行应用
  2. 安装mcp-proxy,例如:uv tool install mcp-proxy
  3. 在Claude Desktop的MCP配置文件(claude_desktop_config.json)中添加:

在Windows上:

{
  "mcpServers": {
    "my-api-mcp-proxy": {
      "command": "mcp-proxy",
      "args": ["http://127.0.0.1:8000/mcp"]
    }
  }
}

在MacOS上:

{
  "mcpServers": {
    "my-api-mcp-proxy": {
      "command": "/Full/Path/To/Your/Executable/mcp-proxy",
      "args": ["http://127.0.0.1:8000/mcp"]
    }
  }
}

可以通过运行which mcp-proxy来找到mcp-proxy的路径。

应用场景

FastAPI-MCP的发布为AI与后端服务的集成带来了广阔的应用前景,典型用例包括:

  1. 数据分析:AI代理可以通过API直接访问数据处理端点,实现实时分析
  2. 内容管理:AI工具可以调用CMS接口,高效完成内容创建与更新
  3. 电子商务:AI助手可以通过API查询库存、下单或获取产品信息
  4. 自动化工作流:企业可以通过API实现跨系统的复杂自动化任务

得益于其与Claude、Cursor等MCP客户端的兼容性,FastAPI-MCP已成为开发者快速构建AI驱动应用的首选工具。

实际案例:构建智能客服系统

下面是一个构建智能客服系统的简单示例,通过将客户支持API暴露为MCP工具,使AI助手能够回答问题、查找订单和创建支持工单:

from fastapi import FastAPI, Depends, HTTPException
from fastapi_mcp import FastApiMCP
from pydantic import BaseModel
from typing import List, Optional
import databases
import sqlalchemy

# 数据库设置(示例)
DATABASE_URL = "sqlite:///./test.db"
database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()

# 定义模型
class OrderBase(BaseModel):
    customer_id: str
    total_amount: float
    status: str

class Order(OrderBase):
    id: int

class TicketCreate(BaseModel):
    customer_id: str
    subject: str
    description: str

class Ticket(TicketCreate):
    id: int
    status: str = "open"

# 创建FastAPI应用
app = FastAPI(title="Customer Support API")

# 端点定义
@app.get("/orders/{customer_id}", response_model=List[Order], operation_id="get_customer_orders")
async def get_customer_orders(customer_id: str):
    query = "SELECT * FROM orders WHERE customer_id = :customer_id"
    return await database.fetch_all(query=query, values={"customer_id": customer_id})

@app.get("/order/{order_id}", response_model=Order, operation_id="get_order_details")
async def get_order_details(order_id: int):
    query = "SELECT * FROM orders WHERE id = :order_id"
    order = await database.fetch_one(query=query, values={"order_id": order_id})
    if not order:
        raise HTTPException(status_code=404, detail="Order not found")
    return order

@app.post("/tickets/", response_model=Ticket, operation_id="create_support_ticket")
async def create_support_ticket(ticket: TicketCreate):
    query = """
    INSERT INTO tickets(customer_id, subject, description, status)
    VALUES (:customer_id, :subject, :description, 'open')
    RETURNING id, customer_id, subject, description, status
    """
    return await database.fetch_one(
        query=query,
        values={
            "customer_id": ticket.customer_id,
            "subject": ticket.subject,
            "description": ticket.description
        }
    )

@app.get("/faqs/{query}", operation_id="search_faq")
async def search_faq(query: str):
    # 这里可以实现FAQ搜索逻辑
    faqs = [
        {"question": "如何重置密码?", "answer": "访问登录页面,点击'忘记密码'链接,然后按照说明操作。"},
        {"question": "何时会收到退款?", "answer": "退款通常在退货被处理后的3-5个工作日内处理。"},
        # 更多FAQs...
    ]
    return {"results": [faq for faq in faqs if query.lower() in faq["question"].lower()]}

# 创建并挂载MCP服务器
mcp = FastApiMCP(
    app,
    name="Customer Support MCP",
    description="Customer support API for AI assistants",
    base_url="http://localhost:8000",
)
mcp.mount()

# 启动事件
@app.on_event("startup")
async def startup():
    await database.connect()

# 关闭事件
@app.on_event("shutdown")
async def shutdown():
    await database.disconnect()

有了这个设置,AI助手可以调用这些API端点来:

  • 查找客户的订单历史
  • 获取特定订单的详细信息
  • 为客户创建支持工单
  • 搜索常见问题解答

这极大地增强了AI助手的能力,使其不仅能够提供基于其训练数据的信息,还能与后端系统交互,获取实时数据并执行操作。

结论

FastAPI-MCP作为一个零配置工具,为AI模型与后端服务的集成提供了革命性的解决方案。它极大地简化了将现有FastAPI应用暴露为MCP工具的过程,使开发者能够快速构建AI驱动的应用,而无需大量的额外开发工作。

随着MCP协议的普及,FastAPI-MCP有望成为AI与API交互的标准工具,推动AI应用的快速落地。无论是构建智能客服系统、数据分析工具,还是自动化工作流,FastAPI-MCP都为开发者提供了强大而灵活的解决方案。

参考资源

<think>好的,用户问的是如何在多云平台(MCP)上集成Java和LangChain。首先,我需要明确用户的问题背景。LangChain是一个用于构建基于语言模型的应用程序的框架,通常与Python关联较多,而用户想用Java集成,这可能涉及到跨语言调用或者Java库的支持。另外,多云平台的环境需要考虑部署、服务发现、配置管理等问题。 首先,我应该确认LangChain是否有官方的Java支持。查阅资料发现,LangChain主要用Python开发,但可能有社区驱动的Java库或适配层。如果存在这样的库,集成步骤可能包括添加依赖、配置API密钥、编写链式逻辑等。如果不存在,可能需要通过REST API或gRPC与Python服务交互,这涉及到跨语言通信。 其次,多云平台的环境下,需要考虑如何部署Java应用和LangChain服务。可能需要容器化部署,使用Kubernetes进行编排,每个云平台上的集群需要统一的配置管理。此外,服务发现和负载均衡是关键,确保Java应用能够动态发现LangChain服务的实例。 然后,配置管理方面,需要将不同云平台的配置外部化,比如使用Spring Cloud Config或者Kubernetes ConfigMap。敏感信息如API密钥应通过Secrets管理,确保安全性。 接下来,分布式追踪和监控也是重要的一环。集成Jaeger或Zipkin来跟踪跨服务的请求,帮助排查问题。日志管理可能需要ELK栈或类似工具,确保日志集中存储和分析。 另外,用户可能需要处理多云平台的异构环境,比如不同云的存储服务。Java应用需要抽象这些差异,可能通过LangChain的模块化设计,或者使用多云存储解决方案如MinIO。 最后,需要考虑性能优化和容错机制,比如重试策略、熔断机制,使用Resilience4j等库来增强应用的健壮性。同时,自动化部署和CI/CD流程也是集成的一部分,确保代码在多云环境中顺利部署。 总结来说,集成步骤可能包括:环境准备、依赖管理、服务部署、配置管理、跨语言通信、监控追踪、多云适配和自动化部署。需要分步骤指导用户,并提醒可能的注意事项,比如Java与Python的交互延迟、版本兼容性等。</think>### Java与LangChain在多云平台(MCP)上的集成步骤 #### 1. **环境准备与依赖管理** - **LangChain服务部署**:若LangChain无原生Java SDK,需通过容器化部署Python服务并提供REST/gRPC接口。例如: ```python # LangChain服务端示例(Python) from fastapi import FastAPI from langchain.llms import OpenAI app = FastAPI() llm = OpenAI(api_key="YOUR_API_KEY") @app.post("/generate") def generate_text(prompt: str): return llm(prompt) ``` - **Java依赖配置**:通过Spring Boot或Quarkus框架集成HTTP客户端调用LangChain服务: ```xml <!-- Maven依赖示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> ``` #### 2. **多云平台适配** - **服务发现**:利用Kubernetes的Service对象或Istio实现跨云服务发现: ```yaml # Kubernetes Service示例 apiVersion: v1 kind: Service metadata: name: langchain-service spec: selector: app: langchain ports: - protocol: TCP port: 8080 targetPort: 8080 ``` - **配置管理**:使用Spring Cloud Config或HashiCorp Vault统一管理多环境配置: ```java // Java代码读取配置 @Value("${langchain.endpoint}") private String langchainEndpoint; ``` #### 3. **跨语言通信实现** - **HTTP调用示例**: ```java // Spring WebClient调用LangChain服务 public Mono<String> generateText(String prompt) { return WebClient.create() .post() .uri(langchainEndpoint + "/generate") .bodyValue(Map.of("prompt", prompt)) .retrieve() .bodyToMono(String.class); } ``` #### 4. **分布式追踪集成** - 集成Jaeger或Zipkin追踪跨云请求链路: ```java // Spring Cloud Sleuth + Zipkin配置 spring.zipkin.base-url=http://zipkin-server:9411 spring.sleuth.sampler.probability=1.0 ``` #### 5. **多云存储与数据处理** - 使用LangChain的文档加载模块适配多云存储(如AWS S3、Azure Blob): ```java // 伪代码示例:从S3加载文档 public String loadFromS3(String bucket, String key) { AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build(); return s3Client.getObjectAsString(bucket, key); } ``` #### 6. **安全与治理** - **API密钥管理**:通过Kubernetes Secrets注入环境变量: ```yaml env: - name: LANGCHAIN_API_KEY valueFrom: secretKeyRef: name: langchain-secrets key: api-key ``` #### 7. **性能优化** - 添加缓存层(如Redis)减少对LangChain服务的重复调用: ```java @Cacheable("promptResponses") public String getCachedResponse(String prompt) { return generateText(prompt).block(); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值