Prozorro MCP Server
The Prozorro MCP Server enables AI models to search and retrieve Ukrainian government procurement (tender) data, with the following capabilities:
Search by EDRPOU code: Look up tenders from a specific procuring organization using their Ukrainian tax ID
Search by legal name: Find tenders by a substring of the procuring organization's name (case-insensitive)
Search by tenderer/supplier name: Find individual entrepreneurs (FOPs) as bidders by name substring, since FOPs may not have EDRPOU codes
Filter by date range: Narrow results using
dateFrom/dateToparameters (ISO 8601 format)Sort results: Sort by amount (ascending/descending) or last-modified date, applied across the full matching dataset
Paginate: Page through large result sets using
offset, with up to 100 records per pageGet total count: Optionally include the total number of matching tenders across all pages via
includeTotalCombine filters: Use multiple parameters together for more targeted queries
The server integrates with Claude Desktop and other MCP-compatible clients, and currently provides data for 2025.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Prozorro MCP Serversearch for tenders from EDRPOU 12345678 in 2025"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Prozorro MCP Server
A Model Context Protocol (MCP) server that provides AI models with seamless access to Ukrainian government procurement data from Prozorro - Ukraine's public procurement system.
βββ Providing all the available features requires to have a proxy server and database, so right now MCP API is not available publicly. To get API URL and API token, please contact the author.
Features
π Search Tenders: Advanced search capabilities by EDRPOU code, legal name, tenderer/supplier name, or date ranges
βοΈ Server-side Sorting: Sort results by amount or last-modified date, so "biggest"/"latest" queries return the actual top results, not an arbitrary page
π Pagination: Page through result sets larger than 100 rows via
offsetβ‘ Fast: Direct API integration with Prozorro's public procurement database
π οΈ Easy Integration: Simple setup with Claude Desktop and other MCP clients
Related MCP server: simap MCP Server
Available Tools
search_tenders
Searches for government tenders based on various criteria (Right now data are available only for 2025 year).
Parameters:
EDRPOUCode(string, optional): The unique identifier code of the procuring organization (Ukrainian tax ID)legalName(string, optional): A substring to match against the procuring organization's legal nametendererName(string, optional): A substring to match against the tenderer/supplier/bidder's name (not the procuring entity). Use this to find individual entrepreneurs (FOPs) as bidders β see Known Limitations below.dateFrom(string, optional): Start date for the search (ISO 8601 format, e.g.,2025-01-01)dateTo(string, optional): End date for the search (ISO 8601 format, e.g.,2025-12-31)sortBy(string, optional): One ofamount_desc,amount_asc,dateModified_desc,dateModified_asc. Sorting is applied server-side across the full matching dataset before pagination, so e.g.amount_descreliably returns the biggest tenders even if there are thousands of matches.offset(number, optional): Number of records to skip, for paging beyond the firstlimitresults (default: 0)includeTotal(boolean, optional): If true, the response includestotal_countβ the true total number of matching results across all pages. Costs an extra query server-side, so it's opt-in; omit it for routine paging (default: false)limit(number, optional): Maximum number of records to return per page (default: 100, max: 100 β the server hard-caps at 100 regardless of the value requested; useoffsetto fetch additional pages)
Returns: An object with data (array of tender objects with detailed information including tender ID, title, organization details, dates, and procurement status), plus count (rows in this page), total_count (true total matching the filters across all pages β null unless includeTotal was set), limit_applied, offset_applied, and sort_applied.
Known Limitations
Individual entrepreneurs (FOP): Prozorro's public data source masks individual-entrepreneur identifier IDs (EDRPOU-style codes) to
0000000000for privacy. This meansEDRPOUCode/tenderer-ID-based search does not reliably find FOPs. UsetendererName(substring match) instead β FOPs almost always appear as bidders/suppliers (tenderers), not as the procuring entity.
Installation
Method 1: Install from npm (Recommended)
The easiest way to install the MCP server is via npm:
npm install -g prozorro-mcp-serverAfter installation, add to Claude Desktop configuration:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"prozorro": {
"command": "prozorro-mcp-server",
"env": {
"PROZORRO_API_TOKEN": "your-api-token-here",
"PROZORRO_SERVICE_URL": "mcp-api-url-here"
}
}
}
}Restart Claude Desktop and you're ready to use the server!
Note: On Linux/macOS, if you encounter permission issues, you may need to use
sudo npm install -g prozorro-mcp-serveror configure npm to use a user directory.
Method 2: Install from GitHub
Install globally via npm from GitHub:
npm install -g git+https://github.com/VladyslavMykhailyshyn/prozorro-mcp-server.gitAdd to Claude Desktop configuration:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"prozorro": {
"command": "prozorro-mcp-server",
"env": {
"PROZORRO_API_TOKEN": "your-api-token-here",
"PROZORRO_SERVICE_URL": "mcp-api-url-here"
}
}
}
}Restart Claude Desktop - The server will be ready to use!
Method 3: Local Development Installation
Clone the repository:
git clone https://github.com/VladyslavMykhailyshyn/prozorro-mcp-server.git
cd prozorro-mcp-serverInstall dependencies:
npm installBuild the project:
npm run buildAdd to Claude Desktop configuration (use absolute path):
{
"mcpServers": {
"prozorro": {
"command": "node",
"args": ["/absolute/path/to/prozorro-mcp-server/build/index.js"],
"env": {
"PROZORRO_API_TOKEN": "your-api-token-here",
"PROZORRO_SERVICE_URL": "https://prozorro.gov.ua"
}
}
}
}Configuration
The server requires specific environment variables to function correctly. You can set these in the Claude Desktop configuration or in a .env file for local development.
Variable | Description | Required | Example |
| Your Bearer token for the Prozorro API | Yes |
|
| Base URL for the API | Yes |
|
Getting API Credentials
To obtain API credentials and URL for Prozorro:
Contact the author
Retrieve API token and URL
Use the token and URL in your configuration
Common Usage Workflows
Workflow 1: Search Tenders by Organization
1. Use search_tenders with EDRPOUCode to find all tenders from a specific organization
2. Review the returned tender details including dates, amounts, and status
3. Filter results by date range if neededWorkflow 2: Find Recent Tenders
1. Use search_tenders with dateFrom and dateTo parameters
2. Optionally filter by organization name using legalName
3. Limit results for better performanceWorkflow 3: Find the Biggest or Most Recent Tenders
1. Use search_tenders with sortBy: "amount_desc" to get the biggest tenders by value,
or sortBy: "dateModified_desc" for the most recently updated tenders
2. Combine with legalName/EDRPOUCode/tendererName/date filters as needed
3. The top results are guaranteed to be the actual top matches, not just an
arbitrary page of the full result setWorkflow 4: Paginate Through Large Result Sets
1. Call search_tenders with limit: 100 and offset: 0
2. Repeat the call with the same filters/sortBy, increasing offset by 100 each
time, until a page comes back with fewer than 100 results
3. If you need to know the total number of matches upfront (e.g. to answer
"how many tenders in total"), pass includeTotal: true and read total_count
from the response β leave it off for routine paging, since it costs an
extra queryTroubleshooting
Server not appearing in Claude Desktop
Check that the path in
claude_desktop_config.jsonis correctEnsure you've built the project with
npm run buildVerify that Node.js is installed (version 18 or higher required)
Restart Claude Desktop
Check Claude Desktop logs for errors
API Request Failures
Verify your
PROZORRO_API_TOKENis valid and not expiredCheck that
PROZORRO_SERVICE_URLis correctThe Prozorro API may have rate limits - consider adding delays between requests
Network connectivity to prozorro.gov.ua is required
Some tenders might be temporarily unavailable
Authentication Errors
Ensure your API token includes the
Bearerprefix if requiredCheck that your token has the necessary permissions
Verify the token hasn't expired
Development
Project Structure
prozorro-mcp-server/
βββ src/
β βββ index.ts # Main MCP server entry point
β βββ tenders.ts # Tender search implementation
β βββ types.ts # TypeScript type definitions
βββ build/ # Compiled JavaScript (generated)
βββ package.json
βββ tsconfig.json
βββ README.mdRunning in Development Mode
# Watch mode - auto-rebuild on changes
npm run dev
# In another terminal
npm startBuilding for Production
npm run buildAPI Information
This server uses the Prozorro public API to retrieve tender information. For more details about the Prozorro system and available data:
Prozorro Website: https://prozorro.gov.ua/
API Documentation: https://prozorro.gov.ua/api
Data Format: JSON responses with detailed tender information
License
ISC
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Contact
For issues and questions, please use the GitHub Issues page.
Tool Call Examples
Example search_tenders arguments for common queries.
Find all tenders from a specific organization:
{
"EDRPOUCode": "21560045"
}Find tenders by organization name within a date range:
{
"legalName": "Π£ΠΊΡΠΏΠΎΡΡΠ°",
"dateFrom": "2025-01-01",
"dateTo": "2025-06-30"
}Find the biggest tenders by value:
{
"legalName": "Π£ΠΊΡΠΏΠΎΡΡΠ°",
"sortBy": "amount_desc",
"limit": 100
}Find the most recently updated tenders:
{
"sortBy": "dateModified_desc",
"limit": 20
}Find an individual entrepreneur (FOP) as a bidder/supplier:
{
"tendererName": "ΠΠ΅ΡΡΠ΅Π½ΠΊΠΎ ΠΠ²Π°Π½ ΠΠ²Π°Π½ΠΎΠ²ΠΈΡ"
}Page through a large result set (second page, 100 rows each):
{
"legalName": "Π£ΠΊΡΠΏΠΎΡΡΠ°",
"sortBy": "amount_desc",
"limit": 100,
"offset": 100
}Get the true total number of matches, not just the current page:
{
"legalName": "Π£ΠΊΡΠΏΠΎΡΡΠ°",
"includeTotal": true
}Response includes "total_count": 4832 alongside "count" (rows in this page) and "data".
Available Tools
1 toolsearch_tendersC
Search for government tenders by EDRPOUCode code, legal name, or date range.
| Name | Required | Description | Default |
|---|---|---|---|
| EDRPOUCode | No | The unique EDRPOUCode identifier code of the procuring entity (e.g., '01976387'). | |
| legalName | No | A substring of the legal name to search for (case-insensitive). | |
| dateFrom | No | Filter tenders starting on or after this date (ISO 8601, e.g., '2023-01-01'). | |
| dateTo | No | Filter tenders ending on or before this date (ISO 8601). | |
| limit | No | Max number of records to return. Requests >100 will default to 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions search functionality but fails to describe key behaviors like pagination, rate limits, error handling, or response format. This leaves significant gaps for a tool with 5 parameters and no output schema.
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 a single, efficient sentence that front-loads the core purpose without unnecessary details. It is appropriately sized for a search tool, though it could be slightly more structured by explicitly mentioning optional parameters or result handling.
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 the complexity of a search tool with 5 parameters, no annotations, and no output schema, the description is insufficient. It lacks details on behavioral traits, result format, limitations, or error conditions, making it incomplete for effective agent use without additional context.
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 lists the search criteria (EDRPOUCode, legal name, date range), which aligns with some parameters in the schema. However, with 100% schema description coverage, the schema already documents all parameters thoroughly, so the description adds minimal value beyond restating what is in 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 clearly states the verb 'search' and the resource 'government tenders', specifying search criteria (EDRPOUCode, legal name, date range). It is specific and actionable, but since there are no sibling tools, it cannot differentiate from alternatives, preventing a score of 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?
The description provides no guidance on when to use this tool versus other methods or tools, such as for filtering or sorting options. It lists search parameters but lacks context on prerequisites, exclusions, or alternative approaches, offering minimal usage direction.
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
v1.0.0- First observed
search_tenders
TDQS
Scored across 1 tool
With only one tool, there is no possibility of ambiguity or overlap between tools. The tool's purpose is clearly defined as searching for government tenders, making it distinct by default.
The single tool name 'search_tenders' follows a consistent verb_noun pattern. Since there are no other tools to compare, the naming is inherently consistent and predictable.
One tool is too few for a server focused on government tenders, as it suggests an incomplete surface. For this domain, typical operations like viewing tender details, submitting bids, or managing updates are missing, making the set feel thin and under-scoped.
The server has a significant gap in functionality for government tenders. While searching is covered, essential operations such as retrieving specific tender information, creating or updating tenders, and handling bid processes are absent, which will likely cause agent failures in real-world scenarios.
Maintenance
Related MCP Connectors
Public Data Ukraine Mcp connects AI agents to real public APIs via MCP. Tools include
Government tender search for AI agents. UK, EU and US procurement opportunities.
Search public procurement notices from 17 sources across Germany, the EU and the UK. Read-only.
UK public procurement data for AI agents: tenders, contracts, buyer and supplier profiles.
Related MCP Servers
- FlicenseAqualityNot gradedmaintenanceEnables users to search and retrieve detailed information about Taiwan government procurement tenders through the Government Electronic Procurement System API. It supports searching tenders by keyword, category code, date, and government unit.6-
- AlicenseAqualityAmaintenanceEnables AI assistants to search and view public tenders from Switzerland's simap.ch platform.14508 npm8MIT
- FlicenseAqualityDmaintenanceEnables AI assistants to query and analyze Korean public procurement data from the Korea Public Procurement Service (G2B/Nuri) via 14 services and 156 operations, including bid announcements, contracts, prices, and statistics.17-
- AlicenseNot gradedqualityCmaintenanceProvides access to Ukraine's public procurement data (ProZorro) via MCP, keyless and integrated with Pipeworx gateway for AI agents.14 npmMIT