
01
—
Fastapi MCP Server 实现
1、Fastapi框架中可以同时实现http restful接口和mcp server。
代码如下:
`` from datetime import datetime
``
`` import uvicorn
`` from fastapi import FastAPI, Depends, HTTPException, Header
`` from fastapi_mcp import FastApiMCP
``
`` app = FastAPI()
``
``
`` # 授权验证,如果不需要,可以删除
`` async def verify_token(authorization: str | None = Header(None)):
`` # 这里替换为实际的验证逻辑,比如数据库查询,JWT验证等
`` valid_tokens = {"123456", "abcdef"} # 示例有效token集合
`` if authorization not in valid_tokens:
`` raise HTTPException(status_code=403, detail="Invalid Token")
`` return True
``
``
`` # 注意:要设置添加明确的 operation_id 参数,这会让大模型更容易理解工具的作用
`` # 编写一个获取当前时间的接口
`` @app.get("/getCurrentTime", operation_id="get_current_time")
`` async def get_current_time():
`` return {"current_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
``
``
`` # 编写一个模拟获取用户信息的接口
`` @app.get("/users/{user_id}", operation_id="get_user_info")
`` async def get_user_info(user_id: int, is_auth: bool = Depends(verify_token)): # 验证请求头,需要授权访问
`` # 这里的data可以替换成实际的查询数据库,这里只作为示例返回
`` data = {
`` "user_id": user_id,
`` "name": "wangzy",
`` "sex": "男",
`` "birthday": "2000-01-01",
`` }
`` return data
``
`` @app.post("/add", operation_id="add_two_number")
`` async def add(a: int, b: int) -> int:
`` """Add two numbers"""
`` return a + b
``
``
`` # 创建 MCP 服务器实例,绑定到 FastAPI app
`` mcp = FastApiMCP(app)
`` # 挂载 MCP 服务器,默认路径是 /mcp(可以修改)
`` mcp.mount()
``
`` if __name__ == "__main__":
`` uvicorn.run(app, host="0.0.0.0", port=8000)2、postman验证http restful 接口

3、Cherry Studio配置mcp server
配置mcp server (如果开启了认证,需要配置认证headers)

可以在工具tab中看到所有的http restful api 同时也发布了mcp 工具。

4、Cherry Studio验证mcp server


fastapi中的FastApi和MCP Server也可以分开独立部署,适用于将 MCP 服务与主 API 在物理上隔离,或者为 MCP 使用不同的安全策略的场景。
笔者也顺便调研了下python实现此类有没有更优的方案,发现目前大家都推荐Fastapi或FastMCP这两个方案,对比如下,笔者使用现状需要同时兼顾http restful api和mcp server,所以应该会选择用Fastapi_mcp的方案。

02
—
Dify安装部署
笔者demo环境采用Docker Compose 方式部署,详细参考官方文档:
https://legacy-docs.dify.ai/zh-hans/getting-started/install-self-hosted/docker-compose
1、部署前提条件

2、克隆Dify仓库代码
# 假设当前最新版本为 0.15.3
git clone https://github.com/langgenius/dify.git --branch 0.15.3
3、启动 Dify

4、访问Dify

配置后登录Dify页面如下:

03
—
Dify中配置大模型及Agent
1、配置大模型
在Dify主页面找到设置选项

如下图,选择【模型供应商】配置,可以配置公有的大模型,也可以配置本地ollama部署的大模型

配置ollama大模型时,需要先安装相关插件:

注:笔者在配置本地ollama部署的大模型时,由于大模型默认启动127.0.0.1的地址,而Dify又是部署在docker容器内,所以从Dify容器中没有识别本机的127.0.0.1回环地址。
所以需要ollama启动的时候,先在环境变量中配置OLLAMA_HOST,然后再启动ollama ollama serve

Dify配置ollama大模型如下:

2、Dify安装mcp相关插件


安装好后如下:

插件中Api Key 授权配置


配置内容如下:
{ "server_name": { "url": "http://192.168.43.78:8000/mcp", "headers": {"Content-Type": "application/json", "Authorization": "123456"}, "timeout": 50, "sse_read_timeout": 50 }}
3、Dify创建Chatflow

输入应用名称及描述

添加Agent节点

Agent配置



Agent试运行:

如下图所示,通过大模型调用了最开始定义的getcurrenttime mcp server。

4、Dify Chatflow中调用mcp server 验证
可以看到,在Dify中工作区找到前面配置的Chatflow【testmcpserver】,在对话框中可以看到,可以正常调用Fastapi启用的mcp server。
注:笔者测试过程中,发现有一半的概率调用,Agent给出的回答是“I am thinking about how to help you”,发现大模型已经调用了mcp server拿到了数据,只不过回答的时候没有给出这个答案,猜测有可能是提示词等原因,后续再跟进排查原因。


04
—
总结
本篇文章内容实现了在Dify平台,配置Chatflow的Agent调用Fatsapi启用的MCP Server的一个demo,笔者后续会基于这个demo,在公司去实践故障诊断相关的自主规划Agent。后续整个项目顺利投产后,应该再总结一篇在生产环境中的项目实战总结。