Skip to main content
Glama

usaspending-mcp-server

Spending by Geography

usaspending_spending_by_geography
Read-onlyIdempotent

Aggregate federal spending by state, county, or congressional district. Useful for per-capita analysis, regional comparisons, and mapping federal investment patterns. Filter by keyword, award type, agency, recipient, NAICS code, Assistance Listing, PSC, DEF code, or date range. Areas are ranked by obligation and capped at limit; to retrieve specific areas, including ones ranked past the cap, list their codes in shape_codes — a 2-letter postal code for state, a 5-digit state + county FIPS code for county, or a 4-digit state FIPS + district number for district — NOT place names. Resolve place names to these codes using a geocoding server (Census or OpenStreetMap) first. Chain per-capita results with Census population data for meaningful comparisons.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum geographic areas to return, ranked by aggregated_amount descending (1–500). The upstream endpoint is not paginated — it returns every matching area in one response — so this caps client-side. A nationwide county query matches over 3,000 areas; use shape_codes to retrieve one ranked past the cap.
scopeYesWhich location to aggregate by: place_of_performance (where work is done) or recipient_location (where the recipient is based)
filtersNoOptional filters to scope the spending aggregation
geo_layerYesGeographic granularity: state (states, DC, and territories), county (county-level), or district (congressional district)
subawardsNoInclude subaward data instead of prime award data
shape_codesNoReturn only these areas (1–500 codes), in the shape_code form this tool returns for geo_layer: 2-letter postal code for state ("NY"), 5-digit state + county FIPS for county ("36117" is Wayne County, NY), or 4-digit state FIPS + 2-digit district number for district ("3623" is NY-23, "5600" is Wyoming's at-large seat). Selection runs over every area the filters matched, so it reaches areas ranked past limit; selected areas stay ranked by aggregated_amount and capped at limit. A code that matches no area is named in the notice.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
capNoThe limit that was applied.
errorNoPresent when the call failed. Absent on success.
scopeNoLocation scope used for aggregation
shownNoNumber of geographic areas returned.
totalNoNumber of geographic areas returned
noticeNoHow to reach areas omitted by limit, which shape_codes matched no area, which time-period bound was filled in when only the other was supplied, and — when the filters matched no area — any Assistance Listing, PSC, or DEF codes sent and how to broaden filters. Absent when none applies.
resultsNoSpending totals by geographic area
geo_layerNoGeographic granularity used
truncatedNoTrue when the area list was capped at limit.
area_countNoNumber of geographic areas returned
applied_scopeNoLocation scope applied: place_of_performance or recipient_location
applied_keywordsNoKeyword filters applied (comma-separated)
applied_def_codesNoDEF codes sent, uppercased (comma-separated)
applied_geo_layerNoGeographic granularity applied: state, county, or district
applied_psc_codesNoPSC codes sent, uppercased (comma-separated)
truncationCeilingNoObligation amount of the lowest-ranked area shown — an upper bound on omitted ones.
applied_agency_nameNoAwarding agency name filter applied
applied_naics_codesNoNAICS code filters applied (comma-separated)
applied_shape_codesNoArea codes listed in shape_codes, letters uppercased and duplicates removed (comma-separated)
total_areas_availableNoNumber of geographic areas the filters matched, before shape_codes selection and limit were applied
applied_time_period_endNoEnd of the time period sent (YYYY-MM-DD), including a filled-in end
applied_time_period_startNoStart of the time period sent (YYYY-MM-DD), including a filled-in start
applied_award_type_defaultNoDisclosure that no filters were supplied, so award_type_codes defaulted to the complete set. Absent when the caller supplied at least one filter.
applied_assistance_listingsNoAssistance Listing numbers sent (comma-separated)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed18 schema fields changed
    • addedInput schema / properties / filters / additionalProperties
      Added value: +false
    • changedInput schema / properties / filters / properties / agency_name / description
      Previous value: -"Awarding agency name filter"New value: +"Awarding agency name filter, top-tier only (e.g., \"Department of Defense\") — the toptier_name from usaspending_autocomplete_filters type=awarding_agency; a sub-agency name matches nothing"
    • addedInput schema / properties / filters / properties / assistance_listings
      Added value: +{
      +  "description": "Filter by Assistance Listing (CFDA) program numbers, e.g. [\"15.507\"]: two digits, a dot, then three digits or capital letters (11.67A). Matches an award when any of its listings equals one of these exactly; several values match any of them. A matching award's primary listing can differ from the one requested, and amounts cover the whole award, not that listing's share. Only assistance awards (grants, direct payments, loans, other assistance) carry listings, so a call whose award types are all contracts or IDVs — including a contract default — is rejected as assistance_listings_type_mismatch. Use usaspending_autocomplete_filters type=cfda to look up numbers.",
      +  "items": {
      +    "description": "Assistance Listing number, e.g. 15.507",
      +    "pattern": "^\\d{2}\\.[0-9A-Z]{3}$",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / filters / properties / def_codes
      Added value: +{
      +  "description": "Filter by Disaster Emergency Fund Codes (DEF), e.g. [\"Z\"], or [\"L\", \"M\", \"N\", \"O\", \"P\"] for COVID-19: 1–3 letters or digits, sent uppercased — the codes usaspending_disaster_spending takes and usaspending_get_agency lists. Matches awards of any type funded under any of these codes. Amounts cover the whole matching award, not the share funded by the code, and DEF-filtered totals can be negative. An unknown code is rejected with the list of codes USAspending accepts.",
      +  "items": {
      +    "description": "Disaster Emergency Fund Code, e.g. Z or L",
      +    "pattern": "^[0-9A-Za-z]{1,3}$",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / filters / properties / psc_codes
      Added value: +{
      +  "description": "Filter by Product and Service Codes (PSC), e.g. [\"Y1NE\"]: 1–4 letters or digits, sent uppercased. A shorter code covers every code under it (\"Y1\" covers \"Y1NE\"); several values match any of them. Only contracts and IDVs carry a PSC, so a call whose award types are all assistance types is rejected as psc_codes_type_mismatch, and pairing psc_codes with assistance_listings matches nothing, since no award carries both. Use usaspending_autocomplete_filters type=psc to look up codes.",
      +  "items": {
      +    "description": "Product and Service Code or prefix, e.g. Y1NE or Y1",
      +    "pattern": "^[0-9A-Za-z]{1,4}$",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / geo_layer / description
      Previous value: -"Geographic granularity: state (50 states), county (county-level), or district (congressional district)"New value: +"Geographic granularity: state (states, DC, and territories), county (county-level), or district (congressional district)"
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum geographic areas to return, ranked by aggregated_amount descending (1–500). The upstream endpoint is not paginated — it returns every matching area in one response — so this caps client-side. A nationwide county query matches over 3,000 areas."New value: +"Maximum geographic areas to return, ranked by aggregated_amount descending (1–500). The upstream endpoint is not paginated — it returns every matching area in one response — so this caps client-side. A nationwide county query matches over 3,000 areas; use shape_codes to retrieve one ranked past the cap."
    • addedInput schema / properties / shape_codes
      Added value: +{
      +  "description": "Return only these areas (1–500 codes), in the shape_code form this tool returns for geo_layer: 2-letter postal code for state (\"NY\"), 5-digit state + county FIPS for county (\"36117\" is Wayne County, NY), or 4-digit state FIPS + 2-digit district number for district (\"3623\" is NY-23, \"5600\" is Wyoming's at-large seat). Selection runs over every area the filters matched, so it reaches areas ranked past limit; selected areas stay ranked by aggregated_amount and capped at limit. A code that matches no area is named in the notice.",
      +  "items": {
      +    "description": "One area code: 2-letter postal code (e.g. \"NY\"), 5-digit county FIPS (e.g. \"36117\"), or 4-digit district code (e.g. \"3623\")",
      +    "pattern": "^(?:[A-Za-z]{2}|\\d{4,5})$",
      +    "type": "string"
      +  },
      +  "maxItems": 500,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedOutput schema / properties / applied_assistance_listings
      Added value: +{
      +  "description": "Assistance Listing numbers sent (comma-separated)",
      +  "type": "string"
      +}
    • addedOutput schema / properties / applied_def_codes
      Added value: +{
      +  "description": "DEF codes sent, uppercased (comma-separated)",
      +  "type": "string"
      +}
    • addedOutput schema / properties / applied_psc_codes
      Added value: +{
      +  "description": "PSC codes sent, uppercased (comma-separated)",
      +  "type": "string"
      +}
    • addedOutput schema / properties / applied_shape_codes
      Added value: +{
      +  "description": "Area codes listed in shape_codes, letters uppercased and duplicates removed (comma-separated)",
      +  "type": "string"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `api_unavailable`: USAspending.gov API is unreachable or returns an error. `api_timeout`: USAspending.gov did not respond before the request deadline elapsed. `date_range_inverted`: Both filters.time_period_start and filters.time_period_end were supplied and the start falls after the end. `date_before_earliest`: The resolved start date precedes the 2007-10-01 earliest date this endpoint can search. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `api_unavailable`: USAspending.gov API is unreachable or returns an error. `api_timeout`: USAspending.gov did not respond before the request deadline elapsed. `date_range_inverted`: Both filters.time_period_start and filters.time_period_end were supplied and the start falls after the end. `date_before_earliest`: The resolved start date precedes the 2007-10-01 earliest date this endpoint can search. `assistance_listings_type_mismatch`: filters.assistance_listings was given while every code in filters.award_type_codes is a contract or IDV code. `psc_codes_type_mismatch`: filters.psc_codes was given while every code in filters.award_type_codes is an assistance code. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "api_unavailable",
      -  "api_timeout",
      -  "date_range_inverted",
      -  "date_before_earliest"
      -]New value: +[
      +  "api_unavailable",
      +  "api_timeout",
      +  "date_range_inverted",
      +  "date_before_earliest",
      +  "assistance_listings_type_mismatch",
      +  "psc_codes_type_mismatch"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"How to reach areas omitted by limit, which time-period bound was filled in when only the other was supplied, and how to broaden filters when results are empty. Absent when none applies."New value: +"How to reach areas omitted by limit, which shape_codes matched no area, which time-period bound was filled in when only the other was supplied, and — when the filters matched no area — any Assistance Listing, PSC, or DEF codes sent and how to broaden filters. Absent when none applies."
    • removedOutput schema / properties / results / items / properties / award_count
      Removed value: -{
      -  "description": "Number of awards in this area",
      -  "type": "number"
      -}
    • changedOutput schema / properties / results / items / properties / shape_code / description
      Previous value: -"Geographic identifier (FIPS state code, county FIPS, or district code)"New value: +"Area code, the form shape_codes takes: 2-letter postal code (state), 5-digit state + county FIPS (county), or 4-digit state FIPS + district number (district). Absent on the row for spending with no recorded location."
    • changedOutput schema / properties / total_areas_available / description
      Previous value: -"Number of geographic areas the filters matched, before limit was applied"New value: +"Number of geographic areas the filters matched, before shape_codes selection and limit were applied"
  2. Changed11 schema fields changed
    • addedInput schema / properties / filters / properties / time_period_end / anyOf
      Added value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "Date as YYYY-MM-DD; month and day may be unpadded",
      +    "pattern": "^\\d{4}-\\d{1,2}-\\d{1,2}$",
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / filters / properties / time_period_end / description
      Previous value: -"End of time period in ISO 8601 format (YYYY-MM-DD)"New value: +"End of time period (YYYY-MM-DD). Given alone, the period starts at 2007-10-01, the earliest searchable date."
    • removedInput schema / properties / filters / properties / time_period_end / type
      Removed value: -"string"
    • addedInput schema / properties / filters / properties / time_period_start / anyOf
      Added value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "Date as YYYY-MM-DD; month and day may be unpadded",
      +    "pattern": "^\\d{4}-\\d{1,2}-\\d{1,2}$",
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / filters / properties / time_period_start / description
      Previous value: -"Start of time period in ISO 8601 format (YYYY-MM-DD)"New value: +"Start of time period (YYYY-MM-DD), 2007-10-01 or later. Given alone, the period runs through today (UTC)."
    • removedInput schema / properties / filters / properties / time_period_start / type
      Removed value: -"string"
    • changedOutput schema / properties / applied_time_period_end / description
      Previous value: -"End date filter applied (YYYY-MM-DD)"New value: +"End of the time period sent (YYYY-MM-DD), including a filled-in end"
    • changedOutput schema / properties / applied_time_period_start / description
      Previous value: -"Start date filter applied (YYYY-MM-DD)"New value: +"Start of the time period sent (YYYY-MM-DD), including a filled-in start"
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `api_unavailable`: USAspending.gov API is unreachable or returns an error. `api_timeout`: USAspending.gov did not respond before the request deadline elapsed. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `api_unavailable`: USAspending.gov API is unreachable or returns an error. `api_timeout`: USAspending.gov did not respond before the request deadline elapsed. `date_range_inverted`: Both filters.time_period_start and filters.time_period_end were supplied and the start falls after the end. `date_before_earliest`: The resolved start date precedes the 2007-10-01 earliest date this endpoint can search. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "api_unavailable",
      -  "api_timeout"
      -]New value: +[
      +  "api_unavailable",
      +  "api_timeout",
      +  "date_range_inverted",
      +  "date_before_earliest"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Recovery hint when results are empty — suggests how to broaden filters. Absent when results are present."New value: +"How to reach areas omitted by limit, which time-period bound was filled in when only the other was supplied, and how to broaden filters when results are empty. Absent when none applies."
  3. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "scope",
      +      "geo_layer",
      +      "results",
      +      "total",
      +      "total_areas_available",
      +      "applied_scope",
      +      "applied_geo_layer",
      +      "area_count"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: USAspending.gov API is unreachable or returns an error. `api_timeout`: USAspending.gov did not respond before the request deadline elapsed. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "api_unavailable",
      +            "api_timeout"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "scope",
      -  "geo_layer",
      -  "results",
      -  "total",
      -  "total_areas_available",
      -  "applied_scope",
      -  "applied_geo_layer",
      -  "area_count"
      -]
  4. Changed9 schema fields changed
    • changedInput schema / properties / filters / properties / award_type_codes / description
      Previous value: -"Award type codes: A/B/C/D (contracts), 02–05 (grants), 06/10 (direct payments), 07/08 (loans)"New value: +"Award type codes: A/B/C/D (contracts), IDV_A–IDV_E (IDVs), 02–05 (grants), 06/10 (direct payments), 07/08 (loans), 09/11 (insurance and other assistance), -1 (unspecified). Groups may be mixed here. Omit to aggregate every type."
    • addedInput schema / properties / limit
      Added value: +{
      +  "default": 50,
      +  "description": "Maximum geographic areas to return, ranked by aggregated_amount descending (1–500). The upstream endpoint is not paginated — it returns every matching area in one response — so this caps client-side. A nationwide county query matches over 3,000 areas.",
      +  "maximum": 500,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / applied_award_type_default
      Added value: +{
      +  "description": "Disclosure that no filters were supplied, so award_type_codes defaulted to the complete set. Absent when the caller supplied at least one filter.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "The limit that was applied.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / shown
      Added value: +{
      +  "description": "Number of geographic areas returned.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / total_areas_available
      Added value: +{
      +  "description": "Number of geographic areas the filters matched, before limit was applied",
      +  "type": "number"
      +}
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "description": "True when the area list was capped at limit.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / truncationCeiling
      Added value: +{
      +  "description": "Obligation amount of the lowest-ranked area shown — an upper bound on omitted ones.",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "scope",
      -  "geo_layer",
      -  "results",
      -  "total",
      -  "applied_scope",
      -  "applied_geo_layer",
      -  "area_count"
      -]New value: +[
      +  "scope",
      +  "geo_layer",
      +  "results",
      +  "total",
      +  "total_areas_available",
      +  "applied_scope",
      +  "applied_geo_layer",
      +  "area_count"
      +]
  5. Changed5 schema fields changed
    • addedOutput schema / properties / applied_agency_name
      Added value: +{
      +  "description": "Awarding agency name filter applied",
      +  "type": "string"
      +}
    • addedOutput schema / properties / applied_keywords
      Added value: +{
      +  "description": "Keyword filters applied (comma-separated)",
      +  "type": "string"
      +}
    • addedOutput schema / properties / applied_naics_codes
      Added value: +{
      +  "description": "NAICS code filters applied (comma-separated)",
      +  "type": "string"
      +}
    • addedOutput schema / properties / applied_time_period_end
      Added value: +{
      +  "description": "End date filter applied (YYYY-MM-DD)",
      +  "type": "string"
      +}
    • addedOutput schema / properties / applied_time_period_start
      Added value: +{
      +  "description": "Start date filter applied (YYYY-MM-DD)",
      +  "type": "string"
      +}
  6. Changed1 schema field changed
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Recovery hint when results are empty — suggests how to broaden filters. Absent when results are present.",
      +  "type": "string"
      +}
  7. Changed4 schema fields changed
    • addedOutput schema / properties / applied_geo_layer
      Added value: +{
      +  "description": "Geographic granularity applied: state, county, or district",
      +  "type": "string"
      +}
    • addedOutput schema / properties / applied_scope
      Added value: +{
      +  "description": "Location scope applied: place_of_performance or recipient_location",
      +  "type": "string"
      +}
    • addedOutput schema / properties / area_count
      Added value: +{
      +  "description": "Number of geographic areas returned",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "scope",
      -  "geo_layer",
      -  "results",
      -  "total"
      -]New value: +[
      +  "scope",
      +  "geo_layer",
      +  "results",
      +  "total",
      +  "applied_scope",
      +  "applied_geo_layer",
      +  "area_count"
      +]
  8. First observed

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, open-world behavior, but the description adds genuinely new traits: results are ranked by obligation and capped, the upstream endpoint is unpaginated, areas ranked past the cap remain retrievable via shape_codes, and unmatched codes are surfaced in a notice. These are operational behaviors the annotations do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose in the first sentence and orders the remaining detail logically (filters, ranking/cap, code formats, geocoding, chaining). Dense but every sentence carries actionable content; the multi-clause code-format sentence is the only slightly heavy spot.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested-filter aggregation tool with an output schema already documenting return values, the description covers the non-obvious gaps: scope selection, ranking/cap behavior, code resolution, and how to reach results past the cap. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, and the description earns above that by clarifying shape_codes semantics (exact code formats per layer, 'NOT place names', geocoding prerequisite) and the limit/shape_codes interaction for reaching areas beyond the cap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Aggregate) and resource (federal spending) with explicit granularities (state, county, congressional district), which cleanly separates it from siblings like usaspending_spending_by_category and usaspending_spending_over_time.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear use cases (per-capita analysis, regional comparisons, mapping) and explains the crucial choice between relying on limit-ranked output versus passing explicit shape_codes, including the prerequisite of resolving place names via a geocoding server first. It never explicitly names a sibling alternative to route to, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.