Travel Safety MCP
一个仅访问固定官方来源的旅行安全 MCP 服务。Agent 只能传入国家、别名和日期,不能传入任意 URL。
工具
get_current_timesearch_china_consular_alert_url:极简版,只输入国家/地区,返回最新匹配的中国领事服务网安全提醒 URLsearch_china_consular_alert_urls:只在中国领事服务网“安全提醒”栏目页内查找指定国家/地区的详情页 URLsearch_four_travel_advisories:输入一次国家名称,后台并行调用千问联网检索 Agent 四次并合并结果search_basic_advisories:保留 0.2.5 原四站结果,并追加中国领事服务网cs.mfa.gov.cn/zggmcg/ljmdd/范围内的“了解目的地—国家概况”search_health_events:旧的多站健康检索工具,百炼主流程不再使用search_disaster_eventssearch_conflict_events
百炼使用与 0.2.5 相同的 travel-safety-mcp 完整入口。
0.2.12 保留原有 8 个工具、工具参数和 stdio 启动方式;
search_basic_advisories 保留原四站输出,并追加中国领事国别概况页。
百炼主流程的“医疗卫生”节点应改用独立 MCP
russel-china-cdc-risk-mcp 的 lookup_china_cdc_risk,不再调用
search_health_events。
中国领事服务网站内 URL 查找
当百炼全网搜索无法稳定召回 cs.mfa.gov.cn 原始详情页时,优先使用:
{
"country": "日本"
}
如果需要候选列表和别名匹配,再使用复数版:
{
"country": "日本",
"aliases": ["日本国"],
"max_results": 5,
"max_pages": 1
}
返回示例:
{
"country": "日本",
"aliases": ["日本", "日本国"],
"candidates": [
{
"title": "提醒中国公民近期避免前往日本",
"date": "2026-03-26",
"url": "https://cs.mfa.gov.cn/gyls/lsgz/lsyj/202603/t20260326_11881693.shtml",
"matched_term": "日本",
"source_index_url": "https://cs.mfa.gov.cn/gyls/lsgz/lsyj/"
}
],
"selected": {
"title": "提醒中国公民近期避免前往日本",
"date": "2026-03-26",
"url": "https://cs.mfa.gov.cn/gyls/lsgz/lsyj/202603/t20260326_11881693.shtml",
"matched_term": "日本",
"source_index_url": "https://cs.mfa.gov.cn/gyls/lsgz/lsyj/"
},
"errors": []
}
百炼工作流中,下一步“读取详情页”节点引用 selected.url。
千问四站聚合工具
search_four_travel_advisories 的最小输入只有国家名称:
{
"country": "日本"
}
可选传入时间 MCP 返回的日期和英文国名:
{
"country": "日本",
"current_date": "2026-07-07",
"country_en": "Japan"
}
服务会在后台并行执行中国领事服务网、澳大利亚 Smartraveller、英国
Foreign Travel Advice、美国 Travel.State.Gov 四次定向检索,只向 Agent 返回
一次合并 JSON。非目标域名 URL 会被拒绝;每个候选 URL 还必须实际访问成功,
并通过页面标题或国家正文匹配。千问未召回或返回假 URL 时,服务自动从对应官网
目录发现并读取真实链接。只有 status=FOUND_VERIFIED 的页面可以用于回答,
事实依据以 official_excerpt 为准。
运行前配置环境变量:
export DASHSCOPE_API_KEY="sk-你的百炼APIKey"
export QWEN_WEB_SEARCH_AGENT_ID="aid-你的联网检索应用ID"
export QWEN_WEB_SEARCH_AGENT_VERSION="release"
可选配置:
export QWEN_WEB_SEARCH_TIMEOUT_SECONDS="180"
export QWEN_WEB_SEARCH_MAX_RETRIES="1"
密钥只能通过环境变量或阿里云密钥管理注入,不要写入代码、提示词或发布包。
所有检索工具都会返回来源状态。error 表示访问失败,no_match 表示当前页面没有找到国家匹配,Agent 不得把这两种状态描述为“没有风险”。
安全边界
- 起始网页固定在
config.py中。 - 只允许 HTTPS 443 和精确匹配的白名单域名。
- 每一次重定向都会重新检查域名。
- 拒绝解析到私网、环回、链路本地等非公网地址的域名。
- HTTP 客户端不读取系统代理配置。
- 单个响应最多 2 MB,最多跟随 5 次白名单内重定向。
- 工具不接受 URL 参数。
代码白名单可以控制 MCP 自己发出的请求。生产环境仍建议通过 VPC 出站代理或云防火墙实施“默认拒绝、按域名放行”的网络策略。
本地运行
需要 Python 3.11 以上和 uv:
uv sync
uv run travel-safety-mcp
运行测试:
uv run python -m unittest discover -s tests -v
发布到 PyPI
百炼的 uvx 脚本部署需要从公开 PyPI 安装包。当前发布包名为 russel-travel-safety-mcp-2026,命令名为 travel-safety-mcp。
uv build
uv publish
不要在代码或发布包中保存 PyPI Token、百炼 API Key 或其他密钥。
百炼脚本部署
在 MCP 管理 -> 创建 MCP 服务 -> 使用脚本部署 中选择:
- 安装方式:
uvx - 部署方式:基础模式
- 地域:北京或最接近业务的地域
使用下面的包名和版本:
{
"mcpServers": {
"travel-safety": {
"command": "uvx",
"args": [
"--from",
"russel-travel-safety-mcp-2026==0.2.24",
"travel-safety-mcp"
]
}
}
}
该完整入口与 0.2.5 一样暴露 8 个工具。
Agent 提示词片段
每次国家查询必须先调用 get_current_time,时区固定为 Asia/Shanghai。
随后使用规范化的中文国名、英文国名和别名调用相应工具。
起止日期仅用于灾害、冲突和安全事件等时效性检索。
中国领事国家概况不按日期筛选;中国 CDC 节点固定使用 2026 年 5 月数据库。
国家概况只使用 status=ok 的 pages 内容;CDC 只使用工具返回的 reason、selected_event 和 dataset。
status 为 error 或 no_match 时,不得推测或补写;应说明指定网站未获取到相关信息。
不得把国家概况描述为旅行风险建议,不得把固定 CDC 数据描述为实时数据。
当前限制
第一版通过各官方网站的固定索引页发现国家相关链接。网站改版、JavaScript 渲染、验证码或反自动化策略都可能导致单一来源返回 error 或 no_match。后续应为失败率较高的网站增加专用适配器,而不是放开通用搜索或任意 URL 抓取。
Release files for chinesecanfly 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| chinesecanfly-0.0.1.tar.gz | 78.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| chinesecanfly-0.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 114.0 kB
Release files / chinesecanfly-0.0.1.tar.gz
| Download URL | chinesecanfly-0.0.1.tar.gz |
|---|---|
| Size | 78.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e8d404a71667521efdb1cf067ed37d25b70f1f68b16ef52c3f1b459290c8ba30
|
|
BLAKE2b-256 checksum How to use checksums |
7ae47c7cbe87e4ed5019df0c6696f3ef4ce625efc98bab6ada16320a95ad1459
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / chinesecanfly-0.0.1-py3-none-any.whl
| Download URL | chinesecanfly-0.0.1-py3-none-any.whl |
|---|---|
| Size | 35.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
87d329c0aeacab43ef734641dd49b66a011ed61bd1d14198f1f3abc1c6e3c799
|
|
BLAKE2b-256 checksum How to use checksums |
21ae58d0f70b0e9a1bf8b9e13ef78f71cae84f7b98cd8992fde540db7a1374c7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|