atlas-przetargow-mcp-py
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@atlas-przetargow-mcp-py Search for IT tenders in Mazowieckie above 100k"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
atlas-przetargow-mcp-py
Atlas Przetargow Polish public procurement API MCP server. A Python/FastMCP rewrite of the official TypeScript server with several upstream bugs fixed and new tender-analysis tools added.
Table of contents
Related MCP server: LexSocket MCP Server
Tools
Tool | Parameters | Description |
|
| Search BZP + TED tenders with filters |
|
| Tender details; |
|
| Full notice chain of a procedure (announcement, revisions, result, performance) |
|
| Offers count and lowest/highest/winning prices from result notices |
|
| Contract/order money amounts extracted from notice text |
|
| Buyer profile + contractors that most often win its tenders |
|
| Contractor profile with win geography + top buyers |
|
| Find buyers/contractors by name (returns NIP) |
|
| Look up CPV codes by Polish keyword |
|
| Category stats: count, median value, avg offers, avg deadline |
|
| Province ranking, single province, or city drill-down |
|
| Escape hatch: GET any |
Fixed vs upstream TS server
Bugs found while testing @atlasprzetargow/mcp v0.1.1:
buyerNipfilter sent asbuyerNipwhile the API expectsbuyer_nip— filter silently ignored. Fixed here.get_buyerwinning contractors read fromwinners.contractorswhile the API returns{"data": [...]}— section never rendered. Fixed here.City stats returned an empty header although
/api/stats/city/{city}/top-buyersreturns data. Fixed here.get_category_statsrequested window can be ignored by the API (asks for year, returns 90 days) — this server returns the actualdaysvalue so the discrepancy is visible.get_contractorreturned 3 lines; this server returns the full profile (win geography, shares) plus winning buyers.
New tools not present upstream: get_tender_timeline, get_tender_offers, extract_contract_value, raw_request.
Environment variables
Variable | Required | Description |
| no | API base (default |
| no | Key for |
| no | Request timeout in seconds (default 20) |
Wiring it up
Only requirement: uv (https://docs.astral.sh/uv/). Nothing else to install.
Claude Code
claude mcp add atlas-przetargow-mcp-py -- uvx --from git+https://github.com/dam2452/atlas-przetargow-mcp-py.git atlas-przetargow-mcp-pyClaude Desktop / other MCP client
{
"mcpServers": {
"atlas-przetargow-mcp-py": {
"command": "uvx",
"args": ["--from", "git+https://github.com/dam2452/atlas-przetargow-mcp-py.git", "atlas-przetargow-mcp-py"]
}
}
}After pushing a new version: uv cache clean and restart the client.
Local run
uv run --directory . atlas-przetargow-mcp-pyTests (manual):
uv run --directory . --with pytest pytest test/Available Tools
12 toolsextract_contract_valueExtract Contract ValueA
Extract contract/order money amounts from a tender notice full text.
Finds contract value, total paid, estimated value, part values and offer prices that the structured API fields do not expose. Amounts are returned as raw strings exactly as published (usually PLN).
Examples: extract_contract_value("2026/BZP 00278142")
Inputs: tender_id (required). Returns: object
get_buyerGet BuyerA
Get a procuring entity (zamawiający) profile by NIP, optionally with the contractors that most frequently win its tenders.
Examples: get_buyer("6751199459") get_buyer("5252248481", include_winning_contractors=False)
Inputs: nip (required), include_winning_contractors. Returns: object
get_category_statsGet Category StatsA
Get aggregate statistics for a CPV category: tender count, average and median value, average offers count, average deadline length.
The response includes the actual days window the API applied - the
upstream API sometimes ignores the requested window, so verify it.
Examples: get_category_stats("302") get_category_stats("45240000-1", window="quarter")
Inputs: cpv (required), window. Returns: object
get_contractorGet ContractorA
Get a contractor (wykonawca) profile by NIP with win geography and, optionally, the buyers they most frequently win tenders from.
Examples: get_contractor("7781473428")
Inputs: nip (required), include_winning_buyers. Returns: object
get_province_statsGet Province StatsA
Get tender statistics: full province ranking (no args), one province, or a city drill-down with top buyers and top CPV categories.
Examples: get_province_stats() get_province_stats(province="PL12") get_province_stats(city="Kraków")
Inputs: city, province. Returns: object
get_tenderGet TenderA
Get full details of a tender by ID ('2026/BZP 00202613' or 'TED-123456-2026').
Set full=True to include the complete notice text (htmlBody) - it can be very large (tens of KB); default response excludes it.
Examples: get_tender("2026/BZP 00276746") get_tender("TED-279585-2026", full=True)
Inputs: tender_id (required), full. Returns: object
get_tender_offersGet Tender OffersA
Get offer statistics for a tender: number of offers, lowest/highest/ winning prices, extracted from the result notice text (SEKCJA V).
Works best on TenderResultNotice / can-standard / ContractPerformingNotice IDs - use get_tender_timeline first to find the result notice of a procedure.
Examples: get_tender_offers("2023/BZP 00559582")
Inputs: tender_id (required). Returns: object
get_tender_timelineGet Tender TimelineA
Get the full notice chain of a procurement procedure (announcement, revisions, result, contract performance) with dates and notice types.
Examples: get_tender_timeline("2023/BZP 00510245")
Inputs: tender_id (required). Returns: object
raw_requestRaw RequestA
Escape hatch: GET any Atlas Przetargów API endpoint (path must start with /api/). Use for endpoints not covered by dedicated tools.
Examples: raw_request("/api/tenders/agg/provinces") raw_request("/api/entities/search", params_json='{"q": "gddkia"}')
Inputs: path (required), params_json.
search_cpvSearch CpvA
Look up CPV (procurement category) codes by Polish keyword.
Examples: search_cpv("komputer") search_cpv("budowa drogi", limit=5)
Inputs: query (required), limit. Returns: result
search_entitiesSearch EntitiesA
Search buyers (zamawiający) and contractors (wykonawcy) by name to find their NIP for get_buyer / get_contractor / search_tenders(buyer_nip=...).
Examples: search_entities("szpital dziecięcy") search_entities("budimex", entity_type="contractor")
Inputs: query (required), limit, entity_type. Returns: result
search_tendersSearch TendersA
Search Polish public tenders (BZP + TED) with filters.
Note: value_min/value_max filter on the estimated value and are known to be leaky at the API side (results slightly outside the range can appear).
Examples: search_tenders(search="komputer", city="Kraków", notice_type="ContractNotice") search_tenders(buyer_nip="6751199459", cpv="302", sort="newest") search_tenders(cpv="45", province="PL12", value_min=1000000, sort="value_desc")
Inputs: cpv, city, page, sort, +10 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
Most tools map to clearly distinct resource/action pairs: search vs detail vs timeline vs entity profiles vs stats. The only potential confusion is between get_tender_offers and extract_contract_value, since both parse notice text and can return offer prices, but their focus (offer statistics vs all monetary amounts) is documented.
Tool names almost all follow a verb_noun snake_case pattern like search_tenders, get_tender, and get_category_stats. raw_request is the lone deviation, but it is clearly an escape hatch and does not create confusion.
Twelve tools is well within the ideal range for a domain-specific read-only API wrapper. Each tool covers a meaningful facet—search, detail, timeline, offers, entities, CPV lookup, stats—and none feels redundant.
The server covers core tender workflows: searching, retrieving details, following notice timelines, extracting offer/contract values, and resolving buyer/contractor entities. It also provides CPV and regional statistics plus a raw_request escape hatch for endpoints not yet wrapped, so agents rarely hit dead ends.
Maintenance
Related MCP Connectors
Polish public procurement for AI agents: BZP and TED tenders, awards, buyers and contractors.
For Przetargowy Janusz customers (trial or paid): Polish tenders, AI summaries, pipeline, filling
Search EU public tenders across TED and 8 national portals. Monitor, match, and analyse procurement.
Open public tenders and awards: EU TED, US SAM.gov, UK Find a Tender, AusTender.
Related MCP Servers
- AlicenseAqualityCmaintenanceSearch 800 000+ Polish public tenders (BZP + TED) from Claude Desktop, Cursor, Continue. Provides 8 tools for tender search, buyer/contractor profiles by NIP, market statistics, plus a glossary of 90+ Polish public procurement terms.4887 npm4MIT
- AlicenseNot gradedqualityDmaintenanceEnables search and analysis of European public procurement tenders, including EU above-threshold (TED) and below-threshold from 11 national sources, with hybrid search and filtering.MIT
- AlicenseNot gradedqualityDmaintenanceFind, analyze, and score Polish public tenders (BZP): parsed requirements, deadlines, certificates, and bid-fit scoring against your company profile.8 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables users to search recent EU TED and Spanish PLACSP tender notices by keyword, country, and source, and to retrieve individual notices by id. A free tier returns five notices without source links, while an API key from tender.bitscorp.co unlocks every notice and call.MIT