Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Tango MCP server

Vendor MCP
Open markdown

The Tango MCP connector routes your AI agent's tool calls to Tango's own MCP server through Scalekit. Each user connects their own Tango API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 6 tools.

Tools
6
What they doRead · write · destructive
5 · 1 · 05 read1 write0 destructive
Users sign in with

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Tango MCP connection

    In AgentKit > Connections, create a Tango MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Console steps with screenshots

    Register your Tango API key with Scalekit so it can authenticate and proxy federal procurement data requests on behalf of your users. Tango MCP uses API key authentication.

    1. Get a Tango API key

      • Go to the Tango developer portal and sign in.
      • Click Manage Account in the top navigation.
      • Under API Keys, your Default Key is shown — click Click to copy to copy it.
      • To create additional keys, click Manage API keys →.

      Tango developer portal showing the API Keys section with the Default Key and rate limit information

    2. Create a connection in Scalekit

      • In the Scalekit dashboard, go to AgentKit → Connections → Create Connection.
      • Search for Tango MCP and click Create.
      • Note the Connection name — use this as connection_name in your code (e.g., tangomcp).
    3. Add a connected account

      Connected accounts link a specific user identifier in your system to a Tango API key. Add one in the dashboard to test. In production, each user adds their own through the authorization link: they enter their credentials on the page it opens.

      In the dashboard, to test

      • Open the connection and click the Connected Accounts tab → Add account.
      • Fill in Your User’s ID and API Key, then click Save.

      From your backend, if your app already has the credentials

      For example, when users enter them on a settings page in your app:

      import { ConnectorStatus } from '@scalekit-sdk/node'
      const authorizationDetails = {
      details: {
      case: 'staticAuth',
      value: { details: { api_key: 'your-tango-api-key' } },
      },
      }
      let { connectedAccount } = await scalekit.actions.upsertConnectedAccount({
      connectionName: 'tangomcp',
      identifier: 'user_123',
      authorizationDetails,
      })
      // Make sure the account is ACTIVE before the first tool call.
      if (connectedAccount?.status !== ConnectorStatus.ACTIVE) {
      ;({ connectedAccount } = await scalekit.actions.upsertConnectedAccount({
      connectionName: 'tangomcp',
      identifier: 'user_123',
      authorizationDetails,
      }))
      }
  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'tangomcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Tango MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'tangomcp_search',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user opens the link once and enters their Tango MCP server credentials there. If your app already has a user's credentials, add the account from your backend instead, as the console steps above show. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • tangomcp_fetch_api_docsFetch detailed Tango API documentation for a specific section.Read-only

    Fetch API documentation

    Fetch detailed Tango API documentation for a specific section. Use when you need the full list of filtering parameters, valid enum values, ordering options, response shaping syntax, or advanced query patterns beyond what the tool descriptions provide.

    Inputs

    sectionstringrequired
    No description.
  • tangomcp_get_detailsGet detailed information about a single item — entity, contract, IDV, vehicle, opportunity, OTA, OTIDV, organization, protest, SIN, GSA eLibrary contract, IT investment, NAICS/PSC code, budget account, DIBBS RFQ/RFP/award, SAM exclusion, or SBIR topic/solicitation.Read-only

    Get entity details

    Get detailed information about a single item — entity, contract, IDV, vehicle, opportunity, OTA, OTIDV, organization, protest, SIN, GSA eLibrary contract, IT investment, NAICS/PSC code, budget account, DIBBS RFQ/RFP/award, SAM exclusion, or SBIR topic/solicitation. Use after search or resolve to drill into a specific record, optionally enriched with related data.

    Inputs

    idstringrequired
    No description.
    typestringrequired
    No description.one of entitycontractidvvehicleopportunityforecastotaotidvorganizationprotestcontract_appealsubawardsingsa_elibrary_contractitdashboardnaicspscbudget_accountdibbs_rfqdibbs_rfpdibbs_awardexclusionsbir_topicsbir_solicitationsled_opportunitysled_forecastfederal_registerebuy
    attachment_idsstring
    No description.
    attachment_offsetinteger
    No description.default 0
    awardee_pageinteger
    No description.default 1
    awardee_searchstring
    No description.
    fieldsstring
    No description.
    include_attachment_textboolean
    No description.default false
    include_relatedboolean
    No description.default false
    monthsinteger
    No description.default 24
    periodstring
    No description.one of yearquartermonthdefault year
  • tangomcp_resolveFind entities, vehicles, NAICS/PSC codes, GSA MAS SINs, contracts, opportunities, IDVs, OTAs, subawards, organizations, and GAO bid protests matching a search query.Read-only

    Resolve entities

    Find entities, vehicles, NAICS/PSC codes, GSA MAS SINs, contracts, opportunities, IDVs, OTAs, subawards, organizations, and GAO bid protests matching a search query. Use this tool first when you have a name or keyword and need to discover what's in the data — returns identifiers (UEI, organization key, etc.) you can use with other tools.

    Inputs

    querystringrequired
    No description.
    limitinteger
    No description.default 5
    typestring
    No description.one of entityvehiclenaicspscsincontractopportunityidvotaotidvsubawardorganizationprotestitdashboard
  • tangomcp_search_opportunitiesSearch open federal pre-award procurement records — SAM.gov opportunities, procurement forecasts, DLA DIBBS RFQs/RFPs, and SBIR/STTR topics and solicitations.Read-only

    Search Opportunities

    Search open federal pre-award procurement records — SAM.gov opportunities, procurement forecasts, DLA DIBBS RFQs/RFPs, and SBIR/STTR topics and solicitations. Filter by organization, NAICS/PSC code, set-aside type, notice type, place of performance, response deadline, and family-specific filters (nsn/part_number for DIBBS, topic_number/program for SBIR). Returns a list of matching records with total count.

    Inputs

    activeboolean
    No description.
    activitystring
    No description.
    award_date_afterstring
    No description.
    award_date_beforestring
    No description.
    awardedboolean
    No description.
    awardee_ueiarray
    No description.
    buyer_agencystring
    No description.
    buyer_codestring
    No description.
    category_codestring
    No description.
    change_seen_afterstring
    No description.
    contract_numberstring
    No description.
    cycle_namestring
    No description.
    doc_sourcestring
    No description.
    fieldsstring
    No description.
    first_notice_date_afterstring
    No description.
    first_notice_date_beforestring
    No description.
    first_seen_afterstring
    No description.
    first_seen_beforestring
    No description.
    fiscal_yearinteger
    No description.
    fiscal_year_endinteger
    No description.
    fiscal_year_startinteger
    No description.
    has_documentsboolean
    No description.
    incumbent_namestring
    No description.
    jurisdictionstring
    No description.
    keywordstring
    No description.
    last_notice_date_afterstring
    No description.
    last_notice_date_beforestring
    No description.
    limitinteger
    No description.default 25
    modified_afterstring
    No description.
    modified_beforestring
    No description.
    naics_codesarray
    No description.
    naics_starts_withstring
    No description.
    notice_typestring
    No description.
    nsnstring
    No description.
    orderingstring
    No description.
    orgstring
    No description.
    organizationstring
    No description.
    out_of_cycleboolean
    No description.
    part_numberstring
    No description.
    place_of_performancestring
    No description.
    programstring
    No description.
    psc_codesarray
    No description.
    purchase_requeststring
    No description.
    quantity_maxinteger
    No description.
    quantity_mininteger
    No description.
    release_date_afterstring
    No description.
    release_date_beforestring
    No description.
    request_typestring
    No description.
    response_deadline_afterstring
    No description.
    response_deadline_beforestring
    No description.
    revision_kindstring
    No description.
    rfq_idstring
    No description.
    schedulestring
    No description.
    set_aside_flagstring
    No description.
    set_aside_typesarray
    No description.
    sinstring
    No description.
    solicitation_numberstring
    No description.
    solicitation_statusstring
    No description.
    solicitation_typestring
    No description.
    source_systemstring
    No description.
    statestring
    No description.
    statusstring
    No description.
    status_codestring
    No description.
    topic_numberstring
    No description.
    typestring
    No description.one of opportunityforecastdibbs_rfqdibbs_rfpsbir_topicsbir_solicitationsled_opportunitysled_forecastebuydefault opportunity
    yearinteger
    No description.
  • tangomcp_send_feedbackTell the Tango team how its tools worked for you — your own assessment, not the user's.Write

    Send Feedback

    Tell the Tango team how its tools worked for you — your own assessment, not the user's. Call this when a tool made the task harder than it should have been: a result was wrong or implausible, data you expected was missing, a parameter or error message misled you, you needed several retries to find the right call, or the tools could not do what the user asked. Also welcome when something worked notably well. One call per distinct issue, at the moment you notice it; do not wait until the end of the conversation. Do not include secrets or personal details about the user. Args: message: What happened and what you expected instead. Name the calls, parameters, and values involved. category: wrong_data, missing_data, confusing_tool, bug, feature_request, worked_well, or other. tool: The tool the feedback is about (e.g. "search_opportunities"), if any. goal: One sentence on what the user was trying to accomplish. follow_up: True only if the user said they want to hear back about this, or asked to be told when it's fixed. Never ask the user just to fill this in, and never set it on your own judgment. When true, the Tango team may email the account holder once the issue is resolved.

    Inputs

    messagestringrequired
    No description.
    categorystring
    No description.one of wrong_datamissing_dataconfusing_toolbugfeature_requestworked_wellotherdefault other
    follow_upboolean
    No description.default false
    goalstring
    No description.
    toolstring
    No description.