fodda-mcp 1.46.31 → 1.46.97

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 (289) hide show
  1. package/README.md +14 -94
  2. package/dist/agents/fodda-researcher/skills.d.ts +1 -1
  3. package/dist/agents/fodda-researcher/skills.d.ts.map +1 -1
  4. package/dist/agents/fodda-researcher/skills.js +1 -1
  5. package/dist/brandTemplate.d.ts +1 -1
  6. package/dist/brandTemplate.d.ts.map +1 -1
  7. package/dist/brandTemplate.js +162 -74
  8. package/dist/brandTemplate.js.map +1 -1
  9. package/dist/catalogCache.d.ts +29 -1
  10. package/dist/catalogCache.d.ts.map +1 -1
  11. package/dist/catalogCache.js +267 -16
  12. package/dist/catalogCache.js.map +1 -1
  13. package/dist/coverageRelevance.d.ts +97 -2
  14. package/dist/coverageRelevance.d.ts.map +1 -1
  15. package/dist/coverageRelevance.js +959 -164
  16. package/dist/coverageRelevance.js.map +1 -1
  17. package/dist/editorialFill.d.ts +5 -0
  18. package/dist/editorialFill.d.ts.map +1 -1
  19. package/dist/editorialFill.js +1 -1
  20. package/dist/editorialFill.js.map +1 -1
  21. package/dist/enrichment.d.ts +26 -0
  22. package/dist/enrichment.d.ts.map +1 -1
  23. package/dist/enrichment.js +394 -31
  24. package/dist/enrichment.js.map +1 -1
  25. package/dist/errorHandling.d.ts +35 -7
  26. package/dist/errorHandling.d.ts.map +1 -1
  27. package/dist/errorHandling.js +225 -155
  28. package/dist/errorHandling.js.map +1 -1
  29. package/dist/index.d.ts +25 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +351 -143
  32. package/dist/index.js.map +1 -1
  33. package/dist/jobs/jlens_quarterly_sweep.d.ts +62 -0
  34. package/dist/jobs/jlens_quarterly_sweep.d.ts.map +1 -0
  35. package/dist/jobs/jlens_quarterly_sweep.js +160 -0
  36. package/dist/jobs/jlens_quarterly_sweep.js.map +1 -0
  37. package/dist/pricingCache.d.ts.map +1 -1
  38. package/dist/pricingCache.js +41 -1
  39. package/dist/pricingCache.js.map +1 -1
  40. package/dist/queryCache.d.ts.map +1 -1
  41. package/dist/queryCache.js +2 -0
  42. package/dist/queryCache.js.map +1 -1
  43. package/dist/reportBriefing.d.ts +89 -0
  44. package/dist/reportBriefing.d.ts.map +1 -0
  45. package/dist/reportBriefing.js +662 -0
  46. package/dist/reportBriefing.js.map +1 -0
  47. package/dist/searchTemplate.d.ts.map +1 -1
  48. package/dist/searchTemplate.js +65 -53
  49. package/dist/searchTemplate.js.map +1 -1
  50. package/dist/services/graphRouter.d.ts +7 -0
  51. package/dist/services/graphRouter.d.ts.map +1 -0
  52. package/dist/services/graphRouter.js +7 -0
  53. package/dist/services/graphRouter.js.map +1 -0
  54. package/dist/services/notifications.d.ts +49 -0
  55. package/dist/services/notifications.d.ts.map +1 -0
  56. package/dist/services/notifications.js +206 -0
  57. package/dist/services/notifications.js.map +1 -0
  58. package/dist/sessionTracker.d.ts +19 -2
  59. package/dist/sessionTracker.d.ts.map +1 -1
  60. package/dist/sessionTracker.js +69 -16
  61. package/dist/sessionTracker.js.map +1 -1
  62. package/dist/skillClient.d.ts.map +1 -1
  63. package/dist/skillClient.js +11 -6
  64. package/dist/skillClient.js.map +1 -1
  65. package/dist/svgVisuals.d.ts +17 -19
  66. package/dist/svgVisuals.d.ts.map +1 -1
  67. package/dist/svgVisuals.js +189 -233
  68. package/dist/svgVisuals.js.map +1 -1
  69. package/dist/systemPrompt.d.ts +7 -2
  70. package/dist/systemPrompt.d.ts.map +1 -1
  71. package/dist/systemPrompt.js +110 -68
  72. package/dist/systemPrompt.js.map +1 -1
  73. package/dist/telemetry.d.ts.map +1 -1
  74. package/dist/telemetry.js +15 -0
  75. package/dist/telemetry.js.map +1 -1
  76. package/dist/test_adjacent_trends_polymorphic.d.ts +2 -0
  77. package/dist/test_adjacent_trends_polymorphic.d.ts.map +1 -0
  78. package/dist/test_adjacent_trends_polymorphic.js +154 -0
  79. package/dist/test_adjacent_trends_polymorphic.js.map +1 -0
  80. package/dist/test_book_a_call_live.js +18 -5
  81. package/dist/test_book_a_call_live.js.map +1 -1
  82. package/dist/test_byo_mcp_submission_clarity.d.ts +2 -0
  83. package/dist/test_byo_mcp_submission_clarity.d.ts.map +1 -0
  84. package/dist/test_byo_mcp_submission_clarity.js +142 -0
  85. package/dist/test_byo_mcp_submission_clarity.js.map +1 -0
  86. package/dist/test_capabilities_guidance.d.ts +2 -0
  87. package/dist/test_capabilities_guidance.d.ts.map +1 -0
  88. package/dist/test_capabilities_guidance.js +372 -0
  89. package/dist/test_capabilities_guidance.js.map +1 -0
  90. package/dist/test_client_provenance.d.ts +2 -0
  91. package/dist/test_client_provenance.d.ts.map +1 -0
  92. package/dist/test_client_provenance.js +77 -0
  93. package/dist/test_client_provenance.js.map +1 -0
  94. package/dist/test_connection_surface_cleanup.d.ts +2 -0
  95. package/dist/test_connection_surface_cleanup.d.ts.map +1 -0
  96. package/dist/test_connection_surface_cleanup.js +203 -0
  97. package/dist/test_connection_surface_cleanup.js.map +1 -0
  98. package/dist/test_consult_routing.d.ts +2 -0
  99. package/dist/test_consult_routing.d.ts.map +1 -0
  100. package/dist/test_consult_routing.js +86 -0
  101. package/dist/test_consult_routing.js.map +1 -0
  102. package/dist/test_consult_split.d.ts +2 -0
  103. package/dist/test_consult_split.d.ts.map +1 -0
  104. package/dist/test_consult_split.js +30 -0
  105. package/dist/test_consult_split.js.map +1 -0
  106. package/dist/test_coverage_relevance.js +111 -70
  107. package/dist/test_coverage_relevance.js.map +1 -1
  108. package/dist/test_coverage_replay.d.ts +2 -0
  109. package/dist/test_coverage_replay.d.ts.map +1 -0
  110. package/dist/test_coverage_replay.js +170 -0
  111. package/dist/test_coverage_replay.js.map +1 -0
  112. package/dist/test_dcr_and_legacy_deprecation.js +45 -50
  113. package/dist/test_dcr_and_legacy_deprecation.js.map +1 -1
  114. package/dist/test_demand_signal_logging.d.ts +2 -0
  115. package/dist/test_demand_signal_logging.d.ts.map +1 -0
  116. package/dist/test_demand_signal_logging.js +92 -0
  117. package/dist/test_demand_signal_logging.js.map +1 -0
  118. package/dist/test_earnings_activity_scope.d.ts +5 -0
  119. package/dist/test_earnings_activity_scope.d.ts.map +1 -0
  120. package/dist/test_earnings_activity_scope.js +101 -0
  121. package/dist/test_earnings_activity_scope.js.map +1 -0
  122. package/dist/test_earnings_divergence_live.d.ts +5 -0
  123. package/dist/test_earnings_divergence_live.d.ts.map +1 -0
  124. package/dist/test_earnings_divergence_live.js +135 -0
  125. package/dist/test_earnings_divergence_live.js.map +1 -0
  126. package/dist/test_earnings_hygiene_and_binding.d.ts +5 -0
  127. package/dist/test_earnings_hygiene_and_binding.d.ts.map +1 -0
  128. package/dist/test_earnings_hygiene_and_binding.js +104 -0
  129. package/dist/test_earnings_hygiene_and_binding.js.map +1 -0
  130. package/dist/test_exec_quotes_render.d.ts +2 -0
  131. package/dist/test_exec_quotes_render.d.ts.map +1 -0
  132. package/dist/test_exec_quotes_render.js +86 -0
  133. package/dist/test_exec_quotes_render.js.map +1 -0
  134. package/dist/test_expert_intro.d.ts +2 -0
  135. package/dist/test_expert_intro.d.ts.map +1 -0
  136. package/dist/test_expert_intro.js +57 -0
  137. package/dist/test_expert_intro.js.map +1 -0
  138. package/dist/test_expert_layer.d.ts +11 -0
  139. package/dist/test_expert_layer.d.ts.map +1 -0
  140. package/dist/test_expert_layer.js +356 -0
  141. package/dist/test_expert_layer.js.map +1 -0
  142. package/dist/test_gap_alert.js +8 -0
  143. package/dist/test_gap_alert.js.map +1 -1
  144. package/dist/test_grok_offering_surfaces.d.ts +2 -0
  145. package/dist/test_grok_offering_surfaces.d.ts.map +1 -0
  146. package/dist/test_grok_offering_surfaces.js +155 -0
  147. package/dist/test_grok_offering_surfaces.js.map +1 -0
  148. package/dist/test_human_agent_live.d.ts +2 -0
  149. package/dist/test_human_agent_live.d.ts.map +1 -0
  150. package/dist/test_human_agent_live.js +48 -0
  151. package/dist/test_human_agent_live.js.map +1 -0
  152. package/dist/test_identity_gap.d.ts +2 -0
  153. package/dist/test_identity_gap.d.ts.map +1 -0
  154. package/dist/test_identity_gap.js +171 -0
  155. package/dist/test_identity_gap.js.map +1 -0
  156. package/dist/test_intelligence_and_verifier.d.ts +17 -0
  157. package/dist/test_intelligence_and_verifier.d.ts.map +1 -0
  158. package/dist/test_intelligence_and_verifier.js +162 -0
  159. package/dist/test_intelligence_and_verifier.js.map +1 -0
  160. package/dist/test_latency_mcp_brief5.d.ts +12 -0
  161. package/dist/test_latency_mcp_brief5.d.ts.map +1 -0
  162. package/dist/test_latency_mcp_brief5.js +200 -0
  163. package/dist/test_latency_mcp_brief5.js.map +1 -0
  164. package/dist/test_limit_and_credit_card_capture.d.ts +21 -0
  165. package/dist/test_limit_and_credit_card_capture.d.ts.map +1 -0
  166. package/dist/test_limit_and_credit_card_capture.js +216 -0
  167. package/dist/test_limit_and_credit_card_capture.js.map +1 -0
  168. package/dist/test_list_graphs_topics.js +1 -1
  169. package/dist/test_list_graphs_topics.js.map +1 -1
  170. package/dist/test_live_deployed_mcp_search.d.ts +2 -0
  171. package/dist/test_live_deployed_mcp_search.d.ts.map +1 -0
  172. package/dist/test_live_deployed_mcp_search.js +85 -0
  173. package/dist/test_live_deployed_mcp_search.js.map +1 -0
  174. package/dist/test_live_deployed_split.d.ts +2 -0
  175. package/dist/test_live_deployed_split.d.ts.map +1 -0
  176. package/dist/test_live_deployed_split.js +72 -0
  177. package/dist/test_live_deployed_split.js.map +1 -0
  178. package/dist/test_live_endpoint_runner.js +2 -2
  179. package/dist/test_live_endpoint_runner.js.map +1 -1
  180. package/dist/test_live_mcp.js +1 -1
  181. package/dist/test_live_mcp.js.map +1 -1
  182. package/dist/test_live_neil_widget.d.ts +2 -0
  183. package/dist/test_live_neil_widget.d.ts.map +1 -0
  184. package/dist/test_live_neil_widget.js +84 -0
  185. package/dist/test_live_neil_widget.js.map +1 -0
  186. package/dist/test_longpoll_status.d.ts +2 -0
  187. package/dist/test_longpoll_status.d.ts.map +1 -0
  188. package/dist/test_longpoll_status.js +117 -0
  189. package/dist/test_longpoll_status.js.map +1 -0
  190. package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts +2 -0
  191. package/dist/test_mcp_find_expert_and_vocabulary_routing.d.ts.map +1 -0
  192. package/dist/test_mcp_find_expert_and_vocabulary_routing.js +130 -0
  193. package/dist/test_mcp_find_expert_and_vocabulary_routing.js.map +1 -0
  194. package/dist/test_next_moves.js +644 -279
  195. package/dist/test_next_moves.js.map +1 -1
  196. package/dist/test_next_moves_transcripts.js +122 -40
  197. package/dist/test_next_moves_transcripts.js.map +1 -1
  198. package/dist/test_on_request_caller_identity.d.ts +13 -0
  199. package/dist/test_on_request_caller_identity.d.ts.map +1 -0
  200. package/dist/test_on_request_caller_identity.js +131 -0
  201. package/dist/test_on_request_caller_identity.js.map +1 -0
  202. package/dist/test_on_request_intercept.d.ts +10 -0
  203. package/dist/test_on_request_intercept.d.ts.map +1 -0
  204. package/dist/test_on_request_intercept.js +95 -0
  205. package/dist/test_on_request_intercept.js.map +1 -0
  206. package/dist/test_onboarding_consent_and_errors.d.ts +2 -0
  207. package/dist/test_onboarding_consent_and_errors.d.ts.map +1 -0
  208. package/dist/test_onboarding_consent_and_errors.js +110 -0
  209. package/dist/test_onboarding_consent_and_errors.js.map +1 -0
  210. package/dist/test_onboarding_live_scenarios.d.ts +2 -0
  211. package/dist/test_onboarding_live_scenarios.d.ts.map +1 -0
  212. package/dist/test_onboarding_live_scenarios.js +189 -0
  213. package/dist/test_onboarding_live_scenarios.js.map +1 -0
  214. package/dist/test_referral_live.d.ts +2 -0
  215. package/dist/test_referral_live.d.ts.map +1 -0
  216. package/dist/test_referral_live.js +33 -0
  217. package/dist/test_referral_live.js.map +1 -0
  218. package/dist/test_referral_piers.d.ts +2 -0
  219. package/dist/test_referral_piers.d.ts.map +1 -0
  220. package/dist/test_referral_piers.js +33 -0
  221. package/dist/test_referral_piers.js.map +1 -0
  222. package/dist/test_report_editorial_briefing.d.ts +21 -0
  223. package/dist/test_report_editorial_briefing.d.ts.map +1 -0
  224. package/dist/test_report_editorial_briefing.js +356 -0
  225. package/dist/test_report_editorial_briefing.js.map +1 -0
  226. package/dist/test_search_graph_quality.d.ts +2 -0
  227. package/dist/test_search_graph_quality.d.ts.map +1 -0
  228. package/dist/test_search_graph_quality.js +493 -0
  229. package/dist/test_search_graph_quality.js.map +1 -0
  230. package/dist/test_service_to_service_auth.d.ts +2 -0
  231. package/dist/test_service_to_service_auth.d.ts.map +1 -0
  232. package/dist/test_service_to_service_auth.js +199 -0
  233. package/dist/test_service_to_service_auth.js.map +1 -0
  234. package/dist/test_sources_live.d.ts +2 -0
  235. package/dist/test_sources_live.d.ts.map +1 -0
  236. package/dist/test_sources_live.js +30 -0
  237. package/dist/test_sources_live.js.map +1 -0
  238. package/dist/test_specialist_and_analyst_tiers.d.ts +2 -0
  239. package/dist/test_specialist_and_analyst_tiers.d.ts.map +1 -0
  240. package/dist/test_specialist_and_analyst_tiers.js +155 -0
  241. package/dist/test_specialist_and_analyst_tiers.js.map +1 -0
  242. package/dist/test_v2_2_visual_hardening.d.ts +5 -0
  243. package/dist/test_v2_2_visual_hardening.d.ts.map +1 -0
  244. package/dist/test_v2_2_visual_hardening.js +333 -0
  245. package/dist/test_v2_2_visual_hardening.js.map +1 -0
  246. package/dist/test_verify_deprecate_render_spec.d.ts +2 -0
  247. package/dist/test_verify_deprecate_render_spec.d.ts.map +1 -0
  248. package/dist/test_verify_deprecate_render_spec.js +217 -0
  249. package/dist/test_verify_deprecate_render_spec.js.map +1 -0
  250. package/dist/test_verify_neil_demo.d.ts +2 -0
  251. package/dist/test_verify_neil_demo.d.ts.map +1 -0
  252. package/dist/test_verify_neil_demo.js +149 -0
  253. package/dist/test_verify_neil_demo.js.map +1 -0
  254. package/dist/test_waitable_research_and_grounded_links.d.ts +2 -0
  255. package/dist/test_waitable_research_and_grounded_links.d.ts.map +1 -0
  256. package/dist/test_waitable_research_and_grounded_links.js +129 -0
  257. package/dist/test_waitable_research_and_grounded_links.js.map +1 -0
  258. package/dist/test_widget_guards.d.ts +2 -0
  259. package/dist/test_widget_guards.d.ts.map +1 -0
  260. package/dist/test_widget_guards.js +229 -0
  261. package/dist/test_widget_guards.js.map +1 -0
  262. package/dist/test_zero_retention_alerts.d.ts +14 -0
  263. package/dist/test_zero_retention_alerts.d.ts.map +1 -0
  264. package/dist/test_zero_retention_alerts.js +76 -0
  265. package/dist/test_zero_retention_alerts.js.map +1 -0
  266. package/dist/toolHandlers.d.ts +38 -1
  267. package/dist/toolHandlers.d.ts.map +1 -1
  268. package/dist/toolHandlers.js +3856 -938
  269. package/dist/toolHandlers.js.map +1 -1
  270. package/dist/tools.d.ts +20 -0
  271. package/dist/tools.d.ts.map +1 -1
  272. package/dist/tools.js +25 -4
  273. package/dist/tools.js.map +1 -1
  274. package/dist/verify_discoverability.d.ts +2 -0
  275. package/dist/verify_discoverability.d.ts.map +1 -0
  276. package/dist/verify_discoverability.js +53 -0
  277. package/dist/verify_discoverability.js.map +1 -0
  278. package/dist/verify_tools_endpoint.js +16 -3
  279. package/dist/verify_tools_endpoint.js.map +1 -1
  280. package/dist/widgetShell.d.ts +2 -2
  281. package/dist/widgetShell.d.ts.map +1 -1
  282. package/dist/widgetShell.js +1 -1
  283. package/dist/widgetShell.js.map +1 -1
  284. package/package.json +1 -1
  285. package/server.json +4 -32
  286. package/dist/oauthRegisterShim.d.ts +0 -13
  287. package/dist/oauthRegisterShim.d.ts.map +0 -1
  288. package/dist/oauthRegisterShim.js +0 -83
  289. package/dist/oauthRegisterShim.js.map +0 -1
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Automated Verification Suite for Brief #5: MCP Client Slim Endpoints
3
+ * Tests:
4
+ * 1. get_my_account points to /v1/account with fallback to /v1/graphs?view=mcp
5
+ * 2. Response shape and fields for get_my_account mirror existing human-safe format without SPT/token text
6
+ * 3. Session init and list_graphs request ?view=mcp
7
+ * 4. serializeGraphForList allowlist preserves routing fields (suitable_questions, price_per_query, accessible, disabled)
8
+ * 5. Outbound requests send Accept-Encoding: gzip and auto-decompress
9
+ * 6. Before/after payload size measurements
10
+ */
11
+ import http from 'http';
12
+ import axios from 'axios';
13
+ import { foddaRequest } from './index.js';
14
+ let passed = 0;
15
+ let failed = 0;
16
+ function assert(condition, msg) {
17
+ if (condition) {
18
+ console.log(`✅ PASS: ${msg}`);
19
+ passed++;
20
+ }
21
+ else {
22
+ console.error(`❌ FAIL: ${msg}`);
23
+ failed++;
24
+ }
25
+ }
26
+ async function runTests() {
27
+ console.log('--- Brief #5 MCP Client Verification Suite ---\n');
28
+ // Test 1: Outbound Accept-Encoding header check
29
+ const headersSent = {};
30
+ const mockServer = http.createServer((req, res) => {
31
+ Object.assign(headersSent, req.headers);
32
+ const url = new URL(req.url || '', `http://${req.headers.host}`);
33
+ if (url.pathname === '/v1/account') {
34
+ const accountPayload = {
35
+ requestId: 'test-req-123',
36
+ version: 'v1.1',
37
+ _account: {
38
+ plan: 'Pro',
39
+ query_retention: 'standard',
40
+ tokens_remaining: 450,
41
+ tokens_total: 500,
42
+ tokens_used: 50,
43
+ accessible_graphs: ['retail', 'tech', 'food'],
44
+ profile: { name: 'Piers', company: 'PSFK', jobTitle: 'CEO' }
45
+ },
46
+ usage: {
47
+ plan: 'Pro',
48
+ calls_used: 50,
49
+ monthly_allowance: 500,
50
+ calls_remaining: 450
51
+ }
52
+ };
53
+ res.writeHead(200, { 'Content-Type': 'application/json' });
54
+ return res.end(JSON.stringify(accountPayload));
55
+ }
56
+ if (url.pathname === '/v1/graphs') {
57
+ const isMcp = url.searchParams.get('view') === 'mcp';
58
+ const graphsPayload = {
59
+ requestId: 'test-req-456',
60
+ graphs: [
61
+ {
62
+ graph_id: 'retail',
63
+ name: 'Retail Intelligence',
64
+ description: 'Consumer retail insights and market trends',
65
+ agent_prompt: 'Route retail and shopper queries here',
66
+ suitable_questions: ['What are grocery margins in 2026?'],
67
+ status: 'live',
68
+ graph_type: 'domain',
69
+ price_per_query: '$0.50',
70
+ accessible: true,
71
+ disabled: false
72
+ },
73
+ {
74
+ graph_id: 'tech',
75
+ name: 'Technology Trends',
76
+ description: 'Enterprise AI and software trends',
77
+ agent_prompt: 'Route enterprise AI questions here',
78
+ suitable_questions: ['How is agentic AI adopted in fintech?'],
79
+ status: 'live',
80
+ graph_type: 'domain',
81
+ price_per_query: '$0.50',
82
+ accessible: true,
83
+ disabled: false
84
+ }
85
+ ],
86
+ _account: {
87
+ plan: 'Pro',
88
+ tokens_remaining: 450,
89
+ tokens_total: 500
90
+ }
91
+ };
92
+ res.writeHead(200, { 'Content-Type': 'application/json' });
93
+ return res.end(JSON.stringify(graphsPayload));
94
+ }
95
+ res.writeHead(404, { 'Content-Type': 'application/json' });
96
+ res.end(JSON.stringify({ error: 'NOT_FOUND' }));
97
+ });
98
+ await new Promise((resolve) => mockServer.listen(0, '127.0.0.1', () => resolve()));
99
+ const port = mockServer.address().port;
100
+ const originalApiUrl = process.env.FODDA_API_URL;
101
+ process.env.FODDA_API_URL = `http://127.0.0.1:${port}`;
102
+ try {
103
+ // Test 1: Outbound Accept-Encoding includes gzip
104
+ const accountData = await foddaRequest('GET', '/v1/account', 'test-key', 'user@example.com');
105
+ assert(Boolean(headersSent['accept-encoding']?.includes('gzip') || headersSent['accept-encoding']?.includes('*')), `Outbound calls send Accept-Encoding with compression support: ${headersSent['accept-encoding']}`);
106
+ // Test 2: GET /v1/account payload structure and size
107
+ assert(accountData && accountData._account?.plan === 'Pro', 'GET /v1/account returns account data');
108
+ const accountPayloadSize = Buffer.byteLength(JSON.stringify(accountData));
109
+ assert(accountPayloadSize < 2000, `GET /v1/account is lightweight (~${accountPayloadSize} bytes, target <2KB)`);
110
+ // Test 3: GET /v1/graphs?view=mcp returns slim routing fields
111
+ const graphsMcpData = await foddaRequest('GET', '/v1/graphs?view=mcp', 'test-key', 'user@example.com');
112
+ assert(Array.isArray(graphsMcpData?.graphs) && graphsMcpData.graphs.length === 2, 'GET /v1/graphs?view=mcp returns graph catalog');
113
+ const firstGraph = graphsMcpData.graphs[0];
114
+ assert(firstGraph.graph_id === 'retail' && firstGraph.agent_prompt != null && firstGraph.suitable_questions?.length > 0, 'GET /v1/graphs?view=mcp preserves graph_id, agent_prompt, and suitable_questions');
115
+ // Test 4: Verification of no SPT / token text in tool output formatting
116
+ const rawAccount = accountData._account;
117
+ const formattedStatus = {
118
+ plan: rawAccount.plan,
119
+ queryRetention: rawAccount.query_retention || 'standard',
120
+ api_calls_remaining: rawAccount.tokens_remaining ?? rawAccount.credits,
121
+ api_calls_total: rawAccount.tokens_total,
122
+ api_calls_used: rawAccount.tokens_used,
123
+ };
124
+ const outputJson = JSON.stringify(formattedStatus);
125
+ assert(!outputJson.toLowerCase().includes('token') && !outputJson.toLowerCase().includes('spt'), 'Account status contains no "token" or "spt" text');
126
+ assert(formattedStatus.api_calls_remaining === 450, 'Account status correctly formats balance as api_calls_remaining');
127
+ // Test 5: Fallback behavior if /v1/account returns 404 (e.g., during deployment rollover)
128
+ const mockServer404 = http.createServer((req, res) => {
129
+ const url = new URL(req.url || '', `http://${req.headers.host}`);
130
+ if (url.pathname === '/v1/account') {
131
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
132
+ return res.end('Cannot GET /v1/account');
133
+ }
134
+ if (url.pathname === '/v1/graphs') {
135
+ res.writeHead(200, { 'Content-Type': 'application/json' });
136
+ return res.end(JSON.stringify({
137
+ requestId: 'fallback-req',
138
+ _account: { plan: 'Pro-Fallback', tokens_remaining: 999 }
139
+ }));
140
+ }
141
+ res.writeHead(404);
142
+ res.end();
143
+ });
144
+ await new Promise((resolve) => mockServer404.listen(0, '127.0.0.1', () => resolve()));
145
+ const port404 = mockServer404.address().port;
146
+ process.env.FODDA_API_URL = `http://127.0.0.1:${port404}`;
147
+ let fallbackData;
148
+ try {
149
+ fallbackData = await foddaRequest('GET', '/v1/account', 'test-key', 'user@example.com');
150
+ }
151
+ catch (e) {
152
+ if (e.response?.status === 404) {
153
+ fallbackData = await foddaRequest('GET', '/v1/graphs?view=mcp', 'test-key', 'user@example.com');
154
+ }
155
+ }
156
+ assert(fallbackData?._account?.plan === 'Pro-Fallback', 'Graceful fallback to /v1/graphs?view=mcp succeeds if /v1/account returns 404');
157
+ mockServer404.close();
158
+ }
159
+ finally {
160
+ mockServer.close();
161
+ if (originalApiUrl) {
162
+ process.env.FODDA_API_URL = originalApiUrl;
163
+ }
164
+ else {
165
+ delete process.env.FODDA_API_URL;
166
+ }
167
+ }
168
+ // Test 6: Live comparison against production api.fodda.ai
169
+ console.log('\n--- Live API Verification (api.fodda.ai) ---');
170
+ try {
171
+ const liveKey = '7ae90d3753d34914fa1dc6fe21396cc30d572ca61fbe5eb7029d367adf22b08e';
172
+ const fullGraphsRes = await axios.get('https://api.fodda.ai/v1/graphs', {
173
+ headers: { 'X-API-Key': liveKey }
174
+ });
175
+ const fullSize = Buffer.byteLength(JSON.stringify(fullGraphsRes.data));
176
+ console.log(`Live GET /v1/graphs (full) size: ${Math.round(fullSize / 1024)} KB (${fullSize} bytes)`);
177
+ const mcpGraphsRes = await axios.get('https://api.fodda.ai/v1/graphs?view=mcp', {
178
+ headers: { 'X-API-Key': liveKey }
179
+ });
180
+ const mcpSize = Buffer.byteLength(JSON.stringify(mcpGraphsRes.data));
181
+ console.log(`Live GET /v1/graphs?view=mcp size: ${Math.round(mcpSize / 1024)} KB (${mcpSize} bytes)`);
182
+ assert(mcpGraphsRes.status === 200, 'Live GET /v1/graphs?view=mcp returns 200 OK');
183
+ assert(Array.isArray(mcpGraphsRes.data.graphs), 'Live response contains graphs array');
184
+ assert(mcpGraphsRes.data.graphs.length === fullGraphsRes.data.graphs.length, `Routing parity: both endpoints return ${mcpGraphsRes.data.graphs.length} graphs`);
185
+ }
186
+ catch (e) {
187
+ console.warn(`Live test warning (non-fatal): ${e.message}`);
188
+ }
189
+ console.log(`\n========================================`);
190
+ console.log(`Tests Passed: ${passed} | Tests Failed: ${failed}`);
191
+ console.log(`========================================\n`);
192
+ if (failed > 0) {
193
+ process.exit(1);
194
+ }
195
+ }
196
+ runTests().catch(err => {
197
+ console.error('Test suite uncaught error:', err);
198
+ process.exit(1);
199
+ });
200
+ //# sourceMappingURL=test_latency_mcp_brief5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_latency_mcp_brief5.js","sourceRoot":"","sources":["../src/test_latency_mcp_brief5.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Test: Daily Burst Limit & Monthly Plan Limit Handling with Credit Card Capture
3
+ * and ChatGPT Commerce-Silence Invariant
4
+ *
5
+ * Verifies:
6
+ * 1. DAILY_LIMIT_EXCEEDED:
7
+ * - classifyAccessError classifies as 'credits'
8
+ * - handleAccessError and handleTrialCreditExhaustion return code DAILY_LIMIT_EXCEEDED, action SETUP_CARD, setup_url, and verbatim next_action
9
+ * 2. PLAN_LIMIT_EXCEEDED:
10
+ * - handleAccessError and handleTrialCreditExhaustion return code PLAN_LIMIT_EXCEEDED, action ADD_PAYMENT_METHOD, setup_url, overage_rate_usd, and verbatim next_action
11
+ * 3. CREDITS_EXHAUSTED:
12
+ * - returns isError: true (an actionable stop, not data)
13
+ * - top-up call count and price dynamically sourced from payload (no hardcoded figures)
14
+ * 4. TRIAL_EXHAUSTED:
15
+ * - returns isError: true, upgrade_url on app.fodda.ai, free Base account framing (not "top up" / not fodda.ai/account/billing)
16
+ * 5. ChatGPT Commerce-Silence Parity:
17
+ * - All 4 credit codes on ChatGPT session source return clean QUOTA_EXHAUSTED payload
18
+ * - Zero Stripe URLs, zero dollar amounts, zero "API calls" text, manage_url: https://app.fodda.ai/account
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=test_limit_and_credit_card_capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_limit_and_credit_card_capture.d.ts","sourceRoot":"","sources":["../src/test_limit_and_credit_card_capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Test: Daily Burst Limit & Monthly Plan Limit Handling with Credit Card Capture
3
+ * and ChatGPT Commerce-Silence Invariant
4
+ *
5
+ * Verifies:
6
+ * 1. DAILY_LIMIT_EXCEEDED:
7
+ * - classifyAccessError classifies as 'credits'
8
+ * - handleAccessError and handleTrialCreditExhaustion return code DAILY_LIMIT_EXCEEDED, action SETUP_CARD, setup_url, and verbatim next_action
9
+ * 2. PLAN_LIMIT_EXCEEDED:
10
+ * - handleAccessError and handleTrialCreditExhaustion return code PLAN_LIMIT_EXCEEDED, action ADD_PAYMENT_METHOD, setup_url, overage_rate_usd, and verbatim next_action
11
+ * 3. CREDITS_EXHAUSTED:
12
+ * - returns isError: true (an actionable stop, not data)
13
+ * - top-up call count and price dynamically sourced from payload (no hardcoded figures)
14
+ * 4. TRIAL_EXHAUSTED:
15
+ * - returns isError: true, upgrade_url on app.fodda.ai, free Base account framing (not "top up" / not fodda.ai/account/billing)
16
+ * 5. ChatGPT Commerce-Silence Parity:
17
+ * - All 4 credit codes on ChatGPT session source return clean QUOTA_EXHAUSTED payload
18
+ * - Zero Stripe URLs, zero dollar amounts, zero "API calls" text, manage_url: https://app.fodda.ai/account
19
+ */
20
+ import assert from 'assert';
21
+ import { handleAccessError, handleTrialCreditExhaustion, classifyAccessError } from './errorHandling.js';
22
+ async function runTests() {
23
+ console.log('--- Running Unified Limit Error & ChatGPT Commerce-Silence Suite ---\n');
24
+ // ── 1. Daily 50-call burst limit ──
25
+ const dailyLimitErr = {
26
+ response: {
27
+ status: 403,
28
+ data: {
29
+ ok: false,
30
+ error: 'DAILY_LIMIT_EXCEEDED',
31
+ code: 'DAILY_LIMIT_EXCEEDED',
32
+ message: 'Daily 50-call limit reached on free Base tier. Add a payment card to remove daily burst limits and continue querying without interruption at 50¢ per API call.',
33
+ setupUrl: 'https://app.fodda.ai/api/account/setup-url?email=newuser%40example.com',
34
+ upgradeUrl: 'https://app.fodda.ai/billing',
35
+ overage_rate_usd: 0.50,
36
+ daily_calls_used: 50,
37
+ daily_calls_limit: 50,
38
+ requestId: 'test-burst-1'
39
+ }
40
+ }
41
+ };
42
+ console.log('Test 1: classifyAccessError recognizes DAILY_LIMIT_EXCEEDED as credits');
43
+ assert.strictEqual(classifyAccessError(dailyLimitErr), 'credits');
44
+ console.log('✅ Test 1 Passed\n');
45
+ console.log('Test 2: handleAccessError surfaces SETUP_CARD, setup_url, and verbatim next_action on DAILY_LIMIT_EXCEEDED');
46
+ const accessDailyRes = await handleAccessError(dailyLimitErr, 'search_graph', 'newuser@example.com', 'sk_live_newuser');
47
+ assert.strictEqual(accessDailyRes.isError, true);
48
+ const parsedAccessDaily = JSON.parse(accessDailyRes.content[0].text);
49
+ assert.strictEqual(parsedAccessDaily.code, 'DAILY_LIMIT_EXCEEDED');
50
+ assert.strictEqual(parsedAccessDaily.status, 'DAILY_LIMIT_EXCEEDED');
51
+ assert.strictEqual(parsedAccessDaily.action, 'SETUP_CARD');
52
+ assert.strictEqual(parsedAccessDaily.setup_url, 'https://app.fodda.ai/api/account/setup-url?email=newuser%40example.com');
53
+ assert.strictEqual(parsedAccessDaily.upgrade_url, 'https://app.fodda.ai/billing');
54
+ assert.ok(parsedAccessDaily.next_action.includes('https://app.fodda.ai/api/account/setup-url'), 'next_action must contain setup_url');
55
+ assert.ok(parsedAccessDaily.next_action.includes('$0.5 per call') || parsedAccessDaily.next_action.includes('$0.50 per call'), 'next_action must reflect payload overage rate');
56
+ console.log('✅ Test 2 Passed\n');
57
+ console.log('Test 3: handleTrialCreditExhaustion surfaces SETUP_CARD and setup_url on DAILY_LIMIT_EXCEEDED (unified parity)');
58
+ const trialDailyRes = await handleTrialCreditExhaustion(dailyLimitErr, 'sk_live_newuser', 'newuser@example.com');
59
+ assert.ok(trialDailyRes, 'handleTrialCreditExhaustion must return a response');
60
+ assert.strictEqual(trialDailyRes.isError, true);
61
+ const parsedTrialDaily = JSON.parse(trialDailyRes.content[0].text);
62
+ assert.strictEqual(parsedTrialDaily.code, 'DAILY_LIMIT_EXCEEDED');
63
+ assert.strictEqual(parsedTrialDaily.status, 'DAILY_LIMIT_EXCEEDED');
64
+ assert.strictEqual(parsedTrialDaily.action, 'SETUP_CARD');
65
+ assert.strictEqual(parsedTrialDaily.setup_url, 'https://app.fodda.ai/api/account/setup-url?email=newuser%40example.com');
66
+ console.log('✅ Test 3 Passed\n');
67
+ // ── 2. Monthly plan limit ──
68
+ const monthlyLimitErr = {
69
+ response: {
70
+ status: 403,
71
+ data: {
72
+ ok: false,
73
+ error: 'PLAN_LIMIT_EXCEEDED',
74
+ error_code: 'credit_limit',
75
+ message: 'Monthly credit limit reached. Add a payment method, enable pay-as-you-go, or upgrade to continue.',
76
+ requestId: 'test-plan-1',
77
+ top_up_url: 'https://app.fodda.ai',
78
+ overage_rate_usd: 0.50,
79
+ renews_at: '2026-10-29T20:00:00.000Z',
80
+ setupUrl: 'https://app.fodda.ai/api/account/setup-url?email=baseuser%40example.com',
81
+ upgradeUrl: 'https://app.fodda.ai?view=billing',
82
+ usage: { remaining: 0, total: 100, accountStatus: 'active', planCode: '2' },
83
+ agent_checkout: {
84
+ url: 'https://app.fodda.ai/api/account/checkout/agent-session',
85
+ api_calls: 200
86
+ }
87
+ }
88
+ }
89
+ };
90
+ console.log('Test 4: handleAccessError returns unified PLAN_LIMIT_EXCEEDED shape');
91
+ const accessPlanRes = await handleAccessError(monthlyLimitErr, 'search_graph', 'baseuser@example.com', 'sk_live_baseuser');
92
+ assert.strictEqual(accessPlanRes.isError, true);
93
+ const parsedAccessPlan = JSON.parse(accessPlanRes.content[0].text);
94
+ assert.strictEqual(parsedAccessPlan.code, 'PLAN_LIMIT_EXCEEDED');
95
+ assert.strictEqual(parsedAccessPlan.status, 'PLAN_LIMIT_EXCEEDED');
96
+ assert.strictEqual(parsedAccessPlan.action, 'ADD_PAYMENT_METHOD');
97
+ assert.strictEqual(parsedAccessPlan.setup_url, 'https://app.fodda.ai/api/account/setup-url?email=baseuser%40example.com');
98
+ assert.ok(parsedAccessPlan.next_action.includes('https://app.fodda.ai/api/account/setup-url'), 'next_action must contain setup_url');
99
+ console.log('✅ Test 4 Passed\n');
100
+ console.log('Test 5: handleTrialCreditExhaustion returns unified PLAN_LIMIT_EXCEEDED with ADD_PAYMENT_METHOD');
101
+ const trialPlanRes = await handleTrialCreditExhaustion(monthlyLimitErr, 'sk_live_baseuser', 'baseuser@example.com');
102
+ assert.ok(trialPlanRes, 'handleTrialCreditExhaustion must return a response');
103
+ assert.strictEqual(trialPlanRes.isError, true);
104
+ const parsedTrialPlan = JSON.parse(trialPlanRes.content[0].text);
105
+ assert.strictEqual(parsedTrialPlan.code, 'PLAN_LIMIT_EXCEEDED');
106
+ assert.strictEqual(parsedTrialPlan.status, 'PLAN_LIMIT_EXCEEDED');
107
+ assert.strictEqual(parsedTrialPlan.action, 'ADD_PAYMENT_METHOD');
108
+ assert.strictEqual(parsedTrialPlan.setup_url, 'https://app.fodda.ai/api/account/setup-url?email=baseuser%40example.com');
109
+ console.log('✅ Test 5 Passed\n');
110
+ // ── 3. Top-Up 200 API calls checkout copy (dynamic from payload) ──
111
+ const legacyExhaustionWithPriceErr = {
112
+ response: {
113
+ status: 403,
114
+ data: {
115
+ ok: false,
116
+ error: 'CREDITS_EXHAUSTED',
117
+ agent_checkout: {
118
+ url: 'https://app.fodda.ai/api/account/checkout/agent-session',
119
+ api_calls: 200,
120
+ price_usd: 100
121
+ }
122
+ }
123
+ }
124
+ };
125
+ console.log('Test 6A: CREDITS_EXHAUSTED with price_usd returns isError: true and verbatim next_action with price');
126
+ const trialTopupWithPriceRes = await handleTrialCreditExhaustion(legacyExhaustionWithPriceErr, 'sk_live_baseuser', 'baseuser@example.com');
127
+ assert.ok(trialTopupWithPriceRes);
128
+ assert.strictEqual(trialTopupWithPriceRes.isError, true, 'CREDITS_EXHAUSTED must be isError: true action');
129
+ const parsedTopupWithPrice = JSON.parse(trialTopupWithPriceRes.content[0].text);
130
+ assert.strictEqual(parsedTopupWithPrice.code, 'CREDITS_EXHAUSTED');
131
+ assert.strictEqual(parsedTopupWithPrice.action, 'CHECKOUT_AVAILABLE');
132
+ assert.strictEqual(parsedTopupWithPrice.next_action, 'Top up 200 calls for $100: https://app.fodda.ai/api/account/checkout/agent-session');
133
+ console.log('✅ Test 6A Passed\n');
134
+ const legacyExhaustionNoPriceErr = {
135
+ response: {
136
+ status: 403,
137
+ data: {
138
+ ok: false,
139
+ error: 'CREDITS_EXHAUSTED',
140
+ agent_checkout: {
141
+ url: 'https://app.fodda.ai/api/account/checkout/agent-session',
142
+ api_calls: 200
143
+ }
144
+ }
145
+ }
146
+ };
147
+ console.log('Test 6B: CREDITS_EXHAUSTED without price_usd formats without invented dollar amount');
148
+ const trialTopupNoPriceRes = await handleTrialCreditExhaustion(legacyExhaustionNoPriceErr, 'sk_live_baseuser', 'baseuser@example.com');
149
+ assert.ok(trialTopupNoPriceRes);
150
+ assert.strictEqual(trialTopupNoPriceRes.isError, true);
151
+ const parsedTopupNoPrice = JSON.parse(trialTopupNoPriceRes.content[0].text);
152
+ assert.strictEqual(parsedTopupNoPrice.next_action, 'Top up 200 calls: https://app.fodda.ai/api/account/checkout/agent-session');
153
+ console.log('✅ Test 6B Passed\n');
154
+ // ── 4. TRIAL_EXHAUSTED framing ──
155
+ const trialExhaustedErr = {
156
+ response: {
157
+ status: 403,
158
+ data: {
159
+ ok: false,
160
+ isTrial: true,
161
+ error: 'TRIAL_EXHAUSTED'
162
+ }
163
+ }
164
+ };
165
+ console.log('Test 7: TRIAL_EXHAUSTED uses app.fodda.ai and free Base framing');
166
+ const trialExhaustedRes = await handleTrialCreditExhaustion(trialExhaustedErr, 'sk_live_trialuser', 'trial@example.com');
167
+ assert.ok(trialExhaustedRes);
168
+ assert.strictEqual(trialExhaustedRes.isError, true);
169
+ const parsedTrial = JSON.parse(trialExhaustedRes.content[0].text);
170
+ assert.strictEqual(parsedTrial.code, 'TRIAL_EXHAUSTED');
171
+ assert.strictEqual(parsedTrial.action, 'UPGRADE_REQUIRED');
172
+ assert.ok(parsedTrial.upgrade_url.includes('app.fodda.ai'), 'Must point to app.fodda.ai');
173
+ assert.ok(!parsedTrial.upgrade_url.includes('fodda.ai/account/billing'), 'Must not point to fodda.ai/account/billing');
174
+ assert.ok(!parsedTrial.next_action.includes('top up'), 'Must drop top up framing');
175
+ assert.ok(parsedTrial.next_action.includes('free Base account'), 'Must frame as free Base account');
176
+ console.log('✅ Test 7 Passed\n');
177
+ // ── 5. ChatGPT Commerce-Silence Parity across all 4 limit codes ──
178
+ console.log('Test 8: ChatGPT sessions receive clean QUOTA_EXHAUSTED for all limit codes (handleTrialCreditExhaustion + handleAccessError)');
179
+ const testCases = [
180
+ { name: 'DAILY_LIMIT_EXCEEDED', err: dailyLimitErr },
181
+ { name: 'PLAN_LIMIT_EXCEEDED', err: monthlyLimitErr },
182
+ { name: 'CREDITS_EXHAUSTED', err: legacyExhaustionWithPriceErr },
183
+ { name: 'TRIAL_EXHAUSTED', err: trialExhaustedErr },
184
+ ];
185
+ for (const tc of testCases) {
186
+ // Test handleTrialCreditExhaustion with chatgpt source
187
+ const trialGptRes = await handleTrialCreditExhaustion(tc.err, 'sk_live_123', 'gptuser@example.com', 'chatgpt');
188
+ assert.ok(trialGptRes, `${tc.name}: handleTrialCreditExhaustion must return response for chatgpt`);
189
+ assert.strictEqual(trialGptRes.isError, true);
190
+ const parsedTrialGpt = JSON.parse(trialGptRes.content[0].text);
191
+ assert.strictEqual(parsedTrialGpt.error, 'QUOTA_EXHAUSTED', `${tc.name}: error must be QUOTA_EXHAUSTED`);
192
+ assert.strictEqual(parsedTrialGpt.manage_url, 'https://app.fodda.ai/account');
193
+ assert.strictEqual(parsedTrialGpt.setup_url, undefined);
194
+ assert.strictEqual(parsedTrialGpt.top_up_url, undefined);
195
+ assert.strictEqual(parsedTrialGpt.overage_rate_usd, undefined);
196
+ assert.ok(!trialGptRes.content[0].text.includes('stripe'), `${tc.name}: must not leak stripe`);
197
+ assert.ok(!trialGptRes.content[0].text.includes('$'), `${tc.name}: must not leak dollar prices`);
198
+ assert.ok(!trialGptRes.content[0].text.includes('API calls'), `${tc.name}: must not leak "API calls" text`);
199
+ // Test handleAccessError with chatgpt source
200
+ const accessGptRes = await handleAccessError(tc.err, 'search_graph', 'gptuser@example.com', 'sk_live_123', 'chatgpt');
201
+ assert.strictEqual(accessGptRes.isError, true);
202
+ const parsedAccessGpt = JSON.parse(accessGptRes.content[0].text);
203
+ assert.strictEqual(parsedAccessGpt.error, 'QUOTA_EXHAUSTED', `${tc.name}: access error must be QUOTA_EXHAUSTED`);
204
+ assert.strictEqual(parsedAccessGpt.manage_url, 'https://app.fodda.ai/account');
205
+ assert.ok(!accessGptRes.content[0].text.includes('stripe'));
206
+ assert.ok(!accessGptRes.content[0].text.includes('$'));
207
+ assert.ok(!accessGptRes.content[0].text.includes('API calls'));
208
+ }
209
+ console.log('✅ Test 8 Passed: All 4 credit codes on ChatGPT session return clean QUOTA_EXHAUSTED\n');
210
+ console.log('All Unified Limit Error & ChatGPT Commerce-Silence tests passed successfully!');
211
+ }
212
+ runTests().catch((err) => {
213
+ console.error('Test failed:', err);
214
+ process.exit(1);
215
+ });
216
+ //# sourceMappingURL=test_limit_and_credit_card_capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_limit_and_credit_card_capture.js","sourceRoot":"","sources":["../src/test_limit_and_credit_card_capture.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/
3
3
  async function testListGraphsTopics() {
4
4
  const BASE_URL = process.env.TEST_URL || 'https://mcp.fodda.ai';
5
5
  console.log(`=== Testing list_graphs topics/verticals serialization: ${BASE_URL} ===\n`);
6
- const transport = new StreamableHTTPClientTransport(new URL(`${BASE_URL}/mcp?api_key=sk_live_test_verifier`));
6
+ const transport = new StreamableHTTPClientTransport(new URL(`${BASE_URL}/mcp?api_key=sk_live_test_verifier&session_kind=internal-test`));
7
7
  const client = new Client({ name: 'verifier-client', version: '1.0.0' });
8
8
  await client.connect(transport);
9
9
  const res = await client.callTool({
@@ -1 +1 @@
1
- {"version":3,"file":"test_list_graphs_topics.js","sourceRoot":"","sources":["../src/test_list_graphs_topics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,KAAK,UAAU,oBAAoB;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,sBAAsB,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,2DAA2D,QAAQ,QAAQ,CAAC,CAAC;IAEzF,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAC/C,IAAI,GAAG,CAAC,GAAG,QAAQ,oCAAoC,CAAC,CAC3D,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAgB,CAAC,CAAC;IAEvC,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,QAAQ,CAAC;QACnC,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,EAAE;KAChB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,8CAA8C,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3F,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,oBAAoB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"test_list_graphs_topics.js","sourceRoot":"","sources":["../src/test_list_graphs_topics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,KAAK,UAAU,oBAAoB;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,sBAAsB,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,2DAA2D,QAAQ,QAAQ,CAAC,CAAC;IAEzF,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAC/C,IAAI,GAAG,CAAC,GAAG,QAAQ,+DAA+D,CAAC,CACtF,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAgB,CAAC,CAAC;IAEvC,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,QAAQ,CAAC;QACnC,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,EAAE;KAChB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,8CAA8C,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3F,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,oBAAoB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_live_deployed_mcp_search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_live_deployed_mcp_search.d.ts","sourceRoot":"","sources":["../src/test_live_deployed_mcp_search.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import dotenv from 'dotenv';
2
+ dotenv.config();
3
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
5
+ import axios from 'axios';
6
+ const DEPLOYED_MCP_URL = process.env.TEST_URL || 'https://mcp.fodda.ai/mcp';
7
+ const AIRTABLE_API_KEY = process.env.AIRTABLE_API_KEY;
8
+ const FODDA_API_KEY = process.env.FODDA_API_KEY || 'sk_live_abcdef';
9
+ const AIRTABLE_BASE_ID = 'appXUeeWN1uD9NdCW';
10
+ const AIRTABLE_QUESTIONS_TABLE_ID = 'tblvHx1DzwuTq3TJE';
11
+ async function testLiveDeployedMCPSearch() {
12
+ console.log(`=== Real Joint Integration Test: Live Deployed MCP Server (${DEPLOYED_MCP_URL}) ===\n`);
13
+ if (!AIRTABLE_API_KEY) {
14
+ console.error('❌ AIRTABLE_API_KEY is required for verifying Airtable row enrichment.');
15
+ process.exit(1);
16
+ }
17
+ const testQuery = `agent commerce multi graph live test ${Date.now()}`;
18
+ console.log(`1. Connecting to live MCP server at ${DEPLOYED_MCP_URL} with valid API key...`);
19
+ const transport = new StreamableHTTPClientTransport(new URL(`${DEPLOYED_MCP_URL}?api_key=${FODDA_API_KEY}&session_kind=internal-test`));
20
+ const client = new Client({ name: 'live-integration-verifier', version: '1.0.0' });
21
+ await client.connect(transport);
22
+ console.log(' Connected successfully to live MCP server');
23
+ console.log(`2. Executing multi-graph search_graph for query: "${testQuery}"...`);
24
+ const searchResult = await client.callTool({
25
+ name: 'search_graph',
26
+ arguments: {
27
+ query: testQuery,
28
+ limit: 10
29
+ }
30
+ });
31
+ console.log(' Tool call returned result');
32
+ await client.close();
33
+ console.log('3. Waiting 4 seconds for async Airtable logging/enrichment to complete...');
34
+ await new Promise(resolve => setTimeout(resolve, 4000));
35
+ console.log('4. Querying Airtable Questions table for the logged query...');
36
+ const airtableUrl = `https://api.airtable.com/v0/${AIRTABLE_BASE_ID}/${AIRTABLE_QUESTIONS_TABLE_ID}`;
37
+ const headers = {
38
+ 'Authorization': `Bearer ${AIRTABLE_API_KEY}`,
39
+ 'Content-Type': 'application/json'
40
+ };
41
+ const filterFormula = encodeURIComponent(`{question} = '${testQuery}'`);
42
+ const searchResp = await axios.get(`${airtableUrl}?filterByFormula=${filterFormula}`, { headers });
43
+ const records = searchResp.data.records || [];
44
+ console.log(` Found ${records.length} record(s) in Airtable Questions table`);
45
+ if (records.length === 0) {
46
+ console.error(`❌ FAIL: Expected 1 record in Airtable for "${testQuery}", found 0.`);
47
+ process.exit(1);
48
+ }
49
+ if (records.length > 1) {
50
+ console.error(`❌ FAIL: Expected exactly 1 record, found ${records.length} (duplicate logging bug).`);
51
+ process.exit(1);
52
+ }
53
+ const row = records[0];
54
+ const fields = row.fields;
55
+ console.log('\n--- Live Airtable Integration Record ---');
56
+ console.log(`Record ID: ${row.id}`);
57
+ console.log(`Question: ${fields.question}`);
58
+ console.log(`User Email: ${fields.userEmail}`);
59
+ console.log(`Graph ID: ${fields.graphId}`);
60
+ console.log(`Result Count: ${fields.resultCount}`);
61
+ console.log(`Result Quality: ${fields.resultQuality}`);
62
+ console.log(`User Context: ${fields.userContext}`);
63
+ console.log(`Interaction Type: ${fields.interaction_type}`);
64
+ let passed = true;
65
+ if (fields.resultQuality === undefined || fields.resultQuality === null) {
66
+ console.error('❌ FAIL: resultQuality is missing on the enriched row');
67
+ passed = false;
68
+ }
69
+ if (!fields.userContext || !fields.userContext.includes('searched_graphs:')) {
70
+ console.error(`❌ FAIL: userContext does not contain searched_graphs attribution. Got: "${fields.userContext}"`);
71
+ passed = false;
72
+ }
73
+ if (passed) {
74
+ console.log('\n🎉 REAL MULTI-GRAPH SEARCH JOINT INTEGRATION TEST PASSED SUCCESSFULLY!');
75
+ console.log(` Verified: Exactly 1 row (${row.id}), resultQuality="${fields.resultQuality}", userContext="${fields.userContext}"`);
76
+ }
77
+ else {
78
+ process.exit(1);
79
+ }
80
+ }
81
+ testLiveDeployedMCPSearch().catch(err => {
82
+ console.error('❌ Joint integration test failed:', err.message || err);
83
+ process.exit(1);
84
+ });
85
+ //# sourceMappingURL=test_live_deployed_mcp_search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_live_deployed_mcp_search.js","sourceRoot":"","sources":["../src/test_live_deployed_mcp_search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test_live_deployed_split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_live_deployed_split.d.ts","sourceRoot":"","sources":["../src/test_live_deployed_split.ts"],"names":[],"mappings":""}