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 5 tools.

Tools
5
What they doRead · write · destructive
5 · 0 · 05 read0 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
    Documentation section to retrieve. Valid values: 'budget_accounts', 'contracts', 'entities', 'forecasts', 'gsa-elibrary', 'idvs', 'itdashboard', 'lcats', 'metrics', 'opportunities', 'otas', 'otidvs', 'protests', 'resolve', 'response-shaping', 'subawards', 'vehicles'.
  • 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
    The identifier for the item — UEI, contract key, IDV key, vehicle UUID, opportunity ID, OTA key, OTIDV key, organization FH key, SIN code, GSA eLibrary contract UUID, IT investment UII, NAICS code, PSC code, or budget account id.
    typestringrequired
    The item type to retrieve details for. Note: 'subaward' is not supported here — use the search tool with type='subaward' and award_key filter instead.one of entitycontractidvvehicleopportunityotaotidvorganizationprotestsubawardsingsa_elibrary_contractitdashboardnaicspscbudget_accountdibbs_rfqdibbs_rfpdibbs_awardexclusionsbir_topicsbir_solicitation
    attachment_idsstring
    Opportunity only. Comma-separated attachment resource_ids (or exact filenames) to pull full extracted text for — the targeted alternative to include_attachment_text when you only need specific documents (Pro-tier).
    attachment_offsetinteger
    Opportunity only, used with attachment_ids. Character offset into each selected document's extracted text — pass the next_offset reported under attachment_text.partial[] to continue reading a document larger than the per-call budget. Ignored without attachment_ids.default 0
    fieldsstring
    Response shape for the primary item — comma-separated field names with optional nesting syntax (same as the search tool). Omit for comprehensive defaults.
    include_attachment_textboolean
    Opportunity only. When true, pulls the full extracted text of ALL file attachments inline (Pro-tier), capped by a per-call character budget.default false
    include_relatedboolean
    When true, enriches the response with related data from multiple endpoints (e.g. child awards for IDVs, socioeconomic status for entities, related opportunities for protests).default false
    monthsinteger
    Trailing window in months for spending-trend metrics (applies to entity, naics, and psc types). Default 24.default 24
    periodstring
    Metric bucketing period for time-series data — 'year', 'quarter', or 'month'. Default 'year'.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
    Free text search — company name, organization name, vehicle name, NAICS code or keyword, PSC code, SIN code, etc.
    limitinteger
    Maximum number of results to return per entity type. Defaults to 5.default 5
    typestring
    Optional filter to restrict search to a specific entity type. When omitted, searches all types except itdashboard.
  • 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

    activestring
    Filter active or inactive opportunities.
    activitystring
    SBIR lifecycle, derived at query time — 'open', 'closed', or (topics only) 'unknown' for topics with no usable date roster (SBIR only). Prefer this over active for SBIR.
    award_date_afterstring
    Anticipated award date lower bound (YYYY-MM-DD, forecasts only).
    award_date_beforestring
    Anticipated award date upper bound (YYYY-MM-DD, forecasts only).
    buyer_codestring
    DLA buyer code (dibbs_rfp only).
    cycle_namestring
    Solicitation cycle name (sbir_solicitation only).
    doc_sourcestring
    Source document collection (sbir_topic only).
    fieldsstring
    Response shape — specify which fields to return. Valid top-level fields: opportunity_id, title, description, solicitation_number, naics_code, psc_code, set_aside, response_deadline, first_notice_date, last_notice_date, active, award_number, notice_history, office, place_of_performance, primary_contact, attachments, meta, sam_url. Use "office(*)" to get agency, department, and office details. Omit for sensible defaults.
    first_notice_date_afterstring
    First notice date lower bound (YYYY-MM-DD).
    first_notice_date_beforestring
    First notice date upper bound (YYYY-MM-DD).
    fiscal_yearstring
    Exact fiscal year match (forecasts only).
    fiscal_year_endstring
    Fiscal year range end (forecasts only).
    fiscal_year_startstring
    Fiscal year range start (forecasts only).
    keywordstring
    Search text across titles and descriptions of opportunities.
    last_notice_date_afterstring
    Last notice date lower bound (YYYY-MM-DD).
    last_notice_date_beforestring
    Last notice date upper bound (YYYY-MM-DD).
    limitinteger
    Max results to return (default 25).default 25
    modified_afterstring
    Modified date lower bound (YYYY-MM-DD, forecasts only).
    modified_beforestring
    Modified date upper bound (YYYY-MM-DD, forecasts only).
    naics_codesstring
    List of NAICS codes to filter by.
    naics_starts_withstring
    NAICS code prefix filter (forecasts only).
    notice_typestring
    Filter by notice type. Accepts a single-letter code or human-readable name. Codes: p (Pre solicitation), k (Combined Synopsis/Solicitation), o (Solicitation), a (Award Notice), m (Modification/Amendment/Cancel), r (Sources Sought), s (Special Notice), u (Justification), i (Intent to Bundle), g (Sale of Surplus Property).
    nsnstring
    National Stock Number, exact (dibbs_rfq/dibbs_rfp only). Use '|' for OR.
    orderingstring
    Ordering field (for example: last_notice_date or -response_deadline).
    orgstring
    Organization filter — accepts a code, name, or abbreviation (e.g. "VA", "CMS", "7500").
    organizationstring
    Federal-hierarchy key of the DLA buying organization (DIBBS only). Not the same as org — DIBBS is always DLA, so this narrows within DLA.
    out_of_cyclestring
    Whether the solicitation is out of cycle (sbir_solicitation only).
    part_numberstring
    Manufacturer part number, exact (dibbs_rfq/dibbs_rfp only).
    place_of_performancestring
    Place of performance text filter.
    programstring
    'SBIR' or 'STTR' (sbir_solicitation only). Topics have no program filter; filter topics via solicitation_number instead.
    psc_codesstring
    List of PSC codes to filter by.
    purchase_requeststring
    Purchase request number (dibbs_rfq only).
    quantity_maxstring
    Maximum quantity requested (dibbs_rfq only).
    quantity_minstring
    Minimum quantity requested (dibbs_rfq only).
    release_date_afterstring
    Release-date lower bound (sbir_topic only). A topic is released, then opens, then closes — this is the earliest of the three, distinct from first_notice_date_*.
    release_date_beforestring
    Release-date upper bound (sbir_topic only).
    response_deadline_afterstring
    Only include opportunities due after this date (YYYY-MM-DD).
    response_deadline_beforestring
    Include opportunities due before this date (YYYY-MM-DD).
    set_aside_flagstring
    DIBBS set-aside flag — 'Y' or 'N' (dibbs_rfq only). A yes/no flag, not a set-aside program type; use set_aside_types for 8(a)/SDVOSB/etc. on opportunities.
    set_aside_typesstring
    List of set-aside type codes to filter by (e.g. ["SBA", "8AN"]). See tango://reference/set-asides for valid codes.
    solicitation_numberstring
    Solicitation number filter.
    solicitation_statusstring
    sbir.gov's own raw Open/Closed string (SBIR only). Source data, distinct from the derived activity field — they can disagree.
    source_systemstring
    Source system filter (forecasts only).
    statusstring
    Status filter (forecasts only). Examples: "Draft", "Final".
    status_codestring
    11-character composite DIBBS status code, e.g. 'DLK00L1N000' (dibbs_rfq only). Unrelated to status and solicitation_status.
    topic_numberstring
    SBIR topic number, exact (sbir_topic only).
    typestring
    What to search — "opportunity" (default), "forecast", "dibbs_rfq", "dibbs_rfp", "sbir_topic", or "sbir_solicitation".default opportunity
    yearstring
    Solicitation year, exact (SBIR only). Not a fiscal year — use fiscal_year for forecasts.