Skip to main content
Glama
VladyslavMykhailyshyn

Prozorro.Sale MCP Server

Prozorro.Sale MCP Server

Read-only MCP server for Prozorro.Sale, the Ukrainian state platform that auctions public assets — small and large privatisation, land sale and rental, property lease, timber, subsoil, arrested and bankruptcy assets, sanctioned assets and non-performing loans.

The tools are organised around what people actually ask, not around HTTP endpoints. There is no GET /procedures/{id}/documents/{doc_id}/history tool; there is "show me the documents for this auction". Nothing writes: no bids are placed, no procedures are created or modified.

Tools

Tool

Question it answers

search_auctions

"What land is up for rent near Lviv under 50 000 ₴?"

get_auction

"Tell me everything about SPD001-UA-20260806-70620."

get_auction_timeline

"How long do I have left to bid, and what happens next?"

get_auction_results

"What did it finally sell for, and how many bidders were there?"

get_auction_documents

"Give me the technical specification and the signed contract."

find_comparable_auctions

"Is this starting price reasonable for this kind of asset?"

track_auction_changes

"What new lots appeared in my niche since yesterday?"

analyze_auction_market

"How much timber was auctioned last week, and how much of it sold?"

list_procedure_types

"Which asset programmes and auction formats exist?"

get_publication_constraints

"If I list a lot today, how soon can the auction run?"

Every tool accepts the public auction id printed on the website (LRE001-UA-20260708-03894) as well as the internal 24-character procedure id.

Related MCP server: swiss-procurement-mcp

Tool reference

search_auctions

Entry point for any "what is available" question.

Parameter

Type

Notes

procedure_type

string[]

Asset programme or exact selling method. "landRental" expands to every format it supports; "landRental-english" is used as-is. Name it whenever you can — the server then queries the per-type feeds and covers far more relevant auctions.

open_for_bids

boolean

"What can I bid on" — keeps only auctions whose deadline has not passed.

keyword

string

Ukrainian free text over title, description, items, classification and locality. All words must match.

status

string[]

e.g. ["active_tendering"], ["complete"]. See list_procedure_types.

region

string

Substring of oblast or settlement, e.g. "Львів".

classification

string

CAV/CPV code or prefix, e.g. "07" or "07123000-7".

min_value / max_value

number

Starting-price band.

seller / seller_edrpou

string

The body running the auction — on state-property leases usually a regional SPFU office, not the institution.

property_owner / property_owner_edrpou

string

The organisation the asset belongs to (балансоутримувач). See Owner vs seller.

published_from / published_to

string

ISO date bounds on publication.

changed_since / changed_until

string

Scan a specific historical period instead of recent activity.

limit

number

Results returned, 1–100. Default 20.

scan_pages

number

Feed pages to scan, 1–40. Default 8. Raise when results come back thin or truncated.

// Property lease near Lviv, still open, under 50 000 UAH
{"procedure_type": ["legitimatePropertyLease"], "open_for_bids": true,
 "region": "Львів", "max_value": 50000, "limit": 10}

// Everything privatisation-related that concluded in July 2026
{"procedure_type": ["smallPrivatization", "largePrivatization"], "status": ["complete"],
 "changed_since": "2026-07-01", "changed_until": "2026-07-31", "scan_pages": 25}

Returns compact summaries plus a scanned block. An empty result means "not in the scanned window", never "does not exist".

Owner vs seller

On the legitimatePropertyLease family the two roles are different organisations. A room in a university building is auctioned by the regional SPFU office, so the university appears as propertyOwner (балансоутримувач) and never as seller. Filtering by seller for an institution returns nothing at all.

// Everything Lviv Polytechnic put up for lease this year — EDRPOU is exact, prefer it to a name
{"procedure_type": ["legitimatePropertyLease"], "property_owner_edrpou": "02071010",
 "changed_since": "2026-01-01", "changed_until": "2026-08-06", "scan_pages": 40}

Only that family publishes the distinction; for every other programme relatedOrganizations is absent, the seller owns what it sells, and property_owner matches nothing. There is no silent fallback to text search — combine with keyword if you need one.

get_auction

Everything about one auction. For deadlines alone use get_auction_timeline; for the outcome alone use get_auction_results — both return far less.

Parameter

Type

Notes

auction (required)

string

Public auction id or 24-character procedure id.

include

string[]

Sections to expand. Default ["items","terms"].

include values: items (area, cadastral number, address, classification) · terms (starting price, minimal step, guarantee deposit, registration fee, lease duration, conditions, restrictions) · documents · questions · bids · awards · contracts.

// Full picture before deciding whether to bid
{"auction": "SPD001-UA-20260806-70620",
 "include": ["items", "terms", "documents", "questions"]}

// Minimal lookup
{"auction": "LRE001-UA-20260708-03894"}

get_auction_timeline

The stage clock: what has passed, what is running, what is next, how long is left to bid.

Parameter

Type

Notes

auction (required)

string

Public auction id or procedure id.

include_revisions

boolean

Also list archived revisions, showing when the seller amended the terms. Default false.

{"auction": "LRE001-UA-20260708-03894"}
{"auction": "LRE001-UA-20260708-03894", "include_revisions": true}

Returns the status with its plain-language meaning, every stage marked past/current/upcoming, the next deadline, and bidding.closesAt / stillOpen / hoursRemaining.

get_auction_results

How an auction ended. Works on in-progress auctions too — reports outcome: "in_progress".

Parameter

Type

Notes

auction (required)

string

Public auction id or procedure id. No other parameters.

{"auction": "SPE001-UA-20260729-69703"}

Returns outcome (contract_signed · winner_determined · ended_without_winner · cancelled_by_seller · in_progress), starting vs final price with priceUpliftPercent, bid counts, attemptNumber (>1 means the lot failed to sell before), awards, contracts and cancellation reasons.

get_auction_documents

Published files with direct public download URLs.

Parameter

Type

Notes

auction (required)

string

Public auction id or procedure id.

document_type

string

Case-insensitive substring: technicalSpecifications, illustration, notice, contractSigned, transferAct, act, cancellationDetails

include_attachments_of

string[]

auction (default), awards, contracts, cancellations.

include_superseded

boolean

Also list earlier revisions of replaced files. Default false.

// Just the technical specification
{"auction": "SPD001-UA-20260806-70620", "document_type": "technicalSpecifications"}

// The complete paper trail including the signed contract
{"auction": "SPD001-UA-20260806-70620",
 "include_attachments_of": ["auction", "awards", "contracts"]}

Documents attached to bids are never published.

find_comparable_auctions

Valuation and risk: what similar lots go for and how often they sell.

Parameter

Type

Notes

auction (required)

string

The reference auction.

match_on

string[]

What a comparable must share. Default ["sellingMethod","classification"]. Add region for a local benchmark, valueRange to stay within ±50% of the starting price.

concluded_only

boolean

Default true — compare only against finished auctions. false also shows what is currently on the market.

limit

number

1–50. Default 15.

scan_pages

number

Widen the sample when comparableCount is low.

// Price benchmark for a land lease (default matching)
{"auction": "LRE001-UA-20260708-03894",
 "match_on": ["sellingMethod", "classification"]}

// What similar assets are on the market right now
{"auction": "SPD001-UA-20260806-70620", "concluded_only": false, "limit": 25}

Re-listings of the same lot are excluded, so one asset is not counted twice.

track_auction_changes

Cursor-based monitoring. Repeated calls make forward progress without re-reading the same activity.

Parameter

Type

Notes

since

string

ISO instant to watch from. Default 24 hours ago. On follow-up polls pass back the previous response's nextCursor.

until

string

Optional upper bound.

procedure_type / status / keyword / region

Narrow the watch to one niche.

limit

number

1–100. Default 30.

scan_pages

number

Raise when a busy window truncates.

// First poll of a niche
{"procedure_type": ["landRental"], "region": "Полтав", "limit": 20}

// Follow-up poll using the cursor from the previous response
{"procedure_type": ["landRental"], "region": "Полтав",
 "since": "2026-08-06T06:27:21.880000Z"}

Each change carries an isNew flag distinguishing brand-new listings from updates. The cursor is inclusive, so the last auction may repeat once.

analyze_auction_market

Volume and trend questions rather than individual lots.

Parameter

Type

Notes

group_by

string

direction (default), sellingMethod, status, region, seller, propertyOwner.

since / until

string

Period to analyse. Omit both for the most recent activity.

procedure_type / status / region / keyword

Narrow the population before aggregating.

scan_pages

number

Default 15. Raise for a larger sample.

// Which regions had the most land activity recently
{"procedure_type": ["landRental", "landSell"], "group_by": "region", "scan_pages": 25}

// How privatisation performed in July 2026
{"procedure_type": ["smallPrivatization"], "since": "2026-07-01", "until": "2026-07-31",
 "group_by": "sellingMethod", "scan_pages": 30}

Returns count/total/mean/median/min/max starting prices, a status histogram and soldSharePercentOfSettled — where settled means complete, unsuccessful or cancelled only, so in-flight procedures do not inflate it. These figures describe the scanned window, not the whole catalogue.

list_procedure_types

The vocabulary the other tools filter on. Cached; no network cost after the first call. Call this rather than guessing a procedure_type — an unrecognised value silently returns nothing.

Parameter

Type

Notes

filter

string

Substring, e.g. "land", "lease", "privat", "timber".

include_status_glossary

boolean

Default true.

{"filter": "land"}
{}

Returns 33 programme families with their auction formats, the exact sellingMethod values, and the three-letter auction-id prefix each produces (LRE = landRental-english, SPE = smallPrivatization-english…), plus what each of the ten statuses means.

get_publication_constraints

The only forward-looking tool: if a lot is published today, how soon may the auction run.

Parameter

Type

Notes

procedure_type (required)

string

A selling method such as "landRental-english". A family name checks every format it supports at once, which is useful for comparing notice periods before choosing one.

{"procedure_type": "landRental-english"}
{"procedure_type": "smallPrivatization"}

Returns earliestAuctionStart and noticeDays. Computed live, so it is not cached.

Install

git clone https://github.com/VladyslavMykhailyshyn/prozorro-sale-mcp-server.git
cd prozorro-sale-mcp-server
npm install
npm run build

Claude Code

claude mcp add prozorro-sale -- node /absolute/path/to/prozorro-sale-mcp-server/build/index.js

Claude Desktop / any MCP client

{
  "mcpServers": {
    "prozorro-sale": {
      "command": "node",
      "args": ["/absolute/path/to/prozorro-sale-mcp-server/build/index.js"]
    }
  }
}

No API key is needed — Prozorro.Sale publishes this data openly.

Configuration

All optional; see .env.example. The variables are read from the process environment, so set them in your MCP client's env block.

Variable

Default

Purpose

PROZORRO_SALE_INSTANCE

production

production, staging (synthetic data) or dgf

PROZORRO_SALE_API_BASE

Full base URL override

PROZORRO_SALE_TIMEOUT_MS

45000

Per-request timeout

PROZORRO_SALE_CACHE_TTL_MS

120000

Feed-page cache lifetime

PROZORRO_SALE_DEFAULT_PAGES

8

Feed pages a search scans by default (100 auctions each)

PROZORRO_SALE_MAX_PAGES

40

Hard ceiling per call

PROZORRO_SALE_MAX_RETRIES

2

Retries on network/5xx errors

The one limitation worth understanding

Prozorro.Sale publishes no full-catalogue search API. The open-data surface is a change feed ordered by modification time, plus a per-selling-method feed of the 100 most recent auctions. There is no "all currently open auctions" endpoint to call.

This server therefore searches by scanning, and it is explicit about what it scanned. Every discovery tool returns a scanned block:

{
  "scanned": {
    "coveredFrom": "2026-08-06T06:12:41.000Z",
    "coveredTo": "now",
    "recordsScanned": 614,
    "truncated": true,
    "note": "Every auction changed in the last 3h was examined (614 records over 3 segments), then the page budget ran out while reaching further back. Auctions last changed before that are NOT fully represented — raise \"scan_pages\" or set an explicit window to go deeper."
  }
}

Two consequences to keep in mind:

  • Name the asset programme when you can. procedure_type: ["smallPrivatization"] makes the server query the per-type feeds directly, which covers the 100 most recent auctions of each matching selling method instead of whatever happened to be busiest platform-wide.

  • An empty result means "not in the scanned window", not "does not exist." Widen with scan_pages, or pass changed_since to scan a specific historical period.

The feed only runs forward in time from a cursor, so the newest records always sit at the end of a crawl. Starting at an arbitrary "7 days ago" would spend the whole page budget on old records and never reach the present. Instead the crawler walks a short window ending at now and then extends backwards in doubling segments while budget remains — so current auctions are always covered first.

Data notes

  • Bidder and buyer identities are redacted upstream and appear as [redacted].

  • Document downloadUrl values are public and can be fetched directly.

  • Bid amounts become visible only after an auction concludes.

  • auctionId encodes its programme and publication date: LRE (landRental-english) + serial

    • -UA- + 20260708 + serial.

Development

npm run typecheck   # tsc --noEmit
npm run build       # compile to build/
npm run smoke       # build, then exercise all 10 tools against the live API

scripts/smoke.mjs is an integration check, not a unit test — it hits production Prozorro.Sale and prints a one-line summary per tool.

License

ISC

Available Tools

10 tools
analyze_auction_marketAggregate statistics over a periodA
Read-onlyIdempotent

Counts, price statistics and sold-share over a window of auction activity, broken down by a dimension of your choice.

WHEN TO USE: questions about volume and trends rather than individual lots — "how much land was auctioned last week", "which regions are most active", "what share of timber lots actually sell", "who are the biggest sellers".

KEY PARAMETERS

  • group_by: the breakdown dimension. "direction" (asset programme, default), "sellingMethod", "status", "region" or "seller".

  • since / until: the period to analyse. Omit both to analyse the most recent activity.

  • procedure_type / status / region / keyword: narrow the population before aggregating.

  • scan_pages: default 15. Raise for a larger, more representative sample.

EXAMPLE — which regions had the most land activity recently: {"procedure_type":["landRental","landSell"],"group_by":"region","scan_pages":25}

EXAMPLE — how privatisation performed in July 2026: {"procedure_type":["smallPrivatization"],"since":"2026-07-01","until":"2026-07-31", "group_by":"sellingMethod","scan_pages":30}

RETURNS: totals with count/total/mean/median/min/max starting prices, a status histogram, soldSharePercentOfSettled (settled = complete, unsuccessful or cancelled only), and the same figures per group. CRITICAL: these describe only auctions CHANGED inside the scanned window, not the whole catalogue. Always report the window and coverage alongside any number.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoStart of the window to analyse, ISO date or instant. Defaults to 7 days ago.
untilNoEnd of the window, ISO date or instant. Defaults to now.
regionNoSubstring of the oblast or settlement name.
statusNoRestrict to these procedure statuses.
keywordNoFree-text filter applied before aggregating.
group_byNoDimension for the breakdown table. "seller" groups by the body running the auction, "propertyOwner" by the organisation the asset belongs to (lease programmes only). Default "direction".
scan_pagesNoFeed pages (100 auctions each) to aggregate over. Higher gives a more representative sample. Default 15.
procedure_typeNoRestrict to an asset programme or exact selling method, e.g. ["landRental"].

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and idempotentHint, but the description adds crucial behavioral context: results cover only auctions changed in the scanned window, not the whole catalogue, and instructs to 'Always report the window and coverage alongside any number.' This exceeds the baseline safety hints and prevents misuse.

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 longer than average but every section earns its place: when-to-use, key parameters, examples, returns, and a critical caveat. Clear formatting with headers and bullet-like structures makes it scannable without redundant filler.

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?

With 8 parameters and no output schema, the description thoroughly covers return structure (totals, status histogram, soldSharePercentOfSettled) and the critical sampling caveat. It provides enough information for an agent to correctly select, invoke, and interpret results, leaving no major gaps.

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 covers 100% of parameters, but the description adds substantial meaning: explains 'since / until' omission behavior, 'scan_pages' default and sampling trade-off, and clarifies group_by semantics with examples. This goes far beyond the schema's field descriptions.

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 action: 'Counts, price statistics and sold-share over a window of auction activity, broken down by a dimension of your choice.' It clearly distinguishes from siblings by emphasizing 'volume and trends rather than individual lots', with concrete example questions like 'how much land was auctioned last week'.

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?

An explicit 'WHEN TO USE' section lists question types, and the description implies not to use it for single-lot queries (which siblings like get_auction handle). Two example JSON payloads demonstrate realistic invocations, providing clear guidance on when this tool is appropriate.

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

find_comparable_auctionsBenchmark an auction against similar onesA
Read-onlyIdempotent

Takes one auction and finds recent comparable ones, then reports median prices and how often that kind of lot actually sells.

WHEN TO USE: valuation and risk questions — "is this price reasonable", "what do similar plots go for", "how likely is this to sell", "should I bid at the starting price".

KEY PARAMETERS

  • auction (required): the reference auction — public auction id or procedure id.

  • match_on: what a comparable must share. Default ["sellingMethod","classification"]. sellingMethod — same auction format and programme classification — same CAV asset category region — same oblast; add this for a local benchmark, which is usually what is wanted valueRange — within ±50% of the starting price; use to exclude outliers Adding more criteria gives a tighter but smaller sample.

  • concluded_only: default true — compares only against finished auctions, which is what a price benchmark needs. Set false to also see what is currently on the market.

  • limit / scan_pages: widen the sample when comparableCount comes back low.

EXAMPLE — price benchmark for a land lease: {"auction":"LRE001-UA-20260708-03894","match_on":["sellingMethod","classification"]}

EXAMPLE — what similar assets are on the market right now: {"auction":"SPD001-UA-20260806-70620","concluded_only":false,"limit":25}

RETURNS: the reference summary, median starting and achieved prices, sold share, and the comparable auctions themselves. Re-listings of the same lot are excluded so one asset is not counted twice. The sample comes from recent activity, not full history — say so when quoting a figure.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum comparables to return. Default 15.
auctionYesReference auction — public auction id (e.g. "LRE001-UA-20260708-03894") or 24-character procedure id.
match_onNoWhich attributes a comparable must share. Default ["sellingMethod", "classification"]. Add "region" for local benchmarks, "valueRange" to stay within ±50% of the starting price.
scan_pagesNoFeed pages to scan when a broad search is needed. Default 8.
concluded_onlyNoOnly compare against auctions that already finished (complete or unsuccessful), which is what a price benchmark needs. Default true.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly, openWorld, idempotent, and non-destructive, so the bar is lower. The description adds valuable context beyond annotations: 'Re-listings of the same lot are excluded' and 'The sample comes from recent activity, not full history — say so when quoting a figure.' These are important behavioral caveats not evident from the schema.

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 organized with clear sections: core purpose, when-to-use, key parameters, examples, and returns. Each section is concise and every sentence adds value. Despite its length, it never feels padded, and the examples are well-integrated.

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?

With 5 parameters, no output schema, and moderate complexity, the description covers usage, parameter semantics, return contents, and important caveats (re-listing exclusion, recency). It even advises how to communicate results to users ('say so when quoting a figure'), making it complete for an agent to invoke 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 100%, but the description greatly enriches parameter meaning: explains each match_on enum option ('same auction format and programme', 'same CAV asset category', 'region — same oblast', 'valueRange — within ±50%'), explains the impact of adding criteria, and clarifies concluded_only and limit/scan_pages. The examples further illustrate parameter combinations.

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 a specific verb+resource: 'Takes one auction and finds recent comparable ones, then reports median prices and how often that kind of lot actually sells.' This clearly distinguishes it from sibling tools like search_auctions (searching) or get_auction (fetching a single record).

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?

An explicit 'WHEN TO USE' section states 'valuation and risk questions' and gives concrete example queries. It does not mention when not to use or name alternatives among sibling tools, so it falls short of a 5 but is clearly actionable.

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

get_auctionGet one auction in detailA
Read-onlyIdempotent

Everything about a single auction: the asset, the financial terms, the seller, and whichever sub-sections are asked for.

WHEN TO USE: the user names an auction, or a search result needs expanding. For deadlines alone use get_auction_timeline; for the outcome alone use get_auction_results — both are much smaller responses.

KEY PARAMETERS

  • auction (required): public id from the website ("SPD001-UA-20260806-70620") or the internal 24-character procedure id. Both work everywhere.

  • include: sections to expand. Defaults to ["items","terms"]. items — what is physically being sold: area, cadastral number, address, classification terms — starting price, minimal step, guarantee deposit, registration fee, lease duration, conditions, restrictions documents — attached files with download URLs questions — clarification questions and the seller's answers bids — submitted bids (amounts appear only after the auction concludes) awards — winner determination contracts — signed contracts

EXAMPLE — full picture before deciding whether to bid: {"auction":"SPD001-UA-20260806-70620","include":["items","terms","documents","questions"]}

EXAMPLE — minimal lookup: {"auction":"LRE001-UA-20260708-03894"}

RETURNS: auction summary, seller, description, per-section counts, and the requested sections. Lease auctions additionally carry propertyOwner (the institution the asset belongs to, with its EDRPOU), ownershipType and currentTenants (sitting tenants and their contract dates). Redacted personal data appears as "[redacted]".

ParametersJSON Schema
NameRequiredDescriptionDefault
auctionYesPublic auction id from the Prozorro.Sale website (e.g. "LRE001-UA-20260708-03894") or the 24-character internal procedure id.
includeNoExtra sections to expand. "items" = what is being sold, "terms" = payment/guarantee/lease conditions, "documents" = attached files, "questions" = clarifications, "bids"/"awards"/"contracts" = outcome. Defaults to ["items", "terms"].

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnly, openWorld, idempotent, and non-destructive. The description adds behavioral details beyond these: bid amounts only appear after the auction concludes, lease auctions carry propertyOwner/ownershipType/currentTenants, and redacted personal data appears as '[redacted]'. No contradiction exists.

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?

Though moderately long, the description is well-structured into WHEN TO USE, KEY PARAMETERS, EXAMPLES, and RETURNS. Each section earns its place: the examples show concrete usage, the RETURN section describes conditional fields, and the alternative guidance prevents misuse. No filler or repetition.

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 2-parameter tool with no output schema, the description fully compensates. It explains return structure (summary, seller, per-section counts, requested sections), conditional data (bid amounts, lease fields), redaction behavior, and provides complete examples. Combined with sibling differentiation, an agent has everything needed to invoke the tool correctly.

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 100%, with each parameter already described. The description adds extra value with examples, clarifies accepted id formats (public or internal), explains default include values, and provides a plain-language breakdown of each include option. While redundant in part, the examples and clarifications go beyond 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 clearly states 'Everything about a single auction: the asset, the financial terms, the seller, and whichever sub-sections are asked for.' It differentiates from sibling tools by explicitly naming get_auction_timeline and get_auction_results for narrower needs, and implies document-only access via get_auction_documents.

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?

An explicit 'WHEN TO USE' section states 'the user names an auction, or a search result needs expanding.' It also provides exclusions: 'For deadlines alone use get_auction_timeline; for the outcome alone use get_auction_results — both are much smaller responses.' This gives clear guidance on choosing alternatives.

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

get_auction_documentsAuction documents and download linksA
Read-onlyIdempotent

Files published for one auction, each with a direct public download URL that can be fetched without authentication.

WHEN TO USE: "show me the documents", "where is the technical specification", "get the signed contract", "is there a photo of the property".

KEY PARAMETERS

  • auction (required): public auction id or 24-character procedure id.

  • document_type: case-insensitive substring of the type. Common values: technicalSpecifications, illustration, notice, contractSigned, transferAct, act, cancellationDetails, evaluationCriteria.

  • include_attachments_of: which sets to return. Defaults to ["auction"]. Add "awards" and "contracts" for outcome paperwork (protocols, signed contracts, transfer acts), "cancellations" for the withdrawal justification.

  • include_superseded: true to also list earlier revisions of files the seller later replaced. Use when the user asks what changed. Default false — current versions only.

EXAMPLE — just the technical spec: {"auction":"SPD001-UA-20260806-70620","document_type":"technicalSpecifications"}

EXAMPLE — the complete paper trail including the signed contract: {"auction":"SPD001-UA-20260806-70620","include_attachments_of":["auction","awards","contracts"]}

RETURNS: per set, a list of documents with title, type, format, publication date and downloadUrl. Documents attached to bids are never published.

ParametersJSON Schema
NameRequiredDescriptionDefault
auctionYesPublic auction id (e.g. "LRE001-UA-20260708-03894") or 24-character procedure id.
document_typeNoKeep only documents of this type, e.g. "technicalSpecifications", "illustration", "notice", "contractSigned", "cancellationDetails". Case-insensitive substring match.
include_supersededNoInclude earlier revisions of documents that were later replaced. Default false — only the current version of each file is returned.
include_attachments_ofNoWhich attachment sets to include. Defaults to ["auction"]. Award and contract documents describe the outcome (protocols, signed contracts, transfer acts).

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint), the description discloses that download URLs are public and require no authentication, explains the default attachment scope, and notes that documents attached to bids are never published. This adds meaningful behavioral context without contradicting the annotations.

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 well-structured with clear sections (main statement, WHEN TO USE, KEY PARAMETERS, EXAMPLES, RETURNS). Every sentence adds value; there is no redundancy or filler. It is long enough to be thorough yet remains skimmable.

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?

With no output schema, the RETURNS line fills the gap by describing the response fields. The description also explains defaults, edge cases, and the fact that bid attachments are excluded, making it self-contained for an agent to understand behavior and limitations.

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?

Even though the schema covers all parameters, the description enriches each one with operational meaning: common document_type values, the semantics of include_attachments_of ('outcome paperwork', 'withdrawal justification'), and the default of include_superseded. Two concrete examples show how to combine parameters, making the API easier to invoke correctly.

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 a specific verb and resource: 'Files published for one auction, each with a direct public download URL...' This clearly identifies the tool's purpose and distinguishes it from sibling tools like get_auction, get_auction_timeline, or get_auction_results, which handle other aspects of an auction.

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 'WHEN TO USE' section lists concrete user phrases such as 'show me the documents' and 'where is the technical specification', giving clear context for when this tool is appropriate. It also hints at when to extend scope with include_attachments_of or include_superseded. However, it does not explicitly name alternative sibling tools, so it stops short of a full 5.

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

get_auction_resultsAuction outcome and final priceA
Read-onlyIdempotent

How one auction ended: sold or not, for how much, to how many bidders.

WHEN TO USE: "what did it go for", "did it sell", "how many people bid", "why was it cancelled". Works on in-progress auctions too — it reports outcome "in_progress" rather than failing.

KEY PARAMETERS

  • auction (required): public auction id or 24-character procedure id. No other parameters.

EXAMPLE: {"auction":"SPE001-UA-20260729-69703"}

RETURNS: outcome (contract_signed / winner_determined / ended_without_winner / cancelled_by_seller / in_progress), starting vs final price with priceUpliftPercent between them, bid and disqualified-bid counts, attemptNumber (>1 means the lot failed to sell before), awards, contracts and cancellation reasons. Winner identities are redacted by the platform; bid amounts appear only after the auction concludes.

ParametersJSON Schema
NameRequiredDescriptionDefault
auctionYesPublic auction id (e.g. "LRE001-UA-20260708-03894") or 24-character procedure id.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description enriches this by disclosing that in-progress auctions return 'in_progress' rather than failing, winner identities are redacted, bid amounts appear only after conclusion, and attemptNumber indicates prior sale failures. These are meaningful behavioral details beyond the annotations.

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 organized into clear sections (intro, WHEN TO USE, KEY PARAMETERS, EXAMPLE, RETURNS), with the most important information front-loaded. It is somewhat lengthy, but every section contributes useful detail, so it earns a 4 rather than a 5.

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?

With no output schema, the description takes on the burden of explaining return values. It enumerates possible outcome values, starting vs final price with priceUpliftPercent, bid/disqualified-bid counts, attemptNumber, awards, contracts, and cancellation reasons. It also covers platform redaction and timing of bid amounts. This is thorough for a single-parameter tool.

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 input schema already provides 100% coverage for the single 'auction' parameter, including format examples. The description's KEY PARAMETERS section largely repeats this ('public auction id or 24-character procedure id') and adds only a concrete example. This aligns with the baseline of 3 for high schema coverage; it does not add meaningfully new semantics.

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 a clear, specific verb+resource: 'How one auction ended: sold or not, for how much, to how many bidders.' This directly states what the tool returns and distinguishes it from siblings like get_auction (likely auction details) and get_auction_timeline (event history). The addition of in-progress auctions further refines the scope.

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 'WHEN TO USE' section provides explicit example queries: 'what did it go for', 'did it sell', 'how many people bid', 'why was it cancelled'. This gives clear usage context. However, it does not name alternative tools or explicitly state when not to use this tool, so it falls 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.

get_auction_timelineAuction schedule and deadlinesA
Read-onlyIdempotent

The stage clock for one auction: what has passed, what is running now, what comes next, and how much time is left to bid.

WHEN TO USE: any time-related question — "how long do I have", "when is the auction", "has the question period closed", "what happens after bidding". Far smaller than get_auction for this.

KEY PARAMETERS

  • auction (required): public auction id or 24-character procedure id.

  • include_revisions: true to also list archived revisions, showing when the seller amended the terms. Use when the user suspects the conditions changed. Default false.

EXAMPLE — "can I still bid on this?": {"auction":"LRE001-UA-20260708-03894"}

EXAMPLE — "did the seller change anything after publishing?": {"auction":"LRE001-UA-20260708-03894","include_revisions":true}

RETURNS: status with its plain-language meaning, every stage marked past/current/upcoming, the next deadline, and a bidding block with closesAt / stillOpen / hoursRemaining. Cancellation reasons appear when the auction was withdrawn.

ParametersJSON Schema
NameRequiredDescriptionDefault
auctionYesPublic auction id (e.g. "LRE001-UA-20260708-03894") or 24-character procedure id.
include_revisionsNoAlso list archived revisions of the procedure, showing when the seller amended it. Default false.

TDQS

A5/5.0
Behavior5/5

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

Despite having annotations (readOnlyHint, idempotentHint, etc.), the description adds substantive behavioral context beyond them: it details return contents (status with plain-language meaning, past/current/upcoming stages, next deadline, bidding block with closesAt/stillOpen/hoursRemaining) and notes cancellation reasons appear when appropriate. This fully informs the agent about what the tool does and returns.

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 well-organized with clear sections (initial description, WHEN TO USE, KEY PARAMETERS, EXAMPLES, RETURNS) and uses concise, high-signal language. Every sentence contributes to understanding the tool, and the examples are particularly efficient at conveying usage.

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?

The tool has only 2 parameters and no output schema, but the description fully covers its input and output behavior, including edge cases like cancellation. The RETURNS section explains the response shape without an output schema, making it complete for agent decision-making.

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?

The schema already has 100% parameter coverage, but the description adds significant value with a KEY PARAMETERS section explaining each parameter's meaning and when to use them (e.g., include_revisions 'when the user suspects the conditions changed'). Concrete JSON examples illustrate usage, going well beyond schema descriptions.

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 function as 'the stage clock for one auction' and specifies exactly what it provides: what has passed, what is running now, what comes next, and time left to bid. It also distinguishes it from get_auction by noting it is 'far smaller' for time-related queries, making it easy to select among siblings.

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 'WHEN TO USE' section explicitly lists example questions like 'how long do I have' and 'when is the auction', and directly compares with get_auction, stating it is 'far smaller for this'. This provides clear when-to-use guidance and an alternative, exceeding the minimum.

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

get_publication_constraintsEarliest possible auction date for a new listingA
Read-onlyIdempotent

Seller-side planning: if a lot is published today, how soon may the auction itself run.

WHEN TO USE: the user is preparing to list something and needs to plan dates — "how far ahead do I need to publish", "what is the minimum notice period", "can we hold the auction before the 20th". This is the only forward-looking tool here; everything else describes auctions that already exist.

KEY PARAMETERS

  • procedure_type (required): a selling method such as "smallPrivatization-english". A family name such as "smallPrivatization" is also accepted and every format it supports is checked at once, which is useful for comparing notice periods before choosing a format.

EXAMPLE — notice period for one format: {"procedure_type":"landRental-english"}

EXAMPLE — compare every format of a programme: {"procedure_type":"smallPrivatization"}

RETURNS: per selling method, earliestAuctionStart (the soonest auctionPeriod.startDate the platform would accept for a procedure published now) and noticeDays, that gap in days. The value is computed live and moves with the calendar, so it is not cached.

ParametersJSON Schema
NameRequiredDescriptionDefault
procedure_typeYesSelling method to check, e.g. "landRental-english" or "smallPrivatization-english". A family name is accepted and every format it supports is checked.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior; the description adds valuable context that the value is computed live and not cached. It also clarifies that a family name checks all supported formats at once, which is non-obvious behavior beyond the schema.

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 well-organized with clear headers, key parameters, examples, and return structure. Every sentence adds value, and the format makes it easy to scan for purpose, usage, and behavior.

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?

Despite having no output schema, the description fully explains return values (earliestAuctionStart and noticeDays) and their behavior. It covers parameter semantics, examples, and placement within the tool family, making it self-sufficient for correct invocation.

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?

The schema only describes procedure_type as a selling method, but the description enriches it significantly by documenting family-name support, the ability to compare formats, and concrete examples. This goes well beyond baseline schema coverage.

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?

Clearly states the tool's purpose as seller-side planning for the earliest possible auction date. The description explicitly identifies it as the only forward-looking tool among siblings, effectively distinguishing it from tools that describe existing auctions.

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?

Provides an explicit WHEN TO USE section with concrete user queries and contrasts with siblings by noting everything else describes existing auctions. However, it does not name a specific alternative tool, leaving the exclusion slightly less direct than naming search_auctions or get_auction.

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

list_procedure_typesAsset programmes, auction formats and statusesA
Read-onlyIdempotent

The vocabulary every other tool filters on. Cheap, cached, no network cost after the first call.

WHEN TO USE: before a search whose asset programme is unclear, or when the user asks what kinds of auctions exist, what a status means, or what an auction id prefix stands for. Call this rather than guessing a procedure_type value — an unrecognised one silently returns nothing.

KEY PARAMETERS

  • filter: substring to narrow the list, e.g. "land", "lease", "privat", "timber".

  • include_status_glossary: default true. Set false when only the programme list is needed.

EXAMPLE — what land-related programmes exist: {"filter":"land"}

EXAMPLE — the full vocabulary: {}

RETURNS: 33 programme families, each with its auction formats, the exact sellingMethod values to pass as procedure_type, and the three-letter auction-id prefix each produces (LRE = landRental-english, SPE = smallPrivatization-english, and so on). Plus the auction-id format and, by default, what each of the ten procedure statuses means.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoSubstring to narrow the list, e.g. "land", "lease", "privatization".
include_status_glossaryNoAlso return what each procedure status means. Default true.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already state readOnly/idempotent, and the description adds non-obvious traits: cheap/cached behavior, the exact scope (33 families, 10 statuses), and the silent-empty-result behavior when an unrecognised procedure_type is passed. This goes beyond annotations without contradicting them.

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?

Well-structured with clear headings (WHEN TO USE, KEY PARAMETERS, EXAMPLE, RETURNS). Every section contributes—the intro establishes its role, examples demonstrate syntax, and returns set expectations. No redundant filler.

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?

Covers the full scope of output (33 families, sellingMethod values, id prefixes, status glossary), explains when to disable the glossary, and warns about failure modes. For a read-only vocabulary tool with 2 optional params and no output schema, this is complete.

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 already describes both params with 100% coverage. Description adds concrete examples for filter ('land', 'lease', 'privat', 'timber'), shows how include_status_glossary can be set false, and provides example JSON calls. This adds usability but schema already handled the core semantics.

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 explicitly states its purpose: 'The vocabulary every other tool filters on' and details that it lists programme families, auction formats, statuses, and id prefixes. This distinguishes it from siblings like search_auctions or get_auction by positioning it as the vocabulary/lookup tool.

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?

Includes a 'WHEN TO USE' section specifying to call before a search when an asset programme is unclear, when the user asks about auction kinds/statuses/prefixes, and explicitly says 'Call this rather than guessing a procedure_type value'. It also warns about silent returns for unrecognised values, which is actionable guidance.

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

search_auctionsSearch Prozorro.Sale auctionsA
Read-onlyIdempotent

Find auctions of Ukrainian public assets. The entry point for any "what is available" question.

WHEN TO USE: the user describes what they are looking for rather than naming one auction. For a specific auction id, call get_auction instead.

KEY PARAMETERS

  • procedure_type: name the asset programme whenever the user implies one ("land", "privatisation", "lease"). This switches to per-type feeds and covers far more relevant auctions. Family names ("landRental") expand to every format; exact values ("landRental-english") are used as-is. Call list_procedure_types if unsure of the vocabulary.

  • open_for_bids: true for "what can I bid on" — keeps only auctions whose deadline has not passed.

  • keyword: Ukrainian free text over title, description, items, classification, locality. All words must match.

  • region / classification / min_value / max_value / published_from / published_to: narrowing filters.

  • seller / seller_edrpou: the body RUNNING the auction (often a regional SPFU office).

  • property_owner / property_owner_edrpou: the organisation the asset BELONGS to — the university, hospital or school whose premises are leased out. Use this when the user names an institution: on lease auctions the institution is almost never the seller. EDRPOU is exact, prefer it. Published by the legitimatePropertyLease family only; elsewhere owner and seller are the same body.

  • changed_since + changed_until: scan a specific historical period instead of recent activity.

  • scan_pages: raise (up to 40) when a broad query comes back thin or truncated.

EXAMPLE — everything Lviv Polytechnic put up for lease this year: {"procedure_type":["legitimatePropertyLease"],"property_owner_edrpou":"02071010", "changed_since":"2026-01-01","changed_until":"2026-08-06","scan_pages":40}

EXAMPLE — property lease near Lviv, still open, under 50 000 UAH: {"procedure_type":["legitimatePropertyLease"],"open_for_bids":true,"region":"Львів","max_value":50000,"limit":10}

EXAMPLE — everything privatisation-related sold in July 2026: {"procedure_type":["smallPrivatization","largePrivatization"],"status":["complete"], "changed_since":"2026-07-01","changed_until":"2026-07-31","scan_pages":25}

RETURNS: compact auction summaries (id, title, status, price, region, seller, propertyOwner, deadlines, auctionUrl) plus a "scanned" block. ALWAYS relay that block's window and truncation to the user — an empty result means "not in the scanned window", never "does not exist".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return. Default 20.
regionNoSubstring of the oblast or settlement name, e.g. "Львів", "Київська".
sellerNoSubstring of the selling entity name.
statusNoProcedure statuses to keep, e.g. ["active_tendering"] for auctions still accepting bids, ["complete"] for concluded sales. Omit for all statuses.
keywordNoFree text matched against title, description, item descriptions, classification names and locality. Ukrainian works best. All words must appear.
max_valueNoMaximum starting price, in the auction currency.
min_valueNoMinimum starting price, in the auction currency.
scan_pagesNoHow many feed pages (100 auctions each) may be scanned. Higher covers more of the window at the cost of latency. Default 8.
published_toNoKeep only auctions published on or before this ISO date.
changed_sinceNoISO date or instant that bounds the change window to scan. Defaults to 7 days ago. Older auctions are only visible if they were modified inside the window.
changed_untilNoUpper bound of the change window, ISO date or instant. Defaults to now.
open_for_bidsNoShortcut for "I want to bid": keeps only auctions whose bidding deadline has not passed and whose status still accepts bids.
seller_edrpouNoRegistration code (ЄДРПОУ) of the selling entity, e.g. "42899921". Leading zeros optional.
classificationNoCAV/CPV classification code or prefix, e.g. "07" for land or "07123000-7" exactly.
procedure_typeNoAsset programme or exact selling method. A family name such as "landRental" or "smallPrivatization" expands to every auction format it supports; an exact value such as "landRental-english" is used as-is. Call list_procedure_types for the vocabulary.
property_ownerNoSubstring of the name of the organisation the asset BELONGS to (балансоутримувач) — the university, hospital or school whose property is being auctioned, as opposed to the body running the sale. Published by the legitimatePropertyLease family only; other programmes have no owner distinct from the seller, so combine with keyword there.
published_fromNoKeep only auctions published on or after this ISO date, e.g. "2026-01-01".
property_owner_edrpouNoRegistration code (ЄДРПОУ) of that organisation, e.g. "02071010" for Lviv Polytechnic. Leading zeros optional. Exact and far more reliable than a name substring.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral context beyond these: it explains the 'scanned' window semantics, warns that 'an empty result means not in the scanned window, never does not exist', and documents the per-type feeds behavior with procedure_type expansion. It also distinguishes owner vs seller data provenance, which is critical for correct interpretation.

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 structured with clear sections (WHEN TO USE, KEY PARAMETERS, EXAMPLE, RETURNS), each sentence earning its place. It front-loads the core purpose, then progressively details parameters and examples without redundancy. Despite its length, it remains scannable and information-dense, with no filler.

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 an 18-parameter, 0-required tool with no output schema, the description is remarkably complete. It covers selection criteria (what to search), key parameter semantics, usage examples, and return-value behavior including the important 'scanned' block warning. The only minor gap is lack of explicit pagination/limit guidance beyond scan_pages, but the three examples and RETURNS section provide enough operational completeness.

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 100%, so the baseline is 3. The description adds substantial meaning beyond schema: it clarifies the semantic distinction between seller and property_owner (the body running the auction vs the asset's owner), explains the procedure_type family/format expansion behavior, and provides three concrete examples mapping real user intents to parameter combinations. This is meaningful added value, though the schema already documents individual parameter meanings well.

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 ('Find auctions of Ukrainian public assets') and clearly positions itself as the entry point for 'what is available' questions. It distinguishes itself from get_auction ('For a specific auction id, call get_auction instead'), making its scope unambiguous.

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 provides an explicit WHEN TO USE section and names the alternative (get_auction) for specific IDs. It also gives detailed guidance on when to use property_owner vs seller, when to use open_for_bids, and how to use changed_since/scan_pages for historical searches, far exceeding mere context.

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

track_auction_changesWatch for new and updated auctionsA
Read-onlyIdempotent

What appeared or changed in a niche since a given moment. Cursor-based, so repeated calls make forward progress without re-reading the same activity.

WHEN TO USE: monitoring rather than searching — "anything new since yesterday", "did anything change on the lots I am watching", "keep me posted on timber auctions". For a one-off "what exists" question use search_auctions instead.

KEY PARAMETERS

  • since: ISO instant to watch from. Defaults to 24 hours ago. On follow-up polls pass back the nextCursor from the previous response — that is the whole point of this tool.

  • procedure_type / status / keyword / region: narrow the watch to one niche.

  • limit / scan_pages: raise when a busy window truncates.

EXAMPLE — first poll of a niche: {"procedure_type":["landRental"],"region":"Полтав","limit":20}

EXAMPLE — follow-up poll using the cursor from the previous response: {"procedure_type":["landRental"],"region":"Полтав","since":"2026-08-06T06:27:21.880000Z"}

RETURNS: changed auctions with changedAt and an isNew flag distinguishing brand-new listings from updates to existing ones, a newlyPublished count, and nextCursor for the following poll. The cursor is inclusive, so the last auction may repeat once.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum changed auctions to list. Default 30.
sinceNoISO instant to watch from — pass the "nextCursor" returned by the previous call to poll for new activity. Defaults to 24 hours ago.
untilNoOptional upper bound, ISO instant. Defaults to now.
regionNoSubstring of the oblast or settlement name.
statusNoRestrict to procedures currently in these statuses, e.g. ["active_tendering"].
keywordNoFree-text filter applied to title, description and items.
scan_pagesNoFeed pages (100 auctions each) this call may read. Default 8.
procedure_typeNoRestrict to an asset programme or exact selling method, e.g. ["smallPrivatization"].

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, but the description adds substantial behavioral depth beyond these: cursor-based forward progress, the inclusive-cursor caveat ("the last auction may repeat once"), default `since` behavior, and the distinction between new and updated items via `isNew`. This enriches the agent's understanding without contradicting the annotations.

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 well-structured with clear sections (WHAT, WHEN TO USE, KEY PARAMETERS, EXAMPLES, RETURNS) and uses bold labels. Every paragraph earns its place: two examples, one for first poll and one for follow-up, and the return fields are summarized without restating the schema verbatim. Despite its length, it is dense with useful information and free of filler.

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?

The tool has 8 parameters, no output schema, and moderate complexity due to cursor semantics. The description covers the monitoring use case, parameter roles, default behavior, examples, and return fields (changedAt, isNew, newlyPublished, nextCursor). It also mentions the inclusive-cursor edge case. This is sufficient for an agent to invoke the tool correctly across both initial and follow-up calls.

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 100% with per-parameter descriptions, so the schema already handles literal meaning. The description adds semantic value by grouping parameters (procedure_type/status/keyword/region as niche narrowers), giving practical advice for `since` (pass back nextCursor), and explaining when to raise `limit`/`scan_pages` (busy window truncation). It doesn't cover `until` but the schema does; overall the added context exceeds the baseline.

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 a specific, behavior-rich statement: "What appeared or changed in a niche since a given moment." This clearly identifies the action (tracking new/updated auctions), the resource (auctions in a niche), and the time-based scope. It also explicitly differentiates from search_auctions by framing monitoring vs. one-off searching, making the tool's purpose unmistakable.

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 includes a dedicated "WHEN TO USE" section with concrete examples ("anything new since yesterday", "keep me posted") and directly instructs to "use search_auctions instead" for one-off questions. This is explicit, actionable guidance that names the alternative tool and the decision criterion.

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. 10 tool updatesv1.0.0
    • First observedanalyze_auction_market
    • First observedfind_comparable_auctions
    • First observedget_auction
    • First observedget_auction_documents
    • First observedget_auction_results
    • First observedget_auction_timeline
    • First observedget_publication_constraints
    • First observedlist_procedure_types
    • First observedsearch_auctions
    • First observedtrack_auction_changes

TDQS

A4.7/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a clearly distinct aspect: searching, viewing details, documents, timeline, results, comparables, monitoring, market stats, vocabulary, and seller constraints. Even related tools like get_auction_timeline and get_auction_results are scoped to different questions.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with lowercase and underscores, using action verbs like search, get, find, track, analyze, list, and get. Sub-resources of an auction are consistently suffixed (get_auction_documents, get_auction_timeline, get_auction_results).

Tool Count5/5

10 tools is well-scoped for a public-asset auction platform. Each tool covers a distinct facet of the domain (search, detail, documents, timeline, results, comparables, monitoring, market analysis, vocabulary, and seller-side planning) without redundancy.

Completeness5/5

The tool surface covers the full read-side lifecycle: discovering auctions, inspecting any aspect (items, terms, documents, bids, awards, contracts), checking deadlines and outcomes, benchmarking prices, monitoring changes over time, aggregating market statistics, and even planning publication dates. No critical dead ends or missing operations for the server's apparent informational and analytical purpose.

Maintenance

ActivitySlowing
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
    Not graded
    quality
    C
    maintenance
    Provides access to Ukraine's public procurement data (ProZorro) via MCP, keyless and integrated with Pipeworx gateway for AI agents.
    14
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server providing read access to Swiss public procurement data via the official simap.ch API, covering all cantons and the Confederation with intraday updates. It enables searching tenders, awards, construction codes, and procurement offices through natural language queries.
    9
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for Cannons Auctions API, enabling natural language access to auction data including item search, auction listings, and detailed item information.
    2
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for Ukrainian public procurement (Prozorro) that exposes tools to search tenders, retrieve tender details and cards, list and read tender documents.
    -