Skip to main content
Glama
handaas

tourism-mcp-server

by handaas
README.md
# 文旅:文旅景区搜索

[该MCP服务提供国标景区搜索与详情、文旅规划明细、乡村旅游重点村镇、餐饮民宿、星级饭店和出境游旅行社查询功能。](https://www.handaas.com/)


## 主要功能

- 🏞️ 国标景区搜索
- 📋 国标景区详情(面积、特色、景点、文化价值和运营主体)
- 🗺️ 文旅规划明细(项目、建设规模、最新进展和相关单位)
- 🏡 乡村旅游重点村镇搜索
- 🏨 餐饮民宿与星级饭店搜索
- ✈️ 出境游旅行社搜索

## 环境要求

- Python 3.10+
- 依赖包:python-dotenv, requests, mcp

## 本地快速启动

### 1. 克隆项目
```bash
git clone https://github.com/handaas/tourism-mcp-server
cd tourism-mcp-server
```

### 2. 创建虚拟环境&安装依赖

```bash
python -m venv mcp_env && source mcp_env/bin/activate
pip install -r requirements.txt
```

### 3. 环境配置

复制环境变量模板并配置:

```bash
cp .env.example .env
```

编辑 `.env` 文件,配置以下环境变量:

```env
INTEGRATOR_ID=your_integrator_id
SECRET_ID=your_secret_id
SECRET_KEY=your_secret_key
HANDAAS_REQUEST_TIMEOUT=30
```

### 4. streamable-http启动服务

```bash
python server/mcp_server.py streamable-http
```

服务将在 `http://localhost:8000` 启动,MCP 地址为 `http://127.0.0.1:8000/mcp`。

#### 支持启动方式 stdio 或 sse 或 streamable-http

### 5. Cursor / Cherry Studio MCP配置

```json
{
  "mcpServers": {
    "tourism-mcp-server": {
      "type": "streamableHttp",
      "url": "http://127.0.0.1:8000/mcp"
    }
  }
}
```

## STDIO版安装部署

### 设置Cursor / Cherry Studio MCP配置

```json
{
  "mcpServers": {
    "tourism-mcp-server": {
      "command": "uv",
      "args": ["run", "mcp", "run", "{workdir}/server/mcp_server.py"],
      "env": {
        "PATH": "{workdir}/mcp_env/bin:$PATH",
        "PYTHONPATH": "{workdir}/mcp_env",
        "INTEGRATOR_ID": "your_integrator_id",
        "SECRET_ID": "your_secret_id",
        "SECRET_KEY": "your_secret_key"
      }
    }
  }
}
```

## 使用官方Remote服务

当前服务暂未开放官方 Remote 地址。请使用本地 `stdio`、`sse` 或 `streamable-http` 方式运行;官方 Remote 地址开放后将在本节补充配置。

### 注意:integrator_id、secret_id、secret_key及Remote token需要登录 https://www.handaas.com/ 进行注册开通平台获取


## 可用工具

### 推荐查询流程

1. 用 `tourism_scenic_area_search` 搜索国标景区,或用 `tourism_countryside_search` 搜索乡村旅游重点村镇,获取结果中的 `taId` 并原样传给后续工具。2026-09-07 实测两类搜索均已返回 `taId`;旧版搜索接口文档中的 `_id` 为记录ID,以实际返回字段为准。
2. 将国标景区ID作为 `taId` 传给 `tourism_scenic_area_detail`,查询景区详细信息。
3. 将国标景区或乡村旅游景区ID作为 `taId` 传给 `tourism_planning_list`,分页查询规划明细。

景区ID应取自搜索接口实际返回的数据,不使用景区名称或运营主体的 `nameId` 代替。若搜索结果没有可用景区ID,应提示缺少关联标识,不猜测ID。
已实测通过“国标景区搜索 → 景区详情”及“乡村旅游搜索 → 文旅规划”的 `taId` 关联链。

### 1. tourism_scenic_area_search
**功能**: 国标文旅景区搜索

**参数**:
- `taName` (可选): 景区名称,支持模糊搜索
- `taCategory` (可选): 景区类别
- `taProvince` (可选): 省份短名,例如北京、广东
- `taCity` (可选): 城市
- `taBatchNumber` (可选): 评定批次
- `pageIndex` (可选): 页码
- `pageSize` (可选): 每页条数,默认10,最大10

**返回值**:
- `total`: 景区总数
- `resultList`: 景区列表
  - `taId`: 景区ID(2026-09-07 实测返回),用于后续详情和规划查询
  - `_id`: 景区记录ID(本地搜索文档字段),用于后续详情/规划查询的 `taId`
  - `taName`: 景区名称
  - `taCategory`: 景区类别
  - `taProvince`: 省份
  - `taCity`: 城市
  - `taRegion`: 区县
  - `taEvaluationYear`: 评定年份
  - `taPublishDate`: 发布日期
  - `taOperatingEntity`: 运营主体
  - `taAddressValue`: 地址
  - `taBatchNumber`: 批次号

### 2. tourism_countryside_search
**功能**: 乡村旅游重点村镇搜索

**参数**:
- `taName` (可选): 村镇名称
- `taBatchNumber` (可选): 入选批次
- `taProvince` (可选): 省份
- `taCity` (可选): 城市
- `pageIndex` (可选): 页码
- `pageSize` (可选): 每页条数,默认10,最大10

**返回值**:
- `total`: 村镇总数
- `resultList`: 重点村镇列表
  - `taId`: 景区ID(2026-09-07 实测返回),用于后续规划查询
  - `_id`: 村镇记录ID(本地搜索文档字段),用于后续规划查询的 `taId`
  - `taName`: 村镇名称
  - `taBatchNumber`: 批次号
  - `taLicenseNumber`: 证号
  - `taProvince`: 省份
  - `taCity`: 城市
  - `taRegion`: 区县
  - `taEvaluationYear`: 评定年份
  - `taPublishDate`: 发布日期

### 3. tourism_accommodation_search
**功能**: 餐饮民宿与星级饭店搜索

**参数**:
- `taName` (可选): 名称,支持模糊搜索
- `taType` (可选): 旅宿类型
- `address` (可选): 地区,多级值用“省份,城市,区县”表示
- `foundTimeBegin` / `foundTimeEnd` (可选): 成立日期区间
- `regCapitalMin` / `regCapitalMax` (可选): 注册资本区间,单位万元
- `operStatus` (可选): 经营状态
- `pageIndex` (可选): 页码
- `pageSize` (可选): 每页条数,默认10,最大10

**返回值**:
- `total`: 旅宿总数
- `resultList`: 旅宿及运营企业列表
  - `taName`: 旅宿名称
  - `taType`: 旅宿类型
  - `taLicenseNumber`: 证号
  - `name`: 运营企业名称
  - `nameId`: 企业主体ID
  - `legalRepresentative`: 法定代表人
  - `foundTime`: 成立时间
  - `regCapital`: 注册资本
  - `address`: 注册地址
  - `operStatus`: 经营状态

### 4. tourism_travel_agency_search
**功能**: 出境游旅行社搜索

**参数**:
- `taName` (可选): 旅行社名称
- `address` (可选): 地区,直辖市使用上海、北京等短名
- `foundTimeBegin` / `foundTimeEnd` (可选): 成立日期区间
- `regCapitalMin` / `regCapitalMax` (可选): 注册资本区间,单位万元
- `operStatus` (可选): 经营状态
- `pageIndex` (可选): 页码
- `pageSize` (可选): 每页条数,默认10,最大10

**返回值**:
- `total`: 旅行社总数
- `resultList`: 旅行社及运营企业列表
  - `taName`: 旅行社名称
  - `englishName`: 英文名称
  - `taLicenseNumber`: 许可证号
  - `name`: 企业名称
  - `nameId`: 企业主体ID
  - `legalRepresentative`: 法定代表人
  - `regCapital`: 注册资本
  - `annualTurnoverAlgValue`: 年营业额
  - `businessTags`: 业务标签
  - `operStatus`: 经营状态

### 5. tourism_scenic_area_detail
**功能**: 国标景区详情

**数据产品ID**: `6a98ec3fcc51ed421bf06fa2`

**参数**:
- `taId` (Schema 可选,实际调用请传入): 景区ID,来自 `tourism_scenic_area_search` 的实际搜索结果。按 PDF 文档保留可选性,但 2026-09-07 实测省略时上游返回 `21008 参数错误`;MCP 会保留该错误,不伪造成功结果。

**返回值**:
- `total`: 详情记录数,空结果为0
- `resultList`: 将上游详情对象包装为列表,保留原始字段与嵌套结构
  - `taName`: 景区名称
  - `taLandArea` / `taBuildingArea`: 占地面积 / 建筑面积,字符串原值;接口文档未注明单位,不推断或自动换算
  - `taFeatures`: 核心特色
  - `taAttractions`: 主要设施/景点,字符串列表
  - `taCultureValues`: 文化价值
  - `taIntroduction`: 简介
  - `taAddress`: 地址对象,含 `province`(省)、`city`(市)、`district`(区)、`value`(具体地址)
  - `taCategory`: 景区类型
  - `taBatchNumber`: 等级批次
  - `taOperatingEntity`: 运营主体列表,每项含 `nameId`(运营主体ID)和 `name`(运营主体名称)

**说明**: 此接口无分页参数;不得把景区详情中的嵌套列表拆成多条景区记录。

### 6. tourism_planning_list
**功能**: 文旅规划明细

**数据产品ID**: `6a995506a96d8a6e55377905`

**参数**:
- `taId` (必填): 景区ID,来自 `tourism_scenic_area_search` 或 `tourism_countryside_search` 的实际搜索结果,不接受空字符串
- `pageIndex` (可选): 页码,默认1,最小1
- `pageSize` (可选): 每页条数,默认10,最大10,最小1

**返回值**:
- `total`: 规划记录总数,保留上游总数而非当前页条数
- `resultList`: 规划记录列表,保留原始字段
  - `taPlanningType`: 类别
  - `taPlanningName`: 项目名称
  - `taPlanningDesc`: 建设内容与规模
  - `taPlanningNews`: 最新进展
  - `taPlanningCompany`: 相关单位

**说明**: `pageSize` 超过10、页码小于1或 `taId` 为空时返回参数错误,不调用上游接口。空页或空结果仅表示本次接口未返回规划数据,不能据此断言景区不存在或没有规划。

## 使用注意事项

1. **Tool选择**: 景区、重点村镇、旅宿和旅行社分别使用对应 Tool,不混用筛选参数。
2. **地区格式**: 旅宿多级地区使用英文逗号分隔,景区和直辖市筛选按 Tool 说明使用短名。
3. **区间校验**: 成立日期和注册资本下限不能大于上限。
4. **API限制**: 分页查询一页最多获取10条数据。
5. **合法空结果**: 未命中时返回 `total=0` 和 `resultList=[]`。
6. **详情与规划**: 景区详情不分页;规划查询需传入景区ID。面积等未声明单位的字段保留原值,不自行推断。

## 使用提问示例

### tourism_scenic_area_search (国标文旅景区搜索)
1. 搜索北京名称中包含“故宫”的景区
2. 查询杭州的国标景区
3. 查看指定批次评定的景区名单

### tourism_countryside_search (乡村旅游重点村镇搜索)
1. 查询浙江省的乡村旅游重点村镇
2. 搜索名称中包含“村”的重点村镇
3. 查看某一批次入选的重点村镇

### tourism_accommodation_search (餐饮民宿与星级饭店搜索)
1. 查找杭州正在经营的民宿
2. 查询上海的星级饭店及运营企业
3. 搜索注册资本超过1000万元的旅宿企业

### tourism_travel_agency_search (出境游旅行社搜索)
1. 查询上海的出境游旅行社
2. 搜索名称中包含“旅行社”的企业
3. 查看北京存续状态的出境游旅行社

### tourism_scenic_area_detail (国标景区详情)
1. 先搜索故宫景区,再查询其核心特色、主要景点和文化价值
2. 根据刚查到的景区ID,查看景区地址及运营主体
3. 查询指定国标景区的占地面积、建筑面积和简介,保留接口原始单位表达

### tourism_planning_list (文旅规划明细)
1. 搜索某个国标景区,查询其文旅规划项目名称和建设规模
2. 根据乡村旅游重点村镇搜索结果中的景区ID,查看规划最新进展和相关单位
3. 继续读取该景区文旅规划的第2页,每页10条

## 测试验证

```bash
python -m py_compile server/mcp_server.py
python -m unittest discover -s tests -v
```

离线测试覆盖6个工具的注册与只读标记、新增接口的参数契约、Product ID 路由、详情嵌套字段、规划分页边界、空结果及上游错误透传,不需要真实凭据。

2026-09-07 验证:18 个离线测试通过;真实 MCP 检查 23 项通过 22 项,覆盖6个工具及规划分页。规划非空样本共14条,第1页10条、第2页4条;详情嵌套字段与搜索对象一致。唯一已知差异是详情省略 `taId` 返回 `21008`,与 PDF 的可选标注不一致;传入有效ID的调用链正常。

接口依据:`国标景区详情_2026-09-07_15-14-48.pdf`、`文旅规划明细_2026-09-07_15-14-54.pdf`。真实接口验证需在本地 `.env` 配置有效凭据并开通对应数据产品后执行,测试输出不得提交真实业务响应或凭据。