Tool
Name: find_qualified_rfps. Read-only. It finds and ranks U.S. federal solicitations from the public Contract Opportunities extract and a company profile. It returns fit reasons, eligibility gaps, deadlines, and official source links. It does not certify eligibility or submit bids. Lookups do not use a SAM.gov API key. Source is local; mode is local. Build falextracts-20260930b.
A company profile alone is not a search. Supply query (title words) or naics (a six-digit code that filters the local file). Profile naics_codes control ranking. When a NAICS filter is set, title words are scored locally and are not required as an extra retrieval AND.
Prompts that fit the tool
- Find janitorial services solicitations posted in the last 30 days.
- Find construction solicitations in Virginia and show the fit score for each.
- Find software solicitations matching NAICS 541511 and flag set-asides I have not confirmed.
- Show the reasons and qualification gaps for each match, and include the official deadline and source link.
- Continue the same search using the next page index, then compare the new results with the previous shortlist.
Arguments
Unknown fields are rejected. Strings are length-limited. Lists hold at most 30 items.
| Field | Rule |
|---|---|
| company.keywords | Strings, 1–120 characters. Used only for title ranking. |
| company.naics_codes | Six digits each. Ranking only. |
| company.states | Two-letter codes. Empty means geography is not screened. |
| company.set_aside_codes | 2–12 letters or digits. Self-reported. Never proof. |
| query | 2–120 characters. Title words, not full-text search of the description. |
| naics | One six-digit code. Exact match against the extract NaicsCode column. |
| state | Optional two-letter retrieval filter on place of performance, separate from profile states. |
| posted_days | Integer 1–364. Default 30. Compared to the extract PostedDate. |
| limit | Integer 1–50. Default 10. Caps the returned shortlist. |
| max_pages | Integer 1–5. Accepted for compatibility. The local query does not page a remote API. |
| page_index | Integer 0–10000. Default 0. Slices the screened shortlist by limit. |
| include_blocked | Boolean. Default false. true returns blocked rows. |
| active | Boolean. Default true. false may include notices the extract does not mark Active. |
{
"query": "video",
"company": {
"keywords": ["video", "production", "media"],
"naics_codes": ["512110"],
"states": [],
"set_aside_codes": []
},
"posted_days": 30,
"limit": 10,
"active": true
}Illustrative capabilities only. They are not a statement that Agent Structure LLC holds any registration or certification. Supply actual qualifications.
Scoring and screening
The server loads the cached Contract Opportunities file, keeps solicitations and combined synopsis/solicitations, and drops notices past an unambiguous deadline. With active true (the default), notices not marked Active are dropped.
- 50 points when a profile NAICS matches the notice.
- Up to 35 points for the fraction of supplied keywords found in the title.
- 15 points when a supplied service state matches place of performance.
- Title matching is literal and case-insensitive. It is not semantic analysis of the solicitation.
- A set-aside the profile does not list becomes a gap, even when the code looks familiar. A listed code is still “verify against this solicitation,” not a pass.
- A state outside the supplied service area is a blocker. Blocked rows are omitted unless include_blocked is true. SAM registration is not an argument on this path.
- Deadlines without an explicit timezone stay timezone_unverified. Missing or malformed values stay unknown. Only unambiguous elapsed timestamps are excluded.
- Screening status is blocked or needs_review. Never certified.
Result fields
The envelope reports source: "falextracts", mode: "local", build (falextracts-20260930b), retrieved_at, extract_last_modified, coverage language, source_total_records (rows in the extract), scanned_records, pages_fetched, has_more_source_pages, next_page_index, and whether the shortlist was truncated. empty_state is zero-local-matches when the file was queried and nothing matched. That is not the same as a missing file or a stale file. Fewer results do not mean no other opportunities exist outside this extract.
Each result includes id, title, agency, notice type, NAICS, state, set-aside code and description, posted date, deadline { raw, status, iso }, a sam.gov/opp/…/view link, fit score and basis, reasons, gaps, blockers, and relevance. Budget is always null. Award amounts are not reused as budgets. Description URLs that could carry an API key are omitted.
next_page_index continues the same query. Each response ranks the ingested file, then returns one page of the shortlist.
HTTP
On this site, POST /api/v1/signals is the bearer-token lookup and runs the same screening as find_qualified_rfps. GET /ui/signals is the browser form. The routes below belong to a separately hosted connector process. Do not submit this website as the Muse MCP host.
- POST /api/v1/signals
- GET /ui/signals
- GET /ui/logout
- POST /v1/find-qualified-rfps
- GET /openapi.json
- POST /mcp
- GET /health
REST and MCP both require Authorization: Bearer the connector token. GET /health reports process liveness, build falextracts-20260930b, source falextracts, and mode local. It does not mean the extract file was just downloaded. OpenAPI 3.1 is generated from the same input schema as the tool.
MCP
Remote Streamable HTTP at https://govcontractfinder.agentstructure.ai/mcp. Protocol 2025-06-18. Methods: initialize, ping, tools/list, tools/call. Notifications return 202. GET and DELETE return 405. The tool is find_qualified_rfps. It calls the same screening function as POST /api/v1/signals.
Required tool argument: query (natural language). Optional: naics, state, posted_days, limit, page_index, include_blocked, active. Responses include chat text plus structured results with official sam.gov links. Read-only. Spec: MCP Streamable HTTP.
ChatGPT
- Settings → Apps & Connectors → Advanced Settings → Developer mode.
- Create an app. Server URL: https://govcontractfinder.agentstructure.ai/mcp.
- Authentication: Token. Paste an access key from /ui/keys as the bearer token.
- Scan tools. Enable find_qualified_rfps in a chat and ask for federal solicitations.
MCP Inspector
Transport: Streamable HTTP. URL: https://govcontractfinder.agentstructure.ai/mcp. Header Authorization: Bearer plus an access key. First call initialize, then tools/list, then tools/call with query set.
Regular opportunities (watches)
For a user who asks an assistant such as Instinct or Muse in WhatsApp or iMessage to “send me new janitorial contracts in Virginia every morning.” The assistant saves a watch once, then checks it on the user’s schedule. Each check returns only opportunities that watch has not delivered before, at most 10 at a time; the rest arrive on the next check.
- watch_opportunities: query (required, plain words; state names and a six-digit NAICS are understood), name (optional, default “default”), naics, state. Saving the same name again updates it. Up to 10 watches per access key.
- check_new_opportunities: name. Returns new_count, waiting_for_next_check, already_sent_skipped and a chat-ready brief. empty_state “no-new-since-last-check” means nothing new was posted, not a failure.
- list_watches and stop_watching (name).
REST: POST /api/v1/watch with the same bearer key and a JSON body such as {"action":"check","name":"clean-va"}. action is save, check, list or stop; other fields match the MCP arguments. Watches are private to the access key that saved them; only a one-way hash of the key is stored.
Authentication
One operator secret. Visitors do not supply a SAM.gov key, and this build does not store one:
- CONNECTOR_TOKEN — optional bearer token for REST and MCP, at least 32 characters, or an access key from /ui/keys. Do not put it in a public browser bundle or in the Muse listing.
Browser origins other than the configured public origin are rejected on the separate connector process. Machine clients with no Origin header still need the bearer token.
Browser lookup
Some assistants can fill a form from a credential vault but cannot add an Authorization header. Open /ui/keys and click Get my API key. You do not need a SAM.gov account. This browser is signed in, so Search now goes straight to a lookup. Save the key only if Instinct or another browser needs it later: put it in the vault as the password for this site. Then use /ui/signals. The password field is named api_key and uses autocomplete="current-password". The text field is named query.
A valid key is stored only in an httpOnly, Secure, SameSite=Strict session cookie. It is not written to localStorage, the address bar, or logs. While that cookie is valid, the page shows the query box and does not ask for the key again. GET /ui/logout clears it. The form carries a CSRF token. Failed key attempts on this form share the API’s limit of 30 per minute. POST /api/v1/signals still requires the bearer token and does not accept the cookie.
Limits and access
- U.S. federal solicitation metadata only.
- 30 authenticated HTTP requests per minute per process. At most 10 MCP messages per batch.
- The extract is downloaded and cached on the server. A file older than about 36 hours, or a file with no timestamp, is extract-stale (reason ingest-lag) and is not served as current.
- A missing or empty cache is extract-not-ingested. A successful query with no rows is zero-local-matches. Neither invents notices.
- Upstream failures return an error. They never invent notices.
- Fictional preview data, if shown in an operator console, is labeled and is never returned by either API.
Not in this build
No database, watchlist, reminders, bid submission, payment, attachment ingestion, private-sector feed, or state and local coverage. Scheduling stays with the assistant until a separate monitoring service exists.
Errors
| Code | When |
|---|---|
| 400 INVALID_INPUT | Schema failure, including a missing query and NAICS. |
| 401 | Bearer token missing or wrong. |
| 403 | Browser Origin is not the configured public origin. |
| 413 | Body too large. |
| 429 | Connector rate limit. |
| 503 EXTRACT_NOT_INGESTED | The Contract Opportunities extract is missing or empty. No notices inferred. |
| 503 EXTRACT_STALE | Timestamp missing or older than about 36 hours. reason: ingest-lag. No notices inferred. |
| 200 zero-local-matches | The extract was queried and no notice matched the filters. Not an ingest failure. |
Sources
Checked with the implementation on September 30, 2026. This page updated September 30, 2026. Build falextracts-20260930b.
- Contract Opportunities full CSVPublic extract queried locally. Freshness uses Last-Modified, or x-amz-meta-lastmodifieddate when Last-Modified is absent. No API key is sent.
- SAM.govThe notice page linked from each result. Confirm amendments and attachments there.
- Model Context Protocol, 2025-06-18 transportsReference for the optional stateless JSON adapter. Not a claim of later revisions.
- Muse Connector PlatformWhere the listing is submitted. Public pages do not replace the authenticated requirements.