Skip to main content
Glama
dam2452

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: Atlas Przetargów

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
tender_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the responsibility for behavioral disclosure. It does disclose that amounts are returned as raw strings exactly as published and usually in PLN, which is useful. It does not mention failure behavior, empty results, or whether the extraction can be partial, leaving some behavioral uncertainty.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact: one purpose sentence, one detail sentence, and one example. It is front-loaded with the primary action and contains no filler, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with an output schema, the description covers input, extraction scope, return format, and a concrete example. It omits explicit comparison with sibling tools, but that is more of a usage-guidance issue; the core information needed to invoke the tool correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage for tender_id, so the description must compensate. The example call demonstrates the expected ID format and connects the parameter to a tender notice, but the description never explicitly defines tender_id or explains where such an ID comes from. This is helpful but not fully sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: extract contract/order money amounts from a tender notice full text. It also lists the exact kinds of values found (contract value, total paid, estimated value, etc.) and notes that these are not exposed by structured API fields, which distinguishes it from sibling lookup tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when structured API fields do not expose certain monetary amounts, giving the agent a decision rule. However, it does not explicitly name sibling alternatives or state when not to use this tool, so the guidance remains mostly implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
nipYes
include_winning_contractorsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. 'Get' implies a read operation, and the optional contractors behavior is disclosed. However, it does not mention NIP validation, error/not-found behavior, or that include_winning_contractors could trigger heavier computation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the core purpose, and both examples earn their place by demonstrating parameter usage. There is no redundant or boilerplate text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only lookup with two parameters and an output schema, the description covers the main inputs and optional behavior. It could add a note on when to use get_contractor instead, but nothing critical is missing for basic invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates by explaining that nip identifies the procuring entity and that include_winning_contractors controls whether top winning contractors are returned. The two examples show realistic call forms and how to set the boolean, though NIP format and default behavior are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: it retrieves a procuring entity (zamawiający) profile by NIP, with an optional enrichment of frequently winning contractors. This clearly distinguishes it from sibling tools like get_contractor and search_entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context: use this when you have a buyer's NIP and want a buyer profile, optionally with top winning contractors. It does not explicitly name alternatives or exclusion conditions, which prevents a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
cpvYes
windowNoyear

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the transparency burden and does disclose a non-obvious upstream behavior: the API sometimes ignores the requested window, so the response must be verified against the actual days applied. This is valuable beyond the schema, though it does not discuss permissions or error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description has three compact components: purpose, one critical caveat, and two examples. Every sentence earns its place, and the most important behavioral warning is prominently placed before the examples.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter stats tool with an output schema, the description provides the computed metrics, input examples, and a necessary caveat about response verification. It does not discuss routing to sibling tools, but that omission is already reflected in usage_guidelines.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does so with concrete examples ('302', '45240000-1', window='quarter') and identifies cpv as a CPV category. The window parameter's allowed values are left to the schema enum, but the examples and 'requested window' phrasing convey its role clearly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get aggregate statistics for a CPV category' and enumerates exact metrics: tender count, average and median value, average offers count, average deadline length. This is specific and distinguishes it from siblings like get_province_stats and search_tenders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly scopes usage to CPV-category aggregate statistics, and the examples show realistic calls. It does not explicitly state when to prefer a sibling like get_province_stats or when not to use this tool, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
nipYes
include_winning_buyersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It does indicate what data is returned, but it does not explicitly state that this is a read-only operation, how missing NIPs are handled, or the effective default for include_winning_buyers. The 'Get' phrasing implies safety, but more explicit behavioral context would be better.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, information-dense sentences plus a useful invocation example. Every part earns its place, and the core behavior is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter lookup with an output schema present, the description is largely complete. It could be more complete by noting when to choose this over search_entities/get_buyer and clarifying the ambiguous 'win geography' phrase, but the essential calling context is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must explain the parameters. It does: 'nip' is clearly the contractor identifier, and include_winning_buyers is tied to optionally returning the buyers the contractor most frequently wins tenders from. It does not describe NIP format or the default-true behavior, but the schema default partially covers the latter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Get') and a specific resource ('contractor profile by NIP'), and names the distinctive outputs: win geography and optionally the most frequent winning buyers. This clearly distinguishes the tool from siblings such as get_buyer or search_tenders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context is clear: use this to fetch a contractor profile when you have a NIP. However, it does not explicitly say when to prefer this over alternatives like search_entities or get_buyer, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNo
provinceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It explains the three output modes and what kind of data is returned, which is useful. However, it does not specify behavior when both province and city are provided, whether arguments are mutually exclusive, or what defaults apply beyond the example-driven use cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: one main sentence defining the tool's capabilities, followed by three minimal example invocations. Every line adds value, and the format is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with only two optional parameters and an output schema, the description covers the core call patterns and expected responses well. The main gaps are edge-case behavior around combining arguments and possible constraints on city/province values, but the essentials are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no descriptions, so the description compensates with concrete examples: province="PL12" and city="Kraków". It clarifies that province expects a code and city expects a name, and ties each parameter to a specific drill-down behavior. The province enum in the schema already provides valid values, and the description reinforces their usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns tender statistics and specifies three distinct modes: full province ranking, a single province, and city drill-down. It also names the output components (ranking, top buyers, top CPV categories), which distinguishes it from sibling tools like search_tenders and get_category_stats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete usage guidance through examples: no arguments for the full ranking, a province code for one province, and a city name for drill-down. It does not explicitly contrast with sibling tools or state when not to use it, but the examples give an agent enough context to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNo
tender_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It explicitly warns that full=True can return a very large htmlBody, and that the default response excludes it. This is valuable behavioral context beyond the schema, though it does not mention error behavior or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: summary, parameter behavior, then examples. Every sentence adds necessary information, and the most important scoping detail (by ID) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema, the description covers the essential invocation semantics, parameter behavior, and size trade-offs. The output schema handles return-value documentation, so nothing critical is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully compensates by explaining tender_id through concrete examples and clearly documenting the full parameter's effect and default. The agent can correctly invoke the tool with either parameter combination.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get') and resource ('full details of a tender by ID'), and gives two concrete ID formats. This clearly distinguishes it from siblings like search_tenders or get_tender_timeline, as it targets a single tender lookup by identifier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the usage context obvious: call this when you already have a tender ID and need full details, reinforced by examples showing both required and optional parameters. It does not explicitly name alternatives or exclusion criteria, but the by-ID framing is strong enough guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
tender_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It discloses that statistics are extracted from result notice text and warns that it works best on specific ID types, implying dependence on notice type. It does not describe error or empty-result behavior, but for a simple read-style extraction tool this is a reasonable level of transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact: every sentence carries useful information, the main purpose is front-loaded, and the example is illustrative rather than redundant. There is no filler or repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with an output schema and no nested objects, the description covers the essential context: what the tool does, what kind of ID it expects, how to find that ID, and a working example. Missing failure-mode details are minor given the low complexity and the presence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description compensates with a concrete example ID format ('2023/BZP 00559582') and directs the caller to obtain the correct result-notice ID via get_tender_timeline. This adds practical meaning to the bare tender_id parameter, though it stops short of an explicit formal parameter definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description names the operation ('Get offer statistics for a tender'), specifies the exact resource, enumerates the data returned (number of offers, lowest/highest/winning prices), and identifies the extraction source (SEKCJA V). It also distinguishes itself from generic tender retrieval by referencing result notice IDs and the get_tender_timeline workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: it works best on TenderResultNotice / can-standard / ContractPerformingNotice IDs and instructs the agent to use get_tender_timeline first to find the result notice. It does not explicitly state when not to use it or name alternatives, but the guidance is sufficient for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
tender_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It discloses the output scope (notice chain, dates, notice types) and provides an example, but it does not disclose error behavior, ordering, or any side effects; as a 'get' tool this is a moderate gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences plus a usage example. The information is front-loaded and every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single required parameter, an output schema, and a read-oriented purpose, the description provides enough to call the tool correctly. It lacks only explicit alternative routing, which is already penalized in usage_guidelines.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain the parameter. It does so only implicitly: the example shows '2023/BZP 00510245' and the description ties the parameter to a procurement procedure. This is useful but leaves the identifier format and meaning partly inferred.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and defines the resource as 'full notice chain... with dates and notice types', enumerating stages. This makes the tool's purpose clear, though it does not explicitly contrast with siblings like get_tender.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when the full timeline of a procedure is needed, and the example shows a valid call. However it does not state when to prefer this over get_tender or raw_request, so the selection guidance is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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"}')

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
params_jsonNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations to carry the burden, the description does disclose the core behavior: it performs a GET request and requires the path to start with /api/. However, it does not describe response shape, error behavior, authentication expectations, or how params_json is handled behind the scenes, leaving some behavioral ambiguity in an otherwise generic escape-hatch tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the essential 'escape hatch' concept, and every part contributes value. The two examples are practical and demonstrate both parameters without unnecessary prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that this is a generic raw API request tool, the description is largely complete: it defines the path constraint, the HTTP method, and when to use it, with examples covering both optional and required parameter usage. It relies on the external API's own endpoint conventions for response details, which is acceptable for an escape hatch, though a note about the response format would make it fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It gives meaningful semantics for path by requiring the /api/ prefix and provides an example showing params_json as a JSON string used for query parameters. However, the description never explicitly explains that params_json is a JSON-encoded query parameter object, how it is serialized, or that it is optional beyond the schema default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies this as an escape hatch for GET requests to any Atlas Przetargów API endpoint, with the explicit path requirement that it must start with /api/. It distinguishes itself from dedicated tooling by stating it is for endpoints not covered by dedicated tools, and the examples reinforce the intended resource and call style.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: for endpoints not covered by dedicated tools. This directly signals that if a specialized sibling tool exists, it should be preferred, giving the agent a clear routing rule. It also constrains the HTTP method to GET, which is an important usage boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_cpvSearch CpvA

Look up CPV (procurement category) codes by Polish keyword.

Examples: search_cpv("komputer") search_cpv("budowa drogi", limit=5)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral burden. 'Look up' conveys a read-only, non-destructive operation, and 'by Polish keyword' adds useful input-language context. But it does not disclose matching behavior (e.g., partial/fuzzy matching), result ordering, or error conditions; the output schema mitigates return-format ambiguity somewhat.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the core purpose, and uses two concrete examples to clarify parameter usage. Every line earns its place, and there is no redundant elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter lookup tool with an output schema, the description covers the essential context: what is searched, in what language, and how the optional parameter is used. It does not mention when to prefer this over get_category_stats or raw_request, but the low complexity keeps the remaining gap minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only bare types and a default, with 0% description coverage. The description compensates well by showing that 'query' is a Polish keyword and demonstrating 'limit' with a concrete example (limit=5), which clarifies that limit controls result size despite the schema not explaining it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Look up'), a clear resource ('CPV (procurement category) codes'), and the required search dimension ('by Polish keyword'). It is clearly distinct from sibling tools like search_tenders and search_entities, which search different object types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The suggested usage is implied through the examples showing Polish keywords and an optional limit, so an agent can infer when to call this tool. However, there is no explicit statement of when to use this versus the sibling tools, nor any exclusion such as 'for tender search use search_tenders instead'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
entity_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It communicates the core behavior (name-based search returning NIP) and the entity_type filter, but does not disclose matching semantics, result limits, or edge-case behavior; the output schema mitigates return-value ambiguity but not behavioral caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact: one purpose sentence plus two concrete examples. Every sentence pulls weight, and the examples are immediately actionable for an agent deciding how to call the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a moderately simple search tool with an output schema, the description is nearly complete: it provides the primary use case, downstream consumers, and representative calls. The main missing piece is limit/result-count behavior, but the default and schema mitigate the gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description needs to compensate for the parameters. It clarifies query by saying 'by name' and illustrates entity_type through examples, but it does not explain the limit parameter or its default, and the enum values are only minimally contextualized.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: search buyers (zamawiający) and contractors (wykonawcy) by name, with the explicit goal of obtaining their NIP. It also names the downstream tools that consume the NIP, which distinguishes it from sibling search tools such as search_tenders and search_cpv.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: before get_buyer, get_contractor, or search_tenders with buyer_nip, when an entity's NIP is needed. It does not explicitly state when not to use it or name alternatives for the same lookup purpose, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
cpvNo
cityNo
pageNo
sortNo
limitNo
searchNo
date_toNo
provinceNo
buyer_nipNo
date_fromNo
value_maxNo
value_minNo
order_kindNo
notice_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a known behavioral quirk: the value_min/value_max filters are 'leaky at the API side' and results slightly outside the range can appear. This is valuable beyond what annotations could provide. However, no annotations are provided at all, so the description carries more burden; it doesn't mention pagination behavior, rate limits, or result count limits, but the leak warning is significant.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded: the first sentence states the purpose, the second discloses the known leak caveat, and the rest are examples. The examples are helpful but take up space; still, for a 14-parameter tool they're valuable. It avoids fluff and every part contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 14 parameters, 0% schema coverage, no annotations, and a large sibling set, the description does a solid job: it gives the source (BZP + TED), warns about leaky filters, and provides three representative example calls covering common use cases. It doesn't document the output schema (but an output schema exists, so that offset applies), nor explicitly state which filters require what conditions, but the examples partially cover that. The lack of explicit date format guidance is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the schema only provides property names, enums, and defaults. The description compensates by showing example parameter combinations: search='komputer', city='Kraków', notice_type='ContractNotice'; buyer_nip, cpv, sort; cpv, province, value_min, sort. These examples clarify how filters combine and how sort values work ('newest', 'value_desc'). The description still doesn't explain format of date_from/date_to or the exact meaning of order_kind, but the examples provide substantial guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Search Polish public tenders (BZP + TED) with filters.' It uses a specific verb ('search') and resource ('Polish public tenders'), and the mention of BZP + TED adds scope. It also distinguishes itself from siblings like get_tender, which is for retrieving a single tender, and search_entities/search_cpv for other entity types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives three concrete usage examples showing filter combinations, which implicitly teach when to use it. It doesn't explicitly state when not to use it or name alternatives, but the examples and the tool name 'search_tenders' make its context clear. It could be improved by explicitly saying 'use get_tender to fetch details for a specific tender ID.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.1.0
    • First observedextract_contract_value
    • First observedget_buyer
    • First observedget_category_stats
    • First observedget_contractor
    • First observedget_province_stats
    • First observedget_tender
    • First observedget_tender_offers
    • First observedget_tender_timeline
    • First observedraw_request
    • First observedsearch_cpv
    • First observedsearch_entities
    • First observedsearch_tenders

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

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    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.
    8
    203
    3
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Exposes French and EU public procurement data (BOAMP + TED) as MCP tools for AI agents, enabling search for tenders, awards, and winner intelligence via typed filters.
    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