fodda-mcp 1.32.1 → 1.46.31

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.
Files changed (186) hide show
  1. package/README.md +14 -16
  2. package/dist/a2aHandler.d.ts +33 -3
  3. package/dist/a2aHandler.d.ts.map +1 -1
  4. package/dist/a2aHandler.js +189 -36
  5. package/dist/a2aHandler.js.map +1 -1
  6. package/dist/agentFacts.d.ts +21 -0
  7. package/dist/agentFacts.d.ts.map +1 -0
  8. package/dist/agentFacts.js +72 -0
  9. package/dist/agentFacts.js.map +1 -0
  10. package/dist/agents/fodda-researcher/index.d.ts +6 -0
  11. package/dist/agents/fodda-researcher/index.d.ts.map +1 -1
  12. package/dist/agents/fodda-researcher/index.js +18 -0
  13. package/dist/agents/fodda-researcher/index.js.map +1 -1
  14. package/dist/agents/fodda-researcher/skills.d.ts +1 -1
  15. package/dist/agents/fodda-researcher/skills.d.ts.map +1 -1
  16. package/dist/agents/fodda-researcher/skills.js +8 -3
  17. package/dist/agents/fodda-researcher/skills.js.map +1 -1
  18. package/dist/brandTemplate.d.ts +1 -1
  19. package/dist/brandTemplate.d.ts.map +1 -1
  20. package/dist/brandTemplate.js +179 -11
  21. package/dist/brandTemplate.js.map +1 -1
  22. package/dist/catalogCache.d.ts +14 -13
  23. package/dist/catalogCache.d.ts.map +1 -1
  24. package/dist/catalogCache.js +266 -67
  25. package/dist/catalogCache.js.map +1 -1
  26. package/dist/coverageRelevance.d.ts +156 -0
  27. package/dist/coverageRelevance.d.ts.map +1 -0
  28. package/dist/coverageRelevance.js +1062 -0
  29. package/dist/coverageRelevance.js.map +1 -0
  30. package/dist/deepResearch.d.ts +43 -0
  31. package/dist/deepResearch.d.ts.map +1 -0
  32. package/dist/deepResearch.js +498 -0
  33. package/dist/deepResearch.js.map +1 -0
  34. package/dist/enrichment.d.ts.map +1 -1
  35. package/dist/enrichment.js +51 -1
  36. package/dist/enrichment.js.map +1 -1
  37. package/dist/errorHandling.d.ts +1 -1
  38. package/dist/errorHandling.d.ts.map +1 -1
  39. package/dist/errorHandling.js +26 -6
  40. package/dist/errorHandling.js.map +1 -1
  41. package/dist/index.d.ts +9 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +548 -38
  44. package/dist/index.js.map +1 -1
  45. package/dist/linkedinEngine.d.ts +150 -0
  46. package/dist/linkedinEngine.d.ts.map +1 -0
  47. package/dist/linkedinEngine.js +696 -0
  48. package/dist/linkedinEngine.js.map +1 -0
  49. package/dist/oauthRegisterShim.d.ts +13 -0
  50. package/dist/oauthRegisterShim.d.ts.map +1 -0
  51. package/dist/oauthRegisterShim.js +83 -0
  52. package/dist/oauthRegisterShim.js.map +1 -0
  53. package/dist/pricingCache.d.ts +6 -8
  54. package/dist/pricingCache.d.ts.map +1 -1
  55. package/dist/pricingCache.js +69 -13
  56. package/dist/pricingCache.js.map +1 -1
  57. package/dist/queryCache.d.ts +2 -0
  58. package/dist/queryCache.d.ts.map +1 -1
  59. package/dist/queryCache.js +11 -2
  60. package/dist/queryCache.js.map +1 -1
  61. package/dist/resources.d.ts +27 -0
  62. package/dist/resources.d.ts.map +1 -0
  63. package/dist/resources.js +126 -0
  64. package/dist/resources.js.map +1 -0
  65. package/dist/sessionTracker.d.ts +24 -2
  66. package/dist/sessionTracker.d.ts.map +1 -1
  67. package/dist/sessionTracker.js +198 -4
  68. package/dist/sessionTracker.js.map +1 -1
  69. package/dist/systemPrompt.d.ts +3 -3
  70. package/dist/systemPrompt.d.ts.map +1 -1
  71. package/dist/systemPrompt.js +81 -61
  72. package/dist/systemPrompt.js.map +1 -1
  73. package/dist/telemetry.d.ts +43 -0
  74. package/dist/telemetry.d.ts.map +1 -0
  75. package/dist/telemetry.js +101 -0
  76. package/dist/telemetry.js.map +1 -0
  77. package/dist/test_analyst.js +2 -2
  78. package/dist/test_analyst.js.map +1 -1
  79. package/dist/test_book_a_call_live.d.ts +2 -0
  80. package/dist/test_book_a_call_live.d.ts.map +1 -0
  81. package/dist/test_book_a_call_live.js +148 -0
  82. package/dist/test_book_a_call_live.js.map +1 -0
  83. package/dist/test_brand_intelligence_endpoint.d.ts +2 -0
  84. package/dist/test_brand_intelligence_endpoint.d.ts.map +1 -0
  85. package/dist/test_brand_intelligence_endpoint.js +20 -0
  86. package/dist/test_brand_intelligence_endpoint.js.map +1 -0
  87. package/dist/test_coverage_relevance.d.ts +12 -0
  88. package/dist/test_coverage_relevance.d.ts.map +1 -0
  89. package/dist/test_coverage_relevance.js +121 -0
  90. package/dist/test_coverage_relevance.js.map +1 -0
  91. package/dist/test_dcr_and_legacy_deprecation.d.ts +2 -0
  92. package/dist/test_dcr_and_legacy_deprecation.d.ts.map +1 -0
  93. package/dist/test_dcr_and_legacy_deprecation.js +148 -0
  94. package/dist/test_dcr_and_legacy_deprecation.js.map +1 -0
  95. package/dist/test_financial_snapshot_render.d.ts +2 -0
  96. package/dist/test_financial_snapshot_render.d.ts.map +1 -0
  97. package/dist/test_financial_snapshot_render.js +167 -0
  98. package/dist/test_financial_snapshot_render.js.map +1 -0
  99. package/dist/test_gap_alert.d.ts +12 -0
  100. package/dist/test_gap_alert.d.ts.map +1 -0
  101. package/dist/test_gap_alert.js +43 -0
  102. package/dist/test_gap_alert.js.map +1 -0
  103. package/dist/test_list_graphs_topics.d.ts +2 -0
  104. package/dist/test_list_graphs_topics.d.ts.map +1 -0
  105. package/dist/test_list_graphs_topics.js +26 -0
  106. package/dist/test_list_graphs_topics.js.map +1 -0
  107. package/dist/test_live_endpoint_runner.d.ts +2 -0
  108. package/dist/test_live_endpoint_runner.d.ts.map +1 -0
  109. package/dist/test_live_endpoint_runner.js +65 -0
  110. package/dist/test_live_endpoint_runner.js.map +1 -0
  111. package/dist/test_local_list_graphs.d.ts +2 -0
  112. package/dist/test_local_list_graphs.d.ts.map +1 -0
  113. package/dist/test_local_list_graphs.js +53 -0
  114. package/dist/test_local_list_graphs.js.map +1 -0
  115. package/dist/test_next_moves.d.ts +2 -0
  116. package/dist/test_next_moves.d.ts.map +1 -0
  117. package/dist/test_next_moves.js +349 -0
  118. package/dist/test_next_moves.js.map +1 -0
  119. package/dist/test_next_moves_transcripts.d.ts +2 -0
  120. package/dist/test_next_moves_transcripts.d.ts.map +1 -0
  121. package/dist/test_next_moves_transcripts.js +413 -0
  122. package/dist/test_next_moves_transcripts.js.map +1 -0
  123. package/dist/test_nike_cmo_alias.d.ts +2 -0
  124. package/dist/test_nike_cmo_alias.d.ts.map +1 -0
  125. package/dist/test_nike_cmo_alias.js +76 -0
  126. package/dist/test_nike_cmo_alias.js.map +1 -0
  127. package/dist/test_session_next_moves_telemetry.d.ts +2 -0
  128. package/dist/test_session_next_moves_telemetry.d.ts.map +1 -0
  129. package/dist/test_session_next_moves_telemetry.js +100 -0
  130. package/dist/test_session_next_moves_telemetry.js.map +1 -0
  131. package/dist/test_token_resolution.d.ts +2 -0
  132. package/dist/test_token_resolution.d.ts.map +1 -0
  133. package/dist/test_token_resolution.js +82 -0
  134. package/dist/test_token_resolution.js.map +1 -0
  135. package/dist/toolHandlers.d.ts +7 -3
  136. package/dist/toolHandlers.d.ts.map +1 -1
  137. package/dist/toolHandlers.js +1678 -364
  138. package/dist/toolHandlers.js.map +1 -1
  139. package/dist/tools.d.ts +7 -2
  140. package/dist/tools.d.ts.map +1 -1
  141. package/dist/tools.js +12 -3
  142. package/dist/tools.js.map +1 -1
  143. package/dist/types.d.ts +9 -46
  144. package/dist/types.d.ts.map +1 -1
  145. package/dist/types.js +6 -0
  146. package/dist/types.js.map +1 -1
  147. package/dist/verify_tools_endpoint.js +4 -3
  148. package/dist/verify_tools_endpoint.js.map +1 -1
  149. package/package.json +5 -2
  150. package/server.json +16 -3
  151. package/dist/scripts/simulate_gemini.d.ts +0 -2
  152. package/dist/scripts/simulate_gemini.d.ts.map +0 -1
  153. package/dist/scripts/simulate_gemini.js +0 -100
  154. package/dist/scripts/simulate_gemini.js.map +0 -1
  155. package/dist/scripts/verify_registry.d.ts +0 -2
  156. package/dist/scripts/verify_registry.d.ts.map +0 -1
  157. package/dist/scripts/verify_registry.js +0 -77
  158. package/dist/scripts/verify_registry.js.map +0 -1
  159. package/dist/src/index.d.ts +0 -2
  160. package/dist/src/index.d.ts.map +0 -1
  161. package/dist/src/index.js +0 -332
  162. package/dist/src/index.js.map +0 -1
  163. package/dist/src/tools.d.ts +0 -12
  164. package/dist/src/tools.d.ts.map +0 -1
  165. package/dist/src/tools.js +0 -104
  166. package/dist/src/tools.js.map +0 -1
  167. package/dist/src/types.d.ts +0 -44
  168. package/dist/src/types.d.ts.map +0 -1
  169. package/dist/src/types.js +0 -2
  170. package/dist/src/types.js.map +0 -1
  171. package/dist/src/verify.d.ts +0 -2
  172. package/dist/src/verify.d.ts.map +0 -1
  173. package/dist/src/verify.js +0 -47
  174. package/dist/src/verify.js.map +0 -1
  175. package/dist/src/verify_hmac.d.ts +0 -2
  176. package/dist/src/verify_hmac.d.ts.map +0 -1
  177. package/dist/src/verify_hmac.js +0 -106
  178. package/dist/src/verify_hmac.js.map +0 -1
  179. package/dist/src/verify_tools_endpoint.d.ts +0 -2
  180. package/dist/src/verify_tools_endpoint.d.ts.map +0 -1
  181. package/dist/src/verify_tools_endpoint.js +0 -40
  182. package/dist/src/verify_tools_endpoint.js.map +0 -1
  183. package/dist/test-waverunner-response.d.ts +0 -2
  184. package/dist/test-waverunner-response.d.ts.map +0 -1
  185. package/dist/test-waverunner-response.js +0 -20
  186. package/dist/test-waverunner-response.js.map +0 -1
@@ -0,0 +1,100 @@
1
+ import assert from 'node:assert';
2
+ import { createSessionTracker } from './sessionTracker.js';
3
+ console.log('--- Running Session Tracker Next Moves Telemetry Tests ---');
4
+ const tracker = createSessionTracker();
5
+ // Initial state: no prior turns, evaluateNextMoveMatch returns undefined
6
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Tell me about Nike', 'search_graph'), undefined);
7
+ // Turn 1 recommendation
8
+ const nextMovesTurn1 = {
9
+ thread: {
10
+ kind: 'more_in_graph',
11
+ graph_id: 'retail',
12
+ graph_display: 'Retail Strategy & Innovation',
13
+ remaining_count: 5,
14
+ theme: 'Autonomous Checkout'
15
+ },
16
+ specific: {
17
+ brands: ['Nike', 'Adidas'],
18
+ statistics_source: 'Census retail trade reports',
19
+ expert: {
20
+ analyst_id: 'ben-dietz-sic',
21
+ display_name: 'Ben Dietz',
22
+ reason: 'cultural strategy and youth marketing'
23
+ }
24
+ },
25
+ scope_prompt: true,
26
+ known_brand: 'Nike',
27
+ presentation: 'internal'
28
+ };
29
+ tracker.recordNextMoves(nextMovesTurn1, 'retail innovation trends');
30
+ assert.deepStrictEqual(tracker.getLastNextMoves(), nextMovesTurn1);
31
+ // Test Scope Match
32
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Cut this specifically to Nike', 'search_graph'), 'scope');
33
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Working on a brief for our brand', 'search_graph'), 'scope');
34
+ // Test Specific Brand Match
35
+ assert.strictEqual(tracker.evaluateNextMoveMatch('What about Adidas in this space?', 'search_graph'), 'specific_brand');
36
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Look up Nike', 'brand_tracker', { brand_name: 'Nike' }), 'specific_brand');
37
+ // Test Specific Expert Match
38
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Can I consult Ben Dietz on this?', 'consult_analyst', { analyst_id: 'ben-dietz-sic' }), 'specific_expert');
39
+ // Test Specific Stat Match
40
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Search statistics for retail spending', 'search_statistics', { graph_id: 'retail' }), 'specific_stat');
41
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Get census retail trade reports data', 'get_supplemental_context'), 'specific_stat');
42
+ // Test Thread Match
43
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Pull the remaining signals on Autonomous Checkout', 'search_graph', { graphId: 'retail' }), 'thread');
44
+ // Test None Match (unrelated query)
45
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Tell me the weather in Seattle', 'search_graph'), 'none');
46
+ // Test that stat query returns none when statistics_source was NOT in recommendations
47
+ const nextMovesNoStats = {
48
+ scope_prompt: true,
49
+ presentation: 'internal'
50
+ };
51
+ tracker.recordNextMoves(nextMovesNoStats, 'some query');
52
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Search statistics for retail', 'search_statistics', { graph_id: 'retail' }), 'none', 'Should not classify as specific_stat if statistics_source was never offered');
53
+ // ── Consult-Specific Next Moves Telemetry Tests (Render Spec 1.3) ──
54
+ const consultNextMoves = {
55
+ scope_prompt: true,
56
+ presentation: 'internal',
57
+ thread: {
58
+ kind: 'expert_thread',
59
+ graph_id: 'ben-dietz-sic',
60
+ graph_display: 'Ben Dietz',
61
+ next_angle: 'We can explore creator-led retail formats next.',
62
+ uncited_themes: ['Discord Communities'],
63
+ text: 'We can explore creator-led retail formats next.'
64
+ },
65
+ shelf: [
66
+ { graph_id: 'retail', graph_display: 'Retail Strategy & Innovation', reason: 'Retail operations' },
67
+ { graph_id: 'fashion', graph_display: 'Fashion & Luxury Systems', reason: 'Luxury circularity' }
68
+ ],
69
+ specific: {
70
+ expert: {
71
+ analyst_id: 'retail-lead',
72
+ display_name: 'Retail Strategy Lead',
73
+ reason: 'omnichannel retail'
74
+ },
75
+ shelf_graphs: [
76
+ { graph_id: 'retail', graph_display: 'Retail Strategy & Innovation', reason: 'Retail operations' }
77
+ ]
78
+ },
79
+ consult_envelope: {
80
+ thread_line: 'We can explore creator-led retail formats next.',
81
+ shelf_line: 'Fodda also holds trend signals on this in Retail Strategy & Innovation and Fashion & Luxury Systems if you want the wider picture.',
82
+ scope_line: "If you tell me the brand or brief you're working on, I'll cut this to that."
83
+ }
84
+ };
85
+ tracker.recordNextMoves(consultNextMoves, 'cultural commerce');
86
+ // 1. Thread match: continuing with current expert
87
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Tell me more about creator-led retail formats', 'consult_human_agent', { analyst_id: 'ben-dietz-sic' }), 'thread', 'Follow-up with same expert should match thread');
88
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Let us look into Discord Communities', 'consult_analyst', { analyst_id: 'ben-dietz-sic' }), 'thread', 'Follow-up on uncited theme with same expert should match thread');
89
+ // 2. Shelf graph match: exploring shelf graphs recommended in sentence 2 -> must emit 'shelf' per §2.C
90
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Show me retail operations research', 'search_graph', { graphId: 'retail' }), 'shelf', 'Exploring shelf graph should match shelf per telemetry spec §2.C');
91
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Explore Fashion & Luxury Systems', 'get_domain_intelligence', { query: 'fashion luxury systems' }), 'shelf', 'Exploring shelf graph by name should match shelf');
92
+ // 3. Alternate expert referral match
93
+ assert.strictEqual(tracker.evaluateNextMoveMatch('I want to consult Retail Strategy Lead', 'consult_analyst', { analyst_id: 'retail-lead' }), 'specific_expert', 'Consulting referred expert should match specific_expert');
94
+ // 4. Scope deliverable match
95
+ assert.strictEqual(tracker.evaluateNextMoveMatch('Scope a deliverable on creator commerce', 'request_deliverable', { analyst_id: 'ben-dietz-sic', offering_key: 'brief' }), 'scope', 'Scoping deliverable should match scope');
96
+ assert.strictEqual(tracker.evaluateNextMoveMatch('To turn this into an executive brief, please scope a project deliverable', 'consult_human_agent', { analyst_id: 'ben-dietz-sic' }), 'scope', 'Scoping text prompt should match scope');
97
+ // 5. None match
98
+ assert.strictEqual(tracker.evaluateNextMoveMatch('How is the weather in Tokyo?', 'search_graph'), 'none', 'Unrelated topic should match none');
99
+ console.log('✅ All Session Tracker Next Moves Telemetry tests passed successfully!');
100
+ //# sourceMappingURL=test_session_next_moves_telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_session_next_moves_telemetry.js","sourceRoot":"","sources":["../src/test_session_next_moves_telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_token_resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_token_resolution.d.ts","sourceRoot":"","sources":["../src/test_token_resolution.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import express from 'express';
2
+ import { Server } from 'http';
3
+ import { resolveMcpToken } from './index.js';
4
+ async function main() {
5
+ console.log('--- Verification: resolveMcpToken header auth ---');
6
+ let receivedHeaders = {};
7
+ let mockStatusCode = 200;
8
+ let mockResponseBody = { apiKey: 'test_key_123', email: 'user@example.com', name: 'Test User' };
9
+ const app = express();
10
+ app.get('/api/mcp-tokens/:token', (req, res) => {
11
+ receivedHeaders = req.headers;
12
+ if (mockStatusCode !== 200) {
13
+ res.status(mockStatusCode).json({ error: 'Unauthorized' });
14
+ return;
15
+ }
16
+ res.json(mockResponseBody);
17
+ });
18
+ const server = await new Promise((res) => {
19
+ const s = app.listen(0, () => res(s));
20
+ });
21
+ const port = server.address().port;
22
+ const baseUrl = `http://localhost:${port}`;
23
+ try {
24
+ // Test 1: FODDA_MCP_SECRET set
25
+ process.env.FODDA_MCP_SECRET = 'test-secret-999';
26
+ delete process.env.ONBOARD_SECRET;
27
+ const res1 = await resolveMcpToken('token_abc_1', baseUrl);
28
+ if (res1.apiKey !== 'test_key_123' || res1.email !== 'user@example.com') {
29
+ throw new Error(`Test 1 Failed: unexpected response payload ${JSON.stringify(res1)}`);
30
+ }
31
+ const h1 = String(receivedHeaders['x-fodda-mcp-secret'] || '');
32
+ if (h1 !== 'test-secret-999') {
33
+ throw new Error(`Test 1 Failed: header X-Fodda-Mcp-Secret was '${h1}', expected 'test-secret-999'`);
34
+ }
35
+ console.log('✅ Test 1 Passed: Outbound token resolution attaches X-Fodda-Mcp-Secret header when configured.');
36
+ // Test 2: ONBOARD_SECRET fallback
37
+ delete process.env.FODDA_MCP_SECRET;
38
+ process.env.ONBOARD_SECRET = 'onboard-secret-777';
39
+ const res2 = await resolveMcpToken('token_abc_2', baseUrl);
40
+ const h2 = String(receivedHeaders['x-fodda-mcp-secret'] || '');
41
+ if (h2 !== 'onboard-secret-777') {
42
+ throw new Error(`Test 2 Failed: header X-Fodda-Mcp-Secret was '${h2}', expected 'onboard-secret-777'`);
43
+ }
44
+ console.log('✅ Test 2 Passed: Outbound token resolution falls back to ONBOARD_SECRET.');
45
+ // Test 3: Secret missing fallback warning
46
+ delete process.env.FODDA_MCP_SECRET;
47
+ delete process.env.ONBOARD_SECRET;
48
+ const res3 = await resolveMcpToken('token_abc_3', baseUrl);
49
+ const h3 = receivedHeaders['x-fodda-mcp-secret'];
50
+ if (h3) {
51
+ throw new Error(`Test 3 Failed: expected no X-Fodda-Mcp-Secret header when secrets unset, got '${h3}'`);
52
+ }
53
+ console.log('✅ Test 3 Passed: Outbound token resolution handles missing secrets gracefully with debug warning.');
54
+ // Test 4: 401 Unauthorized handling
55
+ process.env.FODDA_MCP_SECRET = 'invalid-secret';
56
+ mockStatusCode = 401;
57
+ let caughtError = false;
58
+ try {
59
+ await resolveMcpToken('token_abc_4', baseUrl);
60
+ }
61
+ catch (err) {
62
+ caughtError = true;
63
+ if (!err.message.includes('unauthorized (HTTP 401)')) {
64
+ throw new Error(`Test 4 Failed: unexpected error message: ${err.message}`);
65
+ }
66
+ }
67
+ if (!caughtError) {
68
+ throw new Error('Test 4 Failed: expected 401 error to be thrown');
69
+ }
70
+ console.log('✅ Test 4 Passed: 401 Unauthorized handled cleanly with informative error.');
71
+ console.log('\nAll resolveMcpToken tests passed successfully! 🎉');
72
+ }
73
+ finally {
74
+ server.close();
75
+ process.exit(0);
76
+ }
77
+ }
78
+ main().catch((err) => {
79
+ console.error('❌ Verification failed:', err);
80
+ process.exit(1);
81
+ });
82
+ //# sourceMappingURL=test_token_resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_token_resolution.js","sourceRoot":"","sources":["../src/test_token_resolution.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,15 @@
5
5
  * Contains createServer() which registers all 30+ MCP tools.
6
6
  */
7
7
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
- export type FoddaRequestFn = (method: 'GET' | 'POST' | 'PATCH', path: string, apiKey: string, userId: string, body?: any, requestId?: string) => Promise<any>;
9
- export type WaverunnerRequestFn = (interactionType: import('./trialTracker.js').TrialInteractionType, tokenCost: number, apiKey: string, userId: string, waverunnerPayload: any) => Promise<any>;
8
+ export declare function resolveAnalystAlias(analystIdInput: string, companyInput?: string): {
9
+ analyst_id: string;
10
+ company?: string | undefined;
11
+ };
12
+ export type { FoddaRequestFn, WaverunnerRequestFn } from './types.js';
13
+ import type { FoddaRequestFn, WaverunnerRequestFn } from './types.js';
10
14
  export declare function createServer(apiKey: string, userId: string, foddaRequest: FoddaRequestFn, waverunnerRequest: WaverunnerRequestFn, storeWidget: (html: string) => string, getServiceUrl: () => string, entryId?: string, sptCtx?: {
11
15
  token: string;
12
16
  maxAmountCents: number | null;
13
17
  prices: Record<string, number>;
14
- }): Promise<McpServer>;
18
+ }, allowedTools?: Set<string> | string[]): Promise<McpServer>;
15
19
  //# sourceMappingURL=toolHandlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolHandlers.d.ts","sourceRoot":"","sources":["../src/toolHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmIpE,MAAM,MAAM,cAAc,GAAG,CACzB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,EAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,GAAG,EACV,SAAS,CAAC,EAAE,MAAM,KACjB,OAAO,CAAC,GAAG,CAAC,CAAC;AAElB,MAAM,MAAM,mBAAmB,GAAG,CAC9B,eAAe,EAAE,OAAO,mBAAmB,EAAE,oBAAoB,EACjE,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,GAAG,KACrB,OAAO,CAAC,GAAG,CAAC,CAAC;AA6DlB,wBAAsB,YAAY,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,cAAc,EAC5B,iBAAiB,EAAE,mBAAmB,EACtC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,aAAa,EAAE,MAAM,MAAM,EAC3B,OAAO,GAAE,MAAW,EAEpB,MAAM,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC1F,OAAO,CAAC,SAAS,CAAC,CAumGpB"}
1
+ {"version":3,"file":"toolHandlers.d.ts","sourceRoot":"","sources":["../src/toolHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkCpE,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CA+CvI;AAwGD,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA8DtE,wBAAsB,YAAY,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,cAAc,EAC5B,iBAAiB,EAAE,mBAAmB,EACtC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,aAAa,EAAE,MAAM,MAAM,EAC3B,OAAO,GAAE,MAAW,EAEpB,MAAM,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EACzF,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GACtC,OAAO,CAAC,SAAS,CAAC,CA8iJpB"}