A side-by-side look at the Opentk MCP and Ocds MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Opentk MCP for search & data extraction work as a local process; choose Ocds MCP for search & data extraction as a local process. You can also run both side by side in one mcpServers block.
get_overview, birthdays_today, list_persons.VERGABE_API_KEY.match_tenders, linked_notices, update_company_profile.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Search & Data Extraction | Search & Data Extraction |
| Quality signal | 60/100 · Good | 61/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | No auth required | API key required |
| Pricing | Free | BYOK (pay the provider) |
| Required env vars | None listed | VERGABE_API_KEY |
| Verified owner | Community listing | Community listing |
| GitHub stars | 23 | 5 |
| Directory activity | 1 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 17 | 11 |
| Full listing | View Opentk MCP | View Ocds MCP |
get_overviewProvides a comprehensive overview of recent parliamentary activities, including the most recent documents and MPs celebrating birthdays today. The response contains structured data with two main sections: 'recentDocuments' (listing the latest parliamentary documents with their IDs, titles, types, dates, and URLs) and 'birthdays' (listing MPs celebrating birthdays today). The results are paginated with 10 documents per page. The tool supports iterative pagination - check the pagination.hasMoreDocuments field in the response to determine if additional pages are available. The response includes pagination information showing the current page, whether more documents are available, and the total number of documents retrieved. Applicable when general information about recent parliamentary activities is needed.birthdays_todayLists all Members of Parliament celebrating their birthday today, including their names, political parties, and birth dates. The response is a JSON array where each entry contains the MP's ID, name, party affiliation, and other details. This tool takes no parameters as it always returns today's birthdays. Applicable when information about MPs' birthdays is needed.list_personsProvides a complete directory of current Members of Parliament with their IDs, names, titles, party affiliations, and faction memberships. The response is a JSON array where each entry contains an MP's full details including unique MP IDs that can be referenced by other tools. This tool takes no parameters as it returns all current MPs. Applicable when comprehensive information about all MPs is needed or when analyzing the composition of parliament by party.search_tkPerforms a comprehensive search across all parliamentary data including documents, activities, and cases. Returns results matching the provided keyword or phrase. Use this for general searches when you need information on any topic discussed in parliament, regardless of document type or context. Search syntax: Searching for 'Joe Biden' finds documents containing both 'Joe' and 'Biden' anywhere in the text. Searching for "Joe Biden" (with quotes) finds only documents where these words appear next to each other. Searching for 'Hubert NOT Bruls' finds documents containing 'Hubert' but not 'Bruls'. The capital letters in 'NOT' are important. You can also use 'OR' and 'NEAR()' operators.search_tk_filteredPerforms a search within a specific category of parliamentary data, allowing results to be limited to only documents, activities, or cases. Returns paginated results sorted by date (most recent first). Search syntax supports: keyword searches ('Joe Biden' finds both terms), exact phrase searches ("Joe Biden" with quotes finds the exact phrase), exclusion ('Hubert NOT Bruls' excludes documents with 'Bruls'), and boolean operators ('OR', 'NEAR()'). Results can be returned in 'full' or 'summary' format.get_photoRetrieves the official portrait photograph of a Member of Parliament. Returns the image as a binary resource that can be displayed or saved. Use this when you need to include a visual representation of an MP in reports, presentations, or profiles.get_document_detailsRetrieves metadata about a parliamentary document in a structured JSON format, without downloading the actual document content. Returns information including title, type, document number, dates, version number, and links to both the PDF version and the official Tweede Kamer webpage.get_document_linksConverts document URLs into clickable markdown-formatted links. This tool takes either a direct PDF link or a Tweede Kamer webpage link and returns them as properly formatted clickable links.get_committeesRetrieves a list of all parliamentary committees with their IDs, names, and URLs. The response is a JSON array where each entry represents a committee with its unique identifier and name. Committees are specialized groups of MPs that focus on specific domains like defense, healthcare, or finance. This tool takes no parameters as it returns all active committees.get_committee_detailsRetrieves detailed information about a specific parliamentary committee, including its members, recent activities, and description. This provides deeper insight into the committee's composition, leadership roles, and recent work. Use this when you need comprehensive information about a particular committee's structure and activities.get_upcoming_activitiesRetrieves a list of upcoming parliamentary activities including debates, committee meetings, and other events. The response contains a structured JSON object with both a chronological list of activities and activities grouped by date. Each activity includes details like date, time, location, committee, type, and a URL for more information. The results are sorted by date with the most imminent activities first. The optional 'limit' parameter controls the number of results returned (default: 20, max: 100).get_voting_resultsRetrieves recent voting results on parliamentary motions and bills. The response contains a structured JSON object with voting results sorted by date (newest first). Each result includes detailed information such as the title of the motion/bill, the date of the vote, the submitter, whether it was accepted or rejected, the vote counts (for/against), and which political parties voted for or against. The 'limit' parameter controls the number of results (default: 20, max: 100) and 'format' parameter allows choosing between 'full' or 'summary' format. The 'summary' format provides a more structured representation with renamed fields, while both formats include complete party voting information.match_tendersSemantic match: find tenders similar to a profile's stored description vector. The vector is embedded locally and sent to the API (the profile text never leaves the machine). Optional `filters` (same taxonomy as search_text) apply server-side. Returns SearchResult rows. `k` defaults to 10, max 100.linked_noticesList the notices that make up one procurement: given an OCID, return the linked set of {ocid, notice_id} refs (the procurement's notice lineage — PIN/CN/CAN siblings sharing the procurement key). Ids only; fetch each notice's XML via get_release with the returned notice_id. A length-1 set means a single isolated notice with no lifecycle to walk (the sub-threshold case).update_company_profileUpdate a company profile. Only provided fields change. If the description changes, the profile is re-embedded locally.list_company_profilesList all company profiles (summary without description), ordered by creation date.get_index_infoHealth + version check of the API plus local profile counts and the embedding-contract comparison. Reports the API status/version, the client's embedding model/contract/dimension, the server's advertised contract (when present), and whether they match. Call this first to check connectivity.delete_company_profileDelete a company profile and its embedding by UUID.create_company_profileCreate a company profile for tender matching. Stores name, description, CPV codes, categories, and location in a local SQLite database. The description is embedded locally (passage prefix); neither the text nor the embedding is sent until a match_tenders call sends the vector. Returns the profile UUID and embedding status. German description recommended.search_textSemantic full-text search over the German procurement corpus. The query is embedded locally with multilingual-e5-small and only the 384-float vector is sent to the API (the query text never leaves the machine). Returns the top `k` SearchResult rows grouped by OCID, each carrying ocid, score, title, buyer_name, procurement_method, main_procurement_category, value_amount/currency/currency_eur_amount, deadline (RFC3339), award_date, cpv_codes, phase, documents_url, data_source, country. Optional `filters`: phase (planning/open/closed/awarded/unsuccessful), cpv_starts_with (2..8 digit CPV prefix), country (ISO-2), value_min/value_max (EUR), deadline_after/deadline_before (RFC3339), main_procurement_category (goods/works/services), buyer_name, procurement_method (eForms codes, match-any), data_source.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"r-huijts-opentk-mcp": {
"command": "npx",
"args": [
"-y",
"@r-huijts/opentk-mcp"
]
}
}
}
{
"mcpServers": {
"qune-tech-ocds-mcp": {
"command": "npx",
"args": [
"-y",
"@qune-tech/vergabe-mcp"
],
"env": {
"VERGABE_API_KEY": "YOUR_VERGABE_API_KEY_HERE"
}
}
}
}
get_company_profileGet a company profile by its UUID. Returns name, description, CPV codes, categories, location, and embedding status.list_releasesFilter-only browse over the German procurement corpus (no semantic query — only filter values cross the wire). Same filter taxonomy as search_text. Paginate with `limit` (max 200, default 20) and `offset`. Returns SearchResult rows ordered by deadline DESC.get_releaseFetch the raw eForms XML envelope for a single OCID (5 fields: ocid, notice_id, data_source, country, raw_xml). Optional `notice_id` selects a specific notice of the OCID (EU siblings share one OCID); absent fetches the latest notice. Pair with linked_notices to walk a procurement's lifecycle (PIN->CN->CAN). Parse the XML yourself for detailed eForms fields — the envelope is intentionally thin.