谷歌附近搜索MCP服务器(带身份验证和天气)
一个用Python编写的可扩展的、Docker化的模型上下文协议(MCP)服务器。它包含了谷歌地图API(附近搜索、地理编码)和Meteoblue Weather API,允许人工智能代理查找位置并检查天气。
它包括一个强大的 Nginx Sidecar 对于承载令牌认证,在不干扰SSE(服务器发送事件)流协议的情况下确保安全性。
特性
- 谷歌附近搜索工具:通过坐标、半径和关键字查找位置。
- 地理编码工具:将地址(例如“埃菲尔铁塔”)转换为坐标。
- 距离矩阵工具:计算两点之间的行程时间和距离。
- 天气工具:通过Meteoblue获取当前天气和预报。
- 认证:基于Nginx的承载令牌保护(前向认证兼容)。
- 模拟支持:禁用使用环境变量测试/dev的实际API调用。
- Docker化:已准备好进行本地部署和Dokploy等平台。
先决条件
- Python 3.11+(用于本地开发)
- Docker&Docker编写
- 谷歌地图API密钥(已启用API和API地理编码)
- Meteoblue API密钥(可选,适用于天气)
设置和配置
1.环境变量
复制示例环境文件:
cp .env.example .env编辑 .env 并填写您的详细信息:
| 变量 | 描述 |
|---|---|
GOOGLE_API_KEY | 您的谷歌地图API密钥。 |
METEOBLUE_API_KEY | 您的Meteoblue API密钥(可选)。 |
MCP_AUTH_TOKEN | 秘密令牌 对于承载认证(例如。, my-secret-token). |
MOCK_GOOGLE_API | 设置为 true 使用硬编码的谷歌回复(节省学分)。 |
MOCK_WEATHER_API | 设置为 true 模拟天气数据。 |
TRANSPORT | sse 对于HTTP服务器(Docker), stdio 对于CLI。 |
HOST / PORT | 绑定配置(默认为0.0.0.0:8000)。 |
建筑
此项目使用 侧车图案 用于身份验证:
- Nginx(端口8080): 公共入口点。处理SSL(如果已配置)和 承载令牌身份验证。如果令牌有效,它会将请求代理到Python后端。
- Python MCP服务器(端口8000): 内部逻辑。处理MCP协议、工具和API调用。它在没有身份验证逻辑的情况下运行,以确保SSE的稳定性。
运行项目
选项A:Docker部署(建议使用Auth)
这将运行整个堆栈:Nginx(Auth)+Python(Logic)。
- 构建并启动容器:
docker-compose up --build -d- 访问SSE端点 端口8080:
- 网址: http://localhost:8080/sse - 认证: 必修的。发送标头 Authorization: Bearer 或URL参数 ?token=.
- 使用客户端脚本进行测试:
# Ensure local python env is set
source venv/bin/activate
export MCP_AUTH_TOKEN=your_token_from_env
python client_test.py选项B:本地Python开发人员(无身份验证)
只直接运行Python后端。这跳过了Nginx,所以 身份验证已禁用.
- 创建虚拟环境:
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt- 运行服务器:
export PYTHONPATH=$(pwd)/src
fastmcp run src/server.py --transport sse --host 0.0.0.0 --port 8000- 访问地址:
http://localhost:8000/sse.
项目结构
src/server.py:入口点。初始化FastMCP。src/tools/:
- google_nearby.py:Google Places API逻辑。 - geocoding.py:地址到坐标逻辑。 - weather.py:气象蓝天气逻辑。
nginx/:
- nginx.conf.template:带有Auth逻辑的Nginx配置模板。
docker-compose.yml:Python+Nginx的编排。
Dokloy部署
- 将此存储库推送到Git提供商。
- 在Dokloy,创造一个新的 应用 (Docker Compose)。
- 在Dokloy中设置环境变量(
GOOGLE_API_KEY,MCP_AUTH_TOKEN等等)。 - 重要提示: 将外部端口(例如域)映射到内部容器端口 8080 (Nginx),而不是8000。
