sled-feed
README.md
# sled-feed β Government procurement feeds with change tracking (MCP)
Search live **US (Mississippi)** and **UK (Contracts Finder)** government bids, RFPs and
tenders β and get the one thing the official portals won't push you: **what CHANGED.**
Deadline extensions, new awards, and posted addenda, exposed as **Model Context Protocol
(MCP) tools** so an AI agent can query procurement data directly.
- πΊπΈ **Mississippi** state government solicitations (official DFA Contract Bid Search)
- π¬π§ **UK Contracts Finder** tenders (official Cabinet Office OCDS API, Open Government Licence v3.0)
Both feeds expose the **same three MCP tools**. The standalone server (`mcp_server.py`) is a
thin client that runs the live [Apify](https://apify.com) Actors on demand, so **a fresh
clone returns real data with no local database to seed.**
## Tools
| Tool | What it does |
|---|---|
| `search_opportunities` | Filter live tenders/bids by category, keyword, status, posted/due dates. |
| `get_opportunity` | Full record by id, including all document links + the official notice URL. |
| `list_recent_changes` | **The differentiator** β deadline changes, new awards (Open β Awarded), added documents over time. |
## Quickstart (standalone MCP server, stdio)
The server is **pure Python standard library** β no `pip install` required. You only need
an Apify API token (free tier works); each call runs the live Actor on your own account.
```bash
git clone https://github.com/tobyrichmond12-max/sled-feed.git
cd sled-feed
export APIFY_TOKEN=<your Apify API token> # required β get one at apify.com (free)
export SLED_SOURCE=mississippi # or: uk_contracts_finder
python3 mcp_server.py # speaks MCP over stdio (JSON-RPC 2.0)
# sanity check without a client:
python3 mcp_server.py --selftest
```
### MCP client config (Claude Desktop / VS Code / Cursor)
```json
{
"mcpServers": {
"sled-feed-mississippi": {
"command": "python3",
"args": ["/absolute/path/to/sled-feed/mcp_server.py"],
"env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN", "SLED_SOURCE": "mississippi" }
},
"sled-feed-uk": {
"command": "python3",
"args": ["/absolute/path/to/sled-feed/mcp_server.py"],
"env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN", "SLED_SOURCE": "uk_contracts_finder" }
}
}
}
```
### No-install alternative: Apify hosted MCP
Both feeds are also callable through Apify's hosted MCP server β no clone, no local process:
```json
{
"mcpServers": {
"apify-gov-feeds": {
"url": "https://mcp.apify.com/?tools=toby_richmond/mississippi-procurement-feed,toby_richmond/uk-contracts-finder-feed",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}
```
## Example usage
```jsonc
// search open IT bids
{ "name": "search_opportunities",
"arguments": { "status": "Open", "keyword": "information", "limit": 5 } }
// the change feed (the differentiator)
{ "name": "list_recent_changes",
"arguments": { "since": "2026-06-01T00:00:00" } }
```
Example record (Mississippi):
```json
{
"solicitation_id": "1601-26-R-RFIN-00066",
"title": "SPIRIT Management Information System ...",
"agency": "Mississippi Department of Health",
"category": "INFORMATION TECHNOLOGY (IT)",
"status": "Open",
"due_date": "2026-06-30T15:00:00-05:00",
"due_timezone": "America/Chicago",
"document_links": [{ "label": "Solicitation PDF", "url": "https://.../FORM.PDF" }],
"source_url": "https://www.ms.gov/dfa/contract_bid_search/Bid/Details/45668"
}
```
Example change event (`list_recent_changes`):
```json
{ "event": "deadline_changed", "solicitation_id": "1601-26-R-RFIN-00066",
"old_due_date": "2026-06-30T15:00:00-05:00", "new_due_date": "2026-07-07T15:00:00-05:00" }
```
## Data, schema & privacy
Per solicitation: `solicitation_id`, `title`, `agency` (buying **organisation** only),
`category`, `bid_type`, `posted_date` / `due_date` (ISO-8601 with explicit timezone and
closing time), `status` (Open / Closed / Awarded / Archived), `document_links`,
`source` / `source_url`. The UK feed also carries `estimated_value` + `value_currency`.
**No personal data.** Buyer contact names/emails/phones in the source are stripped at
ingestion and re-checked at storage; only solicitation data and the buying organisation
name are served. A built-in monitor watches for upstream breakage (renamed fields,
response-shape changes, record-count crashes, new status values, or PII drifting toward
output) and returns "temporarily unavailable" rather than serving stale or wrong data.
## How it works
```
MCP client ββstdioββ> mcp_server.py ββHTTPSββ> Apify Actor (run-sync) ββ> official gov API
(thin client) (ingest β diff β change-log β serve)
```
The Actors persist a SQLite snapshot in a named Apify key-value store between runs, so the
change history (`list_recent_changes`) accumulates run over run. Source code for the
pipeline, monitor, and storage layer is all in this repo.
## License
Code: **MIT** (see [LICENSE](LICENSE)). UK Contracts Finder data is provided under the
[Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/)
(commercial reuse permitted). Mississippi data is public-record government information.
This server cannot be deployed
Maintenance
ActivityStale
ResponsivenessNo issues