关于 ihalent
ihalent 是面向土耳其公共采购分析的 CLI、库和 MCP 服务,可将 EKAP 结果公告整理为结构化数据并统计企业历史、折扣与竞争情况。它不负责抓取数据,并让统计值可追溯至公告。
主要功能
- 01整理 EKAP 结果公告
- 02查询企业中标历史与金额
- 03按机构等维度分析折扣
- 04识别单一投标及其他风险
- 05统计获胜者集中度
适用场景
- 01评估企业参与公共招标的竞争情况
- 02比较不同机构的历史授标折扣
- 03筛查单一投标和接近估算价的项目
MCP 相关
可选 MCP 服务将分析能力作为工具提供,包括概览、企业查询、折扣、集中度、风险标记、公告解析和数据导入。它处理由其他方式收集的数据,不负责抓取 EKAP。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
ihalent
土耳其公共招标中标情报:谁中标、金额多少、折扣多少、面对多少家投标方。
基于 saidsurucu/ihale-mcp 构建——ihale-mcp 负责访问 EKAP;ihalent 则负责整理和分析返回的数据。
土耳其的每项公共招标最终都会发布一份 Sonuç İlanı(结果公告),其中列明估算金额、合同金额、中标方以及投标企业数量。这些公告都是公开的。但它们是逐条发布的、没有结构,也无法进行横向分析:你无法向 EKAP 询问“这家公司过去两年中标了哪些项目”,也无法问“这个主管部门的实际授标价格比估算低多少”。ihalent 将这些公告转换为结构化记录,准确回答这些问题——包括企业历史、折扣(kırım)分布和竞争指标,并确保每个数字都能追溯到其来源公告。
这是对 2025 年 12 月至 2026 年 1 月期间九个真实建筑工程授标案例的实际分析结果(见 examples/)。范围底部的 -2.96% 不是错误:伊斯坦布尔大学通过紧急“pazarlık”程序,将一项价值 6.15 亿里拉的校园工程授予中标方,金额比自己的估算高出 2.96%——合同签订金额超过了公开估算。正是这类情况,本应很容易被发现,但目前却并非如此。
为什么要做这个项目
我是一名工业工程师,从事建筑行业。我们公司评估公共招标时,决定投标的关键问题都与其他企业的过往记录有关:这个主管部门通常以低于估算多少的价格授标?通常有多少家企业参与?某个竞争对手中标过哪些项目、价格又是多少?所有这些信息都是公开的——它们散落在 EKAP 上数以万计的结果公告中——却无法查询。因此,每个人都只能手动用电子表格重建一份不完整的私人数据,做得还很糟糕。
现在已经有一个很出色的工具可以获取这些数据: saidsurucu/ihale-mcp 解决了经身份验证访问 EKAP 的问题,并为你提供公告。ihalent 则是在其之上的一层,负责将一堆公告转化为答案。它不会重新抓取 EKAP,而是整理你已收集的数据,并完成目前尚不存在的分析。
它能回答什么
企业历史——汇总数据集中的所有中标记录,并合并不同拼写形式:
$ ihalent firm examples/sample-awards.jsonl "ÖZDEN YEL"
ÖZDEN YEL
wins: 1 joint ventures: 1 total contract value: 19.709.997,40 TL
Discount (kırım) — ÖZDEN YEL
┌────────┬────────┬────────┬────────┐
│ mean │ median │ min │ max │
├────────┼────────┼────────┼────────┤
│ 33.87% │ 33.87% │ 33.87% │ 33.87% │
└────────┴────────┴────────┴────────┘
based on all 1 awards.
top awarding authorities:
1x DSİ 14. Bölge Müdürlüğü
折扣分布——分组并排序,最高的排在前面:
$ ihalent discounts examples/sample-awards.jsonl --by authority
Mean discount by authority
┌──────────────────────────────────┬────────┬────────┬────────┐
│ authority │ mean │ median │ awards │
├──────────────────────────────────┼────────┼────────┼────────┤
│ DSİ 14. Bölge Müdürlüğü │ 33.87% │ 33.87% │ 1/1 │
│ Ziraat Bankası Genel Müdürlüğü │ 31.41% │ 31.41% │ 1/1 │
│ İstanbul YİKOB │ 26.98% │ 26.98% │ 1/1 │
│ İSKİ Genel Müdürlüğü │ 26.66% │ 26.66% │ 1/1 │
│ İTÜ Rektörlüğü │ 22.68% │ 22.68% │ 1/1 │
│ Esenler Belediyesi │ 21.99% │ 21.99% │ 1/1 │
│ Ağrı İl Özel İdaresi │ 19.99% │ 19.99% │ 1/1 │
│ Kağıthane Belediyesi │ 17.41% │ 17.41% │ 1/1 │
│ İstanbul Üniversitesi-Cerrahpaşa │ -2.96% │ -2.96% │ 1/1 │
└──────────────────────────────────┴────────┴────────┴────────┘
awards column: used / considered (excluded lack an estimate).
竞争情况——有多少份有效投标,以及有多少次恰好只有一份(只有一家投标的授标情况,是采购监督机构关注的风险信号)。上方的概览中已展示这些信息。
唯一原则
每个数字都必须有据可依。 平均折扣总会同时注明“基于多少次授标计算,其中多少次因缺少估算金额而被排除”。如果某家企业的部分中标项目没有公开价格,其合同总额会明确说明这一点,因此你看到的是下限,而非完整金额。未公布估算金额时,折扣值为 None,绝不会是 0——ihalent 不会捏造政府未公布的数字。这类工具的价值,有一半在于拒绝猜测。
安装
pip install ihalent # add [mcp] for the MCP server: pip install "ihalent[mcp]"
也可以从源代码安装:pip install git+https://github.com/gulmezeren2-byte/ihalent。
工作流
ihalent 会读取包含授标信息的 JSONL 文件。你可以通过收集结果公告来生成该文件——最简单的方法是使用 ihale-mcp,然后让 ihalent 对其进行结构化处理:
# 1. collect: with ihale-mcp connected to your agent, save what its
# get_tender_announcements returns (one or many tenders) to bundle.json
# 2. structure:
ihalent ingest bundle.json -o awards.jsonl
# 3. ask:
ihalent overview awards.jsonl
ihalent firm awards.jsonl "ACME İNŞAAT"
ihalent discounts awards.jsonl --by province --min 5
每条命令都支持 --json,便于用于管道和 Agent。或者跳过收集,直接试用随附示例:
git clone https://github.com/gulmezeren2-byte/ihalent && cd ihalent
python examples/build_sample.py # parses the real notices in examples/notices/
ihalent overview examples/sample-awards.jsonl
命令
| 命令 | 功能 |
|---|---|
ihalent overview AWARDS | 查看数据集的价值、折扣、竞争情况和数据缺口 |
ihalent firm AWARDS "NAME" | 查看一家公司的中标情况、总价值、折扣和中标地区 |
ihalent discounts AWARDS --by X | 按主管机构、省份或 tender_type 分组,计算平均折扣和中位数折扣 |
ihalent single-bid AWARDS | 列出只有一个有效投标的授标记录——没有真正的竞争(监管机构关注的指标) |
ihalent concentration AWARDS [--authority X] | 查看中标方集中度(HHI)——是不是总是那几家公司中标? |
ihalent flags AWARDS | 查看每条授标记录的风险标记:单一投标、价格接近估算价、没有估算价、弃标率高 |
ihalent parse NOTICE.md | 将一份结果公告转换为结构化 JSON |
ihalent ingest BUNDLE.json | 将收集到的 ihale-mcp/EKAP 输出转换为授标信息 JSONL |
与 AI Agent 搭配使用
结果公告是非结构化文本;真正值得关注的问题往往涉及汇总分析。这不太适合逐条处理公告的 Agent,却很适合作为工具:提供字段稳定的 --json 输出、有实际含义的退出码,以及能合并拼写变体的公司名称匹配功能,让 Agent 无须为此费心。
ihalent 提供原生的 MCP 服务(pip install 'ihalent[mcp]'),可将分析功能作为工具公开——overview、firm、discounts、concentration、flags、parse_notice、ingest_bundle——供你指定的数据集使用:
IHALENT_AWARDS=awards.jsonl ihalent-mcp
没有本地 Python?Dockerfile 可以构建相同的服务:
docker build -t ihalent . && docker run --rm -i -e IHALENT_AWARDS=/data/awards.jsonl -v "$PWD:/data:ro" ihalent。
将它与 ihale-mcp 搭配使用,Agent 就能在一个会话中收集公告并对其进行分析:ihale-mcp 负责获取,ihalent 负责结构化和汇总。如果你更愿意编写脚本,Python API(ihalent.ingest_bundle、ihalent.analytics.firm_profile)只需三层调用即可完成。
诚实说明范围
- 这是分析工具,不是爬虫。 收集工作由 ihale-mcp 负责(它做得很好);ihalent 刻意只负责上层处理,对你提供的数据执行纯函数操作——不访问网络、不需要签名密钥,也不会因 EKAP 更换请求头而失效。
- 公司名称的归并有意采取保守策略。 它会合并法律形式后缀和土耳其语拼写变体;宁可把一家公司的名称显示为两行,也不愿把两家公司合并成一行。因此,
firm会报告查询匹配到多少种不同拼写,并在数量超过一种时发出警告。 - 解析器只处理一种文档:结果公告。 公告中没有投标级别的详细信息(还有谁投标、报价是多少),因此这里也不包含这些信息。折扣是估算价与合同价之间的差额,公告中会列出这两项价格。
- 授标金额采用印刷出来的名义里拉。 如何结合手头的日期比较 2023 年和 2026 年的合同,由你自行分析;ihalent 不会悄悄进行通胀调整。
ihalent 不是什么
它不是 ihale-mcp 的替代品,而是构建在其之上。它不是实时仪表板,也不是付费招标提醒服务;它是一个库和一个命令行工具,用于处理你自己掌控的数据。它也不再分发数据集:随附的 examples/ 中只有少量真实公告,以及用于结构化你自己的数据的代码。
关于数据的说明
公共招标结果属于公共信息,由国家发布以供公众监督。ihalent 对 EKAP 已公开的信息进行结构化处理。出现的公司名称均为以公开商业身份开展活动的法人实体,而非个人。
本项目的构建方式
模型和分析由我设计,每一行代码也都由我审核;为了加快实现速度,我会大量使用 AI Agent(Claude Code),提交记录中的尾注也说明了这一点。衡量标准是测试——共 80 个,基于 EKAP 和 ihale-mcp 输出的确切 JSON 结构构建,其中包括一份折扣为负数的结果公告,以及一份已取消的招标。至于代码是谁敲的,这些测试并不在意。
相关项目
- acikpoz — 补全土耳其公共采购全貌的另一半。
ihalent读取招标结果公告,告知谁中标以及折扣是多少;acikpoz读取单价(birim fiyat)目录,说明工程本该花费多少。两者遵循同样的原则:每个数字都有据可查,绝不凭空捏造。
Eren Gülmez 的更多工具。
许可证
MIT — Mehmet Eren Gülmez
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。