@ cyanheads/ eurostat- mcp- 服务器
通过MCP搜索和查询欧统局的目录——欧盟经济、人口、贸易、卫生和NUTS区域数据。 (原始内容存档于2012-10-12). STIO or Streamable HTTP.
概览
欧统局提供的欧盟统计数据:经济、人口、贸易、卫生和NUTS区域数据,包括详细的Comext贸易和PRODCOM工业生产。 搜索或浏览目录,检查一个数据集的维度,然后查询一个切片或批量下载整件事.
工具
三个 eurostat_dataframe_* 工具需要数据框架画布,数据框架是默认的,然后关闭 CANVAS_PROVIDER_TYPE=none· ; eurostat_dataframe_drop 需求 EUROSTAT_DATAFRAME_DROP_ENABLED=true。 。 。 .
| 工具 | 说明 |
|---|---|
eurostat_search_datasets | 按关键词搜索欧统局目录——返回代码、说明、期间覆盖范围和主题面包屑 |
eurostat_browse_themes | 导航欧统局主题等级结构——列出根主题或钻入分主题和数据集 |
eurostat_get_dataset_info | 获取数据集元数据: 有样本值、 时间范围、 观察计数和最后更新日期的维度 |
eurostat_get_dimension_values | 列出一个数据集维度的所有有效代码,页码,包括代码/标签单词过滤器、代码前缀过滤器和NUTS结构过滤器 geo |
eurostat_query_dataset | 获取带有维度过滤器、 NUTS 地理级别和时程控制的解码观测的边框预览 |
eurostat_download_dataset | 通过SDMX散装端点下载一个完整的数据集,并在数据框上分出一行 |
eurostat_dataframe_describe | 列出数据框帆布上排列的表格,包括行数和列类型 |
eurostat_dataframe_query | 运行一个仅读取的 SQL SELECT 跨级表格 |
eurostat_dataframe_drop | 从一个数据框架帆布中删除一个已分级的表格,将其其他表格留在原地(可选入) |
资源
| 资源 | 说明 |
|---|---|
eurostat://dataset/{dataset_code} | 由URI提供的数据集元数据(dimensions,时间范围,观测计数,最后更新) |
skill://eurostat-guide/SKILL.md | 统计比较门、标识出处和SQL分析工作流程 |
同一元数据可通过 eurostat_get_dataset_info 仅供工具客户端使用.
代理技能
欧洲统计指南 涵盖国家和区域的比较、汇总、数据缺失解释以及SQL在分阶段观测之后加入。 它装有插件、npm、Docker和MCPB安装,并在MCP上安装 skill://eurostat-guide/SKILL.md; 支持 SQL 的例子包含在技能下 references/ 目录.
能力参考
eurostat_search_datasets 工具
query各个数据集的标签、主题面包屑和代码的字词均按不敏感大小写排列,而忽略了相距(Rev.2发现Rev. 2) (中文(简体) ). 匹配按单词的出处排序:包含查询的标签为从一个单词开头的短语,然后是包含每个单词的标签或代码,然后是仅包含主题面包屑,每组按内容表顺序排列. 当没有数据集持有每个单词时,会再次搜索一个最多有10个不同单词的查询,每个缺失单词也匹配它开始一个词的英语标签中其中一个数据集的维度值(pharmacist发现Pharmacists, (中文(简体) ),med_spec=PHARM) (中文(简体) ).limit是一个正整数(默认为 20),用通知夹住到 100。 路过一页nextCursor恢复为cursor; 光标调用忽略limit- 成果
code, (中文(简体) ),label, (中文(简体) ),type(单位:千美元)dataset编号 :table),覆盖期,obsCount, (中文(简体) ),lastUpdated,以及themePath,与totalMatches每个页面。 通过维度值标签找到一行matchedValues(单位:千美元)dimension, (中文(简体) ),code, (中文(简体) ),label; 代码是过滤器eurostat_query_dataset答复中包含:notice失败no_match(将删除后发现匹配的单词命名,或者在无数据的情况下,将匹配无数据集的单词命名,检查前32个不同的单词;它还注明了尺寸值标签没有被搜索的时候,因为其索引没有加载,或者查询有10个以上的单词),invalid_cursor,或可重试upstream_fault当没有装入目录,欧统局的目录无法到达时 - 如果无法装入 Comext 数据流列表,则结果随附
comextListMissing(单位:千美元)notice; 无法刷新的目录catalogueLoadedAt
eurostat_browse_themes 工具
- 奥米
theme_code用于顶级主题文件夹; 为其近代子通过文件夹代码。 代码首先解决,然后对案件不敏感。 Comext的藏书放在下面ext_go_detail(详细贸易情况ext_go和prom(PRODCOM, 于icts(中文(简体) ) - 项目携带
code, (中文(简体) ),label, (中文(简体) ),type(单位:千美元)folder编号 :dataset编号 :table),以及hasChildren,带有parentPath面包屑和otherPlacements对于在多个分支中存档的文件夹; 失败not_found对于一个未知代码,not_a_folder用于数据集或表格代码,或可重试upstream_fault当没有装入目录,欧统局的目录无法到达时 - 如果无法装入Comext数据流列表,
ext_go财务报告和审定财务报表icts携带comextListMissing(单位:千美元)notice; 无法刷新的目录catalogueLoadedAt
eurostat_get_dataset_info 工具
- 一个
dataset_code; 以valuesCount不超过10个sampleValues附加时timeRange, (中文(简体) ),obsCount, (中文(简体) ),lastUpdated和无害环境管理metadataUrl - 失败作为
not_found用于未知数据集,或upstream_fault当欧统局返回一个结构时,服务器无法读取( 当端点倒下时可重试)
eurostat_get_dimension_values 工具
dataset_code加号dimension,准确先解决,然后对案件不敏感(TIME_PERIOD别名time; 返回的值代码和标签保持不变。 对于geo, (中文(简体) ),geo_level选择 NUTS 级别(aggregate, (中文(简体) ),country默认,nuts1, (中文(简体) ),nuts2, (中文(简体) ),nuts3) (中文(简体) ).filter保留其代码和标签包含每个给定单词的值,忽略大小写和重音(palma frankfurt发现DE_EDDF_ES_LEPA(三);code_prefix保留其代码始于文字的值,忽略大小写( q)geo_levelnuts2与DE列出德国NUTS 2区域。 两者在呼叫前适用,并计入matchCountlimit默认为25个,并带有通知夹到1000个。 页面包含许多值, 结尾更少, 有totalCount完整列表; 包含更多的页面truncated, (中文(简体) ),nextCursor(通过回作为cursor页:1notice继续保留有效计数,忽略新的limit; 较旧的光标大于 1 000 , 并随披露而正常化为 1 000 。 失败作为not_found, (中文(简体) ),no_results, (中文(简体) ),conflicting_params, (中文(简体) ),invalid_cursor, (中文(简体) ),upstream_fault(在终点倒下时可重复),或canvas_not_foundcanvas_id将维度的完整列表作为code编号 :label表格 (单位:千美元)canvasId编号 :tableName编号 :stagedRowCount随便filter, (中文(简体) ),code_prefix或者说limit说,它通过一个加入来标记下载的代码列;它从不启动自己的画布. A 类geo表格添加一个level列(无 NUTS 级别代码的 NULL),并且,不geo_level,将每个级别、总量和区域与所包含国家重叠:过滤器level加入或聚合之前
eurostat_query_dataset 工具
dataset_code加号filters(单位:千美元){dimension_code: [values]}, (中文(简体) ),geo_level,则since_period编号 :until_period(单位:千美元)2020, (中文(简体) ),2020-Q1, (中文(简体) ),2020-01下至YYYY-Wnn财务报告和审定财务报表YYYY-Dnnn)或(或)last_n_periods· ;preview_limit是一个正整数(默认为25),在通知后被夹到500;lang实值EN, (中文(简体) ),FR,或DE- 欧统局代码中没有
+或者说.: 过滤值持有+被拆分为单独的值,读作 OR(["DE+FR"]实值["DE", "FR"](掌声).保留一个与无匹配的值。 在选定期间无单元格的有效值不贡献行,以及emptyValues说吧 stage: true在可用帆布上分阶段进行整个匹配,无论大小; 重复使用canvas_id或者省略它来创建一个。 没有它,自动启动开始 超过5 000个观测.truncated仍然说明这一门槛值;tableName确定一个分阶段的结果。 Canvas 故障部署显示,没有明确的集结请求是不存在的last_n_periods计数数据集时间位置,其中可以包括没有人间单元格的期间。 整个比赛(截至最新24次,略去一个计数)的通知名称缺口,并通知一个更大的N(一个频率的准确名称),或 asince_period– 说吧 –until_period区域以单元格结束于切片的最近周期,只有在每段时间与该周期相接时- 欧统局只保留全部内期
since_period– 说吧 –until_period每个频率。 通知中列出了约束期和包含该期限的约束期。 一天的范围外出为time=<date>,因为欧统局忽略了一天的界限 - 每个观测每个维度都带有代码/标签对,一个无效
value, (中文(简体) ),status(OBS FLAG),以及confStatus(CONF STATUS) (中文(简体) );obsCount, (中文(简体) ),missingObsCount, (中文(简体) ),absentCellCount(在每一频段内,从第一个频段到最近一个频段都缺少对应的序列;这些序列不是观测,从不进行)timeRange覆盖整个比赛。 通知名称的周期超过这个期限.truncated超过5 000项观察,unmatchedValues名称过滤值不匹配,以及emptyValues名称值数据集有,但此匹配没有单元格( undergeo_level,该级别的所有代码均无) - 失败作为
not_found, (中文(简体) ),no_results(将未匹配的值命名为其维度的有效代码,或当值超过 25 时进行值搜索,无值的时段,为什么选定范围没有时段,或geo_level欧统局的答复只字不提,invalid_dimension(将每个不是维度的过滤键命名,数据集的维度按密钥顺序排列),invalid_period, (中文(简体) ),conflicting_params,不可重试async_response对于一个太大的查询 服务,retry_deadline_exceeded当统计API未在请求期限内完成查询时,canvas_not_found,或可重试upstream_fault当统计 API 下降时
eurostat_download_dataset 工具
dataset_code加上同样的filters地图和since_period编号 :until_period(无)last_n_periods: TSV 保持一列每段时间, 除非一个范围缩小它);preview_limit是一个正整数( 默认 25), 并附加通知后夹入到 500- 完全内在的规则及其通知也在这里适用。 当天和下一天的一天范围请求,之后一天的栏被删除,然后再计算或放映
- 每个非空白的 TSV 单元格为一行。 无效行
obs_value没有旗帜、状态或文字(未标记):)不是一个观察:这是系列缺少的时期,是系列没有观测到的(混合频率片段的粘贴)频率的时期,或者是任何被下载行有观察的周期之前或之后的一段时间,其中通知名称 filters遵循查询工具的规则:一个值持有+被拆分为单独的值(OR),和一个持有.以invalid_dimension由于欧统局的代码中没有包含任何代码, 在选定期间没有观测值的有效值不添加行,以及emptyValues名称( 当budgetExceeded事实)- 回返
rowCount(以totalCount, (中文(简体) ),missingCount, (中文(简体) ),absentCellCount(未加标记的行在序列所带频率的期间,在该频率从第一个周期到最近一个周期内,并在任何下载的行中进行观察),periodRange(由有数值、旗帜、状态或文字的行所组成),和bytesRead整个下载; 失败not_found, (中文(简体) ),invalid_dimension, (中文(简体) ),invalid_period, (中文(简体) ),filter_arity,不可重试async_queued或者说extraction_too_big, (中文(简体) ),no_results, (中文(简体) ),upstream_fault(在SDMX终点下降时可重复),retry_deadline_exceeded当转移超过时EUROSTAT_BULK_TIMEOUT_MS或过滤后下载结构读取超过请求最后期限,或canvas_not_found - 这个
EUROSTAT_BULK_MAX_BYTES预算( 默认 50 MiB 解码) 在允许的前缀中保留完整的行并返回budgetExceeded: true。对于一个完整的标题和可用的行,预算太小,因为byte_budget_exceeded,并设置了限制和缩小指导.bytesRead已接受的已解码字节数, 不超过预算数; 已丢弃不完整的后行数 .
eurostat_dataframe_describe 工具
canvas_id; 列出每个表格的name, (中文(简体) ),rowCount键入的列,以及expiresAt(滑动)CANVAS_TTL_MS,默认为 24h;失败为canvas_not_found或者说canvas_disabled- 列取决于中转工具 :
eurostat_query_dataset写代码和代码_label每个维,eurostat_download_dataset仅加码time(双方共享obs_*财务报告和审定财务报表conf_status*措施),以及eurostat_get_dimension_values写入code财务报告和审定财务报表label(单位:千美元)level页:1geo(中文(简体) )
eurostat_dataframe_query 工具
- 一个只读
SELECT每个调用; 链式语句、 其他动词和读取文件或外部数据的函数被拒绝 - 回返
columns, (中文(简体) ),rows, (中文(简体) ),rowCount布尔truncated。帆布提供的每行都完好无损地返回,最多不超过CANVAS_DEFAULT_ROW_LIMIT(违约10,000)。 单元格渲染为无损失的JSON,包括嵌入和引出字符串;64位整数以字符串形式来. 失败作为missing_table, (中文(简体) ),canvas_not_found,或canvas_disabled - 一个剪接集
truncated: true并增加一个通知。 页: 1ORDER BY(需要解开口),LIMIT财务报告和审定财务报表OFFSET; 按实际rowCount。重新启动一个最初未排序的结果,排序为相抵零。 波动 SQL 和变化或过期的表格不能提供稳定的呼号
eurostat_dataframe_drop 工具
canvas_id加号table_name,与eurostat_dataframe_describe列表; 删除一个表格,并保留画布和其他表格。 仅在EUROSTAT_DATAFRAME_DROP_ENABLED=true设置在画布旁边- 回返
canvasId, (中文(简体) ),tableName, (中文(简体) ),dropped,以及expiresAt· ;dropped实值false,带有notice所以重复一滴就安全了 失败作为canvas_not_found, (中文(简体) ),identifier_reserved,或canvas_disabled
eurostat://dataset/{dataset_code} 资源
- 有效载荷与
eurostat_get_dataset_info,返回为application/json; 失败的读取方式相同reason和复原提示retryable在停产时 dataset_code来自eurostat_search_datasets或者说eurostat_browse_themes
特征
建造在 @cyanheads/mcp-ts-core: stdio和可流式的 HTTP 传输器,可插接式(none 编号 : jwt 编号 : oauth),可互换存储(in-memory, (中文(简体) ), filesystem, (中文(简体) ), Supabase, (中文(简体) ), Cloudflare KV/R2/D1),结构化记录,可选择的OpenTeleometry tracking.
欧统局:
- 切片的统计API(JSON-stat 2.0),整个数据集的SDMX 2.1 TSV批量端点,大约为字节的一半,目录TOC被缓存了12个小时
- Comext 主机的游戏
DS-*通过同样的工具收集资料(由CN8、HS、SITC、BEC和CPA以及PRODCOM进行的详细贸易)。 过滤每个请求,freq由于贸易流动是年度系列和月系列的混合TOTAL, (中文(简体) ),EU27_2020,以及EXT_EU27_2020与其成员进行合并时的双重计算。 PRODCOM 文本值到达valueText编号 :obs_value_text - NUTS的地平层过滤(
aggregate编号 :country编号 :nuts1编号 :nuts2编号 :nuts3),并将 OBS FLAG和CONF STATUS解码为单独的字段 - 太大的到服务器的回复作为不可重审的回复回来
async_response, (中文(简体) ),extraction_too_big,或async_queued指定要过滤的维度的错误 - 查询方式
stage: true,超过5000个观测结果的匹配,或任何批量下载都作为SQL表进行(canvasId编号 :tableName编号 :stagedRowCount)在 DuckDB 数据帧画布上,默认为上. 这个.mcpb将本地 DuckDB 绑定并运行CANVAS_PROVIDER_TYPE=none,所以SQL分析器需要npm,Docker,或者从源安装
方便代理输出 :
- 已打入错误合同:每一次宣布的失败都带有
reason(单位:千美元)recovery.hint命名下一个要调用的工具 - 下一步提示 :
eurostat_search_datasets财务报告和审定财务报表eurostat_browse_themes返回 anextStep指着后续电话 - 未知保留未知:计算和时限 欧统局不报告(
obsCount, (中文(简体) ),timeRange.start编号 :end, (中文(简体) ),lastUpdated) 被省略而不是去除零 - 有效克瑞回声:
appliedFilters打开eurostat_query_dataset财务报告和审定财务报表appliedQuery(用SDMX表示)url继续eurostat_download_dataset外加一个notice当预览省略行
开始
连接到主机实例 :
claude mcp add --transport http eurostat-mcp-server https://eurostat.caseyjhand.com/mcp
或者在当地运行它:
claude mcp add eurostat-mcp-server -- npx -y @cyanheads/eurostat-mcp-server
对于其他客户端,请将此添加到 MCP 配置文件中 :
{
"mcpServers": {
"eurostat-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/eurostat-mcp-server"]
}
}
}
不需要 API 密钥 。 对于 Docker 或源构建,请参见 运行服务器。 。 。 .
配置
| 变量 | 说明 | 默认 |
|---|---|---|
EUROSTAT_BASE_URL | 欧统局API基础URL. | https://ec.europa.eu/eurostat/api/dissemination |
EUROSTAT_COMEXT_BASE_URL | 通信传播主机,服务于 DS-* 数据集代码(详细贸易和PRODCOM). | https://ec.europa.eu/eurostat/api/comext/dissemination |
EUROSTAT_REQUEST_TIMEOUT_MS | 一项请求的备抵总额,包括复试、退后和身体读取,以毫秒计. | 30000 |
EUROSTAT_METADATA_TIMEOUT_MS | 用于一个数据集的SDMX数据流结构的总允许量,包括复刻、倒接和正文读取,以毫秒计. | 120000 (2分钟) |
EUROSTAT_TOC_CACHE_TTL_MS | 目录 TOC 缓存寿命,以ms为单位. | 43200000 (12小时) |
EUROSTAT_BULK_TIMEOUT_MS | 一次批量转移的总允许量,包括请求重试、回放和流出,以及每一次建立尺寸值指数的下载,以毫秒计. | 120000 (2分钟) |
EUROSTAT_BULK_MAX_BYTES | 一个批量下载的字节预算. | 52428800 (50个米B) |
CANVAS_PROVIDER_TYPE | 数据框架画布后端; none 禁用画布及其工具。 这个 .mcpb 捆绑集 none。 。 。 . | duckdb |
CANVAS_TTL_MS | 滑动的一生 舞台画布,以ms为单位. | 86400000 (24小时) |
CANVAS_DEFAULT_ROW_LIMIT | 最大完成一行 eurostat_dataframe_query 报告前返回 truncated。 。 。 . | 10000 |
EUROSTAT_CLAMP_LIMITS | 粘接正整数预览/搜索/分解限制为500/100/1000,并附有通知. false 恢复拒绝超额输入的策略;零,负数,分数和非数字输入总是被拒绝. 每个夹口日志一次并递增 eurostat.limit_clamps,用工具标出标签. | true |
EUROSTAT_DATAFRAME_DROP_ENABLED | true 列表 eurostat_dataframe_drop; 无效果 CANVAS_PROVIDER_TYPE=none。 。 。 . | false |
MCP_TRANSPORT_TYPE | 运输: stdio 或者说 http。 。 。 . | stdio |
MCP_HTTP_PORT | HTTP 服务器端口. | 3010 |
MCP_SESSION_MODE | HTTP 会话模式 : stateless, (中文(简体) ), stateful,或 auto。服务器宣布 stateless; 一组值将覆盖它. | stateless |
MCP_AUTH_MODE | 认证 : none, (中文(简体) ), jwt,或 oauth。 。 。 . | none |
MCP_LOG_LEVEL | 日志级别 (debug, (中文(简体) ), info, (中文(简体) ), warning, (中文(简体) ), error(见A/C.5/49/70,附件)。 Docker 图像集 info。 。 。 . | debug |
LOGS_DIR | 日志文件目录(只有Node.js). | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | 记录每个工具调用失败的参数和结果,按密钥名称编辑并封顶 LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES (默认) 16384) (中文(简体) ). 自由形式值内部的秘密不编辑 . | false |
STORAGE_PROVIDER_TYPE | 存储后端 : in-memory, (中文(简体) ), filesystem, (中文(简体) ), supabase, (中文(简体) ), cloudflare-kv/r2/d1。 。 。 . | in-memory |
OTEL_ENABLED | 启用 打开几何。 。 。 . | false |
见 .env.example 用于完整可选覆盖列表.
运行服务器
地方发展
要求数 Bun v 1.4.4 (单位:千美元) 或更高(或Node.js v24+).
git clone https://github.com/cyanheads/eurostat-mcp-server.git
cd eurostat-mcp-server && bun install
cp .env.example .env # optional; every setting has a default
-
构建和运行制作版本数字 :
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
运行检查和测试数字 :
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite bun run lint:mcp # Validates MCP definitions against spec
夹克
docker run --rm -p 3010:3010 ghcr.io/cyanheads/eurostat-mcp-server:latest
图像默认为 HTTP 传输、 无国籍会话模式和日志到 /var/log/eurostat-mcp-server。用于 stdio, 使用 docker run -i --rm -e MCP_TRANSPORT_TYPE=stdio ghcr.io/cyanheads/eurostat-mcp-server:latest。通过 docker build -t eurostat-mcp-server .; OpenTeleometry 端点依赖性默认安装——用 --build-arg OTEL_ENABLED=false 以略去它们.
项目结构
| 目录 | 目的 |
|---|---|
src/index.ts | createApp() 入站点——注册工具与资源,inits服务,打开画布上的数据框工具和自旗上放出的工具. |
src/mcp-server/tools | 工具定义*.tool.ts) (中文(简体) ). 6个发现和数据工具,外加3个被画布标出的数据框工具,其中1个是选入. |
src/mcp-server/resources | 资源定义。 数据集元数据资源. |
src/services/eurostat-catalogue | 目录服务——获取并解析了欧统局TOC,将Comext数据流列表合并入其中,并构建维度值指数搜索回落到(元数据库代码,代码列表标签),并带有TTL所绑入的内嵌缓存. |
src/services/eurostat-data | API统计服务——SDMX元数据解析每集缓存,JSON-stat 2.0解码,ASync-Resign检测,画布行源. |
src/services/eurostat-bulk | SDMX 2.1 TSV批量服务——流出下载,字节预算,SOAP断层映射,画布行源. |
src/services/eurostat-codelists.ts | OBS FLAG和CONF STATUS代码列表,测量栏名均由艺人编写,并有文本值解码器. |
src/services/eurostat-hosts.ts | 哪个主机服务于数据集代码 : DS-* 给Comext主机, 其他一切给主机. |
src/services/canvas-accessor.ts | 可选 DataCanvas 的访问器和获得的帮助画布-触摸工具共享 . |
src/services/shared-load.ts | 让我们同时呼叫者等待一个共享下载,所以一个呼叫者的取消只释放那个呼叫者. |
src/config | 服务器特定环境变量与Zod解析并验证. |
skills/ | 已出版Eurotat-guide和SQL参考文献,服务于MCP之上并包含在安装包中. |
tests/ | 单位和综合测试,反映 src/ 结构. |
发展指南
见 CLAUDE.md 发展准则和建筑规则。 简本:
- 搬运工投掷,框架渔获量——否
try/catch在工具逻辑中 - 使用
ctx.log用于伐木,ctx.state用于存储 - 登记册中的新工具和资源
createApp()数组在src/index.ts - 环绕外部 API 调用: 验证 生 → 规范到域类型 → 返回输出计划; 永远不要编织缺失的字段
捐款
问题值得欢迎。 提交前进行检查和测试:
bun run devcheck
bun run test
许可证
这个项目根据Apache 2.0许可证获得许可. 见 自由主义 详细文件.