从零搭建个人MCP服务器:打造AI旅游助手实战教程
一、MCP 是什么?为什么自建 MCP 服务器?
在之前的系列文章中,我已经详细介绍了 MCP(Model Context Protocol)的背景、工作原理以及使用场景。如果您对 MCP 的基础知识还不熟悉,强烈建议先阅读我之前的文章:
本篇文章将重点介绍如何搭建自己的 MCP 服务器,让我们能够将自定义功能整合到 Cursor 等支持 MCP 的平台中。
自建 MCP 服务器的优势尤为明显:
- 功能整合:无需复杂的后端开发,就能多种功能整合起来
- 定制化能力:可以根据自己的需求定制工具和服务
- 数据隐私:敏感数据可以在自己控制的环境中处理
- 扩展性:可以随时添加新的功能模块
通过自建 MCP 服务器,可以实现从用户需求分析到完整工作流生成的一站式解决方案。
二、构建自己的 MCP
我想搭建一个 mcp server 可以使用和控制开源的生成模型。
大语言模型如 DeepSeek,功能强大, 擅长文本处理, 但处理和生成多模态信息(如图像、语音、视频、3D 等)都存在各式各样的问题和局限性。 因此如果大语言模型可以自由的使用不同专长模态的模型, 它就可以快速准确的解决自身技术的不足, 和扩展处理业务范围, 为自己添加三头六臂。
2.1 环境准备
首先,我们需要创建一个新项目并安装必要的依赖。根据 MCP Python SDK 官方文档,推荐使用 uv 来管理 Python 项目:
MCP Python SDK
https://github.com/modelcontextprotocol/python-sdk/blob/main/README.md
mkdir -p MCPServer
cd MCPServer
# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate # 在Windows上使用 .venvScriptsctivate
使用 uv 来创建和管理项目按照以下步骤操作, 按照官方文档 https://docs.astral.sh/uv/ 安装 uv:
|
uv 自动创建了文件
mcp-server-demo/
├── pyproject.toml # 项目依赖配置
├── .gitignore # .venv
├── main.py # MCP服务器主入口
├── .python-version # python 3.13
└── README.md # 项目说明文档
然后添加 MCP 到项目依赖:
|
对于使用 pip 管理依赖的项目,可以使用:
|
要运行 MCP 命令行工具,可以使用:
|
2.2 配置项目依赖
在`pyproject.toml`中添加必要的依赖:
[project]
name = "mcpserver"
version = "0.1.0"
description = "MCP服务器示例"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"mcp[cli]>=1.6.0",
"fal_client>=0.5.9",
"requests>=2.25.0",
"python-dotenv>=0.15.0"
]
这里我们引入了几个关键依赖:
- mcp[cli]:MCP 的 Python SDK,用于构建服务器
- fal_client:用于连接 fal.ai 服务,访问 HiDream-I1-Full 模型
- python-dotenv:管理环境变量,存储 API 密钥
2.3 HuggingFace 开源模型
AI 旅游助手需要高质量的图像生成能力来展示旅游目的地和景点。在选择图像生成模型时,我首先考虑了 Hugging Face 平台上的开源模型,原因有几点:
Hugging Face
https://huggingface.co/
- 开源优势:Hugging Face 上的开源模型允许开发者自由使用、修改和分发,大大降低了开发成本和法律风险
- 社区支持:活跃的开发者社区提供了丰富的文档、教程和示例代码,便于快速上手
- 模型多样性:平台上有大量不同规模、不同特性的模型可供选择,能够满足各种应用场景
- 易于集成:通过 API 或本地部署,这些模型可以轻松集成到各种应用中
- 持续更新:模型会定期更新,性能不断提升
- 免费:只需要你注册个用户, 就可以免费使用模型
本次演示我选择了 HiDream-I1-Full 模型作为本项目的图像生成引擎。这个模型于 2025 年 4 月 8 日发布,是一款非常新的开源图像生成模型,
HiDream-ai/HiDream-I1-Full
https://huggingface.co/HiDream-ai/HiDream-I1-Full
HiDream-I1-Full 模型具有以下优势:
- 强大的性能:作为一个拥有 17B 参数的模型,HiDream-I1-Full 在 HPS v2.1 评分中获得了 33.82 分的顶级成绩,表明它生成的图像与人类偏好高度一致
- 出色的文本跟随能力:在 GenEval 和 DPG 基准测试中表现优异,能够精准地根据文本描述生成相应图像
- 商业友好许可:MIT 许可证允许在商业项目中使用,没有复杂的法律限制
- 通过 Fal.ai 轻松访问:不需要自己部署庞大的模型,没有硬件 GPU 要求。 通过 Fal.ai API https://fal.ai/about 即可轻松调用
对于旅游场景,高质量的视觉内容对用户体验至关重要,HiDream-I1-Full 的写实风格和细节表现正是这个应用场景的理想选择。
以下是HiDream-I1-Full 生成图片案例
|
|
2.4 配置 API 密钥
创建config.env文件来安全地存储我们的 API 密钥:
|
注意:请将your_fal_api_key_here替换为你在 fal.ai https://fal.ai/dashboard/keys 注册后获得的实际 API 密钥。 |
2.5 构建 MCP 服务器核心代码
在main.py中,我们将实现一个名为"TourGuide"的 MCP 服务器,其核心功能是调用外部图像生成模型, 实现文字到图像的转换:
from mcp.server.fastmcp import FastMCP
import os
import fal_client
from dotenv import load_dotenv
import pathlib
# 加载环境变量
current_dir = pathlib.Path(__file__).parent.absolute()
config_path = current_dir / "config.env"
load_dotenv(config_path)
if not os.getenv("FAL_KEY"):
raise ValueError("FAL_KEY environment variable not set")
# 实例化MCP服务器
mcp = FastMCP("TourGuide")
# 定义文本到图像生成工具
@mcp.tool()
def text_to_image_fal(prompt: str) -> dict:
"""Generate an image from text using HiDream-I1-Full model via Fal.ai"""
# 调用Fal.ai的服务生成图像
result = fal_client.subscribe(
"fal-ai/hidream-i1-full",
arguments={"prompt": prompt},
)
# 返回完整结果,包含图片URL、尺寸和其他元数据
return result
# 添加动态问候资源(示例)
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""获取个性化问候"""
return f"Hello, {name}!"
# 定义提示词
@mcp.prompt()
def get_prompts():
"""获取提示词列表"""
return [
"我会帮你创建一个基于你偏好和兴趣的个性化旅游计划。",
"请稍等,我将使用HiDream-I1-Full模型为你生成相关景点的图片。"
]
2.6 启动 MCP 服务器
使用uv运行MCP服务器
uv run mcp dev main.py
如果一切正常,你应该会看到 MCP 服务器成功启动的日志信息。
成功运行后, 点击链接 http://127.0.0.1:6274 即可看到
点击左侧 Connect, 就可以看到自己定义的 mcp sever 了
然后点击上侧的 Tools 选项, 就可以查看和测试自己定义的函数工具
三、配置 Cursor 使用自建 MCP 服务器
现在我们已经构建并运行了 MCP 服务器,接下来需要将其配置到 Cursor 中,这样就可以在 AI 对话中调用我们的服务。
3.1 配置 mcp.json 文件
{
"mcpServers": {
"TourGuide": {
"command": "uv",
"args": [
"run",
"--with",
"mcp[cli]",
"mcp",
"run",
"/path/to/your/MCPServer/main.py"
],
"env": {
"FAL_KEY": "your_fal_api_key_here"
}
},
"tencent-map": {
"type": "remote",
"url": "https://mcp.map.qq.com/sse?key=YOUR_TENCENT_MAP_KEY"
},
"baidu-maps": {
"url": "https://mcp.map.baidu.com/sse?ak=YOUR_BAIDU_MAP_KEY"
}
}
}
请将上述路径和 API 密钥替换为你自己的。 |
这个配置文件告诉 Cursor:
有一个名为"TourGuide"的自建 MCP 服务器,并指定了如何启动它
- 还配置了腾讯地图和百度地图的远程 MCP 服务
百度地图开放平台:https://lbsyun.baidu.com/faq/api?title=mcpserver/quickstart
- 对于地图服务,需要申请并配置对应的 API 密钥, 这些 API 接口都有配额设置, 请自行管理设定
申请完成后,将这些密钥配置到 MCP 服务器中。
配置完成后,Cursor 自动加载新的 MCP 服务器配置,绿灯显示成功链接, 并列出该 mcp server 的工具列表。
四、构建旅游助手智能体
有了 MCP 服务器,接下来我们开始构建旅游助手 Agent。
4.1 定义智能体能力范围
我们需要为旅游助手定义以下核心能力:
- 地点搜索与坐标转换
- 路线规划与距离计算
- 餐厅与酒店推荐
- 景点信息查询
- 旅游行程可视化
4.2 智能体提示词设计
智能体的提示词决定了它如何理解用户需求并调用 MCP 服务。以下是一个基础提示词示例:
|
下面是旅游助手智能体的处理流程图,直观展示了从用户输入到最终行程输出的整个过程,以及各模块间的协作关系:
基于对旅游规划需求的分析,我设计了这个多模块协作的旅游助手智能体架构。整个系统的工作流程如下:
用户与 Cursor 交互
- 用户在 Cursor 编辑器中提交旅游需求(如"帮我规划五一从上海到舟山的三天自驾游...")
- Cursor 客户端接收用户请求并转发给 Claude 语言模型
- 最终将完整的旅游计划以可视化形式呈现给用户
数据流转与协作
系统中的数据流转和模块协作是实现复杂旅游规划的关键:
- Claude 接收用户需求后,启动并协调多个 MCP 服务
- 地图服务提供的地理数据与用户偏好结合,生成初步行程
- 天气数据和本地搜索结果进一步优化行程安排
- 行程数据驱动图像生成,为用户创建景点预览
- 所有服务结果汇总至 Claude 进行统一整合
结果呈现
最终的旅游方案通过多种形式呈现给用户:
- HTML 行程网页:展示详细的日程安排、活动和推荐
- 景点图片展示:通过 AI 生成的图像直观呈现目的地景观
- 地图路线可视化:显示行程路线、距离和时间估计
- 旅游建议文本:提供额外的提示、技巧和注意事项
这种模块化、协作式的架构设计使旅游助手能够提供全面且个性化的旅行规划服务,同时保持良好的可扩展性,可以根据需要添加新的功能模块。
五、实战案例:五一上海到舟山三天自驾游
5.1 用户需求
帮我规划五一自驾游从上海到舟山三天的旅游规划, 我想吃海鲜, 帮我寻找附近口碑好的餐厅。 还想去普陀山转转, 在帮我看看附近有什么特色推荐。 行程不用安排的太满, 我喜欢慢悠悠的玩。 |
5.2 智能体响应流程
- :调用map_geocode获取上海和舟山的坐标
|
- :调用map_directions获取驾车路线
|
- :调用map_search_places查询普陀山景点
|
- :搜索舟山海鲜餐厅
|
- :搜索舟山和普陀山酒店
|
- :调用text_to_image_fal生成相关旅游图片
|
5.3 最终行程生成
五一上海到舟山三天自驾游行程
第一天:上海 → 舟山
上午:
- 265 公里,预计行驶时间约 3-4 小时
- → 杭州湾环线高速 → 沈海高速 → 杭绍甬高速 → 舟山市区
中午:
- 111 号喜来登花园酒店内,电话:(0580)2086969
下午:
晚上:
- 208 号,电话:(0580)2066999
第二天:普陀山一日游
上午:
- 1 小时车程)
- 312 号)
- 107 号)
- 253 号)
中午:
下午:
- 200 号)
- 350 号)
晚上:
- 2780 号,电话:(0580)3580666)
第三天:朱家尖/舟山休闲
上午:
中午:
- 13-14 号,电话:13868228214
下午:
晚上:
自驾游贴士:
- :
- 265 公里,过路费约 230 元(含杭州湾大桥)
这个行程安排相对轻松,没有过度安排,给您留出了充分的休息和自由活动时间,适合慢悠悠地游玩。如果您有特别感兴趣的地方,可以灵活调整行程。祝您五一假期旅途愉快!
旅行图片生成
调用我们的 TourGuide MCP 生成相关图片, 以下是图片生成的 prompt
# 生成普陀山景色图片
putuoshan_image = TourGuide.text_to_image_fal(
prompt="A scenic view of Putuoshan Island in Zhoushan, China, with Buddhist temples and beautiful coastal landscape, travel photography style"
)
# 生成舟山海鲜美食图片
seafood_image = TourGuide.text_to_image_fal(
prompt="Fresh seafood cuisine from Zhoushan, China, featuring local specialties on a restaurant table, food photography"
)
# 生成舟山自驾路线图片
route_image = TourGuide.text_to_image_fal(
prompt="Scenic coastal drive along the road to Zhoushan, China, with bridges crossing the sea and beautiful island views"
)
六、HTML 网页版行程制作
为了让行程更加直观,我们生成了一个精美的 HTML 网页版行程,
点击链接进行查看
五一上海到舟山三天自驾游行程:
https://67fbbb4fbdfde4130834c84b--phenomenal-cannoli-302c1a.netlify.app/
七、总结与扩展思路
通过 MCP 服务器,我们成功构建了一个功能强大的旅游助手智能体,实现了从行程规划到网页生成的完整流程。这种方法的优势在于:
- 功能整合:将地图服务、图像生成等多种功能无缝整合
- 可视化输出:不仅提供文字建议,还能生成图片和网页
- 定制化程度高:可根据个人喜好和需求调整行程
未来扩展方向
- 增加酒店和机票预订功能
- 接入社交媒体,一键分享行程
- 添加 AR 导航和实时翻译功能
- 结合历史数据,提供更个性化的推荐