In-depth architectural comparison of the Ocds MCP and Crw MCP servers. Compare execution transports, security boundaries, tool capabilities, quality scores, and ready-to-paste client installation snippets for Claude, Cursor, Windsurf, and VS Code.
At a Glance & Executive Verdict
Ocds MCP
Search & Data Extraction · Local stdio
Quality: 61/100 (Good) | Auth: API Key required
Crw
Search & Data Extraction · Local stdio
Quality: 68/100 (Great) | Auth: OAuth 2.0
Verdict Summary: Choose Ocds MCP if you need specialized Search & Data Extraction tools running via a local process. Choose Crw if your workspace requires Search & Data Extraction integration with local subprocess execution. Both servers can be configured concurrently in your client's mcpServers manifest.
Which MCP Server Should You Choose?
Choose Ocds MCP when:
You need dedicated capabilities in the Search & Data Extraction domain.
You prefer local stdio subprocess transport architecture.
Your security boundary fits: API Key required (BYOK (Pay Provider Direct)).
You have access to required keys: VERGABE_API_KEY.
German public procurement data (OCDS) — semantic search, tender matching with company profiles, and structured filtering.
fastCRW — open-source (AGPL-3.0), self-hostable Rust web crawler & search API for AI agents. Tools: scrape, crawl, map, and SearXNG-backed search. Single 6MB static binary; reproducible 1K-URL benchmarks faster than hosted alternatives. Hosted MCP at fastcrw.com/mcp (Streamable HTTP, OAuth) or self-host.
Category & Scope
Tools & Capabilities Breakdown
Ocds MCP Tools (11)
match_tenders
Semantic 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_notices
List 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_profile
Update a company profile. Only provided fields change. If the description changes, the profile is re-embedded locally.
list_company_profiles
List all company profiles (summary without description), ordered by creation date.
Ready-to-Paste Client Configurations
Paste either (or both) of these JSON server blocks into your client config file (e.g. claude_desktop_config.json or ~/.cursor/mcp.json).
Ocds MCP is categorized under Search & Data Extraction and uses a local stdio subprocess. In contrast, Crw belongs to Search & Data Extraction using local stdio subprocess. Select Ocds MCP when you need capabilities focused on search & data extraction and Crw when you require tools for search & data extraction.
Health + 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_profile
Delete a company profile and its embedding by UUID.
create_company_profile
Create 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_text
Semantic 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.
get_company_profile
Get a company profile by its UUID. Returns name, description, CPV codes, categories, location, and embedding status.
list_releases
Filter-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_release
Fetch 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.
Crw Tools (8)
crw_scrape
Scrape one URL to markdown, HTML, or links.
crw_crawl
Start an async site crawl; returns a job id to poll with crw_check_crawl_status.
crw_check_crawl_status
Poll an async crawl job and retrieve its pages.
crw_map
Discover URLs on a site via sitemap and/or a short crawl. Returns a URL list only, no page content.
crw_extract
Extract structured JSON from URLs via a prompt and/or JSON schema. Async job — poll crw_check_extract_status with the returned id. Needs an LLM.
crw_check_extract_status
Poll an extract job; returns status and, when complete, a per-URL results array.
crw_cancel_extract
Request cancellation of an extract job. Returns the canonical status; cancelling remains non-terminal until the claimed URL settles.
crw_parse_file
Parse a local PDF (base64 in contentBase64) to markdown. No OCR: scanned PDFs return empty markdown with a warning.