MCP server for public tenders: search tenders from Claude, Cursor and any AI assistant
Scoutee's MCP server lets Claude, Cursor, VS Code or any MCP client search public tenders across Europe and North America and read a notice, with your API key. Setup in one line.
Aktualisiert am 9. September 2026
Scoutee exposes its tender database as an MCP server. Connect it once and your assistant can answer questions such as "which roadworks tenders opened in France this week?" or "what is the deadline on this notice?" by searching the same catalogue as the app: dozens of official journals and buyer platforms across Europe and North America, refreshed every morning.
MCP, the Model Context Protocol, is the open standard that lets an AI assistant call external tools. Claude Code, Claude Desktop, Cursor, VS Code, Windsurf and most agent frameworks speak it. Scoutee's server gives them two tools: search the tenders, read one notice.
What you can ask
- "Find open tenders about school catering in Belgium and Luxembourg, newest first."
- "List the notices with a budget between 100,000 and 500,000 euros in Spain closing after 1 October."
- "Read tender 417558 and summarise the eligibility criteria."
- "Which tenders matching my keywords appeared since my last check on Monday?"
The assistant translates the question into a search, reads the results and answers in your language. It sees the buyer, the title, the location, the deadline, the estimated value and the link to the source, exactly what the app shows.
Connection details
- URL:
https://scoutee.org/api/mcp - Transport: Streamable HTTP, stateless, JSON responses. No stream to hold open, so it works through any proxy.
- Authentication: a Scoutee workspace API key, in the
X-API-Keyheader or asAuthorization: Bearer. The key is mandatory: a call without one comes back as a tool error asking for it. - Quotas: those of the workspace's plan, 100 searches an hour on Pro and 300 on Team. A search costs one unit, reading a notice costs nothing, and the bucket is shared with the REST API.
An API key is created from the workspace page of the app, on any paid plan. The API documentation describes the search parameters in full: the MCP tools take exactly the same ones.
Claude Code
claude mcp add --transport http scoutee https://scoutee.org/api/mcp \
--header "X-API-Key: sct_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b"
Claude Desktop, Cursor, VS Code, Windsurf and other clients
Most clients read a configuration file holding an mcpServers object: .cursor/mcp.json, .vscode/mcp.json, ~/.codeium/windsurf/mcp_config.json, the Claude Desktop settings. The entry is the same everywhere:
{
"mcpServers": {
"scoutee": {
"url": "https://scoutee.org/api/mcp",
"headers": {
"X-API-Key": "sct_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b"
}
}
}
}
The two tools
search_tenders takes the query parameters of the REST search, with the same meaning: q, keyword (array), country (array, English country names), source_id, min_value, max_value, sort (newest, oldest, deadline), include_closed, seen_after, page and page_size. All optional. page_size defaults to 20, since a notice is a large object to hand to a model. The result is a page of tenders plus three fields that tell the assistant where the quota stands: quota_plan, quota_limit and quota_remaining.
get_tender takes a single tender_id and returns the full notice, the same object as the REST endpoint. It consumes no quota.
Both tools are declared read-only: an assistant can never create, change or delete anything on Scoutee through them.
From your own code
With the mcp Python package (pip install mcp):
import asyncio
import os
import httpx
from mcp.client import Client
from mcp.client.streamable_http import streamable_http_client
URL = "https://scoutee.org/api/mcp"
async def main():
headers = {"X-API-Key": os.environ["SCOUTEE_API_KEY"]}
async with httpx.AsyncClient(headers=headers) as http:
async with Client(streamable_http_client(URL, http_client=http)) as client:
result = await client.call_tool(
"search_tenders",
{"keyword": ["roadworks"], "country": ["France"], "page_size": 10},
)
page = result.structured_content
print(page["total"], "notices |", page["quota_remaining"], "searches left")
for tender in page["items"]:
print(tender["id"], tender["deadline_at"], tender["title"])
asyncio.run(main())
Errors
A call that fails comes back with is_error set and a plain English message, followed by its stable code in brackets: Invalid API key [invalid_api_key], an exhausted quota, an unknown identifier. The codes are those of the API documentation.
Where the server is listed
The server is published in the official MCP Registry under the name org.scoutee/scoutee, and its server card is at https://scoutee.org/.well-known/mcp/server-card.json. Directories such as Smithery and Glama list it too, and any of them points back here.