fmp-ai-tools 0.2.0-beta.1 → 0.2.0-beta.4

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/README.md CHANGED
@@ -7,44 +7,39 @@ This package provides pre-built AI tools that can be used with various AI framew
7
7
  ## Installation
8
8
 
9
9
  ```bash
10
- npm install fmp-ai-tools
11
- # or
12
- pnpm add fmp-ai-tools
13
- # or
14
- yarn add fmp-ai-tools
10
+ pnpm add fmp-ai-tools # or: npm install fmp-ai-tools / yarn add fmp-ai-tools
15
11
  ```
16
12
 
17
- ### Peer Dependencies
13
+ `fmp-ai-tools` has two entry points. `ai` and `@openai/agents` are **optional peer dependencies**, so install only the SDK for the entry point you use, plus `zod`.
18
14
 
19
- This package requires the following peer dependencies to be installed in your project:
15
+ ### Vercel AI SDK `fmp-ai-tools/vercel-ai`
20
16
 
21
17
  ```bash
22
- # For Vercel AI SDK
23
- npm install ai zod
24
- # or
25
18
  pnpm add ai zod
26
- # or
27
- yarn add ai zod
28
19
  ```
29
20
 
30
- **Required versions:**
21
+ - `ai`: `>=6.0.0`
22
+ - `zod`: `^4.0.0`
31
23
 
32
- - `ai`: ^5.0.0
33
- - `zod`: ^3.25.76
24
+ ### OpenAI Agents — `fmp-ai-tools/openai`
34
25
 
35
- **⚠️ Common Issue**: If you encounter the error `Invalid schema for function 'getStockQuote': schema must be a JSON Schema of 'type: "object"', got 'type: "None"'`, it means you have a version mismatch between `ai` and `zod`. Make sure you're using compatible versions as listed above.
36
-
37
- ## Version Compatibility
26
+ ```bash
27
+ pnpm add @openai/agents zod
28
+ ```
38
29
 
39
- ### OpenAI Agents Compatibility
30
+ - `@openai/agents`: `>=0.11.0`
31
+ - `zod`: `^4.0.0`
40
32
 
41
- **⚠️ Important**: This package requires `@openai/agents` version `^0.1.0` or higher due to breaking changes in the API. Older versions are not supported and will fail when the tools are imported.
33
+ Both entry points are imported with a normal static `import` no `serverExternalPackages`, `createRequire`, or other bundler workarounds are needed (Next.js App Router and Turbopack included).
42
34
 
43
35
  ## Quick Start
44
36
 
45
37
  ### Vercel AI SDK (Recommended)
46
38
 
39
+ `convertToModelMessages` is **async in `ai` v6** — be sure to `await` it.
40
+
47
41
  ```typescript
42
+ // app/api/chat/route.ts
48
43
  import { openai } from '@ai-sdk/openai';
49
44
  import { streamText, convertToModelMessages, stepCountIs } from 'ai';
50
45
  import { fmpTools } from 'fmp-ai-tools/vercel-ai';
@@ -54,9 +49,12 @@ export async function POST(req: Request) {
54
49
 
55
50
  const result = streamText({
56
51
  model: openai('gpt-4o-mini'),
57
- messages: convertToModelMessages(messages),
52
+ messages: await convertToModelMessages(messages),
58
53
  tools: fmpTools,
59
54
  stopWhen: stepCountIs(5),
55
+ // FMP tools have optional params; relax strict JSON schema so the model
56
+ // can omit them (@ai-sdk/openai v3 defaults strictJsonSchema: true).
57
+ providerOptions: { openai: { strictJsonSchema: false } },
60
58
  });
61
59
 
62
60
  return result.toUIMessageStreamResponse();
@@ -66,19 +64,24 @@ export async function POST(req: Request) {
66
64
  ### OpenAI Agents
67
65
 
68
66
  ```typescript
67
+ // app/api/chat/route.ts
69
68
  import { Agent, run } from '@openai/agents';
70
69
  import { fmpTools } from 'fmp-ai-tools/openai';
71
70
 
72
71
  const agent = new Agent({
73
72
  name: 'Financial Analyst',
73
+ model: 'gpt-4o-mini',
74
74
  instructions: 'You are a financial analyst with access to real-time market data.',
75
75
  tools: fmpTools,
76
76
  });
77
77
 
78
- const result = await run(
79
- agent,
80
- 'Get the current stock quote for Apple (AAPL) and show me their latest balance sheet',
81
- );
78
+ export async function POST(req: Request) {
79
+ const { message } = await req.json();
80
+
81
+ const result = await run(agent, message);
82
+
83
+ return Response.json({ output: result.finalOutput });
84
+ }
82
85
  ```
83
86
 
84
87
  ## Configuration
@@ -222,7 +225,7 @@ const selectedTools = {
222
225
  // Use with Vercel AI SDK
223
226
  const result = streamText({
224
227
  model: openai('gpt-4o-mini'),
225
- messages: convertToModelMessages(messages),
228
+ messages: await convertToModelMessages(messages),
226
229
  tools: selectedTools,
227
230
  });
228
231
  ```
@@ -299,12 +302,25 @@ Each tool accepts specific parameters. Here are some common ones:
299
302
 
300
303
  ## Error Handling
301
304
 
302
- The tools handle API errors gracefully and will return informative error messages if:
305
+ When a request fails, a tool returns a structured JSON error (instead of `null`) so the model can explain *why* to the user:
306
+
307
+ ```json
308
+ { "error": true, "type": "plan-restricted", "message": "This endpoint is not available on your current FMP plan. (403: ...)", "status": 403 }
309
+ ```
310
+
311
+ The `type` field classifies the failure so your agent can react appropriately:
312
+
313
+ | `type` | Meaning |
314
+ | ----------------- | ------------------------------------------------------------ |
315
+ | `plan-restricted` | Endpoint isn't included in your FMP subscription (402/403) |
316
+ | `rate-limit` | FMP quota / rate limit reached (429) |
317
+ | `auth` | Invalid or missing `FMP_API_KEY` (401) |
318
+ | `not-found` | Resource does not exist (404) |
319
+ | `bad-request` | Invalid parameters (400) |
320
+ | `network` | No response from FMP (timeout / offline) |
321
+ | `unknown` | Anything else |
303
322
 
304
- - The API key is invalid or missing
305
- - The requested data is not available
306
- - Rate limits are exceeded
307
- - Invalid parameters are provided
323
+ This is especially useful on lower FMP tiers: an agent calling an endpoint your plan doesn't cover now gets a clear `plan-restricted` message it can relay, rather than empty data. (Direct `fmp-node-api` callers get the same classification via `response.errorType`.)
308
324
 
309
325
  ## Testing Tools
310
326
 
@@ -1,83 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var fs = require('fs');
4
- var path = require('path');
5
3
  var zod = require('zod');
6
4
  var agents = require('@openai/agents');
7
5
  var fmpNodeApi = require('fmp-node-api');
8
6
 
9
- function _interopNamespace(e) {
10
- if (e && e.__esModule) return e;
11
- var n = Object.create(null);
12
- if (e) {
13
- Object.keys(e).forEach(function (k) {
14
- if (k !== 'default') {
15
- var d = Object.getOwnPropertyDescriptor(e, k);
16
- Object.defineProperty(n, k, d.get ? d : {
17
- enumerable: true,
18
- get: function () { return e[k]; }
19
- });
20
- }
21
- });
22
- }
23
- n.default = e;
24
- return Object.freeze(n);
25
- }
26
-
27
- var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
28
- var path__namespace = /*#__PURE__*/_interopNamespace(path);
29
-
30
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
31
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
32
- }) : x)(function(x) {
33
- if (typeof require !== "undefined") return require.apply(this, arguments);
34
- throw Error('Dynamic require of "' + x + '" is not supported');
35
- });
36
- var REQUIRED_VERSION = "0.11.0";
37
- function getInstalledPackageVersion(packageName) {
38
- try {
39
- const packagePath = path__namespace.dirname(__require.resolve(packageName));
40
- const packageJsonPath = path__namespace.join(packagePath, "..", "package.json");
41
- if (fs__namespace.existsSync(packageJsonPath)) {
42
- const packageJson = JSON.parse(fs__namespace.readFileSync(packageJsonPath, "utf8"));
43
- return packageJson.version;
44
- }
45
- } catch (_error) {
46
- return null;
47
- }
48
- return null;
49
- }
50
- function compareVersions(v1, v2) {
51
- const parseVersion = (version) => {
52
- return version.split(".").map((num) => parseInt(num, 10) || 0);
53
- };
54
- const v1Parts = parseVersion(v1);
55
- const v2Parts = parseVersion(v2);
56
- const maxLength = Math.max(v1Parts.length, v2Parts.length);
57
- for (let i = 0; i < maxLength; i++) {
58
- const v1Part = v1Parts[i] || 0;
59
- const v2Part = v2Parts[i] || 0;
60
- if (v1Part < v2Part) return -1;
61
- if (v1Part > v2Part) return 1;
62
- }
63
- return 0;
64
- }
65
- function isVersionLessThan(installedVersion, requiredVersion) {
66
- return compareVersions(installedVersion, requiredVersion) < 0;
67
- }
68
- function checkOpenAIAgentsVersion() {
69
- const installedVersion = getInstalledPackageVersion("@openai/agents");
70
- if (!installedVersion) {
71
- throw new Error(
72
- `@openai/agents package not found. This package requires @openai/agents to be installed. Please install with: npm install @openai/agents`
73
- );
74
- }
75
- if (isVersionLessThan(installedVersion, REQUIRED_VERSION)) {
76
- console.warn(
77
- `Incompatible @openai/agents version detected. Installed version: ${installedVersion}, Required: ${REQUIRED_VERSION} or higher.`
78
- );
79
- }
80
- }
7
+ // src/providers/openai/company.ts
81
8
 
82
9
  // src/utils/logger.ts
83
10
  function isApiLoggingEnabled() {
@@ -250,6 +177,36 @@ async function logApiExecutionWithTiming(toolName, input, executeFn) {
250
177
  }
251
178
  }
252
179
 
180
+ // src/utils/format-response.ts
181
+ function toToolResponse(res) {
182
+ if (res.success === false) {
183
+ return JSON.stringify({
184
+ error: true,
185
+ type: res.errorType ?? "unknown",
186
+ message: res.error ?? "The request failed.",
187
+ status: res.status
188
+ });
189
+ }
190
+ if (isEmpty(res.data)) {
191
+ return JSON.stringify({ data: [], note: "No data was returned for this request." });
192
+ }
193
+ return JSON.stringify(res.data, null, 2);
194
+ }
195
+ function toToolError(error) {
196
+ const message = error instanceof Error ? error.message : String(error);
197
+ let type = "unknown";
198
+ if (/api[\s_-]?key/i.test(message)) {
199
+ type = "auth";
200
+ }
201
+ return JSON.stringify({ error: true, type, message, status: 0 });
202
+ }
203
+ function isEmpty(data) {
204
+ if (data == null) return true;
205
+ if (Array.isArray(data)) return data.length === 0;
206
+ if (typeof data === "object") return Object.keys(data).length === 0;
207
+ return false;
208
+ }
209
+
253
210
  // src/utils/openai-tool-wrapper.ts
254
211
  function createOpenAITool(config) {
255
212
  const { name, description, inputSchema, execute } = config;
@@ -258,8 +215,12 @@ function createOpenAITool(config) {
258
215
  description,
259
216
  parameters: inputSchema,
260
217
  execute: async (input) => {
261
- const args = inputSchema.parse(input);
262
- return await logApiExecutionWithTiming(name, args, () => execute(args));
218
+ try {
219
+ const args = inputSchema.parse(input);
220
+ return await logApiExecutionWithTiming(name, args, () => execute(args));
221
+ } catch (error) {
222
+ return toToolError(error);
223
+ }
263
224
  }
264
225
  });
265
226
  }
@@ -277,7 +238,7 @@ var getCompanyProfile = createOpenAITool({
277
238
  execute: async ({ symbol }) => {
278
239
  const fmp = getFMPClient();
279
240
  const companyProfile = await fmp.company.getCompanyProfile(symbol);
280
- return JSON.stringify(companyProfile.data, null, 2);
241
+ return toToolResponse(companyProfile);
281
242
  }
282
243
  });
283
244
  var getCompanySharesFloat = createOpenAITool({
@@ -289,7 +250,7 @@ var getCompanySharesFloat = createOpenAITool({
289
250
  execute: async ({ symbol }) => {
290
251
  const fmp = getFMPClient();
291
252
  const companySharesFloat = await fmp.company.getSharesFloat(symbol);
292
- return JSON.stringify(companySharesFloat.data, null, 2);
253
+ return toToolResponse(companySharesFloat);
293
254
  }
294
255
  });
295
256
  var getCompanyExecutiveCompensation = createOpenAITool({
@@ -301,7 +262,7 @@ var getCompanyExecutiveCompensation = createOpenAITool({
301
262
  execute: async ({ symbol }) => {
302
263
  const fmp = getFMPClient();
303
264
  const companyExecutiveCompensation = await fmp.company.getExecutiveCompensation(symbol);
304
- return JSON.stringify(companyExecutiveCompensation.data, null, 2);
265
+ return toToolResponse(companyExecutiveCompensation);
305
266
  }
306
267
  });
307
268
  var calendarInputSchema = zod.z.object({
@@ -318,7 +279,7 @@ var getEarningsCalendar = createOpenAITool({
318
279
  from: from ?? void 0,
319
280
  to: to ?? void 0
320
281
  });
321
- return JSON.stringify(earningsCalendar.data, null, 2);
282
+ return toToolResponse(earningsCalendar);
322
283
  }
323
284
  });
324
285
  var getEconomicCalendar = createOpenAITool({
@@ -331,7 +292,7 @@ var getEconomicCalendar = createOpenAITool({
331
292
  from: from ?? void 0,
332
293
  to: to ?? void 0
333
294
  });
334
- return JSON.stringify(economicCalendar.data, null, 2);
295
+ return toToolResponse(economicCalendar);
335
296
  }
336
297
  });
337
298
  var treasuryRatesInputSchema = zod.z.object({
@@ -378,7 +339,7 @@ var getTreasuryRates = createOpenAITool({
378
339
  from: from ?? void 0,
379
340
  to: to ?? void 0
380
341
  });
381
- return JSON.stringify(treasuryRates.data, null, 2);
342
+ return toToolResponse(treasuryRates);
382
343
  }
383
344
  });
384
345
  var getEconomicIndicators = createOpenAITool({
@@ -392,7 +353,7 @@ var getEconomicIndicators = createOpenAITool({
392
353
  from: from ?? void 0,
393
354
  to: to ?? void 0
394
355
  });
395
- return JSON.stringify(economicIndicators.data, null, 2);
356
+ return toToolResponse(economicIndicators);
396
357
  }
397
358
  });
398
359
  var etfHoldingsInputSchema = zod.z.object({
@@ -413,7 +374,7 @@ var getETFHoldings = createOpenAITool({
413
374
  params.date = date;
414
375
  }
415
376
  const etfHoldings = await fmp.etf.getHoldings(params);
416
- return JSON.stringify(etfHoldings.data, null, 2);
377
+ return toToolResponse(etfHoldings);
417
378
  }
418
379
  });
419
380
  var getETFProfile = createOpenAITool({
@@ -423,7 +384,7 @@ var getETFProfile = createOpenAITool({
423
384
  execute: async ({ symbol }) => {
424
385
  const fmp = getFMPClient();
425
386
  const etfProfile = await fmp.etf.getProfile(symbol);
426
- return JSON.stringify(etfProfile.data, null, 2);
387
+ return toToolResponse(etfProfile);
427
388
  }
428
389
  });
429
390
  var getBalanceSheet = createOpenAITool({
@@ -441,7 +402,7 @@ var getBalanceSheet = createOpenAITool({
441
402
  period,
442
403
  limit: Number(limit)
443
404
  });
444
- return JSON.stringify(balanceSheet.data, null, 2);
405
+ return toToolResponse(balanceSheet);
445
406
  }
446
407
  });
447
408
  var getIncomeStatement = createOpenAITool({
@@ -459,7 +420,7 @@ var getIncomeStatement = createOpenAITool({
459
420
  period,
460
421
  limit: Number(limit)
461
422
  });
462
- return JSON.stringify(incomeStatement.data, null, 2);
423
+ return toToolResponse(incomeStatement);
463
424
  }
464
425
  });
465
426
  var getCashFlowStatement = createOpenAITool({
@@ -477,7 +438,7 @@ var getCashFlowStatement = createOpenAITool({
477
438
  period,
478
439
  limit: Number(limit)
479
440
  });
480
- return JSON.stringify(cashFlowStatement.data, null, 2);
441
+ return toToolResponse(cashFlowStatement);
481
442
  }
482
443
  });
483
444
  var getKeyMetrics = createOpenAITool({
@@ -491,7 +452,7 @@ var getKeyMetrics = createOpenAITool({
491
452
  execute: async ({ symbol, period, limit }) => {
492
453
  const fmp = getFMPClient();
493
454
  const keyMetrics = await fmp.financial.getKeyMetrics({ symbol, period, limit: Number(limit) });
494
- return JSON.stringify(keyMetrics.data, null, 2);
455
+ return toToolResponse(keyMetrics);
495
456
  }
496
457
  });
497
458
  var getFinancialRatios = createOpenAITool({
@@ -509,7 +470,7 @@ var getFinancialRatios = createOpenAITool({
509
470
  period,
510
471
  limit: Number(limit)
511
472
  });
512
- return JSON.stringify(financialRatios.data, null, 2);
473
+ return toToolResponse(financialRatios);
513
474
  }
514
475
  });
515
476
  var getEnterpriseValue = createOpenAITool({
@@ -527,7 +488,7 @@ var getEnterpriseValue = createOpenAITool({
527
488
  period,
528
489
  limit: Number(limit)
529
490
  });
530
- return JSON.stringify(enterpriseValue.data, null, 2);
491
+ return toToolResponse(enterpriseValue);
531
492
  }
532
493
  });
533
494
  var getCashflowGrowth = createOpenAITool({
@@ -545,7 +506,7 @@ var getCashflowGrowth = createOpenAITool({
545
506
  period,
546
507
  limit: Number(limit)
547
508
  });
548
- return JSON.stringify(cashflowGrowth.data, null, 2);
509
+ return toToolResponse(cashflowGrowth);
549
510
  }
550
511
  });
551
512
  var getIncomeGrowth = createOpenAITool({
@@ -563,7 +524,7 @@ var getIncomeGrowth = createOpenAITool({
563
524
  period,
564
525
  limit: Number(limit)
565
526
  });
566
- return JSON.stringify(incomeGrowth.data, null, 2);
527
+ return toToolResponse(incomeGrowth);
567
528
  }
568
529
  });
569
530
  var getBalanceSheetGrowth = createOpenAITool({
@@ -581,7 +542,7 @@ var getBalanceSheetGrowth = createOpenAITool({
581
542
  period,
582
543
  limit: Number(limit)
583
544
  });
584
- return JSON.stringify(balanceSheetGrowth.data, null, 2);
545
+ return toToolResponse(balanceSheetGrowth);
585
546
  }
586
547
  });
587
548
  var getFinancialGrowth = createOpenAITool({
@@ -599,7 +560,7 @@ var getFinancialGrowth = createOpenAITool({
599
560
  period,
600
561
  limit: Number(limit)
601
562
  });
602
- return JSON.stringify(financialGrowth.data, null, 2);
563
+ return toToolResponse(financialGrowth);
603
564
  }
604
565
  });
605
566
  var getEarningsHistorical = createOpenAITool({
@@ -615,7 +576,7 @@ var getEarningsHistorical = createOpenAITool({
615
576
  symbol,
616
577
  limit: Number(limit)
617
578
  });
618
- return JSON.stringify(earningsHistorical.data, null, 2);
579
+ return toToolResponse(earningsHistorical);
619
580
  }
620
581
  });
621
582
  var insiderTradingInputSchema = zod.z.object({
@@ -629,7 +590,7 @@ var getInsiderTrading = createOpenAITool({
629
590
  execute: async ({ symbol, page }) => {
630
591
  const fmp = getFMPClient();
631
592
  const insiderTrading = await fmp.insider.getInsiderTradesBySymbol(symbol, page);
632
- return JSON.stringify(insiderTrading.data, null, 2);
593
+ return toToolResponse(insiderTrading);
633
594
  }
634
595
  });
635
596
  var institutionalHoldersInputSchema = zod.z.object({
@@ -642,7 +603,7 @@ var getInstitutionalHolders = createOpenAITool({
642
603
  execute: async ({ symbol }) => {
643
604
  const fmp = getFMPClient();
644
605
  const institutionalHolders = await fmp.institutional.getInstitutionalHolders({ symbol });
645
- return JSON.stringify(institutionalHolders.data, null, 2);
606
+ return toToolResponse(institutionalHolders);
646
607
  }
647
608
  });
648
609
  var emptyInputSchema = zod.z.object({});
@@ -653,7 +614,7 @@ var getMarketPerformance = createOpenAITool({
653
614
  execute: async () => {
654
615
  const fmp = getFMPClient();
655
616
  const marketPerformance = await fmp.market.getMarketPerformance();
656
- return JSON.stringify(marketPerformance.data, null, 2);
617
+ return toToolResponse(marketPerformance);
657
618
  }
658
619
  });
659
620
  var getSectorPerformance = createOpenAITool({
@@ -663,7 +624,7 @@ var getSectorPerformance = createOpenAITool({
663
624
  execute: async () => {
664
625
  const fmp = getFMPClient();
665
626
  const sectorPerformance = await fmp.market.getSectorPerformance();
666
- return JSON.stringify(sectorPerformance.data, null, 2);
627
+ return toToolResponse(sectorPerformance);
667
628
  }
668
629
  });
669
630
  var getGainers = createOpenAITool({
@@ -673,7 +634,7 @@ var getGainers = createOpenAITool({
673
634
  execute: async () => {
674
635
  const fmp = getFMPClient();
675
636
  const gainers = await fmp.market.getGainers();
676
- return JSON.stringify(gainers.data, null, 2);
637
+ return toToolResponse(gainers);
677
638
  }
678
639
  });
679
640
  var getLosers = createOpenAITool({
@@ -683,7 +644,7 @@ var getLosers = createOpenAITool({
683
644
  execute: async () => {
684
645
  const fmp = getFMPClient();
685
646
  const losers = await fmp.market.getLosers();
686
- return JSON.stringify(losers.data, null, 2);
647
+ return toToolResponse(losers);
687
648
  }
688
649
  });
689
650
  var getMostActive = createOpenAITool({
@@ -693,7 +654,7 @@ var getMostActive = createOpenAITool({
693
654
  execute: async () => {
694
655
  const fmp = getFMPClient();
695
656
  const mostActive = await fmp.market.getMostActive();
696
- return JSON.stringify(mostActive.data, null, 2);
657
+ return toToolResponse(mostActive);
697
658
  }
698
659
  });
699
660
  var stockQuoteInputSchema = zod.z.object({
@@ -706,7 +667,7 @@ var getStockQuote = createOpenAITool({
706
667
  execute: async ({ symbol }) => {
707
668
  const fmp = getFMPClient();
708
669
  const stockQuote = await fmp.quote.getQuote(symbol);
709
- return JSON.stringify(stockQuote.data, null, 2);
670
+ return toToolResponse(stockQuote);
710
671
  }
711
672
  });
712
673
  var symbolInputSchema = zod.z.object({
@@ -725,7 +686,7 @@ var getSenateTrading = createOpenAITool({
725
686
  execute: async ({ symbol }) => {
726
687
  const fmp = getFMPClient();
727
688
  const senateTrading = await fmp.senateHouse.getSenateTrading({ symbol });
728
- return JSON.stringify(senateTrading.data, null, 2);
689
+ return toToolResponse(senateTrading);
729
690
  }
730
691
  });
731
692
  var getHouseTrading = createOpenAITool({
@@ -735,7 +696,7 @@ var getHouseTrading = createOpenAITool({
735
696
  execute: async ({ symbol }) => {
736
697
  const fmp = getFMPClient();
737
698
  const houseTrading = await fmp.senateHouse.getHouseTrading({ symbol });
738
- return JSON.stringify(houseTrading.data, null, 2);
699
+ return toToolResponse(houseTrading);
739
700
  }
740
701
  });
741
702
  var getSenateTradingByName = createOpenAITool({
@@ -745,7 +706,7 @@ var getSenateTradingByName = createOpenAITool({
745
706
  execute: async ({ name }) => {
746
707
  const fmp = getFMPClient();
747
708
  const senateTradingByName = await fmp.senateHouse.getSenateTradingByName({ name });
748
- return JSON.stringify(senateTradingByName.data, null, 2);
709
+ return toToolResponse(senateTradingByName);
749
710
  }
750
711
  });
751
712
  var getHouseTradingByName = createOpenAITool({
@@ -755,7 +716,7 @@ var getHouseTradingByName = createOpenAITool({
755
716
  execute: async ({ name }) => {
756
717
  const fmp = getFMPClient();
757
718
  const houseTradingByName = await fmp.senateHouse.getHouseTradingByName({ name });
758
- return JSON.stringify(houseTradingByName.data, null, 2);
719
+ return toToolResponse(houseTradingByName);
759
720
  }
760
721
  });
761
722
  var getSenateTradingRSSFeed = createOpenAITool({
@@ -765,7 +726,7 @@ var getSenateTradingRSSFeed = createOpenAITool({
765
726
  execute: async ({ page }) => {
766
727
  const fmp = getFMPClient();
767
728
  const senateTradingRSSFeed = await fmp.senateHouse.getSenateTradingRSSFeed({ page });
768
- return JSON.stringify(senateTradingRSSFeed.data, null, 2);
729
+ return toToolResponse(senateTradingRSSFeed);
769
730
  }
770
731
  });
771
732
  var getHouseTradingRSSFeed = createOpenAITool({
@@ -775,7 +736,7 @@ var getHouseTradingRSSFeed = createOpenAITool({
775
736
  execute: async ({ page }) => {
776
737
  const fmp = getFMPClient();
777
738
  const houseTradingRSSFeed = await fmp.senateHouse.getHouseTradingRSSFeed({ page });
778
- return JSON.stringify(houseTradingRSSFeed.data, null, 2);
739
+ return toToolResponse(houseTradingRSSFeed);
779
740
  }
780
741
  });
781
742
  var symbolInputSchema2 = zod.z.object({
@@ -788,7 +749,7 @@ var getMarketCap = createOpenAITool({
788
749
  execute: async ({ symbol }) => {
789
750
  const fmp = getFMPClient();
790
751
  const marketCap = await fmp.stock.getMarketCap(symbol);
791
- return JSON.stringify(marketCap.data, null, 2);
752
+ return toToolResponse(marketCap);
792
753
  }
793
754
  });
794
755
  var getStockSplits = createOpenAITool({
@@ -798,7 +759,7 @@ var getStockSplits = createOpenAITool({
798
759
  execute: async ({ symbol }) => {
799
760
  const fmp = getFMPClient();
800
761
  const stockSplits = await fmp.stock.getStockSplits(symbol);
801
- return JSON.stringify(stockSplits.data, null, 2);
762
+ return toToolResponse(stockSplits);
802
763
  }
803
764
  });
804
765
  var getDividendHistory = createOpenAITool({
@@ -808,7 +769,7 @@ var getDividendHistory = createOpenAITool({
808
769
  execute: async ({ symbol }) => {
809
770
  const fmp = getFMPClient();
810
771
  const dividendHistory = await fmp.stock.getDividendHistory(symbol);
811
- return JSON.stringify(dividendHistory.data, null, 2);
772
+ return toToolResponse(dividendHistory);
812
773
  }
813
774
  });
814
775
 
@@ -892,7 +853,6 @@ var fmpTools = [
892
853
  getStockSplits,
893
854
  getDividendHistory
894
855
  ];
895
- checkOpenAIAgentsVersion();
896
856
 
897
857
  exports.calendarTools = calendarTools;
898
858
  exports.companyTools = companyTools;