Skip to main content
Glama
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.