用于旅游搜索的MCP服务器Tourvisor(eto.travel)
准备在Node.js+TypeScript上运行MVP MCP服务器,该服务器连接LLM,并使用监视的HTTP Endpoint Tourvisor通过eto.travel公共搜索执行旅游搜索。
快速启动
npm install
cp .env.example .env
npm run dev解决NPM安装中的403错误
如果安装失败时出现“403 Forbidden”错误 registry.npmjs.org,这意味着阻止对公共NPM注册的访问(例如,安全策略或网络代理)。项目代码本身不依赖于封闭的包,因此只需将注册表更改为允许的:
# вариант 1: однократный запуск через переменную окружения
NPM_CONFIG_REGISTRY=https://registry.npmmirror.com/ npm install
# вариант 2: глобально через npm config
npm config set registry https://registry.npmmirror.com/
npm install如果您的基础设施使用企业NPM代理,请指定其URL而不是 registry.npmmirror.com.
健康检查:
curl http://localhost:3000/health例子.env
PORT=3000
MCP_API_KEY=change_me
TOURVISOR_SESSION=your_session_token
TOURVISOR_REFERRER=https://eto.travel/search/
TOURVISOR_SEARCH_HOST=https://tourvisor.ru
TOURVISOR_RESULT_HOST=https://search3.tourvisor.ru
TOURVISOR_POLL_INTERVAL_MS=500
TOURVISOR_POLL_TIMEOUT_MS=45000
TOURVISOR_MAX_BLOCKS=50
TOURVISOR_MAX_OFFERS=300
ENABLE_TOUR_DETAILS=false
TOURVISOR_USE_SESSION_FOR_MODACT=true
RATE_LIMIT_MAX=60
RATE_LIMIT_WINDOW_MS=60000MCP端点
服务器实现SSE传输并需要标题 x-api-key наMCP端点'ах:
GET /mcp/sse-SSE流(需要)x-api-key)POST /mcp/call-呼叫工具(需要)x-api-key)
呼叫格式:
{
"tool": "search_tours",
"args": { "...": "..." }
}mcp tools(curl)调用示例
搜索_我们
curl -X POST http://localhost:3000/mcp/call \
-H "Content-Type: application/json" \
-H "x-api-key: $MCP_API_KEY" \
-d '{
"tool": "search_tours",
"args": {
"datefrom": "01.06.2024",
"dateto": "15.06.2024",
"regular": 1,
"nightsfrom": 6,
"nightsto": 14,
"adults": 2,
"child": 0,
"meal": 0,
"rating": 0,
"country": 47,
"departure": 1,
"pricefrom": 0,
"priceto": 0,
"currency": 0,
"actype": 0,
"formmode": 0,
"pricetype": 0,
"limit": 50
}
}'get_dictionaries
curl -X POST http://localhost:3000/mcp/call \
-H "Content-Type: application/json" \
-H "x-api-key: $MCP_API_KEY" \
-d '{
"tool": "get_dictionaries",
"args": {
"type": "departure,allcountry,country,region,subregions,operator",
"formmode": 0,
"format": "json"
}
}'Searchu Tours字段描述
必需参数:
datefrom-开始日期(格式为“dd.mm.yyy”)。dateto-结束日期(格式为“DD.MM.YYY”)。nightsfrom最短的持续时间。nightsto-最大持续时间。adults成人人数。country国家代码。departure飞行代码。
可选选项:
regular,child,meal,rating,pricefrom,priceto,currency,actype,formmode,pricetype.limit-限制答案中的离线次数。
限制和特点
- 搜索基于“modsearch→polling moresult”。
- 正确答案需要相关
TOURVISOR_SESSION. - 波林结束于
finished==1,progress==100,达到限制或超时。 - 限制通过
TOURVISOR_POLL_INTERVAL_MS,TOURVISOR_POLL_TIMEOUT_MS,TOURVISOR_MAX_BLOCKS,TOURVISOR_MAX_OFFERS. - 波尔
deep_link如果没有旅游ID,则返回为“未知”。 - 在MCP端点上,IP中启用了内存速率限制,没有外部数据包。
get_tour_details默认情况下禁用。通过ENABLE_TOUR_DETAILS=true.
Деплой(渲染/铁路)
- 从存储库创建新服务。
- 从“示例.env”部分指定环境变量。
- 编译命令:
npm install && npm run build. - 发射命令:
npm run start. - 检查
/health德洛厄斯之后。
项目结构
/src
/config
env.ts
/mcp
server.ts
tools.ts
schemas.ts
auth.ts
/tourvisor
client.ts
endpoints.ts
polling.ts
normalizers.ts
dictionaries.ts
/utils
sleep.ts
errors.ts
rateLimit.ts
index.ts
/tests
search_tours.test.ts
get_dictionaries.test.ts
polling.test.ts
Dockerfile
README.md
.env.example
package.json
tsconfig.json