Skip to main content
Glama
VladyslavMykhailyshyn

Prozorro MCP Server

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 name

  • tendererName (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 of amount_desc, amount_asc, dateModified_desc, dateModified_asc. Sorting is applied server-side across the full matching dataset before pagination, so e.g. amount_desc reliably returns the biggest tenders even if there are thousands of matches.

  • offset (number, optional): Number of records to skip, for paging beyond the first limit results (default: 0)

  • includeTotal (boolean, optional): If true, the response includes total_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; use offset to 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 0000000000 for privacy. This means EDRPOUCode/tenderer-ID-based search does not reliably find FOPs. Use tendererName (substring match) instead β€” FOPs almost always appear as bidders/suppliers (tenderers), not as the procuring entity.

Installation

The easiest way to install the MCP server is via npm:

npm install -g prozorro-mcp-server

After 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-server or configure npm to use a user directory.

Method 2: Install from GitHub

  1. Install globally via npm from GitHub:

npm install -g git+https://github.com/VladyslavMykhailyshyn/prozorro-mcp-server.git
  1. Add 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"
      }
    }
  }
}
  1. Restart Claude Desktop - The server will be ready to use!

Method 3: Local Development Installation

  1. Clone the repository:

git clone https://github.com/VladyslavMykhailyshyn/prozorro-mcp-server.git
cd prozorro-mcp-server
  1. Install dependencies:

npm install
  1. Build the project:

npm run build
  1. Add 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

PROZORRO_API_TOKEN

Your Bearer token for the Prozorro API

Yes

Bearer abc123...

PROZORRO_SERVICE_URL

Base URL for the API

Yes

https://mcp-service-url....

Getting API Credentials

To obtain API credentials and URL for Prozorro:

  1. Contact the author

  2. Retrieve API token and URL

  3. 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 needed

Workflow 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 performance

Workflow 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 set

Workflow 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 query

Troubleshooting

Server not appearing in Claude Desktop

  1. Check that the path in claude_desktop_config.json is correct

  2. Ensure you've built the project with npm run build

  3. Verify that Node.js is installed (version 18 or higher required)

  4. Restart Claude Desktop

  5. Check Claude Desktop logs for errors

API Request Failures

  • Verify your PROZORRO_API_TOKEN is valid and not expired

  • Check that PROZORRO_SERVICE_URL is correct

  • The 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 Bearer prefix if required

  • Check 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.md

Running in Development Mode

# Watch mode - auto-rebuild on changes
npm run dev

# In another terminal
npm start

Building for Production

npm run build

API Information

This server uses the Prozorro public API to retrieve tender information. For more details about the Prozorro system and available data:

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 tool
search_tendersC

Search for government tenders by EDRPOUCode code, legal name, or date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
EDRPOUCodeNoThe unique EDRPOUCode identifier code of the procuring entity (e.g., '01976387').
legalNameNoA substring of the legal name to search for (case-insensitive).
dateFromNoFilter tenders starting on or after this date (ISO 8601, e.g., '2023-01-01').
dateToNoFilter tenders ending on or before this date (ISO 8601).
limitNoMax number of records to return. Requests >100 will default to 100.

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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. 1 tool updatev1.0.0
    • First observedsearch_tenders

TDQS

B3.1/5.0

Scored across 1 tool

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count2/5

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.

Completeness2/5

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

ActivityStale
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    Not graded
    maintenance
    Enables 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
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to search and view public tenders from Switzerland's simap.ch platform.
    14
    508 npm
    8
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides access to Ukraine's public procurement data (ProZorro) via MCP, keyless and integrated with Pipeworx gateway for AI agents.
    14 npm
    MIT