Przetargowy Janusz — Polish public tenders
Server Details
For Przetargowy Janusz customers (trial or paid): Polish tenders, AI summaries, pipeline, filling
- Status
- Healthy
- Uptime
- 100.0% over 25 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 30 tools
Most tools have a clearly distinct resource+action (CPV tools, entity lookups, pipeline mutations, document/fill tools) and the descriptions actively cross-reference each other, e.g. search_tenders vs list_matched_tenders vs search_my_tenders. The main overlap risk is the five search/browse variants (search_tenders, list_tenders, search_archived_tenders, list_matched_tenders, search_my_tenders), which are close enough that an agent must read carefully to pick the right one.
Almost everything follows a consistent snake_case verb_noun pattern (search_tenders, get_tender, set_tender_status, list_my_alerts), with clear domain grouping. The CPV tools (cpv_labels, cpv_search, cpv_tree) are noun-first rather than verb-first, a minor deviation from the otherwise uniform convention.
At 30 tools the surface is heavy, at the upper end of what the broad domain (search, buyers/contractors, company profile, pipeline, documents, fills, alerts, CPV) can justify. Several pairs could plausibly be merged (search_my_tenders as a word-filter on list_matched_tenders; list_tenders as a no-query search_tenders), pushing it toward borderline.
Core lifecycle is well covered: search/browse/get, documents and files, award results, entity profiles, pipeline add/status/fill, matching profile and company details. However there are notable gaps — no remove-from-pipeline tool, and alerts can only be listed (no create/update/delete for saved alert profiles), so some workflows dead-end.
Available Tools
30 toolsadd_to_my_tendersDodaj do Moich przetargówAIdempotentInspect
Adds a tender to the signed-in company's 'Moje przetargi' — the same as 'Dodaj do Moich' in Przetargowy Janusz: a new entry in the first kanban column, 'Do przejrzenia' (one removed earlier comes back there). Its AI summary is not ordered — request_summary does that. A tender already there — also as its copy from another portal — stays as it is, and the answer gives the entry that is there. By tender_id (from search_tenders, list_matched_tenders or get_tender) or public slug. Returns the result (added / restored / already), the status and the workspace link. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | public slug, when there is no tender_id | |
| tender_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: names the destination column ('Do przejrzenia'), states that a previously removed entry is restored, that duplicates are left untouched and echoed back, and spells out the three result states (added/restored/already). It also declares OAuth authentication and a trial/paid plan requirement, which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and destination, then constraints, then return values — a sensible ordering. The sentences are long and parenthetical, and the 'one removed earlier comes back there' aside is slightly buried, costing some crispness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description enumerates the return payload (result, status, workspace link). Combined with the auth/plan prerequisites and idempotency semantics, an agent has everything needed to call it and interpret the answer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% and the description compensates by explaining tender_id as the primary key, its sources, and slug as the fallback. It does not resolve what happens if both are supplied or what the acceptable slug format is, so it stops short of fully closing the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb and resource: adds a tender to the signed-in company's 'Moje przetargi' kanban, mapped explicitly to the UI action. It rules out confusion with request_summary and with listing tools, so an agent can distinguish it from every sibling in one read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and where the identifier comes from (search_tenders, list_matched_tenders, get_tender), plus an explicit non-overlap clause: summaries are not ordered here, request_summary does that. The idempotent case (already present, including a copy from another portal) is described so the agent knows the call is safe to repeat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_bid_priceZatwierdź cenę ofertyADestructiveIdempotentInspect
Sets the offer price (net PLN) of a tender in 'Moje przetargi' — the same as choosing the price in Przetargowy Janusz: one of Janusz's price variants (aggressive, realistic, higher — listed in get_my_tender fill_details.price_proposals) or variant 'manual' with amount. The price goes into the offer documents; it is the price the user states or picks. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | net PLN — required for variant 'manual' | |
| variant | Yes | ||
| rationale | No | ||
| tender_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true; the description adds what the annotations cannot — OAuth authentication plus a trial/paid plan requirement, and that the chosen price is written into the offer documents. It stops short of explaining what the 'destructive' aspect actually overwrites (e.g., a previously confirmed price).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the action and unit (net PLN), followed by the variant mechanics and the auth/plan prerequisite. Slightly clause-heavy but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema, it covers the essentials: prerequisites, variant semantics, and the side effect on offer documents. It omits what happens if a price was already confirmed (relevant given destructiveHint) and what 'rationale' is for.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25%, so the description has to compensate, and it does for the critical fields: it enumerates the three named variants plus 'manual' and states that 'manual' requires an amount. It leaves 'rationale' and 'tender_id' unaddressed, though tender_id is self-evident as a UUID.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — set the offer price (net PLN) of a tender in 'Moje przetargi' — and grounds it in the concrete UI action it mirrors. It also points at the sibling get_my_tender's fill_details.price_proposals as the source of variants, which lets an agent place it relative to the fill workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the workflow (read variants from get_my_tender, then commit one), but never explicitly says when to use this instead of set_fill_details, start_fill, or set_tender_status. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cpv_labelsNazwy kodów CPVARead-onlyIdempotentInspect
Resolve CPV codes to their Polish labels. Pass an array of codes, with or without the check digit (e.g. ['45000000-7', '79952000']); each label comes with the full code. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| codes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive/closed-world, so safety is covered. The description adds genuinely new behavioral context the annotations lack: the OAuth requirement and plan-tier gating. Minor gap: no statement about rate limits or behavior on invalid codes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste; the core purpose is front-loaded, followed immediately by the input format and prerequisites. Nothing repeats the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, annotation-rich, no-output-schema tool, the description covers purpose, input format, and access requirements adequately. It briefly notes output shape ('each label comes with the full code') but could mention behavior on unknown codes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and it does: it explains the array-of-codes input, that the check digit is optional, and gives concrete examples ('45000000-7', '79952000'). It omits the maxItems=500 bound, but the core format ambiguity is resolved.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Resolve CPV codes to their Polish labels', which is clearly distinct from browsing tools like cpv_tree or cpv_search. It does not explicitly name those siblings or state when they should be preferred, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful invocation context: pass an array of codes, check digit optional, and that OAuth plus a trial/paid plan is required. However, it never says when to use this rather than cpv_search or cpv_tree, so the alternative-selection guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cpv_searchSzukaj kodów CPVARead-onlyIdempotentInspect
Resolve free-text to CPV codes (the EU Common Procurement Vocabulary used to classify tenders). Returns matching codes with Polish labels. Use the codes with list_tenders filter='category' (division = first 8 digits). Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Words in Polish — the CPV labels are Polish, e.g. 'projektowanie stron internetowych' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds real value beyond that: the required OAuth authentication, the trial/paid plan gate, and the shape of the response ('matching codes with Polish labels'). Pagination and the meaning of the limit cap are still undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose, then downstream usage, then access prerequisites. No filler or restated title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully sketches the return value and its Polish labels, and covers auth and plan gating. What's missing is the behavior of the limit parameter and whether results are ranked or truncated, which matters for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: the query parameter is documented in the schema with the Polish-language constraint, while limit has no description anywhere. The description's 'resolve free-text' reinforces query but adds nothing about limit, so it does not compensate for the coverage gap beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Resolve free-text to CPV codes') and even explains what CPV is and that results come with Polish labels. It implicitly separates itself from cpv_labels and cpv_tree by positioning this as free-text resolution, but never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete downstream usage: hand the codes to list_tenders filter='category', using the first 8 digits as the division. It also states access preconditions (OAuth plus trial/paid plan). It stops short of telling the agent when to prefer this over cpv_labels or cpv_tree.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cpv_treeDrzewo kodów CPVARead-onlyIdempotentInspect
Walk the CPV hierarchy. Omit parent for top-level divisions; pass a code, with or without the check digit (e.g. '45000000-7' or '45000000'), to list its children. Each node flags whether it has children. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| parent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior. The description adds useful non-schema context: OAuth authentication and a trial or paid plan are required, and each returned node indicates whether it has children. It does not describe error behavior or pagination, but it meaningfully supplements 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four tight sentences, front-loading the purpose and then covering parameter usage, node behavior, and access requirements. Every sentence adds actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tree traversal tool with annotations covering safety and no output schema, the description covers how to call it, access constraints, and the key child-flag behavior. It stops short of describing the full returned node shape or traversal depth semantics, but an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for the single `parent` parameter. It explains omission for top-level results, passing a code to list children, accepting the code with or without the check digit, and gives examples such as '45000000-7' and '45000000'. This is substantially more useful than the schema's pattern alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb plus resource: 'Walk the CPV hierarchy' and explains that it lists children or top-level divisions. It is clearly a different operation from siblings like cpv_search and cpv_labels, but it does not explicitly name or differentiate them, so it falls short of the sibling-routing clarity required for a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage guidance: omit `parent` for top-level divisions and pass a CPV code to list its children. This is clear enough to invoke correctly, but it does not mention alternatives such as using cpv_search for keyword lookup or cpv_labels for labels.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_buyerProfil zamawiającegoARead-onlyIdempotentInspect
Profile of one contracting authority (zamawiający) by slug (from search_entities or a tender's authority): identity (NIP, REGON, KRS, region), counts, its active tenders, recent awards with winners, top contractors, procurement plan positions and recent contracts — or, on older pages, its tenders and public finance (municipal budget, NFZ contracts, investments). Same data as its public page. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover read-only, idempotent, and closed-world, and the description adds real information beyond them: OAuth authentication is required, a trial or paid plan is required, the payload mirrors the public page, and older pages may return a different shape. It does not mention rate limits or error behavior, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that is front-loaded with the purpose and then enumerates the contents. Every clause adds information, though the parenthetical legacy-data aside makes the second half harder to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description compensates by enumerating the return payload and flagging that the schema variant depends on page age. Given there is one parameter, a read-only hint, and a plan restriction, an agent has enough information to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the sole parameter is undocumented in the schema, so the description carries the burden: it explains that the slug is a contracting-authority slug and where to obtain it. It does not give the format or length, but it adds substantial value over the bare string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb and resource: returns the profile of a single contracting authority, and lists exactly what is inside (identity, tenders, awards, contractors, plan positions). It is clear, but it never explains how it differs from the close siblings get_contractor and get_company_profile, so the agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent where the slug comes from (search_entities or a tender's authority), which is the key piece of guidance needed before calling the tool. It does not say when NOT to use this tool or when one of the sibling tools is the better choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_profileDane firmyARead-onlyIdempotentInspect
The signed-in company in Przetargowy Janusz: what it does — its matching profile (matching_profile: CPV codes with names, voivodeships, budget, interests and its own description of what it does and doesn't do), from which its matched tenders come — and the details Janusz writes into offer documents: name, address, NIP, REGON, KRS, contact and the default signatory, with those missing. The NIP is set only in the app (profile_url, checked in the GUS register); the rest with set_company_details. The matching profile changes only with set_matching_profile. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds real context beyond them: it requires OAuth authentication and a trial or paid plan, and it flags that certain fields may be missing and that NIP is verified in the GUS register.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense sentence built from nested parentheticals and em-dashes, which makes the returned-field list hard to scan on first read. It is front-loaded with the resource, but the mid-sentence tangents about mutation paths and NIP make it more convoluted than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values and does so by enumerating the profile and detail fields, plus auth and plan prerequisites. It stops short of stating the response shape or how missing fields appear, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-param tool is a 4. It appropriately spends its words on return content instead of nonexistent inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact resource (the signed-in company) and enumerates what is returned: the matching profile (CPV codes with names, voivodeships, budget, interests, own description) and the document details (name, address, NIP, REGON, KRS, contact, default signatory). It also differentiates from writable siblings by naming set_company_details and set_matching_profile as the mutation paths, so an agent can tell read from write without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It makes clear this tool reads, and that changes go through set_company_details (all fields except NIP) or set_matching_profile (the matching profile), and that NIP is set only in the app via profile_url. That effectively routes the agent to the right sibling, though it never states the read-side trigger ('use when you need the company's profile') in so many words.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contractorProfil wykonawcyARead-onlyIdempotentInspect
Profile of one contractor (wykonawca — company or sole trader) by slug (from search_entities or a buyer's results): registry data (REGON, legal form, VAT status, PKD, debtor-register flags), wins and offers, recent wins and losses, its main buyers, rivals it meets, and recent public contracts. Same data as its public page. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered; the description adds the non-obvious auth and plan-gating requirement and notes the data equals the public page view. It does not cover failure behavior for an unknown or stale slug, which would be the remaining useful detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and the trailing data enumeration helps an agent judge relevance before calling. The middle catalogue of fields is dense but each item earns its place by signalling returned data, given no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by listing the returned data categories, and it covers the single parameter's origin plus auth/plan prerequisites. Nothing an agent needs in order to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there is a single undocumented parameter, so the description carries the burden — it explains what the slug identifies and where to obtain it (search_entities, buyer results), which is the key operational fact. Length/concrete format of the slug is left to the schema's minLength/maxLength only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact resource (one contractor profile) and the identifier (slug), and enumerates the payload categories: registry data, wins/offers, buyers, rivals, recent contracts. Naming the slug source (search_entities or a buyer's results) also disambiguates it from sibling lookups like get_buyer and search_entities, so an agent can route without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions (OAuth authentication plus a trial or paid plan) and tells the agent where the required slug comes from, which is real when-to-use guidance. It does not name an explicit alternative or exclusion case (e.g. when to prefer get_buyer or get_company_profile), so it stops 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_my_tenderMój przetargARead-onlyIdempotentInspect
One tender from the signed-in company's 'Moje przetargi' by tender_id (from list_my_tenders or list_matched_tenders): pipeline status and its history, deadlines, the AI summary state (ready / requested / no_documents / none), the number of tender documents and archive files, the last document fill run, what filling in its documents still needs (fill_details: missing details, confirmed values, Janusz's price proposals), and links to its workspace in the app, its public page and its page on the source portal (source_url, where the official documents are). The summary's text itself comes from get_tender with the returned slug. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| tender_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds genuine context beyond them: authentication and plan requirements, and the enumerated AI summary states (ready / requested / no_documents / none) that shape what an agent will see. It stops short of describing error behavior for a missing or unauthorized tender.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that puts purpose and scope first, then the payload enumeration, then the sibling pointer and prerequisites. It is dense but every clause corresponds to a real returned field; the long mid-sentence enumeration of return values is the only source of friction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the entire burden of explaining what comes back, and it does so field-group by field-group. Combined with the stated auth/plan prerequisites and the pointer to get_tender for the summary text, nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter, so the description must carry the meaning, and it does: it explains that tender_id is a tender identifier coming from list_my_tenders or list_matched_tenders, which tells the agent where to obtain a valid UUID. It does not describe format or failure on unknown IDs, but the origin guidance is the practically important part.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One tender from the signed-in company's "Moje przetargi" by tender_id') and then enumerates exactly what comes back: pipeline status and history, deadlines, AI summary state, document counts, fill state, links. It also distinguishes itself from siblings get_tender (summary text), list_my_tenders and list_matched_tenders, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the exact provenance of the required argument ('tender_id from list_my_tenders or list_matched_tenders') and names the alternative for a related need ('The summary's text itself comes from get_tender with the returned slug'). Prerequisites (OAuth authentication, trial or paid plan) are stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tenderSzczegóły przetarguARead-onlyIdempotentInspect
Fetch full detail for one tender by its public slug (from search_tenders/list_tenders results): metadata, the 12-section AI SWZ summary, the OPZ scope brief, full award results (winner, value, offer price band, rejected offers, whether the cheapest offer won), the cancelled predecessor it re-issues (with that procedure's offer band — a price signal), the EU project funding it, and the bidders' Q&A. A tender without an AI summary (has_summary=false) returns its notice data with summary_sections and scope_brief null, like its public page. Returns not-found for non-public tenders. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | public_slug from a listing result |
Output Schema
| Name | Required | Description |
|---|---|---|
| qa | Yes | |
| cpv | Yes | |
| url | Yes | |
| slug | Yes | |
| title | Yes | |
| region | Yes | |
| source | Yes | |
| results | Yes | |
| currency | Yes | |
| authority | Yes | |
| eu_project | Yes | |
| has_summary | Yes | |
| scope_brief | Yes | |
| opening_date | Yes | |
| published_at | Yes | |
| estimated_value | Yes | |
| summary_sections | Yes | |
| submission_deadline | Yes | |
| cancelled_predecessor | Yes | |
| submission_deadline_pl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: discloses the has_summary=false degradation (summary_sections and scope_brief null), the not-found behavior for non-public tenders, and the OAuth plus trial/paid plan prerequisites. These are exactly the preconditions an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads verb, resource, and identifier, then packs edge cases and auth into the tail. It's dense rather than wasteful, though the long enumeration of returned sections partly duplicates the output schema and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description doesn't need to explain return shape, yet it covers the failure mode, the null-summary case, and access requirements. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already documented as 'public_slug from a listing result'. The description only reinforces provenance ('from search_tenders/list_tenders results'), adding no format, casing, or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch full detail for one tender by its public slug') and enumerates the payload so an agent can distinguish it from siblings like get_tender_results, get_tender_documents, or get_company_profile. The scope (single tender, by slug) is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells where the slug comes from ('from search_tenders/list_tenders results'), which routes the agent to the right discovery tool first, and states when it fails ('Returns not-found for non-public tenders'). It doesn't explicitly name a sibling to prefer for partial needs (e.g. results-only), but the retrieval context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tender_documentsTekst dokumentacji przetarguARead-onlyIdempotentInspect
The text read from a tender's documentation (SWZ, OPZ and attachments; the specification first), by tender_id or public slug, 20000 characters per call (pass next_offset as offset for the rest), with the list of documents it came from. When there is no document text, documents_status and message say why (no documents, or not read yet), the text is the tender's notice instead when Janusz has it (text_source: notice — conditions, wadium, criteria, dates), and copy_with_documents points to the same tender from another portal that has documents. source_url is the procedure's page on the source portal, where its official documents are. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | public slug, when there is no tender_id | |
| offset | No | ||
| tender_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses pagination limits, the next_offset continuation mechanism, fallback to notice text, documents_status and message behavior, copy_with_documents cross-portal pointers, source_url context, and OAuth plus trial/paid plan requirements. This is substantial behavioral context for an otherwise safe read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description is a single very dense sentence with multiple semicolon-separated clauses. It is information-rich rather than wasteful, but the structure makes it harder to scan than a short multi-sentence or bullet-like explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Annotations cover safety and idempotency, and there is no output schema. The description fills that gap by explaining return-relevant behavior: document list, status and message when text is unavailable, notice fallback, source_url, and cross-portal copy pointer. It is complete enough for an agent to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate. It clarifies the relation between tender_id and slug, explains that each call reads 20000 characters, and tells the caller to pass next_offset as offset for continuation, adding meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading text from a tender's documentation, explicitly naming SWZ, OPZ, attachments, and the specification-first behavior. It also clarifies the lookup keys, tender_id or public slug, making it clearly distinguishable from general tender lookup or file-listing siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is strongly implied by the detailed description, and the no-document fallback behavior is explained. However, it does not explicitly say when to choose this tool over siblings such as get_tender_file or list_tender_files, nor does it state clear exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tender_filePlik z archiwumARead-onlyIdempotentInspect
One file from the signed-in company's document archive (file_id from list_tender_files): its text, 20000 characters per call (pass next_offset as offset for the rest; a tender document copied in gives the text read from it), and a download link valid for 5 minutes. download_filename is the name it downloads under: a filled document downloads as its editable Word/Excel original, though filename ends in .pdf; pdf_download_url and pdf_filename then give its PDF. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| file_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: 20,000-character paging via offset, download links expiring in 5 minutes, the surprising rule that a filled document downloads as editable Word/Excel even when the filename ends in .pdf, and the OAuth plus trial/paid-plan requirement. These are exactly the behavioral traps an agent would otherwise hit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, and every clause carries real information. The single long sentence with nested parentheticals is dense and slightly harder to parse than it needs to be, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description supplies the return shape itself: paginated text, a time-limited download link, download_filename, and the pdf_download_url/pdf_filename pair for filled documents. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: file_id is defined as an archive document identifier sourced from list_tender_files, and offset is explained as taking the next_offset value returned for continuation. Both parameters gain meaning unavailable in the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource – fetching one file from the signed-in company's document archive – and anchors the file_id to its source tool (list_tender_files). This clearly distinguishes it from sibling list_tender_files and get_tender_documents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says file_id comes from list_tender_files, which routes the agent from the listing tool to this one. It stops short of stating when not to use it (e.g. bulk download vs single file), so it falls just short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tender_resultsWyniki przetargówARead-onlyIdempotentInspect
Award results of up to 10 tenders at once, by public slug (from search_archived_tenders or any other listing) — to compare prices of similar past tenders. For each: title, contracting authority, estimated value, submission deadline, public URL, and the same award results get_tender returns (winner, value, number of offers, offer price band, the winner's own offer price, rejected offers, whether the cheapest offer won), without the AI summary. results is empty when no award is known; found is false for a slug that is not public. winners lists every winner by part as the tender's public page and the search_archived_tenders card show them (company, NIP, value in PLN only where reliable, award date) — use it for prices when a tender has parts. results names the same winner as winners; when different companies won different parts, its winner_name says so and winners lists them. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| slugs | Yes | public_slug values from listing results |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/non-destructive profile, and the description adds genuinely new behavior: empty `results` when no award exists, `found=false` for non-public slugs, per-part `winners` semantics, and the OAuth plus trial/paid plan requirement. That auth gating is exactly the kind of context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb, resource, and batch limit before the alternative source, and each clause carries substance (return fields, edge cases, per-part behavior). The single dense paragraph is long, but almost every sentence earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the full job of enumerating return fields (title, authority, estimated value, deadline, URL, award results) and the edge-case sentinels (`results` empty, `found` false, `winners` per part). Nothing an agent needs to interpret the response is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `slugs` parameter is documented in the schema, but the description still adds value by pinning the origin of slug values to listing results and reinforcing the batch limit implied by maxItems: 10. Sits above the high-coverage baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource — fetch award results for up to 10 tenders by public slug — and explicitly distinguishes itself from get_tender (batch, no AI summary) and from search_archived_tenders (the source of slugs). An agent can route here without opening either sibling schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case ('to compare prices of similar past tenders') and tells the agent where slugs come from ('from search_archived_tenders or any other listing'), plus how it differs from get_tender. It stops short of explicit when-not conditions, but the context is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_facetsBranże, województwa i miastaARead-onlyIdempotentInspect
List the browsable facets of the active tender set: CPV categories, voivodeships (regions), and cities, each with a count and the slug/code to pass to list_tenders. Also the types of contracting authority (buyer_types) and kinds of contract (kinds) — the codes search_tenders filters by. Call this to discover valid filter values. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile needs no restating. The description adds genuinely new behavioral context: it requires OAuth authentication and a trial or paid plan, and it describes the shape of each returned item (a count plus a slug/code). Minor gap: nothing about result size or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the resource and its contents before the routing advice and the auth/plan caveat. Every clause carries information, though the middle sentence packs two extra facet families (buyer_types, kinds) densely enough that it reads slightly list-heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description must carry the return-value burden, and it does — enumerating the facet families and stating each entry has a count and a slug/code. It also covers the auth/plan prerequisite. What "active tender set" means and whether the facets are user-scoped is left slightly ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing the description could add or omit. The description correctly implies no input is needed, focusing entirely on what the call returns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ("List the browsable facets of the active tender set") and enumerates exactly what is returned: CPV categories, voivodeships, cities, buyer_types and kinds. It also states the payload usefulness (count plus the slug/code to pass to list_tenders), which distinguishes it clearly from siblings like cpv_tree or search_entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call this to discover valid filter values" is an explicit when-to-use instruction, and the description names the downstream consumers (list_tenders, search_tenders) so the agent understands the discovery-then-filter workflow. It lacks an explicit when-not or a pointer to a competing sibling, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_matched_tendersPrzetargy dopasowane do firmyARead-onlyIdempotentInspect
The signed-in company's matched tenders — the list in Przetargowy Janusz built from its profile (CPV codes, voivodeships, budget): view 'recommended' (filtered by what the company does, when its profile says so) or 'all'. 50 per page, each with fit_score (0–100), has_summary, an app_url and the public url, and the profile they are matched to (matching_profile: CPV codes, voivodeships, budget, what the company does). Without CPV codes in the profile there is no list — the answer says so with a link to the profile. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| dir | No | ||
| kind | No | works, supplies or services | |
| page | No | ||
| sort | No | ||
| view | No | recommended | |
| query | No | Words in Polish to narrow the list, e.g. 'oprogramowanie' | |
| regions | No | Voivodeships (slug or name from list_facets); default: the company profile | |
| max_value | No | Maximum estimated value (PLN); overrides the profile budget | |
| min_value | No | Minimum estimated value (PLN); overrides the profile budget | |
| deadline_before | No | ISO date; only tenders with submission deadline before it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly/idempotent/non-destructive; the description adds the materially important context: OAuth authentication and a trial or paid plan are required, results are capped at 50 per page, and a missing-CPV profile yields an explanatory answer rather than an empty list. It also discloses the shape of each returned item (fit_score, has_summary, app_url, public url, matching_profile).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that front-loads what the tool is and the view choice before edge cases and return fields. Every clause carries information, though it runs long and the auth/plan caveat would read better as a separate sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 optional parameters and no output schema, the description covers the gaps that matter: view semantics, profile-driven defaults, pagination limit, the return-field inventory, the no-CPV failure mode, and auth/plan prerequisites. An agent has enough to decide and call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, so the schema carries most of the burden, and the description only adds meaning for the 'view' parameter and the profile-derived defaults behind regions/min_value/max_value. It says nothing about sort, dir, kind, query or deadline_before beyond what the enums already convey, so it adds modest value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('matched tenders' for 'the signed-in company') and immediately grounds it in the matching-profile mechanism, which cleanly separates it from siblings like list_tenders, search_tenders and search_my_tenders. An agent can tell what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains the 'recommended' vs 'all' view choice and the precondition that a CPV-populated profile must exist, plus what happens when it does not (no list, link to profile). It does not name a sibling alternative for general tender browsing, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_alertsMoje alertyARead-onlyIdempotentInspect
List the signed-in user's saved alert profiles (saved searches / notification rules): query, CPV codes, regions, budget band, and delivery settings. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuine context beyond that: it requires OAuth authentication and a trial or paid plan, which the annotations do not convey. It stops short of describing pagination or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the resource and scope front-loaded and the access requirements placed after. Nothing is repeated from the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no output schema, the description supplies the resource, the fields returned, and the access prerequisites. It omits pagination or result-count behavior, which is the only meaningful remaining gap for an agent calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description nevertheless enumerates the content of each alert profile (query, CPV codes, regions, budget band, delivery settings), which frames the semantics of the returned object in the absence of an output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('List the signed-in user's saved alert profiles') and disambiguates with synonyms ('saved searches / notification rules') plus the fields it surfaces. This is unmistakably distinct from siblings like list_my_tenders and search_my_tenders, which operate on tender data rather than saved alert profiles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the prerequisites for use ('Requires OAuth authentication and a trial or paid plan'), which tells the agent when the call will actually succeed. It does not name alternatives or explicitly exclude scenarios, but no sibling covers alerts, so routing ambiguity is low.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_tendersMoje przetargiARead-onlyIdempotentInspect
List the tenders in the signed-in user's pipeline ('Moje przetargi'), most recently updated first, with each one's pipeline status and public URL. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real value beyond that: result ordering ('most recently updated first'), the fields returned (pipeline status, public URL), and the authentication/plan requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the core action and result shape come first, the prerequisite second. Nothing is redundant and no sentence fails to earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the right work by naming the returned fields and ordering, and it discloses auth and plan requirements. The remaining gap is pagination/limit behavior, which is left entirely to the schema's numeric bounds.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single 'limit' parameter is never mentioned in the description. The schema does carry a default (25) and min/max bounds, so the parameter is not fully opaque, but the description makes no attempt to explain paging or what limit controls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('List the tenders in the signed-in user's pipeline') and clarifies the local alias 'Moje przetargi'. The phrase 'signed-in user's pipeline' implicitly separates it from the sibling list_tenders/search_tenders, but it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a prerequisite ('Requires OAuth authentication and a trial or paid plan'), which is useful gating context, but gives no explicit when-to-use versus siblings such as search_my_tenders or list_tenders. Usage is only implied by the 'signed-in user's pipeline' framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tender_filesPliki przetargu w archiwumAIdempotentInspect
Files in the document archive of one tender from the signed-in company's 'Moje przetargi' (tender_id): the tender's documents copied in (copied on the first call when the archive has none yet, as opening the tender in the app does), the company's uploads and the documents Janusz filled — with type, version and date. Read one with get_tender_file. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| tender_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely non-obvious behavior beyond the annotations: the first call may copy tender documents into the archive if it is empty, which explains why readOnlyHint=false on an ostensibly listing tool. It also discloses OAuth authentication and a trial/paid plan requirement, plus the returned fields (type, version, date). No pagination, result-size, or ordering behavior is mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that puts the resource and scope first, then the file origins, then the read-alternative and prerequisites. It is dense and slightly run-on, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape (type, version, date) and covers auth, plan gating, and the archive-population side effect. Missing only edge-case behavior (tender not in 'Moje przetargi', empty archive after copy, result limits) for a tool that mutates state on first call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only constrains tender_id to a UUID, so the description must carry the meaning — and it does, clarifying that the ID identifies a tender in the user's 'Moje przetargi' archive rather than any arbitrary tender. It does not state what happens when the ID is not in the company's saved tenders.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the concrete resource (files in the document archive of one tender) and the scope ('Moje przetargi' of the signed-in company), which an agent can act on directly. It also enumerates the three file origins (copied-in, company uploads, Janusz-filled documents). It does not distinguish itself from the sibling get_tender_documents, which an agent could easily confuse with this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes content retrieval to get_tender_file ('Read one with get_tender_file'), so the list-vs-read split is unambiguous. It also states the precondition that the tender must belong to the signed-in company's saved tenders. It gives no guidance on when to prefer get_tender_documents or get_tender_file's metadata path instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tendersPrzeglądaj przetargiARead-onlyIdempotentInspect
Browse tenders without a text query. filter selects the axis: 'all' (every active tender, or archived when archived=true), 'category' (CPV division code from list_facets), 'region' (voivodeship slug from list_facets), or 'city' (city slug from list_facets). Use list_facets first to get valid values. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| value | No | Required for category/region/city. CPV division code (e.g. '45000000'), region slug, or city slug — all from list_facets. | |
| filter | No | all | |
| archived | No | Only for filter='all': return finished tenders instead. To search finished tenders by topic, CPV or region use search_archived_tenders. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| page | Yes | |
| query | No | |
| total | Yes | |
| filter | No | |
| tenders | Yes | |
| has_more | Yes | |
| per_page | Yes | |
| unapplied_filters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new operational context the annotations cannot carry: OAuth authentication plus a trial or paid plan is required, and 'active' versus archived tenders is a distinct result set. Pagination depth (page max 10) is not mentioned, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening clause front-loads the distinguishing property, then the filter modes are packed into two tight parenthetical sentences with no filler. Slightly dense and backtick-heavy, but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no prose. Auth and plan requirements, the filter axis model, the facet-value dependency and the active/archived distinction are all present, which is everything needed to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 50% schema coverage the description has to compensate, and it does: it explains that `filter` selects the search axis, spelling out the meaning of 'all', 'category' (CPV division code), 'region' (voivodeship slug) and 'city' (city slug) — semantics the bare enum does not provide. `value` and `archived` are already documented in the schema, but `page` is undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Browse tenders') and immediately scopes it apart from the textual search sibling with 'without a text query'. The filter-axis enumeration tells the agent exactly what shapes of result are obtainable, so it is distinguishable from search_tenders, list_matched_tenders and list_my_tenders without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite chain ('Use list_facets first to get valid values') and maps each filter mode to its required value source, which is real routing guidance. It does not explicitly exclude a case or name the alternative to use when a text query is desired (the archived/search_archived_tenders pointer lives only in the schema, not the description), so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_top_winnersKto wygrywa w branży i regionieARead-onlyIdempotentInspect
Who wins public tenders in a sector and region: the contractors that won the most tenders (sort='wins') or the highest total award value (sort='value') among finished tenders with the given CPV codes, in the given voivodeships (of the contracting authority), published in the given period — by default the last 24 months. A whole CPV division (e.g. '45000000') counts tenders whose main CPV code is in that division; a narrower code counts tenders with any CPV code under it, sub-codes included, as in search_archived_tenders (cpv_codes[].match says which). settled_tenders = tenders in that scope with a known winner; the award result is known for part of the finished tenders, less often for the latest months, and a very broad scope may not count in time (the answer then says so). Each contractor: wins (tenders won), parts_won, share_of_tenders (% of settled_tenders), value_pln (sum of the reliable award amounts of value_known_parts of its parts), last_win, NIP, and slug / url when it has a public page (get_contractor takes the slug). Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | wins | |
| limit | No | ||
| regions | No | Voivodeships (slug or name from list_facets); a tender matches any of them | |
| cpv_codes | Yes | CPV codes from cpv_search — the sector, e.g. ['79952000'] for events or ['45000000'] for all construction works | |
| published_after | No | YYYY-MM-DD; published on or after that day | |
| published_before | No | YYYY-MM-DD; published on or before that day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), and the description layers on real behavioral context beyond that: the settled_tenders definition, the caveat that award results are missing for some finished tenders (especially recent months), that a very broad scope may not count in time and says so, and the OAuth plus trial/paid plan requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and sort options are front-loaded, and nearly every clause carries information (scope rules, defaults, caveats, return fields). It is a dense single paragraph, so the enumeration of returned fields and the caveats could be broken out for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description fully enumerates the returned per-contractor fields (wins, parts_won, share_of_tenders, value_pln with its reliability caveat, last_win, NIP, slug/url) and explains the aggregation basis. An agent has everything needed to call it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema coverage, the description adds meaning the schema lacks: the CPV division-vs-narrower-code matching rule (mirroring cpv_codes[].match in search_archived_tenders), that regions refer to the contracting authority's voivodeship, and the default 24-month period that is not encoded in the published_after/published_before defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — ranks contractors who won public tenders in a given sector (CPV) and region, with an explicit choice between sort='wins' and sort='value'. It is clearly distinguishable from siblings like list_tenders or search_archived_tenders, which return tenders rather than aggregated winners.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the scope conditions (finished tenders, contracting authority's voivodeship, publication period defaulting to 24 months) and routes follow-up work to siblings: cpv_search for codes, list_facets for region slugs, and get_contractor for the returned slug. It does not explicitly state when to prefer this over list_tenders or search_archived_tenders, so no true exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_summaryZamów streszczenieAIdempotentInspect
Orders the AI summary of a tender's documentation (SWZ) — the same as 'Wygeneruj teraz' in Przetargowy Janusz: queues the summary, or first the download or reading of the tender documents. By tender_id or public slug. status: already-done (the summary is there — read it with get_tender or get_my_tender), generating (ready in a few minutes), fetch-needed (documents are being downloaded — ask again in a few minutes), extraction-needed (no SWZ among the documents), no-source / no-documents (nothing to summarize), error. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | public slug, when there is no tender_id | |
| tender_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context the annotations cannot express: OAuth authentication plus a trial or paid plan is required, and the call is asynchronous — it queues a summary, or first a document download/read. The status taxonomy discloses every possible behavior along with its follow-up, well beyond readOnlyHint=false / idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, and every clause carries operational value (UI anchor, statuses, auth). The opening sentence is slightly run-on — "queues the summary, or first the download or reading of the tender documents" needs a second pass to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on the return-value burden by enumerating the status values and their meaning. Authentication and plan gating are covered; only identifier precedence is left implicit, a minor gap for a two-optional-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds "By tender_id or public slug," which matches the schema's indication that slug is used only when there is no tender_id. With 50% schema coverage and zero required parameters, it does not resolve whether calling with neither identifier is valid or which identifier wins if both are supplied. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Orders the AI summary of a tender's documentation (SWZ)") and anchors it to a UI equivalent ("Wygeneruj teraz"). It also distinguishes itself from the read-side siblings by naming get_tender and get_my_tender for retrieving an existing summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit exclusion: if status is already-done, do not re-request — read via get_tender/get_my_tender. Each terminal/interim status carries the next action ("ask again in a few minutes", "no SWZ among the documents"), so an agent knows exactly when to call and when to stop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_archived_tendersSzukaj zakończonych przetargówARead-onlyIdempotentInspect
Search finished Polish public tenders (submission deadline passed) — e.g. similar past tenders to price an offer, and who won them. A tender matches when it contains every word of the query (title, contracting authority, CPV, description); recently finished tenders close in meaning are added. Each card's teaser starts with the award result as the tender's public page shows it: 'Wynik: wygrała — zł; ofert: ; .', several winners by part, 'Wynik: unieważniony.' (cancelled) or 'Wynik: brak w danych.' (no result known yet — common for tenders finished in the last months); an amount only where it is reliable. only_settled=true lists only tenders with a known winner — use it to compare prices. Optional filters: CPV codes with all their sub-codes (cpv_codes, from cpv_search), voivodeships, works / supplies / services, estimated value, submission-deadline and publication-date ranges; sort by relevance, deadline or publication date. get_tender_results gives the full results (winners by part, offer price band). Few results: try fewer or other Polish words; hint says how to search again when nothing matches. Tenders without an AI summary are included (has_summary=false). mode is 'semantic' when the meaning search took part, 'lexical' otherwise; unapplied_filters lists filters a temporary fallback could not apply. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| cpv | No | Restrict to tenders whose CPV includes this code, with or without the check digit: '79952000' or '79952000-2' | |
| dir | No | ||
| kind | No | works (roboty), supplies (dostawy), services (uslugi) | |
| page | No | ||
| sort | No | Default: relevance | |
| query | Yes | Words to find, in Polish — the tenders are in Polish, e.g. 'spotkanie mikołajkowe dla dzieci' | |
| region | No | Voivodeship (województwo): slug or name from list_facets, e.g. 'slaskie' or 'śląskie' | |
| regions | No | Voivodeships (slug or name from list_facets); a tender matches any of them | |
| cpv_codes | No | CPV codes from cpv_search, each with all its sub-codes ('79952000' also finds 79952100); a tender matches any of them | |
| max_value | No | Maximum estimated value (PLN) | |
| min_value | No | Minimum estimated value (PLN) | |
| only_settled | No | Only tenders with a known winner — to compare prices. About half of the tenders finished 3–24 months ago have one, fewer of those finished in the last 3 months | |
| deadline_after | No | ISO date; only tenders with submission deadline after it | |
| deadline_before | No | ISO date; only tenders with submission deadline before it | |
| published_after | No | YYYY-MM-DD; published on or after that day | |
| published_before | No | YYYY-MM-DD; published on or before that day |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| mode | No | |
| page | Yes | |
| query | No | |
| total | Yes | |
| filter | No | |
| tenders | Yes | |
| has_more | Yes | |
| per_page | Yes | |
| unapplied_filters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnly/idempotent annotations: it explains the AND-matching rule plus semantic expansion, documents the `teaser` award-result grammar including the cancelled and no-result cases, discloses `has_summary=false` inclusion, defines `mode` and `unapplied_filters`, and states the OAuth plus trial/paid plan prerequisite.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the capability and use cases, then filters, then output semantics, then recovery tips — a sensible order. It is dense and long, and the `teaser` format detail borders on over-specification given an output schema exists, but nearly every sentence carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter search tool with a high-coverage schema and an output schema, the description still covers matching behavior, result-shape caveats, degraded-mode signals, and auth/plan requirements. Nothing an agent needs before calling it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 88%, so the baseline is 3, but the description adds real semantics on top: what only_settled buys you and its hit-rate roughly by tender age, that cpv_codes expand to sub-codes sourced from cpv_search, and what the value and date-range filters constrain. Sort options and CPV expansion are partly restated from the schema, keeping it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with a hard scope boundary: 'Search finished Polish public tenders (submission deadline passed)'. That boundary is what separates it from the active-tender siblings, and it also points to get_tender_results for the full result detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete jobs to be done ('similar past tenders to price an offer, and who won them') and gives a decision rule for only_settled=true ('use it to compare prices'). It also handles failure recovery ('Few results: try fewer or other Polish words') and routes to cpv_search/list_facets for filter inputs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_entitiesSzukaj zamawiających i wykonawcówARead-onlyIdempotentInspect
Find contracting authorities (kind='buyer', zamawiający) or contractors (kind='contractor', wykonawcy — companies and sole traders) by name or NIP. Returns each match with its city, voivodeship, slug and public URL; pass the slug to get_buyer / get_contractor. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| limit | No | ||
| query | Yes | Name fragment as written in Polish, or NIP, e.g. 'gmina wieliczka' or '6772...' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds what the structured fields do not: OAuth plus a trial or paid plan is required, and each match returns city, voivodeship, slug and public URL. Pagination/limit behavior is not explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: purpose and kind semantics first, then return values and next step, then prerequisites. Every clause carries information, though the opening sentence is dense enough to slow parsing slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return shape and the slug handoff to detail tools, and it discloses the auth/plan gate. The only real gap is result-count/pagination behavior via limit, which an agent might need for broad queries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only 'query' is documented in schema), so the description compensates by mapping kind to buyer vs contractor and explaining query accepts either a Polish name fragment or a NIP. The limit parameter (default 20, max 20) is left unmentioned in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find) plus both resource types, and defines the kind values inline with Polish domain terms ('zamawiający', 'wykonawcy — companies and sole traders'). This clearly separates it from get_buyer/get_contractor, which fetch one entity by slug rather than searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the intended flow: search here to obtain a slug, then pass it to get_buyer / get_contractor. It also names the two input modes (name fragment or NIP). It does not say when not to use it (e.g. for tender search, use search_tenders), 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.
search_my_tendersSzukaj w przetargach mojej firmyARead-onlyIdempotentInspect
Search the signed-in company's matched tenders by words — the search box of the tender list in Przetargowy Janusz: only tenders that fit the company profile (CPV codes, voivodeships). view 'recommended' (filtered by what the company does, when its profile says so) or 'all'; 50 per page, the same tender cards as list_matched_tenders. To search all Polish tenders, use search_tenders. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| view | No | recommended | |
| query | Yes | Words in Polish — the tenders are in Polish, e.g. 'oprogramowanie' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior; the description adds real context beyond them: OAuth authentication and a trial or paid plan are required, results are 50 per page, and cards match list_matched_tenders. It does not cover edge cases such as an incomplete company profile, but the key operational constraints are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and scope, then adds view, pagination, alternative, and auth details. It is dense but nearly every clause earns its place; the semicolon-chained structure is slightly run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search with no output schema, the description provides enough to call correctly: scope, views, pagination, Polish query expectation, auth/plan prerequisites, and the return shape by reference to list_matched_tenders. Minor gaps remain around behavior when the company profile is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, so the description carries extra weight. It explains that the query is in Polish and gives an example, clarifies the 'recommended' view as filtered by what the company does when its profile says so, and notes 50 per page; only the page maximum is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Search the signed-in company's matched tenders by words') and bounds the scope to tenders that fit the company profile. It names the sibling it is not (search_tenders for all Polish tenders) and ties results to list_matched_tenders, so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to search_tenders when all Polish tenders are wanted and explains the 'recommended' vs 'all' views. It does not explicitly say when to prefer list_matched_tenders over this search, so the alternative guidance is clear but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tendersSzukaj przetargówARead-onlyIdempotentInspect
Search active Polish public tenders (przetargi) by keywords — the same search as the tender list in Przetargowy Janusz: a tender matches when it contains every word of the query, in any inflection, in its title or contracting authority (the whole query also in CPV and description); words like 'dla' or 'oraz' are skipped. After those come open tenders close in meaning to the query that use other words (e.g. 'ambulans' → 'środki transportu sanitarnego'). Query: 1–3 Polish keywords naming the subject of the tender, e.g. 'catering', 'wywóz odpadów', 'remont dachu' — not sentences, lists of services or a description of the company: every extra word removes tenders. Narrow with the filters instead: CPV codes with all their sub-codes (take them from cpv_search), voivodeships, works / supplies / services, type of contracting authority, notice type (tenders, market research, corrections), submission-deadline and publication-date ranges, bid deposit, estimated value; sort by relevance, deadline, value or publication date. Tenders the company already has in 'Moje przetargi' are found too. For the tenders that fit the user's company use list_matched_tenders — it is built from the company's matching profile (set once in the app or with set_matching_profile). Returns up to 10 pages of 25 tender cards, each with a public URL. Tenders without an AI summary yet are included: their card has has_summary=false and no teaser, get_tender returns their notice data, and a signed-in user on a trial or paid plan can order the summary in Przetargowy Janusz. mode is 'semantic' when tenders close in meaning were added, 'lexical' when only words searched; hint says how to search again when nothing or too much matches. When the search engine is temporarily unavailable, a simpler search answers and unapplied_filters lists the filters it could not apply. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| cpv | No | Restrict to tenders whose CPV includes this code, with or without the check digit: '79952000' or '79952000-2' | |
| dir | No | ||
| kind | No | works (roboty), supplies (dostawy), services (uslugi) | |
| page | No | ||
| sort | No | Default: relevance | |
| query | Yes | Natural-language query in Polish — the tenders are in Polish, e.g. 'budowa hali sportowej z basenem' | |
| region | No | Voivodeship (województwo): slug or name from list_facets, e.g. 'slaskie' or 'śląskie' | |
| deposit | No | Whether a bid deposit (wadium) is required | |
| regions | No | Voivodeships (slug or name from list_facets); a tender matches any of them | |
| cpv_codes | No | CPV codes from cpv_search, each with all its sub-codes ('79952000' also finds 79952100); a tender matches any of them | |
| max_value | No | Maximum estimated value (PLN) | |
| min_value | No | Minimum estimated value (PLN) | |
| buyer_types | No | Type of contracting authority — codes from list_facets buyer_types, e.g. 'gminy_miasta', 'szpitale_przychodnie' | |
| notice_type | No | tenders (przetargi), market research (rozeznania rynku) or corrections (sprostowania) | |
| deadline_after | No | YYYY-MM-DD; submission deadline on or after that day | |
| deadline_before | No | ISO date; only tenders with submission deadline before it | |
| published_after | No | YYYY-MM-DD; published on or after that day | |
| published_before | No | YYYY-MM-DD; published on or before that day |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| mode | No | |
| page | Yes | |
| query | No | |
| total | Yes | |
| filter | No | |
| tenders | Yes | |
| has_more | Yes | |
| per_page | Yes | |
| unapplied_filters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive traits, yet the description adds substantial behavior: the semantic fallback and mode/hint fields, the degraded search with unapplied_filters, has_summary=false cards, the 10-page/25-card pagination cap, and OAuth plus trial/paid plan requirements. The matching semantics are described carefully enough that an agent can predict result loss from extra query words.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, which is good, but the text becomes a dense wall of em-dash clauses, and some material (summary ordering, trial plan, has_summary behavior) is lengthy relative to what an agent needs to invoke the tool. Structure is serviceable but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for an 18-parameter search with an output schema: it covers query construction, filter families, semantic fallback, degraded mode, auth and plan requirements, and pagination. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 89% (baseline 3), but the description genuinely adds value: it explains what a good query looks like (1–3 Polish subject keywords, not sentences), that every extra word removes tenders, and it maps the filter families (CPV with sub-codes, voivodeships, kind, buyer type, notice type, deposit, date ranges, value). It doesn't clarify sort direction or the `region` vs `regions` distinction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search Polish public tenders) with the exact matching model — all words, any inflection, in title or contracting authority, with the whole query also in CPV and description. It clearly distinguishes itself from search_archived_tenders, list_tenders and list_matched_tenders, the latter of which it names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'For the tenders that fit the user's company use list_matched_tenders', 'take CPV codes from cpv_search', and 'Narrow with the filters instead' of extra words. It also states a when-not rule — extra query words remove results — which is a real selection constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_company_detailsUstaw dane firmyADestructiveIdempotentInspect
Sets the signed-in company's details that Janusz writes into offer documents, as the user stated them (the same as 'Profil firmy' in the app). Only the given fields change. Not the NIP — it is set only in the app (profile_url), where it is checked in the GUS register. Returns the saved fields and what is still missing. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| krs | No | KRS number, up to 10 digits | |
| city | No | city | |
| No | contact e-mail | ||
| phone | No | contact phone | |
| regon | No | REGON, 9 or 14 digits | |
| street | No | street and number, e.g. 'ul. Płocka 131/35' | |
| website | No | website | |
| legal_name | No | full legal name, e.g. 'Fundacja We Are For U' | |
| short_name | No | short name | |
| postal_code | No | postal code, e.g. '87-800' | |
| default_signatory_name | No | the person who usually signs offers | |
| default_signatory_role | No | their role, e.g. 'Prezes Zarządu' | |
| default_signatory_email | No | their e-mail |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses partial-update semantics ('Only the given fields change'), the NIP exclusion, that the response includes saved fields and missing fields, and that OAuth plus a trial or paid plan are required. These are substantial operational details for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and partial-update behavior, then quickly covers the NIP exclusion, return value, and auth requirements. It is efficient, though the product-specific phrasing 'that Janusz writes' could be slightly clearer for a general agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 optional parameters, no output schema, and destructive/idempotent annotations, the description supplies the missing context: partial update behavior, return content, auth and plan requirements, and the NIP exception. An agent has enough information to invoke it correctly without surprises.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 13 parameters are already documented in the input schema. The description adds only a broad exclusion for NIP and does not expand on individual field meanings, which is acceptable given the complete schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Sets') and resource ('signed-in company's details') and scopes it to data used in offer documents, matching 'Profil firmy'. It also explicitly distinguishes the operation from NIP handling, which is app-only and GUS-verified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use the tool: updating company profile data as stated by the user. It explicitly excludes NIP and points to the app for that field, but it does not name sibling alternatives such as get_company_profile for reading current values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_fill_detailsUstaw dane do wypełnieniaADestructiveIdempotentInspect
Sets the details Janusz needs to fill in the documents of a tender in 'Moje przetargi' — the completion deadline, the signatory's name and role, and the VAT rate of the offer price — as the user stated them (the same details the Janusz chat in the app records). Only the given fields change. Returns what is still missing before start_fill; the offer price is set with confirm_bid_price. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| vat_rate | No | VAT rate of the offer price (confirm_bid_price is net): 23, 8, 5, 0 or zw (VAT-exempt). Janusz computes the gross price from it; without it he assumes 23. | |
| tender_id | Yes | ||
| signatory_name | No | full name of the person signing the offer | |
| signatory_role | No | e.g. 'Prezes Zarządu' | |
| completion_deadline | No | e.g. '30 dni od podpisania umowy' or '2026-12-15' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so safety is partly pre-communicated. The description usefully adds OAuth and trial/paid plan requirements, the partial-update behavior, and that it returns the list of still-missing fields. However, it never explains what destructiveHint means here — whether previously stored values are overwritten — leaving the main risk unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose is front-loaded in the first clause, with secondary constraints (partial update, return value, auth/plan) following in short sentences. The opening sentence is long and dash-laden, but every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly discloses the return value (what is still missing) and the auth/plan prerequisites, and it scopes the VAT/price split to confirm_bid_price. The one gap is destructive/overwrite behavior, which matters for a tool flagged destructiveHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80% and the enum on vat_rate is documented in-schema with a fallback default of 23. The description lists the same three field groups but adds no format, ordering, or syntax detail beyond what the schema already supplies, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Sets) and resource (details Janusz needs to fill in tender documents), enumerates the exact fields (completion deadline, signatory name/role, VAT rate), and names the product surface 'Moje przetargi'. It also names the sibling that handles the offer price, so the agent can distinguish it from confirm_bid_price without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the workflow position: it reports what is still missing before start_fill, and explicitly routes price-setting to confirm_bid_price. It also clarifies partial-update semantics ('Only the given fields change'). No explicit when-not-to-use case (e.g. before add_to_my_tenders), which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_matching_profileUstaw profil dopasowania firmyADestructiveIdempotentInspect
Changes the signed-in company's MATCHING PROFILE in Przetargowy Janusz — the same as Settings → Profil in the app: CPV codes (add or remove; take them from cpv_search), voivodeships, budget, and what the company does and does not do. This profile decides which tenders are matched to the company — its list (list_matched_tenders), the fit score ('Dopasowanie'), new-tender notifications and e-mails — for EVERY user of the company. It is set ONCE and then stays as it is; it changes for a concrete reason the user gives (e.g. the company started or stopped a line of business). After a change, newly matched tenders show up at once but without AI summaries and fit scores: the score follows within about an hour, the summaries come from a shared queue and can take several hours. Tenders outside the profile are found with search_tenders, without changing it. A change needs user_confirmed=true: the user has been told exactly what will change and what that means, and has confirmed it. Only the given fields change. At most 10 changes a day per company. Returns the profile before and after. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| does | No | What the company does, in its own words ('Co robimy' in the app) — replaces the current text; the fit score is computed from it | |
| cpv_add | No | CPV codes to add, from cpv_search, with or without the check digit: '79952000' or '79952000-2' | |
| regions | No | Voivodeships to match (slug or name from list_facets) — replaces the current list; [] = the whole of Poland | |
| does_not | No | What the company does not do ('Czego nie robimy') — replaces the current text | |
| budget_max | No | Highest estimated value (PLN) of matched tenders; null = no upper bound | |
| budget_min | No | Lowest estimated value (PLN) of matched tenders; null = no lower bound | |
| cpv_remove | No | CPV codes to remove from the profile | |
| user_confirmed | Yes | true when the user has been told exactly what will change and has confirmed it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/idempotentHint annotations: discloses company-wide blast radius ('for EVERY user of the company'), a hard rate limit (10 changes/day per company), a propagation timeline (score within ~1 hour, AI summaries several hours), and that 'only the given fields change'. It also states auth and plan requirements and that the tool returns before/after profiles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does, then layers preconditions, side effects and limits; every sentence carries real information. It is dense and long-ish for one definition, but the length is justified by the number of non-obvious behaviors (delay, rate limit, company-wide scope) that an agent must know before calling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 8-parameter mutation with no output schema, the description supplies everything an agent needs: prerequisites (OAuth, plan, user_confirmed), scope of effect, rate limits, post-change propagation, and return payload ('the profile before and after'). Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter already documents its replacement vs. additive semantics, so the schema carries the burden. The description adds only marginal orientation — pointing at cpv_search as the source for CPV codes and restating the user_confirmed meaning already present in the schema — so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Changes the signed-in company's MATCHING PROFILE') and enumerates the exact fields touched (CPV codes, voivodeships, budget, does/does-not). It also anchors the concept to a UI location ('Settings → Profil'), which removes ambiguity about which object is being mutated, and separates it from list_matched_tenders 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says the profile 'is set ONCE and then stays as it is' and that changes require 'a concrete reason the user gives', which steers the agent away from casual edits. It names the alternative for out-of-profile browsing ('Tenders outside the profile are found with search_tenders, without changing it') and states the user_confirmed=true precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_tender_statusZmień status przetarguAIdempotentInspect
Moves a tender of the signed-in company's 'Moje przetargi' (tender_id) to another status — a kanban column by its name as the company sees it (status from list_my_tenders, e.g. 'Do przejrzenia') or by its id (status_id) — with the moves the app allows: between the company's own kanban stages, to 'Do wysłania' or 'Oczekiwanie na wynik', closing it as 'Wygrana', 'Uczciwa przegrana', 'Nieuczciwa przegrana', 'Anulowane', 'Do odwołania' or 'Odpuszczam', back from 'Do wysłania' / 'Oczekiwanie na wynik' to a work stage, and an appeal to 'Udane odwołanie' or 'Nieudane odwołanie'. Odpuszczam needs a reason; for a loss, cancellation or appeal the reason is optional, for Wygrana the contract value. A refused move lists the allowed statuses with their names (allowed_statuses). Saved to the status history; the rest of the team is notified as in the app. Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | why — required for Odpuszczam; for losses, cancellation and appeals optional | |
| status | Yes | target status: the name of a kanban column as the company sees it (e.g. 'Do wysłania') or its id | |
| tender_id | Yes | ||
| winning_price | No | contract value in PLN, for Wygrana |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, idempotent=true, destructive=false): discloses that Odpuszczam requires a reason, that Wygrana requires a contract value, that a refused move returns allowed_statuses, that changes are written to status history and notify the team, and that OAuth plus a trial/paid plan are required. This is exactly the operational context an agent needs before mutating state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, then the allowed transitions, then side effects and auth. It is dense and long for a single block, but nearly every clause carries distinct information; light restructuring into sentences would improve scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and four parameters, the description covers preconditions (auth, plan), valid targets, conditional parameters, and the failure shape (allowed_statuses). The only gap is the success response, which an agent might want to know since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the baseline is 3, but the description adds value the schema lacks: it names list_my_tenders as the source of valid status names and enumerates the full closing/appeal status vocabulary, which the schema cannot express because there are no enums. The reason/winning_price conditions largely restate the schema fields, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Moves a tender ... to another status') and immediately scopes it to the signed-in company's 'Moje przetargi' kanban. It is unmistakably distinct from siblings like list_my_tenders or get_my_tender, which only read tender state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The enumeration of permitted transitions (own stages, 'Do wysłania', 'Oczekiwanie na wynik', closing statuses, appeals, back-moves) tells an agent exactly when the call will succeed. It also points to list_my_tenders as the source of valid status names. It stops short of naming an alternative tool for cases outside these transitions, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_fillWypełnij dokumentyAInspect
Starts filling in the documents of a tender in 'Moje przetargi' (forms, declarations, price form) with the company's data — the same as 'Wypełnij' in Przetargowy Janusz; it takes a few minutes. Janusz needs the offer price, the completion deadline and the signatory's name and role first: status missing_facts lists what is missing — set it with confirm_bid_price and set_fill_details; allow_missing=true is the user's choice to fill in with what there is (the app's 'Wypełnij z tym co jest'). Progress: get_my_tender (last_fill); the filled files: list_tender_files. Counts toward the plan's fill limit. status: started, missing_facts, nip_required (the company's NIP is not set), fill_limit, rate_limit (8 per day per person). Requires OAuth authentication and a trial or paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| tender_id | Yes | ||
| allow_missing | No | fill in despite missing details — the user's choice |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: discloses that the operation takes minutes, that progress is polled via get_my_tender (last_fill) and results via list_tender_files, that it consumes the plan's fill limit, and the 8/day per-person rate limit. It enumerates terminal statuses (started, missing_facts, nip_required, fill_limit, rate_limit) and states OAuth plus trial/paid plan requirements — none of which annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the app-equivalent name are front-loaded, and every clause carries information (prerequisites, statuses, progress, limits). It is a dense single paragraph with semicolon-chained clauses, which slightly hurts scannability but wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies exactly what would otherwise be missing: the status vocabulary to interpret the result, where to poll progress, and where the produced files appear. For a long-running, quota-consuming mutation, nothing essential is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
allow_missing is fully explained in both schema and prose, including the prerequisite status that motivates it. tender_id carries only format/pattern in the schema with no prose meaning, but it is self-evident as the target tender; coverage is 50% yet the description compensates well for the parameter that actually needs semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Starts filling in the documents of a tender ... with the company's data') and enumerates what gets filled (forms, declarations, price form), plus maps it to the recognizable in-app action 'Wypełnij'. An agent can distinguish it from set_fill_details or get_tender_documents without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names prerequisites (offer price, completion deadline, signatory name/role) and routes the agent to the exact tools that satisfy them (confirm_bid_price, set_fill_details) via status missing_facts. It also explains allow_missing=true as the user's deliberate choice ('Wypełnij z tym co jest'), so use-vs-not is unambiguous.
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 tool update
- Changed
get_tender1 field changed- removed
Output schema / properties / winnersRemoved value: -{ - "items": { - "additionalProperties": false, - "properties": { - "awarded_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "company": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "nip": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "part": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "value": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "part", - "company", - "nip", - "value", - "awarded_at" - ], - "type": "object" - }, - "type": "array" -}
1 tool update
- Changed
get_tender1 field changed- added
Output schema / properties / winnersAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "awarded_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "nip": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "part": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "part", + "company", + "nip", + "value", + "awarded_at" + ], + "type": "object" + }, + "type": "array" +}
1 tool update
- Added
list_top_winners
8 tool updates
- Changed
cpv_search1 field changed- added
Input schema / properties / query / descriptionAdded value: +"Words in Polish — the CPV labels are Polish, e.g. 'projektowanie stron internetowych'"
- Changed
list_matched_tenders1 field changed- added
Input schema / properties / query / descriptionAdded value: +"Words in Polish to narrow the list, e.g. 'oprogramowanie'"
- Changed
search_archived_tenders10 fields changed- added
Input schema / properties / cpv_codesAdded value: +{ + "description": "CPV codes from cpv_search, each with all its sub-codes ('79952000' also finds 79952100); a tender matches any of them", + "items": { + "pattern": "^\\d{8}(-\\d)?$", + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / dirAdded value: +{ + "enum": [ + "asc", + "desc" + ], + "type": "string" +} - added
Input schema / properties / kindAdded value: +{ + "description": "works (roboty), supplies (dostawy), services (uslugi)", + "items": { + "enum": [ + "roboty", + "dostawy", + "uslugi" + ], + "type": "string" + }, + "maxItems": 3, + "type": "array" +} - added
Input schema / properties / only_settledAdded value: +{ + "description": "Only tenders with a known winner — to compare prices. About half of the tenders finished 3–24 months ago have one, fewer of those finished in the last 3 months", + "type": "boolean" +} - added
Input schema / properties / published_afterAdded value: +{ + "description": "YYYY-MM-DD; published on or after that day", + "type": "string" +} - added
Input schema / properties / published_beforeAdded value: +{ + "description": "YYYY-MM-DD; published on or before that day", + "type": "string" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Words to find, e.g. 'spotkanie mikołajkowe dla dzieci'"New value: +"Words to find, in Polish — the tenders are in Polish, e.g. 'spotkanie mikołajkowe dla dzieci'" - added
Input schema / properties / regionsAdded value: +{ + "description": "Voivodeships (slug or name from list_facets); a tender matches any of them", + "items": { + "maxLength": 40, + "minLength": 2, + "type": "string" + }, + "maxItems": 16, + "type": "array" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Default: relevance", + "enum": [ + "relevance", + "deadline", + "published_at" + ], + "type": "string" +} - added
Output schema / properties / hintAdded value: +{ + "type": "string" +}
- Changed
search_entities1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Name fragment or NIP, e.g. 'gmina wieliczka' or '6772...'"New value: +"Name fragment as written in Polish, or NIP, e.g. 'gmina wieliczka' or '6772...'"
- Changed
search_my_tenders1 field changed- added
Input schema / properties / query / descriptionAdded value: +"Words in Polish — the tenders are in Polish, e.g. 'oprogramowanie'"
- Changed
search_tenders13 fields changed- added
Input schema / properties / buyer_typesAdded value: +{ + "description": "Type of contracting authority — codes from list_facets buyer_types, e.g. 'gminy_miasta', 'szpitale_przychodnie'", + "items": { + "enum": [ + "gminy_miasta", + "szkoly_przedszkola", + "firmy_prywatne", + "wojsko_policja_straze", + "powiaty_wojewodztwa", + "sady_prokuratura", + "szpitale_przychodnie", + "pomoc_spoleczna", + "lasy_srodowisko", + "spolki_komunalne", + "kultura_sport", + "uczelnie_instytuty", + "drogi_transport", + "nierozpoznane" + ], + "type": "string" + }, + "maxItems": 14, + "type": "array" +} - added
Input schema / properties / cpv_codesAdded value: +{ + "description": "CPV codes from cpv_search, each with all its sub-codes ('79952000' also finds 79952100); a tender matches any of them", + "items": { + "pattern": "^\\d{8}(-\\d)?$", + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / deadline_afterAdded value: +{ + "description": "YYYY-MM-DD; submission deadline on or after that day", + "type": "string" +} - added
Input schema / properties / depositAdded value: +{ + "description": "Whether a bid deposit (wadium) is required", + "enum": [ + "required", + "none" + ], + "type": "string" +} - added
Input schema / properties / dirAdded value: +{ + "enum": [ + "asc", + "desc" + ], + "type": "string" +} - added
Input schema / properties / kindAdded value: +{ + "description": "works (roboty), supplies (dostawy), services (uslugi)", + "items": { + "enum": [ + "roboty", + "dostawy", + "uslugi" + ], + "type": "string" + }, + "maxItems": 3, + "type": "array" +} - added
Input schema / properties / notice_typeAdded value: +{ + "description": "tenders (przetargi), market research (rozeznania rynku) or corrections (sprostowania)", + "enum": [ + "tenders", + "market_research", + "corrections" + ], + "type": "string" +} - added
Input schema / properties / published_afterAdded value: +{ + "description": "YYYY-MM-DD; published on or after that day", + "type": "string" +} - added
Input schema / properties / published_beforeAdded value: +{ + "description": "YYYY-MM-DD; published on or before that day", + "type": "string" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Natural-language query, e.g. 'budowa hali sportowej z basenem'"New value: +"Natural-language query in Polish — the tenders are in Polish, e.g. 'budowa hali sportowej z basenem'" - added
Input schema / properties / regionsAdded value: +{ + "description": "Voivodeships (slug or name from list_facets); a tender matches any of them", + "items": { + "maxLength": 40, + "minLength": 2, + "type": "string" + }, + "maxItems": 16, + "type": "array" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Default: relevance", + "enum": [ + "relevance", + "deadline", + "value", + "published_at" + ], + "type": "string" +} - added
Output schema / properties / hintAdded value: +{ + "type": "string" +}
- Added
set_matching_profile - Changed
start_fill1 field changed- changed
Input schema / properties / allow_missing / descriptionPrevious value: -"fill in despite missing details — only when the user agreed"New value: +"fill in despite missing details — the user's choice"
6 tool updates
- Changed
list_matched_tenders1 field changed- changed
Input schema / properties / page / maximumPrevious value: -200New value: +10
- Changed
list_tenders1 field changed- changed
Input schema / properties / page / maximumPrevious value: -200New value: +10
- Changed
search_archived_tenders1 field changed- changed
Input schema / properties / page / maximumPrevious value: -200New value: +10
- Changed
search_entities1 field changed- changed
Input schema / properties / limit / maximumPrevious value: -50New value: +20
- Changed
search_my_tenders1 field changed- changed
Input schema / properties / page / maximumPrevious value: -200New value: +10
- Changed
search_tenders1 field changed- changed
Input schema / properties / page / maximumPrevious value: -200New value: +10
6 tool updates
- Changed
cpv_labels1 field changed- changed
Input schema / properties / codes / items / patternPrevious value: -"^\\d{8}-\\d$"New value: +"^\\d{8}(-\\d)?$"
- Removed
cpv_stats - Changed
cpv_tree1 field changed- changed
Input schema / properties / parent / anyOfPrevious value: -[ - { - "pattern": "^\\d{8}-\\d$", - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^\\d{8}(-\\d)?$", + "type": "string" + }, + { + "type": "null" + } +]
- Changed
search_archived_tenders2 fields changed- changed
Input schema / properties / cpv / descriptionPrevious value: -"Restrict to tenders whose CPV includes this code"New value: +"Restrict to tenders whose CPV includes this code, with or without the check digit: '79952000' or '79952000-2'" - changed
Input schema / properties / cpv / patternPrevious value: -"^\\d{8}-\\d$"New value: +"^\\d{8}(-\\d)?$"
- Changed
search_tenders2 fields changed- changed
Input schema / properties / cpv / descriptionPrevious value: -"Restrict to tenders whose CPV includes this code"New value: +"Restrict to tenders whose CPV includes this code, with or without the check digit: '79952000' or '79952000-2'" - changed
Input schema / properties / cpv / patternPrevious value: -"^\\d{8}-\\d$"New value: +"^\\d{8}(-\\d)?$"
- Changed
set_tender_status1 field changed- changed
Input schema / properties / status / descriptionPrevious value: -"target status: a kanban column id of the company or a system status"New value: +"target status: the name of a kanban column as the company sees it (e.g. 'Do wysłania') or its id"
4 tool updates
- Changed
get_tender2 fields changed- added
Output schema / properties / submission_deadline_plAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / requiredPrevious value: -[ - "slug", - "url", - "title", - "source", - "authority", - "cpv", - "region", - "estimated_value", - "currency", - "submission_deadline", - "opening_date", - "published_at", - "has_summary", - "scope_brief", - "summary_sections", - "results", - "cancelled_predecessor", - "eu_project", - "qa" -]New value: +[ + "slug", + "url", + "title", + "source", + "authority", + "cpv", + "region", + "estimated_value", + "currency", + "submission_deadline", + "submission_deadline_pl", + "opening_date", + "published_at", + "has_summary", + "scope_brief", + "summary_sections", + "results", + "cancelled_predecessor", + "eu_project", + "qa" +]
- Changed
list_tenders2 fields changed- added
Output schema / properties / tenders / items / properties / submission_deadline_plAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / tenders / items / requiredPrevious value: -[ - "slug", - "url", - "title", - "buyer", - "buyer_city", - "region", - "cpv", - "estimated_value", - "currency", - "submission_deadline", - "published_at", - "teaser" -]New value: +[ + "slug", + "url", + "title", + "buyer", + "buyer_city", + "region", + "cpv", + "estimated_value", + "currency", + "submission_deadline", + "submission_deadline_pl", + "published_at", + "teaser" +]
- Changed
search_archived_tenders2 fields changed- added
Output schema / properties / tenders / items / properties / submission_deadline_plAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / tenders / items / requiredPrevious value: -[ - "slug", - "url", - "title", - "buyer", - "buyer_city", - "region", - "cpv", - "estimated_value", - "currency", - "submission_deadline", - "published_at", - "teaser" -]New value: +[ + "slug", + "url", + "title", + "buyer", + "buyer_city", + "region", + "cpv", + "estimated_value", + "currency", + "submission_deadline", + "submission_deadline_pl", + "published_at", + "teaser" +]
- Changed
search_tenders2 fields changed- added
Output schema / properties / tenders / items / properties / submission_deadline_plAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / tenders / items / requiredPrevious value: -[ - "slug", - "url", - "title", - "buyer", - "buyer_city", - "region", - "cpv", - "estimated_value", - "currency", - "submission_deadline", - "published_at", - "teaser" -]New value: +[ + "slug", + "url", + "title", + "buyer", + "buyer_city", + "region", + "cpv", + "estimated_value", + "currency", + "submission_deadline", + "submission_deadline_pl", + "published_at", + "teaser" +]
1 tool update
- Changed
list_tenders1 field changed- changed
Input schema / properties / archived / descriptionPrevious value: -"Only for filter='all': return finished tenders instead."New value: +"Only for filter='all': return finished tenders instead. To search finished tenders by topic, CPV or region use search_archived_tenders."
2 tool updates
- Added
get_tender_results - Added
search_archived_tenders
2 tool updates
- Added
get_company_profile - Added
set_company_details
1 tool update
- Changed
set_fill_details1 field changed- added
Input schema / properties / vat_rateAdded value: +{ + "description": "VAT rate of the offer price (confirm_bid_price is net): 23, 8, 5, 0 or zw (VAT-exempt). Janusz computes the gross price from it; without it he assumes 23.", + "enum": [ + "0", + "5", + "8", + "23", + "zw" + ], + "type": "string" +}
3 tool updates
- Added
confirm_bid_price - Added
set_fill_details - Added
start_fill
1 tool update
- Added
request_summary
Related MCP Connectors
EU tenders and grant calls, matched to your company and qualified, inside the AI you already use
Open UK and EU public tenders (Find a Tender, TED) with go/no-go screening. Paid tier via L402.
Open UK and EU public tenders (Find a Tender, TED) with go/no-go screening. Paid tier via L402.
Find, score and analyse German and EU public tenders; search docs; draft quotes.
Related MCP Servers
- AlicenseAqualityCmaintenanceSearch 800 000+ Polish public tenders (BZP + TED) from Claude Desktop, Cursor, Continue. Provides 8 tools for tender search, buyer/contractor profiles by NIP, market statistics, plus a glossary of 90+ Polish public procurement terms.4889 npm4MIT
- AlicenseNot gradedqualityDmaintenanceFind, analyze, and score Polish public tenders (BZP): parsed requirements, deadlines, certificates, and bid-fit scoring against your company profile.5 npmMIT
- FlicenseAqualityCmaintenanceEnables searching and analyzing Polish public procurement tenders from BZP and TED, including filtering, tender details and timelines, offers and contract values, buyer/contractor profiles, CPV code lookup, and regional statistics, with optional AI-summary endpoints.121-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search and retrieve Poland's official public procurement notices from the e-Zamówienia/BZP bulletin without any API key, covering the latest published contract notices as well as filtering by keyword, CPV code, date range, or contracting authority.20 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.