EOA MCP服务器
生产就绪的MCP(模型上下文协议)服务器,用于通过EOA公共注册表(EOA.conet.gr)搜索希腊保险中介机构。
设置
先决条件
- Node.js 18+
- EOA API证书(AUSER/APSWORD)
安装
cd mcp_server
npm install环境变量
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
EOA_AUSER | 是 | - | EOA API用户名(标题AUSER) |
EOA_APASSWORD | 是 | - | EOA API密码(标题APASSWORD) |
EOA_BASE_URL | 没有 | https://eoa.conet.gr | EOA API基本URL(方案+主机+端口,无尾部斜线)。 默认为生产;对于本地Django开发服务器集,例如。 http://127.0.0.1:8000 因此MCP调用您的实例(需要使用本地API更改,如新的过滤器)。 |
PORT | 没有 | 8080 | HTTP服务器端口 |
CACHE_TTL_SECONDS | 没有 | 600 | 相同请求的缓存TTL(10分钟) |
跑
发展 (带手表):
npm run dev生产:
npm run build
npm start端点
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /health | 健康检查(退货 { status: "ok" }) |
| 职位 | /mcp | MCP JSON-RPC消息(工具、初始化等) |
| 得到 | /mcp | 返回405(使用POST) |
MCP工具
所有工具返回JSON results,可选 total, source_note,以及 errors.
1. search_intermediaries
按查询和筛选器进行常规搜索。
输入:
| 参数 | 类型 | 默认值 | 说明 | ||
|---|---|---|---|---|---|
query | string | - | 按名称搜索(部分匹配) | ||
vat | string | - | 增值税号(9位数字) | ||
gemi | string | - | GEMI注册号 | ||
keee_categories | string\[\] | - | KEEE类别值 | ||
license_status | “活动” | “过期” | “无信息” | - | 许可证状态筛选器 |
main_activity | “任意” | “主” | “次” | - | 主活动筛选器 |
legaltype_ids | string\[\] | - | 合法类型ID(请参见 list_legal_types) | ||
page | number | 1 | 页码 | ||
page_size | number | 20 | 页面大小(最大50) | ||
order_by | string\[\] | - | 字段排序: vatnumber, gemiTradeName, keeeLicenceExpiration, gemiIncorporationDate, lastUpdate (前缀 - 下降) | ||
gemi_incorporation_date_from | string | - | GEMI成立日期的下限(YYYY-MM-DD);单独使用或与 gemi_incorporation_date_to | ||
gemi_incorporation_date_to | string | - | 包含GEMI成立日期的上限(YYYY-MM-DD);单独使用或与 gemi_incorporation_date_from | ||
include_total | boolean | false | 包括总计数 |
这些日期参数被传递给EOA检索API作为 filter.gemiIncorporationDateFrom 和 filter.gemiIncorporationDateTo (包括日历日期)。当应用绑定时,不包括没有GEMI注册日期的配置文件。
例子:
{
"query": "ΠΛΥΤΑΡΙΑΣ",
"license_status": "active",
"page": 1,
"page_size": 20,
"include_total": true
}2. get_intermediary_by_vat
通过增值税号码获得单个中介。
输入:
| 参数 | 类型 | 说明 |
|---|---|---|
vat | string | 希腊增值税号码(9位数字) |
例子:
{
"vat": "998368964"
}3. get_intermediary_by_gemi
通过GEMI注册号获得单个中介。
输入:
| 参数 | 类型 | 说明 |
|---|---|---|
gemi | string | GEMI(Γ.ΜΗ.)注册号 |
例子:
{
"gemi": "69583903000"
}4. search_intermediaries_in_bbox
在地理边界框内搜索。
输入:
| 参数 | 类型 | 说明 | ||
|---|---|---|---|---|
latitude_from | number | 最小纬度 | ||
latitude_to | number | 最大纬度 | ||
longitude_from | number | 最小经度 | ||
longitude_to | number | 最大经度 | ||
query | string | 可选名称筛选器 | ||
keee_categories | string\[\] | 可选 | ||
license_status | “活动” | “过期” | “无信息” | 可选 |
main_activity | “任意” | “主” | “次” | 可选 |
legaltype_ids | string\[\] | 可选 | ||
gemi_incorporation_date_from | string | 可选;包容的 YYYY-MM-DD GEMI成立日期下限 | ||
gemi_incorporation_date_to | string | 可选;包容的 YYYY-MM-DD GEMI成立日期的上限 | ||
page | number | 默认值1 | ||
page_size | number | 默认值为20,最大值为50 | ||
order_by | string\[\] | 可选 | ||
include_total | boolean | 默认值为false |
例子:
{
"latitude_from": 37.96,
"latitude_to": 38.00,
"longitude_from": 23.71,
"longitude_to": 23.75,
"include_total": true
}5. list_legal_types
返回合法类型ID到希腊语描述的映射。无输入。
示例响应:
{
"results": {
"1": "ΑΕ",
"2": "ΟΕ",
"4": "ΕΕ",
...
},
"source_note": "EOA public registry aggregation; check lastUpdate for freshness.",
"errors": []
}输出格式
所有搜索工具返回:
{
"results": [
{
"profileType": "P|G",
"vatnumber": ".........",
"geminumber": "...",
"agentName": "...",
"gemiTradeName": "...",
"gemiIncorporationDate": "YYYY-MM-DD",
"keeeRegistrationClass": "...",
"keeeLicenceExpiration": "YYYY-MM-DD",
"gemiBusinessAddress": "...",
"gemiPhoneNumber": "...",
"latitude": 0,
"longitude": 0,
"lastUpdate": "ISO-8601"
}
],
"total": 123,
"source_note": "EOA public registry aggregation; check lastUpdate for freshness.",
"errors": []
}total仅在以下情况下存在include_total: true.errors包含任何上游或验证错误。
非功能性特征
- 速率限制:每个IP每分钟60个请求
- 缓存:相同请求的10分钟TTL(在内存中,可为Redis交换)
- 输入验证:增值税9位数,page_size≤50,page≥1,bbox边界,可选GEMI注册日期范围(
YYYY-MM-DD,从≤到) - 安全:头盔,没有敏感的头部日志记录,v1中没有base64图像
