economicIndicators_nonfarmPayroll
Access US nonfarm payroll data through MCP Avantage to analyze employment trends. Retrieve data in JSON or CSV format for informed economic decision-making.
Instructions
Retrieves US nonfarm payroll data.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| datatype | No | Data format for the response. | json |
Input Schema (JSON Schema)
{
"additionalProperties": false,
"description": "Common parameter schema accepting only datatype.",
"properties": {
"datatype": {
"default": "json",
"description": "Data format for the response.",
"enum": [
"json",
"csv"
],
"type": "string"
}
},
"type": "object"
}
Implementation Reference
- src/index.ts:692-706 (registration)Registers the 'economicIndicators_nonfarmPayroll' MCP tool, specifying name, description, input schema, and an execute handler that invokes the generic executeAvantageTool with the specific Alpha Vantage method av.economicIndicators.nonfarmPayroll(params).server.addTool({ name: "economicIndicators_nonfarmPayroll", description: "Retrieves US nonfarm payroll data.", parameters: schemas.EconomicIndicatorsDataTypeParamSchema, execute: ( args, context // Let type be inferred ) => executeAvantageTool( "economicIndicators_nonfarmPayroll", args, context, (av, params) => av.economicIndicators.nonfarmPayroll(params) ), });
- src/schemas.ts:124-126 (schema)Zod input validation schema for the tool, defining an optional 'datatype' parameter (json or csv).export const EconomicIndicatorsDataTypeParamSchema = z.object({ datatype: DatatypeSchema.default('json').optional(), }).describe('Common parameter schema accepting only datatype.')
- src/index.ts:38-115 (handler)Generic handler logic shared across all tools: resolves API key, manages AVantage client instance via resourceManager, calls the specific library method, handles errors, and returns stringified data. The specific method call for this tool is av.economicIndicators.nonfarmPayroll(params).async function executeAvantageTool<TArgs, TResult>( toolName: string, args: TArgs, context: Context<Record<string, unknown> | undefined>, // Use the imported Context type directly avantageMethod: ( av: AVantage, args: TArgs ) => Promise<{ error?: boolean; reason?: string; data?: TResult }> ): Promise<string> { logger.info(`Executing '${toolName}' tool for request ID: ${context}`); logger.debug(`Args for ${toolName}: ${JSON.stringify(args)}`); // --- Authentication & Resource Management --- // Access extraArgs safely - it might be null or undefined const extraArgsApiKey = context.extraArgs?.apiKey as string | undefined; const apiKey = extraArgsApiKey || config.apiKey; if (!apiKey) { logger.error(`'${toolName}' failed: Alpha Vantage API key missing.`); throw new UserError(apiKeyErrorMessage); } logger.debug( `Using AV API key (source: ${extraArgsApiKey ? "extraArgs" : "environment"}) for ${toolName}` ); try { // Get or create AVantage instance managed by ResourceManager const av = await resourceManager.getResource<AVantage>( apiKey, // Cache key is the resolved API key "avantage_client", // Type identifier for logging async (key) => { // Factory Function logger.info( `Creating new AVantage instance for key ending ...${key.slice(-4)}` ); // AVantage library reads AV_PREMIUM from process.env internally return new AVantage(key); }, async (avInstance) => { // Cleanup Function (no-op needed for AVantage) logger.debug(`Destroying AVantage instance (no-op)`); } ); // --- Library Call --- const result = await avantageMethod(av, args); // --- Response Handling --- if (result.error) { logger.warn( `'${toolName}' failed. Reason from avantage: ${result.reason}` ); throw new UserError(result.reason || `Tool '${toolName}' failed.`); } if (result.data === undefined || result.data === null) { logger.warn(`'${toolName}' completed successfully but returned no data.`); return "null"; // Return string "null" for empty data } logger.info(`'${toolName}' completed successfully.`); // Stringify the data part of the response return JSON.stringify(result.data); } catch (error: any) { logger.error( `Error during execution of '${toolName}': ${error.message}`, error ); // If it's already a UserError, rethrow it if (error instanceof UserError) { throw error; } // Otherwise, wrap it in a UserError throw new UserError( `An unexpected error occurred while executing tool '${toolName}': ${error.message}` ); } }
- src/schemas.ts:6-37 (helper)Shared Zod enum used in the tool's input schema for specifying response data format (json or csv).const DatatypeSchema = z.enum(['json', 'csv']).describe('Data format for the response.') const DailyWeeklyMonthlySchema = z.enum(['daily', 'weekly', 'monthly']).describe('Time interval.') const MonthlyQuarterlyAnnualSchema = z.enum(['monthly', 'quarterly', 'annual']).describe('Time interval.') const SeriesTypeSchema = z.enum(['close', 'open', 'high', 'low']).describe('The desired price type.') // === Alpha Intelligence Schemas === export const NewsSentimentsParamsSchema = z.object({ tickersList: z.array(z.string()).optional().describe('List of stock/crypto/forex symbols (e.g., ["AAPL", "GOOGL"]).'), topics: z.string().optional().describe('Specific topics to filter news for (e.g., "technology", "earnings").'), time_from: z.string().optional().describe('Start time for news articles (YYYYMMDDTHHMM format).'), time_to: z.string().optional().describe('End time for news articles (YYYYMMDDTHHMM format).'), sort: z.enum(['LATEST', 'EARLIEST', 'RELEVANCE']).default('LATEST').optional().describe('Sort order for results.'), limit: z.number().int().min(1).max(1000).default(50).optional().describe('Number of results to return (1-1000).'), }).describe('Parameters for fetching market news and sentiment data.') export const InsiderTransactionsParamsSchema = z.object({ symbol: z.string().describe('The stock symbol (e.g., "AAPL").'), }).describe('Parameters for fetching insider trading information.') // Schemas for Analytics endpoints are complex and omitted for brevity, // as they were commented out in the original library analysis. // Add FixedWindowAnalyticsParamsSchema and SlidingWindowAnalyticsParamsSchema if needed. // === Commodities Schemas === export const CommoditiesDailyWeeklyMonthlyParamsSchema = z.object({ interval: DailyWeeklyMonthlySchema.optional().describe('Time interval for the data.'), datatype: DatatypeSchema.optional().describe('Response data format.'), }).describe('Parameters for daily/weekly/monthly commodity data.') export const CommoditiesMonthlyQuarterlyAnnualParamsSchema = z.object({ interval: MonthlyQuarterlyAnnualSchema.optional().describe('Time interval for the data.'), datatype: DatatypeSchema.optional().describe('Response data format.'),