fmp-ai-tools 0.2.1 ā 0.2.3-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/providers/openai/index.d.mts +7 -1
- package/dist/providers/openai/index.d.ts +7 -1
- package/dist/providers/openai/index.js +68 -4
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/openai/index.mjs +63 -5
- package/dist/providers/openai/index.mjs.map +1 -1
- package/dist/providers/vercel-ai/index.d.mts +7 -1
- package/dist/providers/vercel-ai/index.d.ts +7 -1
- package/dist/providers/vercel-ai/index.js +74 -7
- package/dist/providers/vercel-ai/index.js.map +1 -1
- package/dist/providers/vercel-ai/index.mjs +69 -8
- package/dist/providers/vercel-ai/index.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -254,6 +254,14 @@ var quoteDefinitions = [
|
|
|
254
254
|
}),
|
|
255
255
|
execute: async ({ symbol: symbol2 }) => toToolResponse(await getFMPClient().quote.getQuote(symbol2))
|
|
256
256
|
}),
|
|
257
|
+
defineTool({
|
|
258
|
+
name: "getStockQuoteShort",
|
|
259
|
+
description: "Get a short real-time quote (price, change, and volume only) for a symbol. Lighter than the full quote.",
|
|
260
|
+
inputSchema: z.object({
|
|
261
|
+
symbol: z.string().min(1, "Stock symbol is required").describe("The symbol to get the short quote for (e.g., AAPL, BTCUSD, EURUSD)")
|
|
262
|
+
}),
|
|
263
|
+
execute: async ({ symbol: symbol2 }) => toToolResponse(await getFMPClient().quote.getQuoteShort(symbol2))
|
|
264
|
+
}),
|
|
257
265
|
defineTool({
|
|
258
266
|
name: "getHistoricalPrice",
|
|
259
267
|
description: "Get historical daily prices (open/high/low/close/volume) for a symbol. Returns the most recent `limit` days.",
|
|
@@ -578,6 +586,10 @@ var institutionalDefinitions = [
|
|
|
578
586
|
})
|
|
579
587
|
];
|
|
580
588
|
var empty = z.object({});
|
|
589
|
+
var snapshotDateSchema = z.object({
|
|
590
|
+
date: z.string().min(1).describe("Snapshot date in YYYY-MM-DD format"),
|
|
591
|
+
exchange: z.string().optional().nullable().describe("Optional exchange filter (e.g., NASDAQ, NYSE)")
|
|
592
|
+
});
|
|
581
593
|
var marketDefinitions = [
|
|
582
594
|
defineTool({
|
|
583
595
|
name: "getMarketPerformance",
|
|
@@ -587,9 +599,25 @@ var marketDefinitions = [
|
|
|
587
599
|
}),
|
|
588
600
|
defineTool({
|
|
589
601
|
name: "getSectorPerformance",
|
|
590
|
-
description: "Get sector
|
|
591
|
-
inputSchema:
|
|
592
|
-
execute: async () => toToolResponse(
|
|
602
|
+
description: "Get a sector-performance snapshot for a given date, showing the average change per sector by exchange",
|
|
603
|
+
inputSchema: snapshotDateSchema,
|
|
604
|
+
execute: async ({ date, exchange }) => toToolResponse(
|
|
605
|
+
await getFMPClient().market.getSectorPerformance({
|
|
606
|
+
date,
|
|
607
|
+
exchange: exchange ?? void 0
|
|
608
|
+
})
|
|
609
|
+
)
|
|
610
|
+
}),
|
|
611
|
+
defineTool({
|
|
612
|
+
name: "getIndustryPESnapshot",
|
|
613
|
+
description: "Get an industry P/E snapshot for a given date, showing the average price-to-earnings ratio per industry by exchange",
|
|
614
|
+
inputSchema: snapshotDateSchema,
|
|
615
|
+
execute: async ({ date, exchange }) => toToolResponse(
|
|
616
|
+
await getFMPClient().market.getIndustryPESnapshot({
|
|
617
|
+
date,
|
|
618
|
+
exchange: exchange ?? void 0
|
|
619
|
+
})
|
|
620
|
+
)
|
|
593
621
|
}),
|
|
594
622
|
defineTool({
|
|
595
623
|
name: "getGainers",
|
|
@@ -844,6 +872,29 @@ var stockDefinitions = [
|
|
|
844
872
|
description: "Get dividend history for a company showing all historical dividend payments",
|
|
845
873
|
inputSchema: symbolSchema4,
|
|
846
874
|
execute: async ({ symbol: symbol2 }) => toToolResponse(await getFMPClient().stock.getDividendHistory(symbol2))
|
|
875
|
+
}),
|
|
876
|
+
defineTool({
|
|
877
|
+
name: "getStockPriceChange",
|
|
878
|
+
description: "Get the percentage price change for a stock across standard horizons (1D, 5D, 1M, 3M, 6M, YTD, 1Y, 3Y, 5Y, 10Y, max)",
|
|
879
|
+
inputSchema: symbolSchema4,
|
|
880
|
+
execute: async ({ symbol: symbol2 }) => toToolResponse(await getFMPClient().stock.getPriceChange(symbol2))
|
|
881
|
+
})
|
|
882
|
+
];
|
|
883
|
+
var symbolSchema5 = z.object({
|
|
884
|
+
symbol: z.string().min(1, "Stock symbol is required").describe("The stock symbol (e.g., AAPL, MSFT, GOOGL)")
|
|
885
|
+
});
|
|
886
|
+
var aftermarketDefinitions = [
|
|
887
|
+
defineTool({
|
|
888
|
+
name: "getAftermarketTrade",
|
|
889
|
+
description: "Get the latest extended-hours (pre/post-market) trade for a symbol, including price, trade size, and timestamp",
|
|
890
|
+
inputSchema: symbolSchema5,
|
|
891
|
+
execute: async ({ symbol: symbol2 }) => toToolResponse(await getFMPClient().aftermarket.getTrade(symbol2))
|
|
892
|
+
}),
|
|
893
|
+
defineTool({
|
|
894
|
+
name: "getAftermarketQuote",
|
|
895
|
+
description: "Get the latest extended-hours (pre/post-market) bid/ask quote for a symbol, including bid/ask prices and sizes",
|
|
896
|
+
inputSchema: symbolSchema5,
|
|
897
|
+
execute: async ({ symbol: symbol2 }) => toToolResponse(await getFMPClient().aftermarket.getQuote(symbol2))
|
|
847
898
|
})
|
|
848
899
|
];
|
|
849
900
|
|
|
@@ -866,6 +917,7 @@ var valuationTools = toToolSet(valuationDefinitions);
|
|
|
866
917
|
var technicalTools = toToolSet(technicalDefinitions);
|
|
867
918
|
var senateHouseTools = toToolSet(senateHouseDefinitions);
|
|
868
919
|
var stockTools = toToolSet(stockDefinitions);
|
|
920
|
+
var aftermarketTools = toToolSet(aftermarketDefinitions);
|
|
869
921
|
var fmpTools = {
|
|
870
922
|
...quoteTools,
|
|
871
923
|
...companyTools,
|
|
@@ -883,9 +935,10 @@ var fmpTools = {
|
|
|
883
935
|
...valuationTools,
|
|
884
936
|
...technicalTools,
|
|
885
937
|
...senateHouseTools,
|
|
886
|
-
...stockTools
|
|
938
|
+
...stockTools,
|
|
939
|
+
...aftermarketTools
|
|
887
940
|
};
|
|
888
|
-
var { getStockQuote, getHistoricalPrice, getIntraday } = quoteTools;
|
|
941
|
+
var { getStockQuote, getStockQuoteShort, getHistoricalPrice, getIntraday } = quoteTools;
|
|
889
942
|
var {
|
|
890
943
|
getCompanyProfile,
|
|
891
944
|
getCompanySharesFloat,
|
|
@@ -915,7 +968,14 @@ var {
|
|
|
915
968
|
} = financialTools;
|
|
916
969
|
var { getInsiderTrading } = insiderTools;
|
|
917
970
|
var { getInstitutionalHolders } = institutionalTools;
|
|
918
|
-
var {
|
|
971
|
+
var {
|
|
972
|
+
getMarketPerformance,
|
|
973
|
+
getSectorPerformance,
|
|
974
|
+
getIndustryPESnapshot,
|
|
975
|
+
getGainers,
|
|
976
|
+
getLosers,
|
|
977
|
+
getMostActive
|
|
978
|
+
} = marketTools;
|
|
919
979
|
var {
|
|
920
980
|
getSenateTrading,
|
|
921
981
|
getHouseTrading,
|
|
@@ -930,8 +990,9 @@ var { searchSymbol } = searchTools;
|
|
|
930
990
|
var { getAnalystEstimates, getPriceTargetConsensus, getStockGrades, getGradesConsensus } = analystTools;
|
|
931
991
|
var { getDiscountedCashFlow, getCompanyRating } = valuationTools;
|
|
932
992
|
var { getTechnicalIndicator } = technicalTools;
|
|
933
|
-
var { getMarketCap, getStockSplits, getDividendHistory } = stockTools;
|
|
993
|
+
var { getMarketCap, getStockSplits, getDividendHistory, getStockPriceChange } = stockTools;
|
|
994
|
+
var { getAftermarketTrade, getAftermarketQuote } = aftermarketTools;
|
|
934
995
|
|
|
935
|
-
export { analystTools, calendarTools, companyTools, configureFMPClient, economicTools, etfTools, financialTools, fmpTools, getAnalystEstimates, getBalanceSheet, getBalanceSheetGrowth, getCashFlowStatement, getCashflowGrowth, getCompanyExecutiveCompensation, getCompanyProfile, getCompanyRating, getCompanySharesFloat, getDiscountedCashFlow, getDividendHistory, getETFHoldings, getETFProfile, getEarningsCalendar, getEarningsHistorical, getEconomicCalendar, getEconomicIndicators, getEnterpriseValue, getFinancialGrowth, getFinancialRatios, getFinancialRatiosTTM, getFinancialScores, getGainers, getGradesConsensus, getHistoricalPrice, getHouseTrading, getHouseTradingByName, getHouseTradingRSSFeed, getIncomeGrowth, getIncomeStatement, getInsiderTrading, getInstitutionalHolders, getIntraday, getKeyMetrics, getKeyMetricsTTM, getLosers, getMarketCap, getMarketPerformance, getMostActive, getPriceTargetConsensus, getRevenueGeographicSegmentation, getRevenueProductSegmentation, getSectorPerformance, getSenateTrading, getSenateTradingByName, getSenateTradingRSSFeed, getStockGrades, getStockNews, getStockNewsBySymbol, getStockPeers, getStockQuote, getStockSplits, getTechnicalIndicator, getTreasuryRates, insiderTools, institutionalTools, marketTools, newsTools, quoteTools, resetFMPClient, screenStocks, screenerTools, searchSymbol, searchTools, senateHouseTools, stockTools, technicalTools, valuationTools };
|
|
996
|
+
export { aftermarketTools, analystTools, calendarTools, companyTools, configureFMPClient, economicTools, etfTools, financialTools, fmpTools, getAftermarketQuote, getAftermarketTrade, getAnalystEstimates, getBalanceSheet, getBalanceSheetGrowth, getCashFlowStatement, getCashflowGrowth, getCompanyExecutiveCompensation, getCompanyProfile, getCompanyRating, getCompanySharesFloat, getDiscountedCashFlow, getDividendHistory, getETFHoldings, getETFProfile, getEarningsCalendar, getEarningsHistorical, getEconomicCalendar, getEconomicIndicators, getEnterpriseValue, getFinancialGrowth, getFinancialRatios, getFinancialRatiosTTM, getFinancialScores, getGainers, getGradesConsensus, getHistoricalPrice, getHouseTrading, getHouseTradingByName, getHouseTradingRSSFeed, getIncomeGrowth, getIncomeStatement, getIndustryPESnapshot, getInsiderTrading, getInstitutionalHolders, getIntraday, getKeyMetrics, getKeyMetricsTTM, getLosers, getMarketCap, getMarketPerformance, getMostActive, getPriceTargetConsensus, getRevenueGeographicSegmentation, getRevenueProductSegmentation, getSectorPerformance, getSenateTrading, getSenateTradingByName, getSenateTradingRSSFeed, getStockGrades, getStockNews, getStockNewsBySymbol, getStockPeers, getStockPriceChange, getStockQuote, getStockQuoteShort, getStockSplits, getTechnicalIndicator, getTreasuryRates, insiderTools, institutionalTools, marketTools, newsTools, quoteTools, resetFMPClient, screenStocks, screenerTools, searchSymbol, searchTools, senateHouseTools, stockTools, technicalTools, valuationTools };
|
|
936
997
|
//# sourceMappingURL=index.mjs.map
|
|
937
998
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/logger.ts","../../../src/utils/format-response.ts","../../../src/utils/aisdk-tool-wrapper.ts","../../../src/client.ts","../../../src/definitions/types.ts","../../../src/definitions/quote.ts","../../../src/definitions/company.ts","../../../src/definitions/financial.ts","../../../src/definitions/calendar.ts","../../../src/definitions/economic.ts","../../../src/definitions/etf.ts","../../../src/definitions/insider.ts","../../../src/definitions/institutional.ts","../../../src/definitions/market.ts","../../../src/definitions/news.ts","../../../src/definitions/screener.ts","../../../src/definitions/search.ts","../../../src/definitions/analyst.ts","../../../src/definitions/valuation.ts","../../../src/definitions/technical.ts","../../../src/definitions/senate-house.ts","../../../src/definitions/stock.ts","../../../src/providers/vercel-ai/index.ts"],"names":["symbol","limit","z","period","symbolSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Logger utility for tools package\n * Controls logging of API results based on environment variable\n */\n\ninterface LogOptions {\n toolName: string;\n input: unknown;\n result: unknown;\n executionTime?: number;\n}\n\n/**\n * Check if API result logging is enabled via environment variable\n * Defaults to false if not set\n */\nexport function isApiLoggingEnabled(): boolean {\n return process.env.FMP_TOOLS_LOG_API_RESULTS === 'true';\n}\n\n/**\n * Check if data-only logging is enabled via environment variable\n * Defaults to false if not set\n */\nexport function isDataOnlyLoggingEnabled(): boolean {\n return process.env.FMP_TOOLS_LOG_DATA_ONLY === 'true';\n}\n\n/**\n * Estimate token count for LLM context (JSON-optimized)\n * JSON has many structural characters that count as single tokens\n */\nfunction estimateTokenCount(text: string): number {\n // Try to parse as JSON first for better estimation\n try {\n const parsed = JSON.parse(text);\n return estimateTokenCountForData(parsed);\n } catch {\n // Not JSON, use text-based estimation\n return estimateTokenCountForText(text);\n }\n}\n\n/**\n * Estimate tokens for parsed JSON data\n */\nfunction estimateTokenCountForData(data: unknown): number {\n if (data === null || data === undefined) {\n return 1; // null/undefined is typically 1 token\n }\n\n if (typeof data === 'string') {\n // Strings are typically tokenized by words/symbols\n // Financial data often has short strings like \"AAPL\", \"USD\", etc.\n return Math.ceil(data.length / 3); // More conservative for short strings\n }\n\n if (typeof data === 'number') {\n // Numbers are typically 1-2 tokens depending on size\n return data.toString().length > 10 ? 2 : 1;\n }\n\n if (typeof data === 'boolean') {\n return 1; // true/false are single tokens\n }\n\n if (Array.isArray(data)) {\n // Arrays: count structural tokens + content tokens\n let tokens = 2; // [ and ]\n for (const item of data) {\n tokens += estimateTokenCountForData(item);\n if (data.indexOf(item) < data.length - 1) {\n tokens += 1; // comma separator\n }\n }\n return tokens;\n }\n\n if (typeof data === 'object') {\n // Objects: count structural tokens + key-value pairs\n let tokens = 2; // { and }\n const keys = Object.keys(data);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = (data as Record<string, unknown>)[key];\n\n // Key (quoted string)\n tokens += Math.ceil(key.length / 3);\n tokens += 2; // quotes around key\n\n // Colon separator\n tokens += 1;\n\n // Value\n tokens += estimateTokenCountForData(value);\n\n // Comma separator (except for last item)\n if (i < keys.length - 1) {\n tokens += 1;\n }\n }\n return tokens;\n }\n\n return 1; // fallback\n}\n\n/**\n * Estimate tokens for plain text (non-JSON)\n */\nfunction estimateTokenCountForText(text: string): number {\n // For plain text, use a more conservative estimate\n // Consider that financial data often has numbers, symbols, and abbreviations\n const words = text.split(/\\s+/).filter(word => word.length > 0);\n let tokens = 0;\n\n for (const word of words) {\n if (/^\\d+$/.test(word)) {\n // Pure numbers are typically 1-2 tokens\n tokens += word.length > 8 ? 2 : 1;\n } else if (/^[A-Z]+$/.test(word)) {\n // All caps (like stock symbols) are often single tokens\n tokens += 1;\n } else if (/^\\$[\\d,]+\\.?\\d*$/.test(word)) {\n // Currency amounts are typically 2-3 tokens\n tokens += 3;\n } else {\n // Regular words: roughly 3-4 characters per token\n tokens += Math.ceil(word.length / 3.5);\n }\n }\n\n return tokens;\n}\n\n/**\n * Get simple metadata about the result for LLM context\n */\nfunction getResultInfo(result: unknown): string {\n if (result === null || result === undefined) {\n return 'null/undefined';\n }\n\n if (typeof result === 'string') {\n const tokenCount = estimateTokenCount(result);\n try {\n const parsed = JSON.parse(result);\n if (Array.isArray(parsed)) {\n return `JSON string (array of ${parsed.length} items, ~${tokenCount} tokens)`;\n }\n } catch {\n // Not JSON\n }\n return `string (${result.length} chars, ~${tokenCount} tokens)`;\n }\n\n if (Array.isArray(result)) {\n const jsonStr = JSON.stringify(result);\n const tokenCount = estimateTokenCount(jsonStr);\n return `array (${result.length} items, ~${tokenCount} tokens)`;\n }\n\n if (typeof result === 'object') {\n const jsonStr = JSON.stringify(result);\n const tokenCount = estimateTokenCount(jsonStr);\n return `object (~${tokenCount} tokens)`;\n }\n\n return typeof result;\n}\n\n/**\n * Log API tool execution details when enabled\n */\nexport function logApiExecution(options: LogOptions): void {\n if (!isApiLoggingEnabled()) {\n return;\n }\n\n const { toolName, input, result, executionTime } = options;\n\n console.log('\\n' + '='.repeat(80));\n console.log(`š§ FMP Tool Execution: ${toolName}`);\n console.log('='.repeat(80));\n\n console.log('\\nš„ Input:');\n console.log(JSON.stringify(input, null, 2));\n\n const resultInfo = getResultInfo(result);\n\n console.log(`š§ ${toolName}: ${resultInfo}`);\n\n if (executionTime !== undefined) {\n console.log(`\\nā±ļø Execution Time: ${executionTime}ms`);\n }\n\n console.log('='.repeat(80) + '\\n');\n}\n\n/**\n * Log data-only information for LLM context (when enabled)\n */\nexport function logDataOnly(options: LogOptions): void {\n if (!isDataOnlyLoggingEnabled()) {\n return;\n }\n\n const { result } = options;\n\n console.log('\\nš¤ Result:');\n if (typeof result === 'string') {\n try {\n // Try to parse and pretty-print if it's JSON\n const parsed = JSON.parse(result);\n console.log(JSON.stringify(parsed, null, 2));\n } catch {\n // If not JSON, log as-is\n console.log(result);\n }\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n\n console.log('='.repeat(80) + '\\n');\n}\n\n/**\n * Log API tool execution with timing\n */\nexport async function logApiExecutionWithTiming<T>(\n toolName: string,\n input: unknown,\n executeFn: () => Promise<T>,\n): Promise<T> {\n const startTime = Date.now();\n\n try {\n const result = await executeFn();\n const executionTime = Date.now() - startTime;\n\n logApiExecution({\n toolName,\n input,\n result,\n executionTime,\n });\n\n // Also log data-only info if enabled\n logDataOnly({\n toolName,\n input,\n result,\n executionTime,\n });\n\n return result;\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n // Log error case as well\n if (isApiLoggingEnabled()) {\n console.log('\\n' + '='.repeat(80));\n console.log(`ā FMP Tool Execution Error: ${toolName}`);\n console.log('='.repeat(80));\n console.log('\\nš„ Input:');\n console.log(JSON.stringify(input, null, 2));\n console.log('\\nā Error:');\n console.log(error instanceof Error ? error.message : String(error));\n console.log(`\\nā±ļø Execution Time: ${executionTime}ms`);\n console.log('='.repeat(80) + '\\n');\n }\n\n throw error;\n }\n}\n","import type { APIResponse, FMPErrorType } from 'fmp-node-api';\n\n/**\n * Format an `fmp-node-api` response into the string an AI tool returns to the model.\n *\n * On success, returns the data as pretty JSON (or a clear \"no data\" note when the\n * payload is empty). On failure, returns a structured error object ā including the\n * classified `type` (e.g. `plan-restricted`, `rate-limit`, `auth`) ā so the model\n * can explain *why* the call failed instead of receiving a bare `null`.\n */\nexport function toToolResponse(res: APIResponse<unknown>): string {\n // Only an explicit failure surfaces an error; the client always sets `success`.\n if (res.success === false) {\n return JSON.stringify({\n error: true,\n type: res.errorType ?? 'unknown',\n message: res.error ?? 'The request failed.',\n status: res.status,\n });\n }\n\n if (isEmpty(res.data)) {\n return JSON.stringify({ data: [], note: 'No data was returned for this request.' });\n }\n return JSON.stringify(res.data, null, 2);\n}\n\n/**\n * Format a *thrown* error into the same structured shape `toToolResponse` uses.\n *\n * Some failures throw instead of returning an `APIResponse` ā most notably a\n * missing/invalid `FMP_API_KEY`, which throws from the `FMP` constructor before\n * any request is made. Catching these at the tool boundary lets the model relay\n * the real reason instead of receiving a bare exception.\n */\nexport function toToolError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n let type: FMPErrorType = 'unknown';\n if (/api[\\s_-]?key/i.test(message)) {\n type = 'auth';\n }\n return JSON.stringify({ error: true, type, message, status: 0 });\n}\n\nfunction isEmpty(data: unknown): boolean {\n if (data == null) return true;\n if (Array.isArray(data)) return data.length === 0;\n if (typeof data === 'object') return Object.keys(data as object).length === 0;\n return false;\n}\n","import { z } from 'zod';\nimport { tool } from 'ai';\nimport { logApiExecutionWithTiming } from './logger';\nimport { toToolError } from './format-response';\n\ninterface AISDKToolConfig {\n name: string;\n description: string;\n inputSchema: z.ZodSchema;\n execute: (input: any) => Promise<string>;\n}\n\nexport const createTool = (config: AISDKToolConfig) => {\n const { name, description, inputSchema, execute } = config;\n return tool({\n description,\n // `as any` avoids ai@6 tool()'s excessively-deep type instantiation on a\n // generic Zod schema; the real Zod schema is still passed at runtime.\n inputSchema: inputSchema as any,\n execute: async (input: any) => {\n try {\n return await logApiExecutionWithTiming(name, input, () => execute(input));\n } catch (error) {\n // Never throw out of a tool ā return a structured error the model can\n // relay (e.g. a missing FMP_API_KEY, which throws from `new FMP()`).\n return toToolError(error);\n }\n },\n });\n};\n","/**\n * Internal FMP API client used by the tools.\n *\n * The client is memoized so tools reuse a single `FMP` instance instead of\n * constructing one (and re-validating the API key) on every tool call. By\n * default it reads the `FMP_API_KEY` environment variable; consumers can call\n * `configureFMPClient(...)` once at startup to provide a key/timeout explicitly.\n */\nimport { FMP, type FMPConfig } from 'fmp-node-api';\n\nlet cached: FMP | undefined;\nlet configured: FMPConfig | undefined;\n\n/**\n * Configure the FMP client used by all tools. Optional ā by default the client\n * reads the `FMP_API_KEY` environment variable. Call once before using the tools.\n */\nexport function configureFMPClient(config: FMPConfig): void {\n configured = config;\n cached = undefined; // rebuilt lazily on next use\n}\n\n/** Reset the memoized client and configuration (mainly for tests / serverless reuse). */\nexport function resetFMPClient(): void {\n cached = undefined;\n configured = undefined;\n}\n\n/** Get the memoized FMP client instance (internal use by tools). */\nexport function getFMPClient(): FMP {\n if (!cached) {\n cached = new FMP(configured);\n }\n return cached;\n}\n","import { z } from 'zod';\n\n/**\n * Provider-agnostic definition of an FMP tool: its name, model-facing description,\n * Zod input schema, and the execute body (which returns the string the model receives,\n * already run through `toToolResponse`).\n *\n * Per-provider adapters (`createTool` for Vercel AI, `createOpenAITool` for OpenAI Agents)\n * turn a definition into an SDK-specific tool. Defining each tool once here keeps the\n * providers in sync and makes adding a new provider a single adapter file.\n */\nexport interface FMPToolDefinition {\n name: string;\n description: string;\n inputSchema: z.ZodObject<any>;\n execute: (args: any) => Promise<string>;\n}\n\n/**\n * Identity helper that preserves per-tool inference of `execute`'s args from the schema\n * at the definition site, while widening the result to `FMPToolDefinition` so definitions\n * can be collected into a single array.\n */\nexport function defineTool<T extends z.ZodObject<any>>(def: {\n name: string;\n description: string;\n inputSchema: T;\n execute: (args: z.infer<T>) => Promise<string>;\n}): FMPToolDefinition {\n return def as FMPToolDefinition;\n}\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\nimport type { APIResponse } from 'fmp-node-api';\n\nexport const quoteDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getStockQuote',\n description:\n 'Get the real-time stock quote for a company including price, volume, and market data',\n inputSchema: z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('The symbol of the company to get the stock quote for'),\n }),\n execute: async ({ symbol }) => toToolResponse(await getFMPClient().quote.getQuote(symbol)),\n }),\n defineTool({\n name: 'getHistoricalPrice',\n description:\n 'Get historical daily prices (open/high/low/close/volume) for a symbol. Returns the most recent `limit` days.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock/ETF symbol (e.g., AAPL)'),\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(30)\n .describe('Max number of most-recent days to return (default 30)'),\n }),\n execute: async ({ symbol, from, to, limit = 30 }) => {\n const res = await getFMPClient().quote.getHistoricalPrice({\n symbol,\n from: from ?? undefined,\n to: to ?? undefined,\n });\n // Response is { symbol, historical: [...] } (newest first); cap to `limit`.\n const data = res.data as { historical?: unknown[] } | null;\n if (res.success && data && Array.isArray(data.historical)) {\n return toToolResponse({\n ...res,\n data: { ...data, historical: data.historical.slice(0, limit) },\n } as APIResponse<unknown>);\n }\n return toToolResponse(res);\n },\n }),\n defineTool({\n name: 'getIntraday',\n description:\n 'Get intraday price bars for a symbol at a given interval. Returns the most recent `limit` bars.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock/ETF symbol (e.g., AAPL)'),\n interval: z\n .enum(['1min', '5min', '15min', '30min', '1hour', '4hour'])\n .default('5min')\n .describe('Bar interval'),\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(50)\n .describe('Max number of most-recent bars to return (default 50)'),\n }),\n execute: async ({ symbol, interval = '5min', from, to, limit = 50 }) => {\n const res = await getFMPClient().quote.getIntraday({\n symbol,\n interval,\n from: from ?? undefined,\n to: to ?? undefined,\n });\n if (res.success && Array.isArray(res.data)) {\n return toToolResponse({ ...res, data: res.data.slice(0, limit) } as APIResponse<unknown>);\n }\n return toToolResponse(res);\n },\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst symbolSchema = z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('The stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n});\n\nexport const companyDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getCompanyProfile',\n description: 'Get the company profile for a company',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().company.getCompanyProfile(symbol)),\n }),\n defineTool({\n name: 'getCompanySharesFloat',\n description: 'Get the company shares float',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().company.getSharesFloat(symbol)),\n }),\n defineTool({\n name: 'getCompanyExecutiveCompensation',\n description: 'Get the company executive compensation',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().company.getExecutiveCompensation(symbol)),\n }),\n defineTool({\n name: 'getStockPeers',\n description: 'Get a list of peer companies (with price and market cap) for a company',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().company.getStockPeers(symbol)),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst period = z\n .enum(['annual', 'quarter'])\n .default('annual')\n .describe('The period type (annual or quarter)');\n\nconst symbol = (what: string) => z.string().min(1).describe(`The stock symbol to get ${what} for`);\n\nconst limit = z.number().default(5).describe('The number of periods to retrieve');\n\n/** Build a standard statement tool: symbol + period + limit -> fmp.financial[method]. */\nconst statementTool = (\n name: string,\n description: string,\n what: string,\n call: (args: { symbol: string; period: 'annual' | 'quarter'; limit: number }) => Promise<any>,\n) =>\n defineTool({\n name,\n description,\n inputSchema: z.object({ symbol: symbol(what), period, limit }),\n execute: async ({ symbol, period, limit }) =>\n toToolResponse(await call({ symbol, period, limit })),\n });\n\nexport const financialDefinitions: FMPToolDefinition[] = [\n statementTool(\n 'getBalanceSheet',\n 'Get balance sheet for a company showing assets, liabilities, and equity',\n 'balance sheet',\n args => getFMPClient().financial.getBalanceSheet(args),\n ),\n statementTool(\n 'getIncomeStatement',\n 'Get income statement for a company showing revenue, expenses, and profit',\n 'income statement',\n args => getFMPClient().financial.getIncomeStatement(args),\n ),\n statementTool(\n 'getCashFlowStatement',\n 'Get cash flow statement for a company showing operating, investing, and financing cash flows',\n 'cash flow statement',\n args => getFMPClient().financial.getCashFlowStatement(args),\n ),\n statementTool('getKeyMetrics', 'Get key metrics for a company', 'key metrics', args =>\n getFMPClient().financial.getKeyMetrics(args),\n ),\n statementTool(\n 'getFinancialRatios',\n 'Get financial ratios for a company including profitability, liquidity, and efficiency metrics',\n 'financial ratios',\n args => getFMPClient().financial.getFinancialRatios(args),\n ),\n statementTool(\n 'getEnterpriseValue',\n 'Get enterprise value for a company',\n 'enterprise value',\n args => getFMPClient().financial.getEnterpriseValue(args),\n ),\n statementTool('getCashflowGrowth', 'Get cashflow growth for a company', 'cashflow growth', args =>\n getFMPClient().financial.getCashflowGrowth(args),\n ),\n statementTool('getIncomeGrowth', 'Get income growth for a company', 'income growth', args =>\n getFMPClient().financial.getIncomeGrowth(args),\n ),\n statementTool(\n 'getBalanceSheetGrowth',\n 'Get balance sheet growth for a company',\n 'balance sheet growth',\n args => getFMPClient().financial.getBalanceSheetGrowth(args),\n ),\n statementTool(\n 'getFinancialGrowth',\n 'Get financial growth for a company',\n 'financial growth',\n args => getFMPClient().financial.getFinancialGrowth(args),\n ),\n defineTool({\n name: 'getEarningsHistorical',\n description: 'Get earnings historical for a company',\n inputSchema: z.object({\n symbol: symbol('earnings historical'),\n limit: z.number().default(10).describe('The number of periods to retrieve'),\n }),\n execute: async ({ symbol, limit }) =>\n toToolResponse(await getFMPClient().financial.getEarningsHistorical({ symbol, limit })),\n }),\n defineTool({\n name: 'getFinancialScores',\n description:\n 'Get financial health scores for a company (Altman Z-Score bankruptcy risk + Piotroski fundamental-strength score)',\n inputSchema: z.object({ symbol: symbol('financial scores') }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().financial.getFinancialScores({ symbol })),\n }),\n defineTool({\n name: 'getKeyMetricsTTM',\n description:\n 'Get current trailing-twelve-month (TTM) key metrics for a company (one snapshot row)',\n inputSchema: z.object({ symbol: symbol('TTM key metrics') }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().financial.getKeyMetricsTTM({ symbol })),\n }),\n defineTool({\n name: 'getFinancialRatiosTTM',\n description:\n 'Get current trailing-twelve-month (TTM) financial ratios for a company (margins, returns, liquidity)',\n inputSchema: z.object({ symbol: symbol('TTM financial ratios') }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().financial.getFinancialRatiosTTM({ symbol })),\n }),\n defineTool({\n name: 'getRevenueProductSegmentation',\n description: 'Get revenue broken down by product line for a company',\n inputSchema: z.object({ symbol: symbol('product revenue segmentation'), period }),\n execute: async ({ symbol, period }) =>\n toToolResponse(\n await getFMPClient().financial.getRevenueProductSegmentation({ symbol, period }),\n ),\n }),\n defineTool({\n name: 'getRevenueGeographicSegmentation',\n description: 'Get revenue broken down by geographic region for a company',\n inputSchema: z.object({ symbol: symbol('geographic revenue segmentation'), period }),\n execute: async ({ symbol, period }) =>\n toToolResponse(\n await getFMPClient().financial.getRevenueGeographicSegmentation({ symbol, period }),\n ),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst dateRangeSchema = z.object({\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n});\n\nexport const calendarDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getEarningsCalendar',\n description: 'Get earnings calendar showing upcoming and recent earnings announcements',\n inputSchema: dateRangeSchema,\n execute: async ({ from, to }) =>\n toToolResponse(\n await getFMPClient().calendar.getEarningsCalendar({\n from: from ?? undefined,\n to: to ?? undefined,\n }),\n ),\n }),\n defineTool({\n name: 'getEconomicCalendar',\n description: 'Get economic calendar showing upcoming and recent economic events and indicators',\n inputSchema: dateRangeSchema,\n execute: async ({ from, to }) =>\n toToolResponse(\n await getFMPClient().calendar.getEconomicsCalendar({\n from: from ?? undefined,\n to: to ?? undefined,\n }),\n ),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst economicIndicatorNames = [\n 'GDP',\n 'realGDP',\n 'nominalPotentialGDP',\n 'realGDPPerCapita',\n 'federalFunds',\n 'CPI',\n 'inflationRate',\n 'inflation',\n 'retailSales',\n 'consumerSentiment',\n 'durableGoods',\n 'unemploymentRate',\n 'totalNonfarmPayroll',\n 'initialClaims',\n 'industrialProductionTotalIndex',\n 'newPrivatelyOwnedHousingUnitsStartedTotalUnits',\n 'totalVehicleSales',\n 'retailMoneyFunds',\n 'smoothedUSRecessionProbabilities',\n '3MonthOr90DayRatesAndYieldsCertificatesOfDeposit',\n 'commercialBankInterestRateOnCreditCardPlansAllAccounts',\n '30YearFixedRateMortgageAverage',\n '15YearFixedRateMortgageAverage',\n] as const;\n\nexport const economicDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getTreasuryRates',\n description: 'Get treasury rates for different maturities over time',\n inputSchema: z.object({\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n }),\n execute: async ({ from, to }) =>\n toToolResponse(\n await getFMPClient().economic.getTreasuryRates({\n from: from ?? undefined,\n to: to ?? undefined,\n }),\n ),\n }),\n defineTool({\n name: 'getEconomicIndicators',\n description: 'Get economic indicators like GDP, unemployment rate, inflation, etc.',\n inputSchema: z.object({\n name: z.enum(economicIndicatorNames).describe('The name of the economic indicator'),\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n }),\n execute: async ({ name, from, to }) =>\n toToolResponse(\n await getFMPClient().economic.getEconomicIndicators({\n name,\n from: from ?? undefined,\n to: to ?? undefined,\n }),\n ),\n }),\n];\n","import { z } from 'zod';\r\nimport { getFMPClient } from '@/client';\r\nimport { toToolResponse } from '@/utils/format-response';\r\nimport { defineTool, type FMPToolDefinition } from './types';\r\n\r\nexport const etfDefinitions: FMPToolDefinition[] = [\r\n defineTool({\r\n name: 'getETFHoldings',\r\n description:\r\n 'Get ETF holdings for a specific ETF symbol, showing the underlying assets and their weights',\r\n inputSchema: z.object({\r\n symbol: z\r\n .string()\r\n .min(1, 'ETF symbol is required')\r\n .describe('ETF symbol (e.g., SPY, QQQ, VTI)'),\r\n date: z\r\n .string()\r\n .optional()\r\n .nullable()\r\n .describe('Date for holdings in YYYY-MM-DD format (optional)'),\r\n }),\r\n execute: async ({ symbol, date }) => {\r\n // `date` is optional; the holdings params type treats it as required, so widen.\r\n const params: any = { symbol };\r\n if (date) {\r\n params.date = date;\r\n }\r\n return toToolResponse(await getFMPClient().etf.getHoldings(params));\r\n },\r\n }),\r\n defineTool({\r\n name: 'getETFProfile',\r\n description: 'Get ETF profile information including fund details, expense ratio, and key metrics',\r\n inputSchema: z.object({\r\n symbol: z\r\n .string()\r\n .min(1, 'ETF symbol is required')\r\n .describe('ETF symbol (e.g., SPY, QQQ, VTI)'),\r\n }),\r\n execute: async ({ symbol }) => toToolResponse(await getFMPClient().etf.getProfile(symbol)),\r\n }),\r\n];\r\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const insiderDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getInsiderTrading',\n description:\n 'Get insider trading data for a specific stock symbol showing buy/sell transactions by company insiders',\n inputSchema: z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('Stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number for pagination (optional, defaults to 0)'),\n }),\n execute: async ({ symbol, page }) =>\n toToolResponse(await getFMPClient().insider.getInsiderTradesBySymbol(symbol, page)),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const institutionalDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getInstitutionalHolders',\n description:\n 'Get institutional holders for a specific stock symbol showing which institutions own shares and their holdings',\n inputSchema: z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('Stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().institutional.getInstitutionalHolders({ symbol })),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst empty = z.object({});\n\nexport const marketDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getMarketPerformance',\n description: 'Get overall market performance data including major indices performance',\n inputSchema: empty,\n execute: async () => toToolResponse(await getFMPClient().market.getMarketPerformance()),\n }),\n defineTool({\n name: 'getSectorPerformance',\n description: 'Get sector performance data showing how different market sectors are performing',\n inputSchema: empty,\n execute: async () => toToolResponse(await getFMPClient().market.getSectorPerformance()),\n }),\n defineTool({\n name: 'getGainers',\n description: 'Get top gaining stocks showing the best performing stocks of the day',\n inputSchema: empty,\n execute: async () => toToolResponse(await getFMPClient().market.getGainers()),\n }),\n defineTool({\n name: 'getLosers',\n description: 'Get top losing stocks showing the worst performing stocks of the day',\n inputSchema: empty,\n execute: async () => toToolResponse(await getFMPClient().market.getLosers()),\n }),\n defineTool({\n name: 'getMostActive',\n description: 'Get most active stocks showing stocks with the highest trading volume',\n inputSchema: empty,\n execute: async () => toToolResponse(await getFMPClient().market.getMostActive()),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const newsDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getStockNews',\n description: 'Get the latest general stock market news articles',\n inputSchema: z.object({\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(20)\n .describe('Max number of articles to return (default 20)'),\n }),\n execute: async ({ from, to, limit = 20 }) =>\n toToolResponse(\n await getFMPClient().news.getStockNews({\n from: from ?? undefined,\n to: to ?? undefined,\n limit,\n }),\n ),\n }),\n defineTool({\n name: 'getStockNewsBySymbol',\n description: 'Get the latest news articles for one or more specific stock symbols',\n inputSchema: z.object({\n symbols: z\n .array(z.string().min(1))\n .min(1)\n .describe('Stock symbols to get news for (e.g., [\"AAPL\", \"MSFT\"])'),\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(20)\n .describe('Max number of articles to return (default 20)'),\n }),\n execute: async ({ symbols, from, to, limit = 20 }) =>\n toToolResponse(\n await getFMPClient().news.getStockNewsBySymbol({\n symbols,\n from: from ?? undefined,\n to: to ?? undefined,\n limit,\n }),\n ),\n }),\n];\n","import { z } from 'zod';\r\nimport type { ScreenerParams } from 'fmp-node-api';\r\nimport { getFMPClient } from '@/client';\r\nimport { toToolResponse } from '@/utils/format-response';\r\nimport { defineTool, type FMPToolDefinition } from './types';\r\n\r\nexport const screenerDefinitions: FMPToolDefinition[] = [\r\n defineTool({\r\n name: 'screenStocks',\r\n description:\r\n 'Screen for stocks matching financial criteria (market cap, price, sector, exchange, etc.). Returns matching companies.',\r\n inputSchema: z.object({\r\n marketCapMoreThan: z.number().optional().nullable().describe('Minimum market capitalization'),\r\n marketCapLowerThan: z.number().optional().nullable().describe('Maximum market capitalization'),\r\n priceMoreThan: z.number().optional().nullable().describe('Minimum stock price'),\r\n priceLowerThan: z.number().optional().nullable().describe('Maximum stock price'),\r\n sector: z.string().optional().nullable().describe('Sector filter (e.g., \"Technology\")'),\r\n industry: z.string().optional().nullable().describe('Industry filter'),\r\n exchange: z.string().optional().nullable().describe('Exchange filter (e.g., \"NASDAQ\")'),\r\n country: z.string().optional().nullable().describe('Country filter (e.g., \"US\")'),\r\n isEtf: z.boolean().optional().nullable().describe('Restrict to ETFs'),\r\n isActivelyTrading: z.boolean().optional().nullable().describe('Restrict to actively trading'),\r\n limit: z\r\n .number()\r\n .int()\r\n .positive()\r\n .default(50)\r\n .describe('Max number of results to return (default 50)'),\r\n }),\r\n execute: async ({ limit = 50, ...filters }) => {\r\n // Drop null/undefined so they aren't sent as query params.\r\n const params: Record<string, unknown> = { limit };\r\n for (const [key, value] of Object.entries(filters)) {\r\n if (value !== null && value !== undefined) params[key] = value;\r\n }\r\n return toToolResponse(await getFMPClient().screener.getScreener(params as ScreenerParams));\r\n },\r\n }),\r\n];\r\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const searchDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'searchSymbol',\n description:\n 'Search for a ticker symbol by company name or partial ticker (e.g., resolve \"Apple\" to \"AAPL\")',\n inputSchema: z.object({\n query: z.string().min(1).describe('Company name or ticker to search for'),\n limit: z\n .number()\n .int()\n .positive()\n .default(10)\n .describe('Max number of results to return (default 10)'),\n exchange: z\n .string()\n .optional()\n .nullable()\n .describe('Restrict to a specific exchange (optional, e.g., \"NASDAQ\")'),\n }),\n execute: async ({ query, limit = 10, exchange }) =>\n toToolResponse(\n await getFMPClient().search.search({ query, limit, exchange: exchange ?? undefined }),\n ),\n }),\n];\n","import { z } from 'zod';\nimport type { APIResponse } from 'fmp-node-api';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const analystDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getAnalystEstimates',\n description:\n 'Get analyst estimates (revenue, EBITDA, net income, EPS) for a company, by period',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\n period: z\n .enum(['annual', 'quarter'])\n .default('annual')\n .describe('The period type (annual or quarter)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(10)\n .describe('Max number of periods to return (default 10)'),\n }),\n execute: async ({ symbol, period = 'annual', limit = 10 }) =>\n toToolResponse(await getFMPClient().analyst.getEstimates({ symbol, period, limit })),\n }),\n defineTool({\n name: 'getPriceTargetConsensus',\n description:\n 'Get the analyst price-target consensus (high, low, consensus, median) for a company',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\n }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().analyst.getPriceTargetConsensus({ symbol })),\n }),\n defineTool({\n name: 'getStockGrades',\n description:\n 'Get recent analyst grades (upgrades/downgrades) for a company (most recent `limit`)',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(20)\n .describe('Max number of grade entries to return (default 20)'),\n }),\n execute: async ({ symbol, limit = 20 }) => {\n const res = await getFMPClient().analyst.getGrades({ symbol });\n if (res.success && Array.isArray(res.data)) {\n return toToolResponse({ ...res, data: res.data.slice(0, limit) } as APIResponse<unknown>);\n }\n return toToolResponse(res);\n },\n }),\n defineTool({\n name: 'getGradesConsensus',\n description:\n 'Get the analyst rating consensus for a company (counts of strongBuy/buy/hold/sell/strongSell + overall consensus)',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\n }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().analyst.getGradesConsensus({ symbol })),\n }),\n];\n","import { z } from 'zod';\r\nimport { getFMPClient } from '@/client';\r\nimport { toToolResponse } from '@/utils/format-response';\r\nimport { defineTool, type FMPToolDefinition } from './types';\r\n\r\nconst symbolSchema = z.object({\r\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\r\n});\r\n\r\nexport const valuationDefinitions: FMPToolDefinition[] = [\r\n defineTool({\r\n name: 'getDiscountedCashFlow',\r\n description:\r\n \"Get the discounted-cash-flow (DCF) fair-value estimate vs. the current price for a company\",\r\n inputSchema: symbolSchema,\r\n execute: async ({ symbol }) =>\r\n toToolResponse(await getFMPClient().valuation.getDiscountedCashFlow({ symbol })),\r\n }),\r\n defineTool({\r\n name: 'getCompanyRating',\r\n description: \"Get FMP's current rating/score snapshot for a company\",\r\n inputSchema: symbolSchema,\r\n execute: async ({ symbol }) =>\r\n toToolResponse(await getFMPClient().valuation.getRatingSnapshot({ symbol })),\r\n }),\r\n];\r\n","import { z } from 'zod';\nimport type { APIResponse } from 'fmp-node-api';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const technicalDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getTechnicalIndicator',\n description:\n 'Get a technical indicator series (SMA, EMA, RSI, etc.) for a symbol at a given timeframe. Returns the most recent `limit` bars.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock/ETF symbol (e.g., AAPL)'),\n type: z\n .enum(['sma', 'ema', 'wma', 'dema', 'tema', 'rsi', 'standardDeviation', 'williams', 'adx'])\n .describe('The indicator type'),\n periodLength: z\n .number()\n .int()\n .positive()\n .default(10)\n .describe('Lookback period for the indicator (e.g. 14 for a 14-day RSI)'),\n timeframe: z\n .enum(['1min', '5min', '15min', '30min', '1hour', '4hour', '1day', '1week', '1month'])\n .default('1day')\n .describe('Bar timeframe'),\n limit: z\n .number()\n .int()\n .positive()\n .default(50)\n .describe('Max number of most-recent bars to return (default 50)'),\n }),\n execute: async ({ symbol, type, periodLength = 10, timeframe = '1day', limit = 50 }) => {\n const res = await getFMPClient().technical.getTechnicalIndicator({\n symbol,\n type,\n periodLength,\n timeframe,\n });\n if (res.success && Array.isArray(res.data)) {\n return toToolResponse({ ...res, data: res.data.slice(0, limit) } as APIResponse<unknown>);\n }\n return toToolResponse(res);\n },\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst symbolSchema = z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('Stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n});\n\nconst rssFeedSchema = z.object({\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number for pagination (optional, defaults to 0)'),\n});\n\nexport const senateHouseDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getSenateTrading',\n description: 'Get senate trading data for a specific stock symbol showing senator transactions',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().senateHouse.getSenateTrading({ symbol })),\n }),\n defineTool({\n name: 'getHouseTrading',\n description:\n 'Get house trading data for a specific stock symbol showing representative transactions',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().senateHouse.getHouseTrading({ symbol })),\n }),\n defineTool({\n name: 'getSenateTradingByName',\n description:\n 'Get senate trading data for a specific senator by name showing their trading activity',\n inputSchema: z.object({\n name: z\n .string()\n .min(1, 'Name is required')\n .describe('The name of the senator to get trading data for'),\n }),\n execute: async ({ name }) =>\n toToolResponse(await getFMPClient().senateHouse.getSenateTradingByName({ name })),\n }),\n defineTool({\n name: 'getHouseTradingByName',\n description:\n 'Get house trading data for a specific representative by name showing their trading activity',\n inputSchema: z.object({\n name: z\n .string()\n .min(1, 'Name is required')\n .describe('The name of the representative to get trading data for'),\n }),\n execute: async ({ name }) =>\n toToolResponse(await getFMPClient().senateHouse.getHouseTradingByName({ name })),\n }),\n defineTool({\n name: 'getSenateTradingRSSFeed',\n description:\n 'Get senate trading data through RSS feed with pagination showing recent senate transactions',\n inputSchema: rssFeedSchema,\n // JS default mirrors the Zod default for the Vercel adapter, which (unlike the\n // OpenAI adapter) does not parse input before calling execute.\n execute: async ({ page = 0 }) =>\n toToolResponse(await getFMPClient().senateHouse.getSenateTradingRSSFeed({ page })),\n }),\n defineTool({\n name: 'getHouseTradingRSSFeed',\n description:\n 'Get house trading data through RSS feed with pagination showing recent house transactions',\n inputSchema: rssFeedSchema,\n // JS default mirrors the Zod default for the Vercel adapter, which (unlike the\n // OpenAI adapter) does not parse input before calling execute.\n execute: async ({ page = 0 }) =>\n toToolResponse(await getFMPClient().senateHouse.getHouseTradingRSSFeed({ page })),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst symbolSchema = z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('The stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n});\n\nexport const stockDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getMarketCap',\n description: 'Get market capitalization for a company showing current market value',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) => toToolResponse(await getFMPClient().stock.getMarketCap(symbol)),\n }),\n defineTool({\n name: 'getStockSplits',\n description: 'Get stock splits history for a company showing all historical stock split events',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().stock.getStockSplits(symbol)),\n }),\n defineTool({\n name: 'getDividendHistory',\n description: 'Get dividend history for a company showing all historical dividend payments',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().stock.getDividendHistory(symbol)),\n }),\n];\n","import { ToolSet } from 'ai';\nimport { createTool } from '@/utils/aisdk-tool-wrapper';\n\n// Re-export client configuration helpers (optional; tools default to FMP_API_KEY).\nexport { configureFMPClient, resetFMPClient } from '@/client';\n\nimport {\n quoteDefinitions,\n companyDefinitions,\n financialDefinitions,\n calendarDefinitions,\n economicDefinitions,\n etfDefinitions,\n insiderDefinitions,\n institutionalDefinitions,\n marketDefinitions,\n newsDefinitions,\n screenerDefinitions,\n searchDefinitions,\n analystDefinitions,\n valuationDefinitions,\n technicalDefinitions,\n senateHouseDefinitions,\n stockDefinitions,\n type FMPToolDefinition,\n} from '@/definitions';\n\n// Build a Vercel AI `ToolSet` (object keyed by tool name) from shared definitions.\nconst toToolSet = (defs: FMPToolDefinition[]): ToolSet =>\n Object.fromEntries(defs.map(def => [def.name, createTool(def)]));\n\n// Tool groups by category\nexport const quoteTools = toToolSet(quoteDefinitions);\nexport const companyTools = toToolSet(companyDefinitions);\nexport const financialTools = toToolSet(financialDefinitions);\nexport const calendarTools = toToolSet(calendarDefinitions);\nexport const economicTools = toToolSet(economicDefinitions);\nexport const etfTools = toToolSet(etfDefinitions);\nexport const insiderTools = toToolSet(insiderDefinitions);\nexport const institutionalTools = toToolSet(institutionalDefinitions);\nexport const marketTools = toToolSet(marketDefinitions);\nexport const newsTools = toToolSet(newsDefinitions);\nexport const screenerTools = toToolSet(screenerDefinitions);\nexport const searchTools = toToolSet(searchDefinitions);\nexport const analystTools = toToolSet(analystDefinitions);\nexport const valuationTools = toToolSet(valuationDefinitions);\nexport const technicalTools = toToolSet(technicalDefinitions);\nexport const senateHouseTools = toToolSet(senateHouseDefinitions);\nexport const stockTools = toToolSet(stockDefinitions);\n\n// Combine all tools into a single ToolSet\nexport const fmpTools: ToolSet = {\n ...quoteTools,\n ...companyTools,\n ...financialTools,\n ...calendarTools,\n ...economicTools,\n ...etfTools,\n ...insiderTools,\n ...institutionalTools,\n ...marketTools,\n ...newsTools,\n ...screenerTools,\n ...searchTools,\n ...analystTools,\n ...valuationTools,\n ...technicalTools,\n ...senateHouseTools,\n ...stockTools,\n};\n\n// Individual tools for direct import\nexport const { getStockQuote, getHistoricalPrice, getIntraday } = quoteTools;\nexport const {\n getCompanyProfile,\n getCompanySharesFloat,\n getCompanyExecutiveCompensation,\n getStockPeers,\n} = companyTools;\nexport const { getEarningsCalendar, getEconomicCalendar } = calendarTools;\nexport const { getTreasuryRates, getEconomicIndicators } = economicTools;\nexport const { getETFHoldings, getETFProfile } = etfTools;\nexport const {\n getBalanceSheet,\n getIncomeStatement,\n getCashFlowStatement,\n getKeyMetrics,\n getFinancialRatios,\n getEnterpriseValue,\n getCashflowGrowth,\n getIncomeGrowth,\n getBalanceSheetGrowth,\n getFinancialGrowth,\n getEarningsHistorical,\n getFinancialScores,\n getKeyMetricsTTM,\n getFinancialRatiosTTM,\n getRevenueProductSegmentation,\n getRevenueGeographicSegmentation,\n} = financialTools;\nexport const { getInsiderTrading } = insiderTools;\nexport const { getInstitutionalHolders } = institutionalTools;\nexport const { getMarketPerformance, getSectorPerformance, getGainers, getLosers, getMostActive } =\n marketTools;\nexport const {\n getSenateTrading,\n getHouseTrading,\n getSenateTradingByName,\n getHouseTradingByName,\n getSenateTradingRSSFeed,\n getHouseTradingRSSFeed,\n} = senateHouseTools;\nexport const { getStockNews, getStockNewsBySymbol } = newsTools;\nexport const { screenStocks } = screenerTools;\nexport const { searchSymbol } = searchTools;\nexport const { getAnalystEstimates, getPriceTargetConsensus, getStockGrades, getGradesConsensus } =\n analystTools;\nexport const { getDiscountedCashFlow, getCompanyRating } = valuationTools;\nexport const { getTechnicalIndicator } = technicalTools;\nexport const { getMarketCap, getStockSplits, getDividendHistory } = stockTools;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/logger.ts","../../../src/utils/format-response.ts","../../../src/utils/aisdk-tool-wrapper.ts","../../../src/client.ts","../../../src/definitions/types.ts","../../../src/definitions/quote.ts","../../../src/definitions/company.ts","../../../src/definitions/financial.ts","../../../src/definitions/calendar.ts","../../../src/definitions/economic.ts","../../../src/definitions/etf.ts","../../../src/definitions/insider.ts","../../../src/definitions/institutional.ts","../../../src/definitions/market.ts","../../../src/definitions/news.ts","../../../src/definitions/screener.ts","../../../src/definitions/search.ts","../../../src/definitions/analyst.ts","../../../src/definitions/valuation.ts","../../../src/definitions/technical.ts","../../../src/definitions/senate-house.ts","../../../src/definitions/stock.ts","../../../src/definitions/aftermarket.ts","../../../src/providers/vercel-ai/index.ts"],"names":["symbol","limit","z","period","symbolSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Logger utility for tools package\n * Controls logging of API results based on environment variable\n */\n\ninterface LogOptions {\n toolName: string;\n input: unknown;\n result: unknown;\n executionTime?: number;\n}\n\n/**\n * Check if API result logging is enabled via environment variable\n * Defaults to false if not set\n */\nexport function isApiLoggingEnabled(): boolean {\n return process.env.FMP_TOOLS_LOG_API_RESULTS === 'true';\n}\n\n/**\n * Check if data-only logging is enabled via environment variable\n * Defaults to false if not set\n */\nexport function isDataOnlyLoggingEnabled(): boolean {\n return process.env.FMP_TOOLS_LOG_DATA_ONLY === 'true';\n}\n\n/**\n * Estimate token count for LLM context (JSON-optimized)\n * JSON has many structural characters that count as single tokens\n */\nfunction estimateTokenCount(text: string): number {\n // Try to parse as JSON first for better estimation\n try {\n const parsed = JSON.parse(text);\n return estimateTokenCountForData(parsed);\n } catch {\n // Not JSON, use text-based estimation\n return estimateTokenCountForText(text);\n }\n}\n\n/**\n * Estimate tokens for parsed JSON data\n */\nfunction estimateTokenCountForData(data: unknown): number {\n if (data === null || data === undefined) {\n return 1; // null/undefined is typically 1 token\n }\n\n if (typeof data === 'string') {\n // Strings are typically tokenized by words/symbols\n // Financial data often has short strings like \"AAPL\", \"USD\", etc.\n return Math.ceil(data.length / 3); // More conservative for short strings\n }\n\n if (typeof data === 'number') {\n // Numbers are typically 1-2 tokens depending on size\n return data.toString().length > 10 ? 2 : 1;\n }\n\n if (typeof data === 'boolean') {\n return 1; // true/false are single tokens\n }\n\n if (Array.isArray(data)) {\n // Arrays: count structural tokens + content tokens\n let tokens = 2; // [ and ]\n for (const item of data) {\n tokens += estimateTokenCountForData(item);\n if (data.indexOf(item) < data.length - 1) {\n tokens += 1; // comma separator\n }\n }\n return tokens;\n }\n\n if (typeof data === 'object') {\n // Objects: count structural tokens + key-value pairs\n let tokens = 2; // { and }\n const keys = Object.keys(data);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = (data as Record<string, unknown>)[key];\n\n // Key (quoted string)\n tokens += Math.ceil(key.length / 3);\n tokens += 2; // quotes around key\n\n // Colon separator\n tokens += 1;\n\n // Value\n tokens += estimateTokenCountForData(value);\n\n // Comma separator (except for last item)\n if (i < keys.length - 1) {\n tokens += 1;\n }\n }\n return tokens;\n }\n\n return 1; // fallback\n}\n\n/**\n * Estimate tokens for plain text (non-JSON)\n */\nfunction estimateTokenCountForText(text: string): number {\n // For plain text, use a more conservative estimate\n // Consider that financial data often has numbers, symbols, and abbreviations\n const words = text.split(/\\s+/).filter(word => word.length > 0);\n let tokens = 0;\n\n for (const word of words) {\n if (/^\\d+$/.test(word)) {\n // Pure numbers are typically 1-2 tokens\n tokens += word.length > 8 ? 2 : 1;\n } else if (/^[A-Z]+$/.test(word)) {\n // All caps (like stock symbols) are often single tokens\n tokens += 1;\n } else if (/^\\$[\\d,]+\\.?\\d*$/.test(word)) {\n // Currency amounts are typically 2-3 tokens\n tokens += 3;\n } else {\n // Regular words: roughly 3-4 characters per token\n tokens += Math.ceil(word.length / 3.5);\n }\n }\n\n return tokens;\n}\n\n/**\n * Get simple metadata about the result for LLM context\n */\nfunction getResultInfo(result: unknown): string {\n if (result === null || result === undefined) {\n return 'null/undefined';\n }\n\n if (typeof result === 'string') {\n const tokenCount = estimateTokenCount(result);\n try {\n const parsed = JSON.parse(result);\n if (Array.isArray(parsed)) {\n return `JSON string (array of ${parsed.length} items, ~${tokenCount} tokens)`;\n }\n } catch {\n // Not JSON\n }\n return `string (${result.length} chars, ~${tokenCount} tokens)`;\n }\n\n if (Array.isArray(result)) {\n const jsonStr = JSON.stringify(result);\n const tokenCount = estimateTokenCount(jsonStr);\n return `array (${result.length} items, ~${tokenCount} tokens)`;\n }\n\n if (typeof result === 'object') {\n const jsonStr = JSON.stringify(result);\n const tokenCount = estimateTokenCount(jsonStr);\n return `object (~${tokenCount} tokens)`;\n }\n\n return typeof result;\n}\n\n/**\n * Log API tool execution details when enabled\n */\nexport function logApiExecution(options: LogOptions): void {\n if (!isApiLoggingEnabled()) {\n return;\n }\n\n const { toolName, input, result, executionTime } = options;\n\n console.log('\\n' + '='.repeat(80));\n console.log(`š§ FMP Tool Execution: ${toolName}`);\n console.log('='.repeat(80));\n\n console.log('\\nš„ Input:');\n console.log(JSON.stringify(input, null, 2));\n\n const resultInfo = getResultInfo(result);\n\n console.log(`š§ ${toolName}: ${resultInfo}`);\n\n if (executionTime !== undefined) {\n console.log(`\\nā±ļø Execution Time: ${executionTime}ms`);\n }\n\n console.log('='.repeat(80) + '\\n');\n}\n\n/**\n * Log data-only information for LLM context (when enabled)\n */\nexport function logDataOnly(options: LogOptions): void {\n if (!isDataOnlyLoggingEnabled()) {\n return;\n }\n\n const { result } = options;\n\n console.log('\\nš¤ Result:');\n if (typeof result === 'string') {\n try {\n // Try to parse and pretty-print if it's JSON\n const parsed = JSON.parse(result);\n console.log(JSON.stringify(parsed, null, 2));\n } catch {\n // If not JSON, log as-is\n console.log(result);\n }\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n\n console.log('='.repeat(80) + '\\n');\n}\n\n/**\n * Log API tool execution with timing\n */\nexport async function logApiExecutionWithTiming<T>(\n toolName: string,\n input: unknown,\n executeFn: () => Promise<T>,\n): Promise<T> {\n const startTime = Date.now();\n\n try {\n const result = await executeFn();\n const executionTime = Date.now() - startTime;\n\n logApiExecution({\n toolName,\n input,\n result,\n executionTime,\n });\n\n // Also log data-only info if enabled\n logDataOnly({\n toolName,\n input,\n result,\n executionTime,\n });\n\n return result;\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n // Log error case as well\n if (isApiLoggingEnabled()) {\n console.log('\\n' + '='.repeat(80));\n console.log(`ā FMP Tool Execution Error: ${toolName}`);\n console.log('='.repeat(80));\n console.log('\\nš„ Input:');\n console.log(JSON.stringify(input, null, 2));\n console.log('\\nā Error:');\n console.log(error instanceof Error ? error.message : String(error));\n console.log(`\\nā±ļø Execution Time: ${executionTime}ms`);\n console.log('='.repeat(80) + '\\n');\n }\n\n throw error;\n }\n}\n","import type { APIResponse, FMPErrorType } from 'fmp-node-api';\n\n/**\n * Format an `fmp-node-api` response into the string an AI tool returns to the model.\n *\n * On success, returns the data as pretty JSON (or a clear \"no data\" note when the\n * payload is empty). On failure, returns a structured error object ā including the\n * classified `type` (e.g. `plan-restricted`, `rate-limit`, `auth`) ā so the model\n * can explain *why* the call failed instead of receiving a bare `null`.\n */\nexport function toToolResponse(res: APIResponse<unknown>): string {\n // Only an explicit failure surfaces an error; the client always sets `success`.\n if (res.success === false) {\n return JSON.stringify({\n error: true,\n type: res.errorType ?? 'unknown',\n message: res.error ?? 'The request failed.',\n status: res.status,\n });\n }\n\n if (isEmpty(res.data)) {\n return JSON.stringify({ data: [], note: 'No data was returned for this request.' });\n }\n return JSON.stringify(res.data, null, 2);\n}\n\n/**\n * Format a *thrown* error into the same structured shape `toToolResponse` uses.\n *\n * Some failures throw instead of returning an `APIResponse` ā most notably a\n * missing/invalid `FMP_API_KEY`, which throws from the `FMP` constructor before\n * any request is made. Catching these at the tool boundary lets the model relay\n * the real reason instead of receiving a bare exception.\n */\nexport function toToolError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n let type: FMPErrorType = 'unknown';\n if (/api[\\s_-]?key/i.test(message)) {\n type = 'auth';\n }\n return JSON.stringify({ error: true, type, message, status: 0 });\n}\n\nfunction isEmpty(data: unknown): boolean {\n if (data == null) return true;\n if (Array.isArray(data)) return data.length === 0;\n if (typeof data === 'object') return Object.keys(data as object).length === 0;\n return false;\n}\n","import { z } from 'zod';\nimport { tool } from 'ai';\nimport { logApiExecutionWithTiming } from './logger';\nimport { toToolError } from './format-response';\n\ninterface AISDKToolConfig {\n name: string;\n description: string;\n inputSchema: z.ZodSchema;\n execute: (input: any) => Promise<string>;\n}\n\nexport const createTool = (config: AISDKToolConfig) => {\n const { name, description, inputSchema, execute } = config;\n return tool({\n description,\n // `as any` avoids ai@6 tool()'s excessively-deep type instantiation on a\n // generic Zod schema; the real Zod schema is still passed at runtime.\n inputSchema: inputSchema as any,\n execute: async (input: any) => {\n try {\n return await logApiExecutionWithTiming(name, input, () => execute(input));\n } catch (error) {\n // Never throw out of a tool ā return a structured error the model can\n // relay (e.g. a missing FMP_API_KEY, which throws from `new FMP()`).\n return toToolError(error);\n }\n },\n });\n};\n","/**\n * Internal FMP API client used by the tools.\n *\n * The client is memoized so tools reuse a single `FMP` instance instead of\n * constructing one (and re-validating the API key) on every tool call. By\n * default it reads the `FMP_API_KEY` environment variable; consumers can call\n * `configureFMPClient(...)` once at startup to provide a key/timeout explicitly.\n */\nimport { FMP, type FMPConfig } from 'fmp-node-api';\n\nlet cached: FMP | undefined;\nlet configured: FMPConfig | undefined;\n\n/**\n * Configure the FMP client used by all tools. Optional ā by default the client\n * reads the `FMP_API_KEY` environment variable. Call once before using the tools.\n */\nexport function configureFMPClient(config: FMPConfig): void {\n configured = config;\n cached = undefined; // rebuilt lazily on next use\n}\n\n/** Reset the memoized client and configuration (mainly for tests / serverless reuse). */\nexport function resetFMPClient(): void {\n cached = undefined;\n configured = undefined;\n}\n\n/** Get the memoized FMP client instance (internal use by tools). */\nexport function getFMPClient(): FMP {\n if (!cached) {\n cached = new FMP(configured);\n }\n return cached;\n}\n","import { z } from 'zod';\n\n/**\n * Provider-agnostic definition of an FMP tool: its name, model-facing description,\n * Zod input schema, and the execute body (which returns the string the model receives,\n * already run through `toToolResponse`).\n *\n * Per-provider adapters (`createTool` for Vercel AI, `createOpenAITool` for OpenAI Agents)\n * turn a definition into an SDK-specific tool. Defining each tool once here keeps the\n * providers in sync and makes adding a new provider a single adapter file.\n */\nexport interface FMPToolDefinition {\n name: string;\n description: string;\n inputSchema: z.ZodObject<any>;\n execute: (args: any) => Promise<string>;\n}\n\n/**\n * Identity helper that preserves per-tool inference of `execute`'s args from the schema\n * at the definition site, while widening the result to `FMPToolDefinition` so definitions\n * can be collected into a single array.\n */\nexport function defineTool<T extends z.ZodObject<any>>(def: {\n name: string;\n description: string;\n inputSchema: T;\n execute: (args: z.infer<T>) => Promise<string>;\n}): FMPToolDefinition {\n return def as FMPToolDefinition;\n}\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\nimport type { APIResponse } from 'fmp-node-api';\n\nexport const quoteDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getStockQuote',\n description:\n 'Get the real-time stock quote for a company including price, volume, and market data',\n inputSchema: z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('The symbol of the company to get the stock quote for'),\n }),\n execute: async ({ symbol }) => toToolResponse(await getFMPClient().quote.getQuote(symbol)),\n }),\n defineTool({\n name: 'getStockQuoteShort',\n description:\n 'Get a short real-time quote (price, change, and volume only) for a symbol. Lighter than the full quote.',\n inputSchema: z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('The symbol to get the short quote for (e.g., AAPL, BTCUSD, EURUSD)'),\n }),\n execute: async ({ symbol }) => toToolResponse(await getFMPClient().quote.getQuoteShort(symbol)),\n }),\n defineTool({\n name: 'getHistoricalPrice',\n description:\n 'Get historical daily prices (open/high/low/close/volume) for a symbol. Returns the most recent `limit` days.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock/ETF symbol (e.g., AAPL)'),\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(30)\n .describe('Max number of most-recent days to return (default 30)'),\n }),\n execute: async ({ symbol, from, to, limit = 30 }) => {\n const res = await getFMPClient().quote.getHistoricalPrice({\n symbol,\n from: from ?? undefined,\n to: to ?? undefined,\n });\n // Response is { symbol, historical: [...] } (newest first); cap to `limit`.\n const data = res.data as { historical?: unknown[] } | null;\n if (res.success && data && Array.isArray(data.historical)) {\n return toToolResponse({\n ...res,\n data: { ...data, historical: data.historical.slice(0, limit) },\n } as APIResponse<unknown>);\n }\n return toToolResponse(res);\n },\n }),\n defineTool({\n name: 'getIntraday',\n description:\n 'Get intraday price bars for a symbol at a given interval. Returns the most recent `limit` bars.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock/ETF symbol (e.g., AAPL)'),\n interval: z\n .enum(['1min', '5min', '15min', '30min', '1hour', '4hour'])\n .default('5min')\n .describe('Bar interval'),\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(50)\n .describe('Max number of most-recent bars to return (default 50)'),\n }),\n execute: async ({ symbol, interval = '5min', from, to, limit = 50 }) => {\n const res = await getFMPClient().quote.getIntraday({\n symbol,\n interval,\n from: from ?? undefined,\n to: to ?? undefined,\n });\n if (res.success && Array.isArray(res.data)) {\n return toToolResponse({ ...res, data: res.data.slice(0, limit) } as APIResponse<unknown>);\n }\n return toToolResponse(res);\n },\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst symbolSchema = z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('The stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n});\n\nexport const companyDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getCompanyProfile',\n description: 'Get the company profile for a company',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().company.getCompanyProfile(symbol)),\n }),\n defineTool({\n name: 'getCompanySharesFloat',\n description: 'Get the company shares float',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().company.getSharesFloat(symbol)),\n }),\n defineTool({\n name: 'getCompanyExecutiveCompensation',\n description: 'Get the company executive compensation',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().company.getExecutiveCompensation(symbol)),\n }),\n defineTool({\n name: 'getStockPeers',\n description: 'Get a list of peer companies (with price and market cap) for a company',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().company.getStockPeers(symbol)),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst period = z\n .enum(['annual', 'quarter'])\n .default('annual')\n .describe('The period type (annual or quarter)');\n\nconst symbol = (what: string) => z.string().min(1).describe(`The stock symbol to get ${what} for`);\n\nconst limit = z.number().default(5).describe('The number of periods to retrieve');\n\n/** Build a standard statement tool: symbol + period + limit -> fmp.financial[method]. */\nconst statementTool = (\n name: string,\n description: string,\n what: string,\n call: (args: { symbol: string; period: 'annual' | 'quarter'; limit: number }) => Promise<any>,\n) =>\n defineTool({\n name,\n description,\n inputSchema: z.object({ symbol: symbol(what), period, limit }),\n execute: async ({ symbol, period, limit }) =>\n toToolResponse(await call({ symbol, period, limit })),\n });\n\nexport const financialDefinitions: FMPToolDefinition[] = [\n statementTool(\n 'getBalanceSheet',\n 'Get balance sheet for a company showing assets, liabilities, and equity',\n 'balance sheet',\n args => getFMPClient().financial.getBalanceSheet(args),\n ),\n statementTool(\n 'getIncomeStatement',\n 'Get income statement for a company showing revenue, expenses, and profit',\n 'income statement',\n args => getFMPClient().financial.getIncomeStatement(args),\n ),\n statementTool(\n 'getCashFlowStatement',\n 'Get cash flow statement for a company showing operating, investing, and financing cash flows',\n 'cash flow statement',\n args => getFMPClient().financial.getCashFlowStatement(args),\n ),\n statementTool('getKeyMetrics', 'Get key metrics for a company', 'key metrics', args =>\n getFMPClient().financial.getKeyMetrics(args),\n ),\n statementTool(\n 'getFinancialRatios',\n 'Get financial ratios for a company including profitability, liquidity, and efficiency metrics',\n 'financial ratios',\n args => getFMPClient().financial.getFinancialRatios(args),\n ),\n statementTool(\n 'getEnterpriseValue',\n 'Get enterprise value for a company',\n 'enterprise value',\n args => getFMPClient().financial.getEnterpriseValue(args),\n ),\n statementTool('getCashflowGrowth', 'Get cashflow growth for a company', 'cashflow growth', args =>\n getFMPClient().financial.getCashflowGrowth(args),\n ),\n statementTool('getIncomeGrowth', 'Get income growth for a company', 'income growth', args =>\n getFMPClient().financial.getIncomeGrowth(args),\n ),\n statementTool(\n 'getBalanceSheetGrowth',\n 'Get balance sheet growth for a company',\n 'balance sheet growth',\n args => getFMPClient().financial.getBalanceSheetGrowth(args),\n ),\n statementTool(\n 'getFinancialGrowth',\n 'Get financial growth for a company',\n 'financial growth',\n args => getFMPClient().financial.getFinancialGrowth(args),\n ),\n defineTool({\n name: 'getEarningsHistorical',\n description: 'Get earnings historical for a company',\n inputSchema: z.object({\n symbol: symbol('earnings historical'),\n limit: z.number().default(10).describe('The number of periods to retrieve'),\n }),\n execute: async ({ symbol, limit }) =>\n toToolResponse(await getFMPClient().financial.getEarningsHistorical({ symbol, limit })),\n }),\n defineTool({\n name: 'getFinancialScores',\n description:\n 'Get financial health scores for a company (Altman Z-Score bankruptcy risk + Piotroski fundamental-strength score)',\n inputSchema: z.object({ symbol: symbol('financial scores') }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().financial.getFinancialScores({ symbol })),\n }),\n defineTool({\n name: 'getKeyMetricsTTM',\n description:\n 'Get current trailing-twelve-month (TTM) key metrics for a company (one snapshot row)',\n inputSchema: z.object({ symbol: symbol('TTM key metrics') }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().financial.getKeyMetricsTTM({ symbol })),\n }),\n defineTool({\n name: 'getFinancialRatiosTTM',\n description:\n 'Get current trailing-twelve-month (TTM) financial ratios for a company (margins, returns, liquidity)',\n inputSchema: z.object({ symbol: symbol('TTM financial ratios') }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().financial.getFinancialRatiosTTM({ symbol })),\n }),\n defineTool({\n name: 'getRevenueProductSegmentation',\n description: 'Get revenue broken down by product line for a company',\n inputSchema: z.object({ symbol: symbol('product revenue segmentation'), period }),\n execute: async ({ symbol, period }) =>\n toToolResponse(\n await getFMPClient().financial.getRevenueProductSegmentation({ symbol, period }),\n ),\n }),\n defineTool({\n name: 'getRevenueGeographicSegmentation',\n description: 'Get revenue broken down by geographic region for a company',\n inputSchema: z.object({ symbol: symbol('geographic revenue segmentation'), period }),\n execute: async ({ symbol, period }) =>\n toToolResponse(\n await getFMPClient().financial.getRevenueGeographicSegmentation({ symbol, period }),\n ),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst dateRangeSchema = z.object({\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n});\n\nexport const calendarDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getEarningsCalendar',\n description: 'Get earnings calendar showing upcoming and recent earnings announcements',\n inputSchema: dateRangeSchema,\n execute: async ({ from, to }) =>\n toToolResponse(\n await getFMPClient().calendar.getEarningsCalendar({\n from: from ?? undefined,\n to: to ?? undefined,\n }),\n ),\n }),\n defineTool({\n name: 'getEconomicCalendar',\n description: 'Get economic calendar showing upcoming and recent economic events and indicators',\n inputSchema: dateRangeSchema,\n execute: async ({ from, to }) =>\n toToolResponse(\n await getFMPClient().calendar.getEconomicsCalendar({\n from: from ?? undefined,\n to: to ?? undefined,\n }),\n ),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst economicIndicatorNames = [\n 'GDP',\n 'realGDP',\n 'nominalPotentialGDP',\n 'realGDPPerCapita',\n 'federalFunds',\n 'CPI',\n 'inflationRate',\n 'inflation',\n 'retailSales',\n 'consumerSentiment',\n 'durableGoods',\n 'unemploymentRate',\n 'totalNonfarmPayroll',\n 'initialClaims',\n 'industrialProductionTotalIndex',\n 'newPrivatelyOwnedHousingUnitsStartedTotalUnits',\n 'totalVehicleSales',\n 'retailMoneyFunds',\n 'smoothedUSRecessionProbabilities',\n '3MonthOr90DayRatesAndYieldsCertificatesOfDeposit',\n 'commercialBankInterestRateOnCreditCardPlansAllAccounts',\n '30YearFixedRateMortgageAverage',\n '15YearFixedRateMortgageAverage',\n] as const;\n\nexport const economicDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getTreasuryRates',\n description: 'Get treasury rates for different maturities over time',\n inputSchema: z.object({\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n }),\n execute: async ({ from, to }) =>\n toToolResponse(\n await getFMPClient().economic.getTreasuryRates({\n from: from ?? undefined,\n to: to ?? undefined,\n }),\n ),\n }),\n defineTool({\n name: 'getEconomicIndicators',\n description: 'Get economic indicators like GDP, unemployment rate, inflation, etc.',\n inputSchema: z.object({\n name: z.enum(economicIndicatorNames).describe('The name of the economic indicator'),\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n }),\n execute: async ({ name, from, to }) =>\n toToolResponse(\n await getFMPClient().economic.getEconomicIndicators({\n name,\n from: from ?? undefined,\n to: to ?? undefined,\n }),\n ),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const etfDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getETFHoldings',\n description:\n 'Get ETF holdings for a specific ETF symbol, showing the underlying assets and their weights',\n inputSchema: z.object({\n symbol: z\n .string()\n .min(1, 'ETF symbol is required')\n .describe('ETF symbol (e.g., SPY, QQQ, VTI)'),\n date: z\n .string()\n .optional()\n .nullable()\n .describe('Date for holdings in YYYY-MM-DD format (optional)'),\n }),\n execute: async ({ symbol, date }) => {\n // `date` is optional; the holdings params type treats it as required, so widen.\n const params: any = { symbol };\n if (date) {\n params.date = date;\n }\n return toToolResponse(await getFMPClient().etf.getHoldings(params));\n },\n }),\n defineTool({\n name: 'getETFProfile',\n description:\n 'Get ETF profile information including fund details, expense ratio, and key metrics',\n inputSchema: z.object({\n symbol: z\n .string()\n .min(1, 'ETF symbol is required')\n .describe('ETF symbol (e.g., SPY, QQQ, VTI)'),\n }),\n execute: async ({ symbol }) => toToolResponse(await getFMPClient().etf.getProfile(symbol)),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const insiderDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getInsiderTrading',\n description:\n 'Get insider trading data for a specific stock symbol showing buy/sell transactions by company insiders',\n inputSchema: z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('Stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number for pagination (optional, defaults to 0)'),\n }),\n execute: async ({ symbol, page }) =>\n toToolResponse(await getFMPClient().insider.getInsiderTradesBySymbol(symbol, page)),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const institutionalDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getInstitutionalHolders',\n description:\n 'Get institutional holders for a specific stock symbol showing which institutions own shares and their holdings',\n inputSchema: z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('Stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().institutional.getInstitutionalHolders({ symbol })),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst empty = z.object({});\n\nconst snapshotDateSchema = z.object({\n date: z.string().min(1).describe('Snapshot date in YYYY-MM-DD format'),\n exchange: z\n .string()\n .optional()\n .nullable()\n .describe('Optional exchange filter (e.g., NASDAQ, NYSE)'),\n});\n\nexport const marketDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getMarketPerformance',\n description: 'Get overall market performance data including major indices performance',\n inputSchema: empty,\n execute: async () => toToolResponse(await getFMPClient().market.getMarketPerformance()),\n }),\n defineTool({\n name: 'getSectorPerformance',\n description:\n 'Get a sector-performance snapshot for a given date, showing the average change per sector by exchange',\n inputSchema: snapshotDateSchema,\n execute: async ({ date, exchange }) =>\n toToolResponse(\n await getFMPClient().market.getSectorPerformance({\n date,\n exchange: exchange ?? undefined,\n }),\n ),\n }),\n defineTool({\n name: 'getIndustryPESnapshot',\n description:\n 'Get an industry P/E snapshot for a given date, showing the average price-to-earnings ratio per industry by exchange',\n inputSchema: snapshotDateSchema,\n execute: async ({ date, exchange }) =>\n toToolResponse(\n await getFMPClient().market.getIndustryPESnapshot({\n date,\n exchange: exchange ?? undefined,\n }),\n ),\n }),\n defineTool({\n name: 'getGainers',\n description: 'Get top gaining stocks showing the best performing stocks of the day',\n inputSchema: empty,\n execute: async () => toToolResponse(await getFMPClient().market.getGainers()),\n }),\n defineTool({\n name: 'getLosers',\n description: 'Get top losing stocks showing the worst performing stocks of the day',\n inputSchema: empty,\n execute: async () => toToolResponse(await getFMPClient().market.getLosers()),\n }),\n defineTool({\n name: 'getMostActive',\n description: 'Get most active stocks showing stocks with the highest trading volume',\n inputSchema: empty,\n execute: async () => toToolResponse(await getFMPClient().market.getMostActive()),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const newsDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getStockNews',\n description: 'Get the latest general stock market news articles',\n inputSchema: z.object({\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(20)\n .describe('Max number of articles to return (default 20)'),\n }),\n execute: async ({ from, to, limit = 20 }) =>\n toToolResponse(\n await getFMPClient().news.getStockNews({\n from: from ?? undefined,\n to: to ?? undefined,\n limit,\n }),\n ),\n }),\n defineTool({\n name: 'getStockNewsBySymbol',\n description: 'Get the latest news articles for one or more specific stock symbols',\n inputSchema: z.object({\n symbols: z\n .array(z.string().min(1))\n .min(1)\n .describe('Stock symbols to get news for (e.g., [\"AAPL\", \"MSFT\"])'),\n from: z.string().optional().nullable().describe('Start date in YYYY-MM-DD format (optional)'),\n to: z.string().optional().nullable().describe('End date in YYYY-MM-DD format (optional)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(20)\n .describe('Max number of articles to return (default 20)'),\n }),\n execute: async ({ symbols, from, to, limit = 20 }) =>\n toToolResponse(\n await getFMPClient().news.getStockNewsBySymbol({\n symbols,\n from: from ?? undefined,\n to: to ?? undefined,\n limit,\n }),\n ),\n }),\n];\n","import { z } from 'zod';\nimport type { ScreenerParams } from 'fmp-node-api';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const screenerDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'screenStocks',\n description:\n 'Screen for stocks matching financial criteria (market cap, price, sector, exchange, etc.). Returns matching companies.',\n inputSchema: z.object({\n marketCapMoreThan: z.number().optional().nullable().describe('Minimum market capitalization'),\n marketCapLowerThan: z\n .number()\n .optional()\n .nullable()\n .describe('Maximum market capitalization'),\n priceMoreThan: z.number().optional().nullable().describe('Minimum stock price'),\n priceLowerThan: z.number().optional().nullable().describe('Maximum stock price'),\n sector: z.string().optional().nullable().describe('Sector filter (e.g., \"Technology\")'),\n industry: z.string().optional().nullable().describe('Industry filter'),\n exchange: z.string().optional().nullable().describe('Exchange filter (e.g., \"NASDAQ\")'),\n country: z.string().optional().nullable().describe('Country filter (e.g., \"US\")'),\n isEtf: z.boolean().optional().nullable().describe('Restrict to ETFs'),\n isActivelyTrading: z.boolean().optional().nullable().describe('Restrict to actively trading'),\n limit: z\n .number()\n .int()\n .positive()\n .default(50)\n .describe('Max number of results to return (default 50)'),\n }),\n execute: async ({ limit = 50, ...filters }) => {\n // Drop null/undefined so they aren't sent as query params.\n const params: Record<string, unknown> = { limit };\n for (const [key, value] of Object.entries(filters)) {\n if (value !== null && value !== undefined) params[key] = value;\n }\n return toToolResponse(await getFMPClient().screener.getScreener(params as ScreenerParams));\n },\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const searchDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'searchSymbol',\n description:\n 'Search for a ticker symbol by company name or partial ticker (e.g., resolve \"Apple\" to \"AAPL\")',\n inputSchema: z.object({\n query: z.string().min(1).describe('Company name or ticker to search for'),\n limit: z\n .number()\n .int()\n .positive()\n .default(10)\n .describe('Max number of results to return (default 10)'),\n exchange: z\n .string()\n .optional()\n .nullable()\n .describe('Restrict to a specific exchange (optional, e.g., \"NASDAQ\")'),\n }),\n execute: async ({ query, limit = 10, exchange }) =>\n toToolResponse(\n await getFMPClient().search.search({ query, limit, exchange: exchange ?? undefined }),\n ),\n }),\n];\n","import { z } from 'zod';\nimport type { APIResponse } from 'fmp-node-api';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const analystDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getAnalystEstimates',\n description:\n 'Get analyst estimates (revenue, EBITDA, net income, EPS) for a company, by period',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\n period: z\n .enum(['annual', 'quarter'])\n .default('annual')\n .describe('The period type (annual or quarter)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(10)\n .describe('Max number of periods to return (default 10)'),\n }),\n execute: async ({ symbol, period = 'annual', limit = 10 }) =>\n toToolResponse(await getFMPClient().analyst.getEstimates({ symbol, period, limit })),\n }),\n defineTool({\n name: 'getPriceTargetConsensus',\n description:\n 'Get the analyst price-target consensus (high, low, consensus, median) for a company',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\n }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().analyst.getPriceTargetConsensus({ symbol })),\n }),\n defineTool({\n name: 'getStockGrades',\n description:\n 'Get recent analyst grades (upgrades/downgrades) for a company (most recent `limit`)',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\n limit: z\n .number()\n .int()\n .positive()\n .default(20)\n .describe('Max number of grade entries to return (default 20)'),\n }),\n execute: async ({ symbol, limit = 20 }) => {\n const res = await getFMPClient().analyst.getGrades({ symbol });\n if (res.success && Array.isArray(res.data)) {\n return toToolResponse({ ...res, data: res.data.slice(0, limit) } as APIResponse<unknown>);\n }\n return toToolResponse(res);\n },\n }),\n defineTool({\n name: 'getGradesConsensus',\n description:\n 'Get the analyst rating consensus for a company (counts of strongBuy/buy/hold/sell/strongSell + overall consensus)',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\n }),\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().analyst.getGradesConsensus({ symbol })),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst symbolSchema = z.object({\n symbol: z.string().min(1).describe('The stock symbol (e.g., AAPL)'),\n});\n\nexport const valuationDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getDiscountedCashFlow',\n description:\n 'Get the discounted-cash-flow (DCF) fair-value estimate vs. the current price for a company',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().valuation.getDiscountedCashFlow({ symbol })),\n }),\n defineTool({\n name: 'getCompanyRating',\n description: \"Get FMP's current rating/score snapshot for a company\",\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().valuation.getRatingSnapshot({ symbol })),\n }),\n];\n","import { z } from 'zod';\nimport type { APIResponse } from 'fmp-node-api';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nexport const technicalDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getTechnicalIndicator',\n description:\n 'Get a technical indicator series (SMA, EMA, RSI, etc.) for a symbol at a given timeframe. Returns the most recent `limit` bars.',\n inputSchema: z.object({\n symbol: z.string().min(1).describe('The stock/ETF symbol (e.g., AAPL)'),\n type: z\n .enum(['sma', 'ema', 'wma', 'dema', 'tema', 'rsi', 'standardDeviation', 'williams', 'adx'])\n .describe('The indicator type'),\n periodLength: z\n .number()\n .int()\n .positive()\n .default(10)\n .describe('Lookback period for the indicator (e.g. 14 for a 14-day RSI)'),\n timeframe: z\n .enum(['1min', '5min', '15min', '30min', '1hour', '4hour', '1day', '1week', '1month'])\n .default('1day')\n .describe('Bar timeframe'),\n limit: z\n .number()\n .int()\n .positive()\n .default(50)\n .describe('Max number of most-recent bars to return (default 50)'),\n }),\n execute: async ({ symbol, type, periodLength = 10, timeframe = '1day', limit = 50 }) => {\n const res = await getFMPClient().technical.getTechnicalIndicator({\n symbol,\n type,\n periodLength,\n timeframe,\n });\n if (res.success && Array.isArray(res.data)) {\n return toToolResponse({ ...res, data: res.data.slice(0, limit) } as APIResponse<unknown>);\n }\n return toToolResponse(res);\n },\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst symbolSchema = z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('Stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n});\n\nconst rssFeedSchema = z.object({\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number for pagination (optional, defaults to 0)'),\n});\n\nexport const senateHouseDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getSenateTrading',\n description: 'Get senate trading data for a specific stock symbol showing senator transactions',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().senateHouse.getSenateTrading({ symbol })),\n }),\n defineTool({\n name: 'getHouseTrading',\n description:\n 'Get house trading data for a specific stock symbol showing representative transactions',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().senateHouse.getHouseTrading({ symbol })),\n }),\n defineTool({\n name: 'getSenateTradingByName',\n description:\n 'Get senate trading data for a specific senator by name showing their trading activity',\n inputSchema: z.object({\n name: z\n .string()\n .min(1, 'Name is required')\n .describe('The name of the senator to get trading data for'),\n }),\n execute: async ({ name }) =>\n toToolResponse(await getFMPClient().senateHouse.getSenateTradingByName({ name })),\n }),\n defineTool({\n name: 'getHouseTradingByName',\n description:\n 'Get house trading data for a specific representative by name showing their trading activity',\n inputSchema: z.object({\n name: z\n .string()\n .min(1, 'Name is required')\n .describe('The name of the representative to get trading data for'),\n }),\n execute: async ({ name }) =>\n toToolResponse(await getFMPClient().senateHouse.getHouseTradingByName({ name })),\n }),\n defineTool({\n name: 'getSenateTradingRSSFeed',\n description:\n 'Get senate trading data through RSS feed with pagination showing recent senate transactions',\n inputSchema: rssFeedSchema,\n // JS default mirrors the Zod default for the Vercel adapter, which (unlike the\n // OpenAI adapter) does not parse input before calling execute.\n execute: async ({ page = 0 }) =>\n toToolResponse(await getFMPClient().senateHouse.getSenateTradingRSSFeed({ page })),\n }),\n defineTool({\n name: 'getHouseTradingRSSFeed',\n description:\n 'Get house trading data through RSS feed with pagination showing recent house transactions',\n inputSchema: rssFeedSchema,\n // JS default mirrors the Zod default for the Vercel adapter, which (unlike the\n // OpenAI adapter) does not parse input before calling execute.\n execute: async ({ page = 0 }) =>\n toToolResponse(await getFMPClient().senateHouse.getHouseTradingRSSFeed({ page })),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst symbolSchema = z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('The stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n});\n\nexport const stockDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getMarketCap',\n description: 'Get market capitalization for a company showing current market value',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) => toToolResponse(await getFMPClient().stock.getMarketCap(symbol)),\n }),\n defineTool({\n name: 'getStockSplits',\n description: 'Get stock splits history for a company showing all historical stock split events',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().stock.getStockSplits(symbol)),\n }),\n defineTool({\n name: 'getDividendHistory',\n description: 'Get dividend history for a company showing all historical dividend payments',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().stock.getDividendHistory(symbol)),\n }),\n defineTool({\n name: 'getStockPriceChange',\n description:\n 'Get the percentage price change for a stock across standard horizons (1D, 5D, 1M, 3M, 6M, YTD, 1Y, 3Y, 5Y, 10Y, max)',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().stock.getPriceChange(symbol)),\n }),\n];\n","import { z } from 'zod';\nimport { getFMPClient } from '@/client';\nimport { toToolResponse } from '@/utils/format-response';\nimport { defineTool, type FMPToolDefinition } from './types';\n\nconst symbolSchema = z.object({\n symbol: z\n .string()\n .min(1, 'Stock symbol is required')\n .describe('The stock symbol (e.g., AAPL, MSFT, GOOGL)'),\n});\n\nexport const aftermarketDefinitions: FMPToolDefinition[] = [\n defineTool({\n name: 'getAftermarketTrade',\n description:\n 'Get the latest extended-hours (pre/post-market) trade for a symbol, including price, trade size, and timestamp',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().aftermarket.getTrade(symbol)),\n }),\n defineTool({\n name: 'getAftermarketQuote',\n description:\n 'Get the latest extended-hours (pre/post-market) bid/ask quote for a symbol, including bid/ask prices and sizes',\n inputSchema: symbolSchema,\n execute: async ({ symbol }) =>\n toToolResponse(await getFMPClient().aftermarket.getQuote(symbol)),\n }),\n];\n","import { ToolSet } from 'ai';\nimport { createTool } from '@/utils/aisdk-tool-wrapper';\n\n// Re-export client configuration helpers (optional; tools default to FMP_API_KEY).\nexport { configureFMPClient, resetFMPClient } from '@/client';\n\nimport {\n quoteDefinitions,\n companyDefinitions,\n financialDefinitions,\n calendarDefinitions,\n economicDefinitions,\n etfDefinitions,\n insiderDefinitions,\n institutionalDefinitions,\n marketDefinitions,\n newsDefinitions,\n screenerDefinitions,\n searchDefinitions,\n analystDefinitions,\n valuationDefinitions,\n technicalDefinitions,\n senateHouseDefinitions,\n stockDefinitions,\n aftermarketDefinitions,\n type FMPToolDefinition,\n} from '@/definitions';\n\n// Build a Vercel AI `ToolSet` (object keyed by tool name) from shared definitions.\nconst toToolSet = (defs: FMPToolDefinition[]): ToolSet =>\n Object.fromEntries(defs.map(def => [def.name, createTool(def)]));\n\n// Tool groups by category\nexport const quoteTools = toToolSet(quoteDefinitions);\nexport const companyTools = toToolSet(companyDefinitions);\nexport const financialTools = toToolSet(financialDefinitions);\nexport const calendarTools = toToolSet(calendarDefinitions);\nexport const economicTools = toToolSet(economicDefinitions);\nexport const etfTools = toToolSet(etfDefinitions);\nexport const insiderTools = toToolSet(insiderDefinitions);\nexport const institutionalTools = toToolSet(institutionalDefinitions);\nexport const marketTools = toToolSet(marketDefinitions);\nexport const newsTools = toToolSet(newsDefinitions);\nexport const screenerTools = toToolSet(screenerDefinitions);\nexport const searchTools = toToolSet(searchDefinitions);\nexport const analystTools = toToolSet(analystDefinitions);\nexport const valuationTools = toToolSet(valuationDefinitions);\nexport const technicalTools = toToolSet(technicalDefinitions);\nexport const senateHouseTools = toToolSet(senateHouseDefinitions);\nexport const stockTools = toToolSet(stockDefinitions);\nexport const aftermarketTools = toToolSet(aftermarketDefinitions);\n\n// Combine all tools into a single ToolSet\nexport const fmpTools: ToolSet = {\n ...quoteTools,\n ...companyTools,\n ...financialTools,\n ...calendarTools,\n ...economicTools,\n ...etfTools,\n ...insiderTools,\n ...institutionalTools,\n ...marketTools,\n ...newsTools,\n ...screenerTools,\n ...searchTools,\n ...analystTools,\n ...valuationTools,\n ...technicalTools,\n ...senateHouseTools,\n ...stockTools,\n ...aftermarketTools,\n};\n\n// Individual tools for direct import\nexport const { getStockQuote, getStockQuoteShort, getHistoricalPrice, getIntraday } = quoteTools;\nexport const {\n getCompanyProfile,\n getCompanySharesFloat,\n getCompanyExecutiveCompensation,\n getStockPeers,\n} = companyTools;\nexport const { getEarningsCalendar, getEconomicCalendar } = calendarTools;\nexport const { getTreasuryRates, getEconomicIndicators } = economicTools;\nexport const { getETFHoldings, getETFProfile } = etfTools;\nexport const {\n getBalanceSheet,\n getIncomeStatement,\n getCashFlowStatement,\n getKeyMetrics,\n getFinancialRatios,\n getEnterpriseValue,\n getCashflowGrowth,\n getIncomeGrowth,\n getBalanceSheetGrowth,\n getFinancialGrowth,\n getEarningsHistorical,\n getFinancialScores,\n getKeyMetricsTTM,\n getFinancialRatiosTTM,\n getRevenueProductSegmentation,\n getRevenueGeographicSegmentation,\n} = financialTools;\nexport const { getInsiderTrading } = insiderTools;\nexport const { getInstitutionalHolders } = institutionalTools;\nexport const {\n getMarketPerformance,\n getSectorPerformance,\n getIndustryPESnapshot,\n getGainers,\n getLosers,\n getMostActive,\n} = marketTools;\nexport const {\n getSenateTrading,\n getHouseTrading,\n getSenateTradingByName,\n getHouseTradingByName,\n getSenateTradingRSSFeed,\n getHouseTradingRSSFeed,\n} = senateHouseTools;\nexport const { getStockNews, getStockNewsBySymbol } = newsTools;\nexport const { screenStocks } = screenerTools;\nexport const { searchSymbol } = searchTools;\nexport const { getAnalystEstimates, getPriceTargetConsensus, getStockGrades, getGradesConsensus } =\n analystTools;\nexport const { getDiscountedCashFlow, getCompanyRating } = valuationTools;\nexport const { getTechnicalIndicator } = technicalTools;\nexport const { getMarketCap, getStockSplits, getDividendHistory, getStockPriceChange } = stockTools;\nexport const { getAftermarketTrade, getAftermarketQuote } = aftermarketTools;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fmp-ai-tools",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3-beta.0",
|
|
4
4
|
"description": "AI tools for FMP Node API - compatible with Vercel AI SDK, Langchain, OpenAI, and more",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./vercel-ai": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
},
|
|
39
39
|
"homepage": "https://fmp-node-wrapper-docs.vercel.app",
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"fmp-node-api": "0.2.
|
|
41
|
+
"fmp-node-api": "0.2.3-beta.0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@openai/agents": ">=0.11.0",
|