Skip to main content

SAM.gov Opportunities MCP server

This MCP server lets an AI assistant (Claude Desktop, Cursor, VS Code, Claude Code or any other MCP client) search U.S. federal contract opportunities on SAM.gov: solicitations, sources sought, presolicitations and award notices.

Each call runs the Apify actor cleandatalabs/samgov-opportunities under your own Apify token. You don't need a SAM.gov API key and there is no 10-requests-per-day limit.

Not a developer? If you'd rather have a person watch a SAM.gov search for you, Clean Data Labs offers a free hand-checked sample: one search, the last 7 days, up to 10 notices.

Tools

Tool What it does
search_opportunities Searches active notices, newest first. Filters: keywords, naics_codes, psc_codes (both accept prefixes, e.g. 2362 or Z2), set_asides (SBA, 8A, HZC, SDVOSBC, WOSB, EDWOSB and others), agencies (by name), states (place of performance), notice_types, posted_since (YYYY-MM-DD, posted or updated on or after that date; default is the last 7 days), deadline_within_days, open_for_response_only, max_results (default 25, max 200) and detail (compact or full).
get_opportunity Fetches one notice by notice ID, sam.gov/opp/... URL or solicitation number. A solicitation number returns all of its notices, including the award (winner, UEI, amount).
what_changed_since_last_check Monitor mode: give a stable monitor_id plus the same filters each time and get only notices that are new or changed since the previous call, each with change_type (new, amended, deadline_changed, amount_changed, awarded, canceled, notice_type_changed, updated), changed_fields, plain-English change_summary, structured text_diff (title, description passages, attachments, deadline/amount/etc.) and previous values (previous_response_deadline, previous_award_amount_usd, previous_notice_id). Unchanged notices are free. The first call defaults to a free baseline.

Compact rows include the notice ID, title, solicitation number, type, department, agency and office, posted and deadline dates, NAICS, PSC, set-aside, place of performance, primary contact, attachment count, award fields (amount, date, awardee name, UEI, CAGE, award number), monitor change fields (change_type, changed_fields, change_summary, text_diff, previous values), optional attachment_archive / attachments_archived when the actor archived files, and the SAM.gov link. detail: "full" adds the description, all contacts and attachment links.

search_opportunities and get_opportunity are read-only. what_changed_since_last_check stores its memory (a samgov-monitor-state key-value record) in your own Apify account.

Cost

The actor charges $0.003 per returned notice (25 results cost $0.075), billed to the Apify account that owns the token. Apify's free plan includes $5 of monthly credit. Each tool call carries a spending cap: the lower of max_results × $0.003 and SAMGOV_MAX_CHARGE_USD (default $0.30). Each result reports estimated_cost_usd.

Install

You need uv (for uvx), or Python 3.10+ with pip, and an Apify API token from Console > Settings > API & Integrations.

Claude Desktop / Cursor / any client with an mcpServers config

{
  "mcpServers": {
    "samgov": {
      "command": "uvx",
      "args": ["samgov-opportunities-mcp"],
      "env": { "APIFY_TOKEN": "apify_api_..." }
    }
  }
}

Claude Code

claude mcp add samgov --env APIFY_TOKEN=apify_api_... -- uvx samgov-opportunities-mcp

VS Code (.vscode/mcp.json)

{
  "inputs": [{ "type": "promptString", "id": "apify-token", "description": "Apify API token", "password": true }],
  "servers": {
    "samgov": { "type": "stdio", "command": "uvx", "args": ["samgov-opportunities-mcp"],
                "env": { "APIFY_TOKEN": "${input:apify-token}" } }
  }
}

From source

git clone https://github.com/clean-data-labs-org/samgov-opportunities-mcp && cd samgov-opportunities-mcp
pip install -e .
APIFY_TOKEN=apify_api_... samgov-opportunities-mcp   # speaks MCP over stdio

Configuration

Env var Default Meaning
APIFY_TOKEN (required) Your Apify API token. Runs are billed to this account.
SAMGOV_MAX_CHARGE_USD 0.30 Spending cap per tool call.
SAMGOV_ACTOR_BUILD latest Actor build tag or number to run. latest is actor 0.3.7 (monitor change_summary/text_diff, opt-in downloadAttachments → attachment_archive). Leave unset so the default latest is used. get_opportunity needs 0.3+, what_changed_since_last_check needs 0.3.4+.

Actor 0.3.7 (on latest): monitor rows include change_summary and text_diff, and every row carries set_aside / set_aside_description. Attachment archiving is opt-in on the actor via downloadAttachments: true (files land in a persistent KV store with sha256 dedupe; rows get attachment_archive[] / attachments_archived). This MCP package does not yet expose a download_attachments tool flag; set it only if you call the actor directly.

Example prompts

  • "Find small-business set-aside janitorial contracts in Colorado posted this week."
  • "Any VA construction solicitations under NAICS 2362 due in the next 30 days?"
  • "Who won solicitation FA813226Q0061, and for how much?"
  • "What changed since last check in my construction-co watch (NAICS 236220, Colorado)?"
  • "Show me HUBZone IT services opportunities (NAICS 5415) from the Army since 2026-11-01."

No-install alternative: Apify's hosted MCP server

To skip installing anything, point your client at Apify's hosted server and limit it to this actor:

{ "mcpServers": { "samgov": { "url": "https://mcp.apify.com/?tools=cleandatalabs/samgov-opportunities" } } }

It signs you in with OAuth, or you can send Authorization: Bearer <APIFY_TOKEN>. It exposes the actor as one generic tool with every raw actor input, plus run and dataset helper tools. This package instead offers three focused tools with typed filters, compact output and a per-call spending cap.

Development

pip install -e ".[test]"
pytest                                  # offline tests over a real MCP stdio session
SAMGOV_LIVE=1 APIFY_TOKEN=... pytest    # adds a live search + get (about $0.01)
npx @modelcontextprotocol/inspector -e APIFY_TOKEN=... -- samgov-opportunities-mcp

Data source and disclaimer

The data comes from public SAM.gov notices. This project is not affiliated with or endorsed by the U.S. General Services Administration or SAM.gov. Always confirm deadlines and requirements on the official notice before you bid.

License

MIT

Metadata

Release files for samgov-opportunities-mcp 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for samgov-opportunities-mcp 0.2.1
File Size Uploaded Provenance Actions
samgov_opportunities_mcp-0.2.1.tar.gz 11.3 kB Without provenance Details for samgov_opportunities_mcp-0.2.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for samgov-opportunities-mcp 0.2.1
File Interpreter ABI Platform Actions
samgov_opportunities_mcp-0.2.1-py3-none-any.whl Python 3 none any Details for samgov_opportunities_mcp-0.2.1-py3-none-any.whl

Total release size: 22.6 kB

Release files / samgov_opportunities_mcp-0.2.1.tar.gz

Download URL samgov_opportunities_mcp-0.2.1.tar.gz
Size 11.3 kB
Tags Source
SHA-256 checksum
How to use checksums
069222a7647161f0f38adf0d4803be1776ad84d97be37a0e94f76ce569b7dc9f
BLAKE2b-256 checksum
How to use checksums
90da5a3e0b005b2cdbc2fc80822a2b966759ee7e7db073825acff3693932e2b5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.16

Release files / samgov_opportunities_mcp-0.2.1-py3-none-any.whl

Download URL samgov_opportunities_mcp-0.2.1-py3-none-any.whl
Size 11.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
13e61238277d6622152d5090664664f885a30aeb3f6a27e856488fa95423e489
BLAKE2b-256 checksum
How to use checksums
c7840ef5872e000cfebfc4f05f4c86cad82d22fa65a69f5d0c3768209d8d7a23
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.16

Security for samgov-opportunities-mcp 0.2.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page