usas_search_psc_spending
Search federal spending broken down by Product Service Code (PSC) to analyze market structure and identify top spending categories beyond NAICS.
Instructions
Spending broken down by Product Service Code (PSC). Use for 'what PSC categories see the most $ at DoD' — surfaces market structure beyond NAICS (e.g. PSC R425 = engineering support services).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| agency | No | ||
| naics | No | ||
| fiscalYear | No | ||
| limit | No |
Implementation Reference
- src/usaspending.ts:447-468 (handler)The actual handler function 'searchPscSpending' that calls the USAspending 'search/spending_by_category/psc' API endpoint and returns spending broken down by PSC code.
export async function searchPscSpending(args: { agency?: string; naics?: string; fiscalYear?: number; limit?: number; }) { const filters = buildFilters(args); type Resp = { results?: { code?: string; name?: string; amount?: number }[]; }; const json = await postUsas<Resp>( "search/spending_by_category/psc", { filters, limit: args.limit ?? 10, page: 1 }, ); return { psc: (json.results ?? []).map((r) => ({ pscCode: r.code ?? "", pscName: r.name ?? "", amount: r.amount ?? 0, })), }; } - src/server.ts:137-142 (schema)Input validation schema 'UsasCategorySpendingInput' used by the tool, defined with Zod.
const UsasCategorySpendingInput = z.object({ agency: z.string().optional(), naics: z.string().optional(), fiscalYear: z.number().int().min(2007).optional(), limit: z.number().min(1).max(50).optional(), }); - src/server.ts:376-381 (registration)Tool registration with name 'usas_search_psc_spending', description, and inputSchema binding.
{ name: "usas_search_psc_spending", description: "Spending broken down by Product Service Code (PSC). Use for 'what PSC categories see the most $ at DoD' — surfaces market structure beyond NAICS (e.g. PSC R425 = engineering support services).", inputSchema: UsasCategorySpendingInput, }, - src/server.ts:722-725 (registration)Case statement routing the tool name to the handler function in the server's main switch.
case "usas_search_psc_spending": return await usas.searchPscSpending( UsasCategorySpendingInput.parse(args), ); - src/usaspending.ts:42-67 (helper)Helper 'buildFilters' constructs the shared filter object used by searchPscSpending and other category endpoints.
function buildFilters(args: { agency?: string; naics?: string; fiscalYear?: number; setAside?: string; pscCodes?: string[]; }): UsasFilters { const filters: UsasFilters = { award_type_codes: ["A", "B", "C", "D"] }; if (args.agency) { filters.agencies = [ { type: "awarding", tier: "toptier", name: args.agency }, ]; } if (args.naics) filters.naics_codes = [args.naics]; if (args.fiscalYear) { filters.time_period = [ { start_date: `${args.fiscalYear - 1}-10-01`, end_date: `${args.fiscalYear}-09-30`, }, ]; } if (args.setAside) filters.set_aside_type_codes = [args.setAside]; if (args.pscCodes?.length) filters.psc_codes = args.pscCodes; return filters; }