Skip to main content
Glama
atlas-przetargow-mcp-py

atlas-przetargow-mcp-py

by dam2452

atlas-przetargow-mcp-py

Polski

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_tenders

search?, buyer_nip?, cpv?, city?, province?, notice_type?, order_kind?, date_from?, date_to?, value_min?, value_max?, sort?, page=1, limit=20

Search BZP + TED tenders with filters

get_tender

tender_id: str, full: bool = False

Tender details; full=True includes complete notice text

get_tender_timeline

tender_id: str

Full notice chain of a procedure (announcement, revisions, result, performance)

get_tender_offers

tender_id: str

Offers count and lowest/highest/winning prices from result notices

extract_contract_value

tender_id: str

Contract/order money amounts extracted from notice text

get_buyer

nip: str, include_winning_contractors: bool = True

Buyer profile + contractors that most often win its tenders

get_contractor

nip: str, include_winning_buyers: bool = True

Contractor profile with win geography + top buyers

search_entities

query: str, entity_type?, limit=10

Find buyers/contractors by name (returns NIP)

search_cpv

query: str, limit=10

Look up CPV codes by Polish keyword

get_category_stats

cpv: str, window="year"

Category stats: count, median value, avg offers, avg deadline

get_province_stats

province?, city?

Province ranking, single province, or city drill-down

raw_request

path: str, params_json?

Escape hatch: GET any /api/* endpoint

Fixed vs upstream TS server

Bugs found while testing @atlasprzetargow/mcp v0.1.1:

  1. buyerNip filter sent as buyerNip while the API expects buyer_nip — filter silently ignored. Fixed here.

  2. get_buyer winning contractors read from winners.contractors while the API returns {"data": [...]} — section never rendered. Fixed here.

  3. City stats returned an empty header although /api/stats/city/{city}/top-buyers returns data. Fixed here.

  4. get_category_stats requested window can be ignored by the API (asks for year, returns 90 days) — this server returns the actual days value so the discrepancy is visible.

  5. get_contractor returned 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

ATLAS_PRZETARGOW_MCP_PY_API_BASE

no

API base (default https://atlasprzetargow.pl)

ATLAS_PRZETARGOW_MCP_PY_API_KEY

no

Key for /api/llm/* AI summary endpoints

ATLAS_PRZETARGOW_MCP_PY_TIMEOUT

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-py

Claude 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-py

Tests (manual):

uv run --directory . --with pytest pytest test/

Available Tools

12 tools
extract_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

    A4.1/5.0

    Scored across 12 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count5/5

    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.

    Completeness5/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      Search 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.
      4
      8
      87 npm
      4
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables 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
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables 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