Tango MCP (AI agents)¶
The Tango MCP server gives AI agents access to federal procurement competitive intelligence via the Tango API. The server is hosted at https://tango.dev/mcp and uses HTTP transport — you connect your MCP client to the remote endpoint; no local install required.
https://govcon.dev/mcp is the original endpoint and keeps working; it is not deprecated and we are not retiring it. Both addresses reach the same server. Use tango.dev/mcp for new setups, and see Which endpoint should I use? if you are already connected to govcon.dev.
Tango is listed in both major assistant directories, and you can also point any MCP-compatible client — Cursor, the OpenAI Responses API, your own — at the endpoint directly.
Install from a directory¶
Installing from a directory is one click plus a Tango sign-in. You never handle an API key and there is nothing to configure:
- Claude —
tango.dev/claudeopens the Tango connector in Anthropic's directory. You can also find it in Claude under Settings → Connectors. Works on web, desktop, and mobile. - ChatGPT —
tango.dev/chatgptopens the Tango app in the ChatGPT app directory.
Both connect to the same hosted server and authenticate through Tango's OAuth flow, so the assistant sees exactly the data your account and plan already allow. Manage the connection — or revoke it — from your account at tango.dev.
The rest of this page covers connecting other MCP clients, where you supply the endpoint and credentials yourself.
What it does¶
The server exposes 5 tools that let an AI agent research government contracting data on your behalf:
- Discover what's in the data — Use
resolveto find entities, agencies, vehicles, NAICS/PSC codes, contracts, opportunities, OTAs, OTIDVs, subawards, organizations, protests, and IT Dashboard investments by name or keyword; get identifiers and previews to use with other tools. - Search awards and related data — Use
searchto query contracts, IDVs, vehicles, OTAs, OTIDVs, subawards, organizations, GSA eLibrary contracts, CALC labor rates (LCATs), bid protests, IT Dashboard investments, grants, and federal budget accounts. Filter by vendor, agency, NAICS, PSC, dates, and many other criteria; optionally profile a capped sample of the matches (obligated amounts, set-aside breakdown, etc.) — seeinclude_summaryis a sample, not a market total. - Search active opportunities — Use
search_opportunitiesto find SAM.gov opportunities and agency forecasts by agency, NAICS, set-aside type, response deadline, and keyword. - Get full details for any item — Use
get_detailsto retrieve detailed information for a specific entity, contract, IDV, vehicle, opportunity, OTA, OTIDV, organization, subaward, protest, MAS SIN, GSA eLibrary contract, or IT Dashboard investment by ID, with optional related-data enrichment. - Read curated API documentation — Use
fetch_api_docsto pull short, LLM-friendly documentation for any major Tango resource (contracts, opportunities, vehicles, IT Dashboard, etc.).
Quick start¶
Skip this section if you installed from the Claude or ChatGPT directory — those handle the endpoint and the sign-in for you.
Prerequisites¶
- A Tango API key (from the Tango web interface), or for OAuth clients: access tokens via
Authorization: Bearer <access_token> - An MCP-compatible client (e.g. Cursor, Claude Desktop)
Connect via HTTP¶
The MCP endpoint is https://tango.dev/mcp. Configure your client to connect to this URL over HTTP and send your API key (see Using with MCP clients below).
Which endpoint should I use?¶
| New setups | https://tango.dev/mcp |
Already connected to govcon.dev/mcp | Stay there. Nothing is changing and there is no migration deadline. |
The two addresses are the same server, but they are distinct OAuth protected resources — each advertises its own resource identifier, and access tokens are bound to the one you authorized against. Switching an existing OAuth connection from govcon.dev/mcp to tango.dev/mcp therefore means re-authorizing. That is the only reason to think twice; if you connect with an API key rather than OAuth, you can switch freely.
Using with MCP clients¶
Remote MCP (HTTP) — recommended¶
Connect your client to the hosted server over HTTP using mcp-remote. The server expects your Tango API key in the X-Tango-API-Key header (or an OAuth bearer token in Authorization: Bearer).
Cursor / Claude with remote URL (API key):
{
"mcpServers": {
"tango-remote": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://tango.dev/mcp",
"--header",
"X-Tango-API-Key: your_api_key_here"
]
}
}
}
Cursor / Claude with remote URL (OAuth bearer token):
{
"mcpServers": {
"tango-remote-oauth": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://tango.dev/mcp",
"--header",
"Authorization: Bearer your_oauth_token_here"
]
}
}
}
Use a fresh access token from your Tango OAuth flow; refresh the token when it expires.
Streamable HTTP (JSON mode) — The server uses HTTP transport and returns JSON responses rather than Server-Sent Events (SSE). If you see errors like "Unexpected content type" or "Failed to open SSE stream", ensure the client uses JSON mode.
API key security — Prefer setting the API key via environment variable or a secrets manager. When using mcp-remote with --header X-Tango-API-Key: ..., avoid committing the key to config; use a local env var or secret so the key is not logged or stored in plain text.
Claude¶
The Tango connector in Anthropic's directory is the recommended path — one click, sign in with Tango, no API key to manage. See Install from a directory above.
To supply your own API key instead of signing in with OAuth, configure Claude Desktop with the remote-MCP JSON above.
ChatGPT¶
Enable the Tango app from the ChatGPT app directory. Authentication is the same Tango OAuth sign-in; no API key required.
To call the server from your own OpenAI integration instead, see OpenAI Responses API below.
OAuth flow¶
When connecting over HTTP, you can authenticate with a bearer token instead of an API key. This is useful for clients that support OAuth or when you obtain access tokens from Tango's OAuth server. The Claude and ChatGPT directory listings run this flow for you — the steps below are for clients you wire up yourself.
-
Obtain an access token from the Tango OAuth server at tango.makegov.com. Use the authorization code or client credentials flow; supported grant types include
authorization_code,client_credentials, andrefresh_token. Required scope is typicallyread. -
Send the token on each request via the
Authorizationheader:Authorization: Bearer <your_access_token>. -
Auth precedence — The server resolves auth in this order: (1)
Authorization: Bearerif present, (2)X-Tango-API-Keyif present, (3)TANGO_API_KEYfrom the environment (stdio/local only).
OAuth discovery — The server exposes standard discovery endpoints so clients can find the Tango authorization server and required scopes:
- Authorization server metadata:
GET /.well-known/oauth-authorization-serverandGET /mcp/.well-known/oauth-authorization-server - Protected resource metadata:
GET /.well-known/oauth-protected-resource
These return JSON (issuer, authorization_endpoint, token_endpoint, scopes_supported, etc.). The default issuer is https://tango.makegov.com.
OpenAI Responses API¶
OpenAI's MCP integration requires a publicly accessible server. Use the hosted MCP endpoint https://tango.dev/mcp in your tools configuration. See the OpenAI MCP documentation for details.
Available tools¶
| Tool | Description |
|---|---|
resolve | Find entities, vehicles, organizations, contracts, opportunities, OTAs, OTIDVs, subawards, protests, IT Dashboard investments, NAICS / PSC / SIN codes by name or keyword. Use first when you have a string and need to discover what's in the data; returns identifiers and short previews for use with other tools. |
search | Search across 13 record types: contract (default), idv, vehicle, ota, otidv, subaward, organization, protest, gsa_elibrary, lcat, itdashboard, grant, and budget_account — or all. Filter by vendor, agency, NAICS, PSC, dates, keyword, and many other criteria. Set include_summary=true to profile a capped sample of the matches (see below). |
search_opportunities | Search open opportunities and agency forecasts. Filter by agency, NAICS, PSC, set-aside type, response deadline, notice type, keyword, and other criteria. Type defaults to opportunity; pass type="forecast" for forecast data. |
get_details | Get detailed information for a single item by ID and type. Supported types: entity, contract, idv, vehicle, opportunity, ota, otidv, organization, subaward, protest, sin, gsa_elibrary_contract, itdashboard. Use after search or resolve to drill into a specific record. Optional include_related=True enriches the response (see "Enrichment matrix" below). IT Dashboard business_case_html content requires Business+. |
fetch_api_docs | Fetch curated, LLM-friendly markdown documentation for a single Tango resource. Sections: budget_accounts, contracts, entities, forecasts, gsa-elibrary, idvs, itdashboard, lcats, metrics, opportunities, otas, otidvs, protests, resolve, response-shaping, subawards, vehicles. |
Enrichment matrix (get_details(..., include_related=True))¶
| Type | Adds when include_related=True |
|---|---|
entity | Socioeconomic status + 10 most recent contracts |
contract | Full detail + subawards |
idv | Full detail + child awards + transactions + CALC labor rates |
vehicle | Full detail + awardees + task orders |
opportunity | Full detail (attachments, notice history, primary contact) |
ota / otidv | Full detail + child awards / OTAs + transactions |
organization | Detail + child organizations |
protest | Detail + dockets + related opportunities / contracts |
sin | Detail + GSA eLibrary contracts (Schedule holders) |
gsa_elibrary_contract | Detail (no further enrichment) |
itdashboard | Detail + nested CIO evaluation, contracts, projects, funding, performance metrics. The business_case_html HTML blob requires Business+ tier. |
Enrichment failures degrade gracefully — if a related-data fetch fails, the main object is still returned with empty related blocks.
include_summary is a sample, not a market total¶
search(..., include_summary=true) returns a statistical profile — total_obligated, top_vendors, set_aside_distribution, naics_distribution, org_distribution — computed over at most 250 matching records. That is a hard cap, not a ceiling a narrow filter escapes: the server fetches up to 250 rows and aggregates those. When more records match, the response sets is_capped_sample and includes a _note naming how many of the total were analyzed.
Two limits worth knowing before you use it:
- Don't report
total_obligatedas market size. It is the sum over the sampled rows. Narrow the filters until the match count falls under the cap if you need the sample to be the whole population. - The distributions are awarding-side.
org_distributionis keyed onawarding_office, so a summary cannot break spending down by funding organization even when you filtered onfunding_org.
For true full-population aggregates, computed server-side over every matching record:
| You want | Use |
|---|---|
| One vendor's entire award history | get_details(type="entity", fields="past_performance(summary,top_agencies)") |
| An organization's obligations, including its whole subtree | search(type="organization", fields="fh_key,name,total_obligations,tree_obligations") |
| Appropriations-level totals | search(type="budget_account") — see Budget |
Resources¶
The server also exposes static MCP resources. Clients that support resource fetching can pull curated reference content without a tool call:
| URI | Content |
|---|---|
tango://guides/federal-procurement | Overview guide: how federal procurement data fits together. |
tango://guides/api-reference | Quick reference: enums, sorting fields, response shaping, recipes. |
tango://reference/set-asides | Set-aside type codes and meanings. |
tango://reference/protests | Background on bid protests (GAO / SBA OHA). |
tango://reference/naics/{code} | NAICS code lookup. |
tango://reference/psc/{code} | PSC (Product / Service Code) lookup. |
tango://reference/sin/{code} | GSA MAS SIN lookup. |
Configuration¶
- API key vs OAuth: Send your Tango API key in the
X-Tango-API-Keyheader, or useAuthorization: Bearer <token>with an OAuth access token from tango.makegov.com. - Endpoint: The MCP endpoint is
https://tango.dev/mcp(HTTP transport).https://govcon.dev/mcpreaches the same server and continues to work. - Response format: The hosted server returns responses in TOON (Token-Oriented Object Notation) by default — a compact serialization that is roughly 30–60% smaller than JSON for typical responses. To force standard JSON, set
TANGO_RESPONSE_FORMAT=json(relevant when self-hosting; the hosted server returns TOON).
Self-hosting / local environment variables¶
If you run the server locally (e.g. via stdio for development), the following environment variables are recognized:
| Variable | Purpose |
|---|---|
TANGO_API_KEY | Default API key (used when no X-Tango-API-Key / Authorization header is supplied; stdio mode only). |
TANGO_RESPONSE_FORMAT | json to force JSON output. Default is TOON. |
TRANSPORT | http to switch from stdio to streamable-HTTP transport. |
TANGO_TELEMETRY | 1 to log per-tool duration / token counts / status to stderr as JSON. |
TANGO_LOG_USER_FINGERPRINT | 1 to log a stable hash of the API key (not the key itself) for correlation. |
SENTRY_ENABLED | 1 to enable optional Sentry error monitoring. |
Notable behaviors¶
The server includes several robustness features worth knowing about when integrating:
- Strict argument validation. Unknown tool arguments are rejected with a structured error that lists the valid arg names — no silent drops. Pass
typenotrecord_type, etc. - Zero-result hints. When a search returns no results, the response includes a
_hintwith the active filters and broaden-query guidance — helpful for LLM agents that would otherwise guess randomly. - Ordering-alias rewrite. LLM-friendly sort field names like
expiring,date,value, andamountare rewritten to API-valid values (award_date,obligated,total_contract_value). - Parameter coercion. Bare strings for array fields (
naics_codes,psc_codes,set_aside_types) are wrapped automatically.activeaccepts"true"/"false".notice_typeaccepts both code letters (p,k,o,a,m,r,s,u,i,g) and full names ("Solicitation","Sources Sought", etc.). - Circuit breaker. After 3 transient upstream failures (502 / 503 / 504 / timeout) within 60 seconds, the server short-circuits with
UpstreamUnavailableError. A probe is allowed every 10 seconds during the cooldown. - Tier-aware errors. Tier-gated endpoints (e.g. CALC labor rates) return a typed error with an upgrade hint rather than a raw HTTP exception.
Troubleshooting¶
424 error from OpenAI — OpenAI can only reach publicly accessible servers. Use the hosted endpoint https://tango.dev/mcp.
Empty results — Verify your API key is valid. Check that the UEI, NAICS code, or other identifiers you are using exist in the Tango database.
502 Bad Gateway / "Failed to open SSE stream" — The server uses HTTP transport and JSON responses, not SSE. If the client expects SSE, use a client that supports JSON mode.
403 when calling the server URL — A proxy or firewall may be blocking the request to https://tango.dev/mcp. Ensure your client sends the API key or Bearer token as described above.
"Invalid API key or authentication required" — When connecting to https://tango.dev/mcp, the server must receive either your Tango API key in the X-Tango-API-Key header or an OAuth bearer token in the Authorization: Bearer <token> header. Ensure your MCP client is configured to send one of these.
Get help¶
For API keys, account issues, or MCP connection problems:
- Email: [email protected]
- Tango web interface: tango.dev — sign in to manage your account and API keys.
Privacy¶
Data handling and privacy are described in our Privacy policy.
References¶
- Tango connector in Anthropic's directory — one-click install for Claude
- Tango app in the ChatGPT app directory — one-click install for ChatGPT
https://tango.dev/mcp— Hosted Tango MCP server (HTTP transport).https://govcon.dev/mcpis an alias for the same server.- Model Context Protocol Specification
- MCP Inspector — Interactive testing and debugging for MCP servers
- OpenAI MCP Documentation
- Tango API