
ihalent
io.github.gulmezeren2-byte由 GitHub 帳號 gulmezeren2-byte 發布v0.3.0更新於 Oct 25, 2026
Turkish public-tender (EKAP) award intelligence: firm histories, discounts, competition, red flags
概覽
本機 MCP 伺服器,將土耳其公共招標(EKAP)結果公告整理為結構化得標資料,並回答廠商歷史、折扣、競爭與風險訊號等問題。
- 可以做什麼
- 分析招標資料集:總覽金額、折扣、競爭情況與資料缺口,並計算得標集中度(HHI)。
- 適用情境
- 當你已經擁有或能夠蒐集 EKAP 結果公告,並希望助理跨多筆得標紀錄進行分析,而不是逐筆閱讀公告時使用。
- 執行需求
- 以本機 Python 程序執行,需安裝含 MCP 附加元件的套件。伺服器讀取由環境變數 IHALENT_AWARDS 指定的 JSONL 得標資料檔。公告蒐集不包含在內,需由其他工具完成。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 ihalent,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
ihalent
Turkish public-tender award intelligence: who won, for how much, at what discount, against how many bidders.
[CI] [PyPI] [Python] [License: MIT]
Built on top of saidsurucu/ihale-mcp — ihale-mcp reaches EKAP; ihalent structures and analyzes what it returns.
Every public tender in Turkey ends with a Sonuç İlanı — a result notice that states the estimate, the contract price, the winner, and how many firms bid. The notices are public. They are also one at a time, unstructured, and impossible to reason across: you cannot ask EKAP "what has this company won in the last two years" or "how far below estimate does this authority actually award." ihalent turns those notices into structured records and answers exactly those questions — firm histories, discount (kırım) distributions, and competition metrics — with every number traceable back to the notice it came from.
That is real output over nine real construction awards from the December-2025 / January-2026 window (in
examples/). The -2.96% at the bottom of the range is not a bug: Istanbul
University awarded a 615-million-lira campus job at 2.96% above its own estimate,
through an emergency "pazarlık" procedure — a contract signed over the public estimate,
which is precisely the kind of thing that should be easy to see and currently is not.
Why this exists
I'm an industrial engineer and I work in construction. When our firm weighs a public tender, the questions that decide the bid are all about other people's history: how far below estimate does this authority award, how many firms usually show up, what has a given competitor been winning and at what price. All of that is public — it is sitting in tens of thousands of result notices on EKAP — and none of it is queryable. So everyone rebuilds a private, partial version of it by hand, in spreadsheets, badly.
There is already an excellent tool for reaching this data: saidsurucu/ihale-mcp solved authenticated EKAP access and hands you the notices. ihalent is the layer above it — the one that turns a pile of notices into an answer. It does not re-scrape EKAP; it structures what you have collected and does the analytics that don't exist yet.
What it answers
A firm's history — every award across the dataset, folded across spelling variants:
Where the discounts are — grouped and sorted, highest first:
Competition — how many valid bids show up, and how often exactly one does (a single-bid award is a flag procurement watchdogs care about). It's in the overview above.
The one rule
A number is never shown without the ground it stands on. A mean discount always comes
with "over how many awards, and how many were dropped for a missing estimate." A firm's
total contract value says so when some of its wins had no published price, so you read it as
a floor, not the full figure. A discount is None, never 0, when the estimate wasn't
published — ihalent does not invent the numbers the government didn't print. Half the value
of a tool like this is refusing to guess.
Install
Or from source: pip install git+https://github.com/gulmezeren2-byte/ihalent.
The workflow
ihalent reads a JSONL file of awards. You produce it by collecting result notices — the easy path is ihale-mcp — and letting ihalent structure them:
Every command takes --json for pipelines and agents. Or skip collection and try the
bundled example directly:
Commands
Using it with AI agents
The result notice is unstructured text; the interesting questions are aggregate. That is an
awkward fit for an agent working notice-by-notice, and a natural fit for a tool: --json
output with stable fields, an exit code that means something, and a firm-name match that
folds spelling variants so an agent doesn't have to.
There is a native MCP server (pip install 'ihalent[mcp]') that exposes the analytics
as tools — overview, firm, discounts, concentration, flags, parse_notice,
ingest_bundle — over a dataset you point it at:
No local Python? The Dockerfile builds the same server:
docker build -t ihalent . && docker run --rm -i -e IHALENT_AWARDS=/data/awards.jsonl -v "$PWD:/data:ro" ihalent.
Pair it with ihale-mcp and an agent can collect notices and reason across them in one
session: ihale-mcp fetches, ihalent structures and aggregates. The Python API
(ihalent.ingest_bundle, ihalent.analytics.firm_profile) is three calls deep if you'd
rather script it.
Scope, honestly
- This is analytics, not a scraper. Collection is ihale-mcp's job (it does it well); ihalent deliberately owns the layer above and stays a pure function of the data you give it — no network, no signing keys, nothing that breaks when EKAP rotates a header.
- Company-name folding is conservative on purpose. It merges legal-form suffixes and
Turkish spelling variants, and it would rather show two rows for one firm than one row for
two — so
firmreports how many distinct spellings a query matched, and warns you if that is more than one. - The parser tracks one document: the result notice. Bid-level detail (who else bid, at what price) is not in the notice and so is not here. Discount is the estimate-to-contract gap, which the notice does carry.
- Award values are nominal lira, as printed. Comparing 2023 and 2026 contracts is your analysis to make with the dates in hand; ihalent does not silently inflation-adjust.
What ihalent is not
It is not a replacement for ihale-mcp — it sits
on top of it. It is not a live dashboard or a paid tender-alert service; it is a library and
a CLI you point at data you control. And it does not redistribute a dataset: it ships the
handful of real notices in examples/ and the code to structure your own.
A note on the data
Public-tender results are public information, published by the state for public scrutiny. ihalent structures what EKAP already discloses. Company names that appear are legal entities in their public commercial capacity, not private individuals.
How this project is built
I designed the model and the analytics and I review every line; I use AI agents (Claude Code) heavily for implementation speed, and the commit trailers say so. The contract is the tests — 80 of them, built on the exact JSON shapes EKAP and ihale-mcp emit, including a result notice with a negative discount and a cancelled tender. They don't care who typed them.
Related
- acikpoz — the other half of the Turkish public-procurement picture.
ihalentreads the tender result notices that say who won and at what discount;acikpozreads the unit-price (birim fiyat) catalogs that say what the work should have cost. Same discipline: every figure traceable to its source, nothing invented.
More tools by Eren Gülmez.
License
MIT — Mehmet Eren Gülmez
來源:README.md,提交 f1f5940
工具
0版本歷史
1- v0.3.0最新Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分