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
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  [![MCP Registry](https://img.shields.io/badge/MCP_Registry-ai.fodda%2Fmcp--server-blue)](https://registry.modelcontextprotocol.io/v0.1/servers?search=ai.fodda/mcp-server)
9
9
  [![npm](https://img.shields.io/npm/v/fodda-mcp)](https://www.npmjs.com/package/fodda-mcp)
10
- [![Version](https://img.shields.io/badge/version-1.30.0-green)](./CHANGELOG.md)
10
+ [![Version](https://img.shields.io/badge/version-1.46.85-green)](./CHANGELOG.md)
11
11
  [![License](https://img.shields.io/badge/license-Proprietary-red)](https://fodda.ai)
12
12
 
13
13
  </div>
@@ -18,97 +18,26 @@
18
18
 
19
19
  ### Claude (Web — Pro, Max, Team, Enterprise)
20
20
 
21
- 1. Get your personal MCP URL at [app.fodda.ai](https://app.fodda.ai) → Account → MCP Integration (format: `https://mcp.fodda.ai/c/<your-token>`)
21
+ 1. Get your personal MCP URL at [app.fodda.ai](https://app.fodda.ai) → Connections (format: `https://mcp.fodda.ai/c/<your-token>`)
22
22
  2. In Claude, go to **Settings → Connectors → Add custom connector**, paste the URL, and click **Add**
23
23
  3. Start chatting with your Fodda knowledge graphs
24
24
 
25
- > **Note:** legacy `?api_key=` or `?user_id=` query string URLs are deprecated and return HTTP 401 with explicit instructions (`Fodda: this connection URL is outdated. Get your new MCP URL at https://app.fodda.ai...`). Get your fresh MCP URL or connect via OAuth at [app.fodda.ai](https://app.fodda.ai).
25
+ > **Note:** Legacy URL query-string parameter authentication is deprecated and returns HTTP 401 with instructions. Get your fresh MCP URL or connect via OAuth at [app.fodda.ai](https://app.fodda.ai).
26
26
 
27
-
28
- ### Claude Code (CLI — SSE)
27
+ ### Claude Code (CLI)
29
28
 
30
29
  ```bash
31
- claude mcp add --transport sse fodda https://mcp.fodda.ai/sse \
32
- --header "Authorization: Bearer YOUR_API_KEY"
33
- ```
34
-
35
- ### Claude Enterprise
36
-
37
- For Claude Enterprise with admin-managed connectors, your workspace admin can register the Fodda MCP server using the same Streamable HTTP endpoint (`https://mcp.fodda.ai/mcp`) via the Admin Console. See [Enterprise MCP Setup](./Enterprise_MCP_Setup.md) for full details.
38
-
39
- ### OpenAI (Responses API — Recommended)
40
-
41
- Use OpenAI's native MCP support — no function definitions needed:
30
+ # Connect via OAuth:
31
+ claude mcp add --transport http fodda https://mcp.fodda.ai/mcp
42
32
 
43
- ```python
44
- from openai import OpenAI
45
- client = OpenAI()
46
-
47
- resp = client.responses.create(
48
- model="gpt-5",
49
- tools=[{
50
- "type": "mcp",
51
- "server_label": "fodda",
52
- "server_description": "Expert-curated knowledge graphs for retail, beauty, sports trends and earnings intelligence.",
53
- "server_url": "https://mcp.fodda.ai/mcp",
54
- "authorization": "Bearer YOUR_API_KEY",
55
- "require_approval": "never",
56
- }],
57
- input="What are the top emerging retail trends?",
58
- )
59
- print(resp.output_text)
60
- ```
61
-
62
- ```javascript
63
- import OpenAI from "openai";
64
- const client = new OpenAI();
65
-
66
- const resp = await client.responses.create({
67
- model: "gpt-5",
68
- tools: [{
69
- type: "mcp",
70
- server_label: "fodda",
71
- server_description: "Expert-curated knowledge graphs for retail, beauty, sports trends and earnings intelligence.",
72
- server_url: "https://mcp.fodda.ai/mcp",
73
- authorization: "Bearer YOUR_API_KEY",
74
- require_approval: "never",
75
- }],
76
- input: "What are the top emerging retail trends?",
77
- });
78
- console.log(resp.output_text);
33
+ # Or with an API key:
34
+ claude mcp add --transport http fodda https://mcp.fodda.ai/mcp \
35
+ --header "Authorization: Bearer sk_live_..."
79
36
  ```
80
37
 
81
- > **Tip:** To reduce latency with 30+ tools, use `allowed_tools` to filter:
82
- > `"allowed_tools": ["search_graph", "search_statistics", "brand_tracker"]`
38
+ ### Client Setup Guides
83
39
 
84
- > **Legacy:** If you're using `chat.completions.create()` with function calling, define a custom function that calls the Fodda REST API. See [fodda.ai/connect](https://app.fodda.ai) for details.
85
-
86
- ### Generic Streamable HTTP Client
87
-
88
- Connect to the `/mcp` endpoint using HTTP `POST` (Streamable HTTP) with `Authorization: Bearer YOUR_API_KEY`:
89
- ```
90
- https://mcp.fodda.ai/mcp
91
- ```
92
-
93
- ### Gemini / Antigravity
94
-
95
- Add to `~/.gemini/config/mcp_config.json`:
96
- ```json
97
- {
98
- "mcpServers": {
99
- "fodda": {
100
- "serverUrl": "https://mcp.fodda.ai/mcp",
101
- "headers": {
102
- "Authorization": "Bearer YOUR_API_KEY"
103
- }
104
- }
105
- }
106
- }
107
- ```
108
-
109
- ### Generic SSE Client
110
-
111
- Connect to `https://mcp.fodda.ai/sse` with an `Authorization: Bearer YOUR_API_KEY` header.
40
+ For complete setup guides across all supported clients — Claude Web, Claude Code, Claude Enterprise, ChatGPT, OpenAI Responses API, Cursor, Gemini, and custom agents — visit **[https://www.fodda.ai/connect](https://www.fodda.ai/connect)**.
112
41
 
113
42
  ---
114
43
 
@@ -197,11 +126,7 @@ In MCP request `_meta`:
197
126
  { "_meta": { "authorization": "Bearer sk_live_..." } }
198
127
  ```
199
128
 
200
- **Fallback — URL query parameter.** Some clients (e.g. the Claude.ai web *custom
201
- connector* UI) cannot set custom request headers. For those, the key may be passed as
202
- `?api_key=...`. This is provided only for compatibility; prefer header-based auth
203
- wherever the client supports it, since URLs are more likely to be logged by
204
- intermediaries. The server never returns your API key in tool output.
129
+ **Connection URLs.** Web connector clients use personal tokenized connection URLs (`https://mcp.fodda.ai/c/<token>`) generated in your [Connections dashboard](https://app.fodda.ai/connections). Raw keys in URLs are not accepted.
205
130
 
206
131
  ---
207
132
 
@@ -209,7 +134,7 @@ intermediaries. The server never returns your API key in tool output.
209
134
 
210
135
  | Variable | Description | Default |
211
136
  |----------|-------------|---------|
212
- | `PORT` | HTTP server port (omit for stdio mode) | — |
137
+ | `PORT` | HTTP server port | `8080` |
213
138
  | `FODDA_API_URL` | Upstream API base URL | `https://api.fodda.ai` |
214
139
  | `FODDA_MCP_SECRET` | HMAC signing secret for API requests | — |
215
140
  | `NODE_ENV` | Environment (`development` / `production`) | `production` |
@@ -221,12 +146,7 @@ intermediaries. The server never returns your API key in tool output.
221
146
  ```bash
222
147
  npm install
223
148
  npm run build
224
-
225
- # Stdio mode
226
149
  npm start
227
-
228
- # SSE mode
229
- PORT=8080 npm start
230
150
  ```
231
151
 
232
152
  ## Self-Hosting
@@ -283,7 +203,7 @@ June 16, 2026) for the complete, authoritative terms.
283
203
  ## Support
284
204
 
285
205
  - **Email:** [hello@fodda.ai](mailto:hello@fodda.ai)
286
- - **Account & API keys:** [app.fodda.ai](https://app.fodda.ai) → Account → MCP Integration
206
+ - **Account & API keys:** [app.fodda.ai](https://app.fodda.ai) → Connections
287
207
  - **Documentation:** [fodda.ai](https://www.fodda.ai)
288
208
 
289
209
  To report a security issue, email **[hello@fodda.ai](mailto:hello@fodda.ai)** with
@@ -11,6 +11,6 @@
11
11
  export declare const SKILL_RESEARCH_METHODOLOGY = "---\nid: FODDA-SKILL-METHODOLOGY-001\ntitle: Fodda Research Methodology Skill\nversion: 2.0.0\ncompliance: RFC-2119\n---\n\n### SEQUENCE: DeepResearch\n1. **Phase 1: PLAN** \u2014 seconds:\n - Decompose the query into 2-4 research dimensions.\n - Identify which knowledge graph verticals are most relevant.\n - Determine if supplemental data sources (Google Trends, BLS, Census, OECD) are needed.\n - Estimate research depth: light (3-4 sources) vs comprehensive (6+ sources).\n2. **Phase 2: SEARCH** \u2014 primary:\n - Analyze pre-loaded Fodda knowledge graph results.\n - Identify convergence patterns across multiple graphs.\n - Track which graphs yielded strong results and which were sparse.\n - Note signal_score values: 80+ is strong, 60-79 is moderate, below 60 is weak.\n3. **Phase 3: READ** \u2014 deepen:\n - Examine evidence snippets and source URLs for key themes.\n - Use Google Search to find additional context for high-signal trends.\n - Use URL Context for primary source verification if external URLs are referenced.\n - Flag conflicting evidence explicitly.\n4. **Phase 4: SYNTHESIZE** \u2014 connect:\n - Identify the 3-5 strongest themes.\n - Rank by signal strength, evidence count, recency, and cross-graph convergence.\n - Build narrative arc: What is happening -> Why it matters -> What comes next.\n - Note gaps in coverage.\n5. **Phase 5: CITE** \u2014 attribute:\n - Every claim MUST reference its source graph and evidence.\n - Attribute findings to source graph by name.\n - Include source URLs as inline citations.\n - Suggest 2-3 follow-up research questions.\n";
12
12
  export declare const SKILL_EVIDENCE_CATEGORIES = "---\nid: FODDA-SKILL-EVIDENCE-001\ntitle: Fodda Evidence Categories Skill\nversion: 2.0.0\ncompliance: RFC-2119\n---\n\n### TOKEN: EvidenceCategories\n\n| Category | What it covers | When to use |\n|----------|---------------|-------------|\n| Case Study | Innovation, strategic moves, novel approaches | Must demonstrate innovation or strategic intent \u2014 NOT routine news |\n| Statistic | Quantitative data \u2014 market sizes, growth rates, survey results | Numbers with clear methodology |\n| Data Point | Factual brand/industry news without innovation | Routine business activity, personnel changes, earnings, regulatory |\n| Analysis | Expert interpretation, industry reports, competitive assessments | Qualitative expert judgment |\n| Interview | Direct quotes from practitioners, executives, researchers | Verbatim attributed speech |\n\n### RULE: EvidenceClassification\n- Case Study REQUIRES demonstrated innovation or strategic intent.\n- Routine brand news (store openings, executive hires) MUST map to Data Point.\n- If an article contains both a stat and analysis, classify by PRIMARY value.\n- \"Report\" MUST map to Analysis.\n- The agent MUST NOT invent a 6th category; all evidence must fit into these 5.\n- A finding MAY cite multiple evidence pieces of different types.\n";
13
13
  export declare const SKILL_OUTPUT_FORMAT = "---\nid: FODDA-SKILL-OUTPUT-001\ntitle: Fodda Output Format Skill\nversion: 2.0.0\ncompliance: RFC-2119\n---\n\n### RECORD: ResearchReport\n- executive_summary: String \u2014 2-3 sentences. The single most important finding, stated as a provocative editorial claim.\n- thematic_sections: List[ThematicSection] \u2014 3-5 thematic narrative sections.\n- strategic_agenda: List[Implication] \u2014 2-3 concrete moves.\n- source_landscape: List[SourceLink] \u2014 bulleted list of all source URLs referenced.\n\n### RULE: OutputFormat\n- Thematic sections MUST:\n - Open with a declarative statement.\n - Use flowing paragraphs with embedded data points (no bullet lists).\n - Weave in source citations inline: \"Sephora's AI Color Match drove a 28% conversion lift (PSFK Retail Graph)\".\n - Close with a practical implication: what this means for the practitioner.\n- Tone MUST read like a senior strategist briefing a CMO, not a consultant deck. Strongest findings first.\n- The agent MUST NOT use italicized terms followed by parenthetical attribution for trends. Instead, weave attribution into the narrative sentence as the subject (e.g. \"One trend, [Trend Name] from [Graph/Expert], highlights how...\").\n- Ground every trend in a named example ONLY IF one is provided in the graph evidence. Do NOT hunt via Google Search for missing examples.\n- If a trend lacks recent statistics, the agent SHOULD use the google_search tool to find recent (2025-2026) statistics.\n- Prefer Fodda graph stats over web stats. Cite Fodda stats as: \"According to research tracked in the [Graph/Expert Name] graph...\".\n";
14
- export declare const SKILL_GRAPH_AWARENESS = "---\nid: FODDA-SKILL-AWARENESS-001\ntitle: Fodda Graph Awareness Skill\nversion: 2.0.0\ncompliance: RFC-2119\n---\n\n### RULE: GraphAwareness\n- Each graph is a curated knowledge graph representing an editorial viewpoint with evidence, not a generic database.\n- Multi-graph convergence (same theme in 2+ graphs) indicates a high-confidence finding.\n- Contradicting graphs MUST be noted explicitly as a tension.\n- Match expert graph terminology on concepts, not labels.\n- Industry report graphs are deep but narrow; excellent for specific verticals.\n\n### TOKEN: GraphTypes\n- PSFK curated graphs: retail, beauty, fashion, sports, sic, ce-design, pew.\n- Expert graphs: individual specialist perspectives (e.g., ezra-eeman-wayfinder, alyson-stevens-macro).\n- Industry report graphs: single-report deep dives (e.g., pwc/sxsw-2026-key-insights, delta/the-connection-index).\n\n### RULE: GraphAttribution\n- The agent MUST NEVER say \"the Fodda graph\" or \"according to Fodda\". Fodda is the platform; graphs are created by named experts.\n- Format: \"According to PSFK's Retail Graph...\" or \"Ezra Eeman's Wayfinder Graph identifies...\".\n- Include graph_id for programmatic reference.\n";
14
+ export declare const SKILL_GRAPH_AWARENESS = "---\nid: FODDA-SKILL-AWARENESS-001\ntitle: Fodda Graph Awareness Skill\nversion: 2.0.0\ncompliance: RFC-2119\n---\n\n### RULE: GraphAwareness\n- Each graph is a curated knowledge graph representing an editorial viewpoint with evidence, not a generic database.\n- Multi-graph convergence (same theme in 2+ graphs) indicates a high-confidence finding.\n- Contradicting graphs MUST be noted explicitly as a tension.\n- Match expert graph terminology on concepts, not labels.\n- Industry report graphs are deep but narrow; excellent for specific verticals.\n\n### TOKEN: GraphTypes\n- PSFK curated graphs: food, retail, tech, travel, beauty, fashion, sports, sic, ce-design, pew.\n- Expert graphs: individual specialist perspectives (e.g., ezra-eeman-wayfinder, alyson-stevens-macro).\n- Industry report graphs: single-report deep dives (e.g., pwc/sxsw-2026-key-insights, delta/the-connection-index).\n\n### RULE: GraphAttribution\n- The agent MUST NEVER say \"the Fodda graph\" or \"according to Fodda\". Fodda is the platform; graphs are created by named experts.\n- Format: \"According to PSFK's Retail Graph...\" or \"Ezra Eeman's Wayfinder Graph identifies...\".\n- Include graph_id for programmatic reference.\n";
15
15
  export declare const SKILL_SOURCE_QUALITY = "---\nid: FODDA-SKILL-QUALITY-001\ntitle: Fodda Source Quality Skill\nversion: 2.0.0\ncompliance: RFC-2119\n---\n\n### TOKEN: SourceCredibilityTiers\n- Tier 5 (Primary Research): Earnings reports, PubMed, OECD, Census, BLS, government filings.\n- Tier 4 (Expert Analysis): PSFK original research, McKinsey, Deloitte, named expert graphs.\n- Tier 3 (Quality Journalism): Financial Times, Bloomberg, Business of Fashion, Wired.\n- Tier 2 (Industry Sources): Trade publications, brand press releases, industry blogs.\n- Tier 1 (Unverified): Social media posts, individual opinions, unattributed claims.\n\n### RULE: SourcePreferenceHierarchy\n- The agent MUST follow this preference order:\n 1. Fodda knowledge graph evidence (pre-vetted, always prefer).\n 2. Supplemental structured data (BLS, Census, Google Trends, OECD).\n 3. Google Search results (web-sourced context for themes not covered).\n 4. URL-fetched primary sources (for deep verification).\n\n### RULE: SourceQualityGate\n- At least 60% of cited evidence SHOULD be tier 3 or above.\n- The agent MUST NOT present a tier 1-2 source without qualification (\"industry reports suggest...\").\n- Acknowledge explicitly if a finding relies on a single source.\n### RULE: ConflictingEstimates\n- When multiple sources provide conflicting quantitative estimates for the same metric (e.g. market size, growth rate, CAGR), the agent MUST surface ALL estimates with their sources rather than silently selecting one.\n- Present conflicting data as: \"Estimates range from $X (Source A) to $Y (Source B), reflecting [methodological, scope, or forecast horizon differences].\"\n- Never present a subset figure (e.g. built-in cabinets) as smaller than a total figure if the source numbers contradict; explicitly flag and reconcile the divergence.\n\n### RULE: OutlierOrderOfMagnitudeGuardrail\n- When reported market size figures for a specific product category differ by an order of magnitude or more from the general consensus cluster (e.g. $430 billion vs $1.5-$3.5 billion for wine fridges/coolers), ALWAYS treat the extreme outlier as a data or unit annotation error (e.g. millions mistranslated as billions) and DISCARD it.\n- NEVER present, include, or hedge an impossible outlier number (e.g. claiming a single niche appliance sub-category is worth hundreds of billions).\n";
16
16
  //# sourceMappingURL=skills.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/agents/fodda-researcher/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,eAAO,MAAM,0BAA0B,wmDAiCtC,CAAC;AAMF,eAAO,MAAM,yBAAyB,mxCAwBrC,CAAC;AAMF,eAAO,MAAM,mBAAmB,klDAwB/B,CAAC;AAMF,eAAO,MAAM,qBAAqB,8qCAuBjC,CAAC;AAMF,eAAO,MAAM,oBAAoB,gyEAiChC,CAAC"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/agents/fodda-researcher/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,eAAO,MAAM,0BAA0B,wmDAiCtC,CAAC;AAMF,eAAO,MAAM,yBAAyB,mxCAwBrC,CAAC;AAMF,eAAO,MAAM,mBAAmB,klDAwB/B,CAAC;AAMF,eAAO,MAAM,qBAAqB,ksCAuBjC,CAAC;AAMF,eAAO,MAAM,oBAAoB,gyEAiChC,CAAC"}
@@ -119,7 +119,7 @@ compliance: RFC-2119
119
119
  - Industry report graphs are deep but narrow; excellent for specific verticals.
120
120
 
121
121
  ### TOKEN: GraphTypes
122
- - PSFK curated graphs: retail, beauty, fashion, sports, sic, ce-design, pew.
122
+ - PSFK curated graphs: food, retail, tech, travel, beauty, fashion, sports, sic, ce-design, pew.
123
123
  - Expert graphs: individual specialist perspectives (e.g., ezra-eeman-wayfinder, alyson-stevens-macro).
124
124
  - Industry report graphs: single-report deep dives (e.g., pwc/sxsw-2026-key-insights, delta/the-connection-index).
125
125
 
@@ -10,5 +10,5 @@ export declare function renderBrandWidget(profile: any): Promise<{
10
10
  editorial_context: any;
11
11
  open_slots: string[];
12
12
  }>;
13
- export declare const TEMPLATE = "\n<style>\n:root{--p:#663399;--pl:#F5F0FF;--pm:#9B72CC;--pl-on:#663399;}\n@media(prefers-color-scheme:dark){:root{--p:#9B72CC;--pl:rgba(155,114,204,0.14);--pm:#663399;--pl-on:#C4A7E8;}}\n.w{border:1px solid var(--p);border-top:3px solid var(--p);border-radius:6px;padding:1.25rem;font-family:var(--font-mono);}\n.hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.25rem;padding-bottom:1rem;border-bottom:.5px solid var(--color-border-tertiary);}\n.logo{display:flex;align-items:center;gap:10px;}\n.logo img{height:24px;width:auto;display:block;}\n.lt{font-size:13px;font-weight:500;}.ls{font-size:10px;color:var(--color-text-secondary);}\n.bfolio{font-family:var(--font-mono);font-size:10px;letter-spacing:0.18em;text-transform:uppercase;color:var(--color-text-secondary);}\n.bh{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.75rem;}\n.bn{font-family:var(--font-serif);font-style:italic;font-weight:400;font-size:22px;letter-spacing:-0.01em;}\n.vc{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;font-family:var(--font-mono);}\n.vc-up{color:var(--color-text-success);}\n.vc-build{color:var(--color-text-info);}\n.vc-steady{color:var(--color-text-secondary);}\n.vc-slow{color:var(--color-text-warning);}\n.pv{font-size:14px;font-family:var(--font-serif);font-style:italic;font-weight:400;line-height:1.65;padding:14px 16px;background:var(--pl);border:1px solid var(--p);border-left-width:3px;border-radius:4px;margin-bottom:1.25rem;color:var(--color-text-primary);}\n.lcb{display:flex;height:8px;border-radius:4px;overflow:hidden;margin-bottom:.75rem;gap:2px;}\n.lcl{display:flex;gap:12px;margin-bottom:1.25rem;flex-wrap:wrap;}\n.lci{display:flex;align-items:center;gap:5px;font-size:10px;color:var(--color-text-secondary);}\n.lcd{width:8px;height:8px;border-radius:2px;}\n.card{background:var(--color-background-primary);border:1px solid var(--color-border-tertiary);border-radius:4px;padding:1rem 1.25rem;margin-bottom:8px;transition:border-color .15s,background .15s;}\n.card:hover{border-color:var(--p);background:var(--pl);}\n.th{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:6px;gap:8px;}\n.tn{font-size:13px;font-weight:500;}\n.ta{display:flex;align-items:center;gap:4px;flex-shrink:0;}\n.td{font-size:12px;color:var(--color-text-secondary);margin-bottom:5px;line-height:1.5;}\n.lb{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;white-space:nowrap;font-family:var(--font-mono);background:transparent;}\n.lb-b{color:var(--color-text-info);}\n.lb-e{color:var(--color-text-success);}\n.lb-m{color:var(--color-text-secondary);}\n.lb-f{color:var(--color-text-warning);}\n.bd{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;background:transparent;color:var(--color-text-secondary);font-family:var(--font-mono);}\n.bd-fast{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;background:transparent;color:#7A4000;font-family:var(--font-mono);}\n.bdp{font-size:10px;padding:2px 8px;border-radius:20px;background:var(--pl);color:var(--pl-on);font-family:var(--font-mono);}\n.brow{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;}\n.wl{font-size:11px;color:var(--color-text-secondary);margin:1.25rem 0 8px;display:flex;align-items:center;gap:6px;}\n.wd{width:6px;height:6px;border-radius:50%;background:var(--color-text-warning);display:inline-block;}\n.ec{border:1px dashed var(--color-border-tertiary);border-radius:4px;margin-bottom:8px;padding:1rem 1.25rem;}\n.et a{color:var(--color-text-info);text-decoration:none;font-size:13px;font-weight:500;}.et a:hover{text-decoration:underline;}\n.ex{font-size:12px;color:var(--color-text-secondary);line-height:1.5;margin:6px 0 8px;}\n.em{display:flex;gap:6px;flex-wrap:wrap;}\n.cit{font-size:10px;color:var(--color-text-secondary);margin-top:8px;padding-top:8px;border-top:.5px solid var(--color-border-tertiary);}\n.cit a{color:var(--color-text-info);text-decoration:none;}\n.cat-cs{background:var(--color-background-info);color:var(--color-text-info);}\n.cat-si{background:var(--pl);color:var(--p);}\n.cat-me{background:var(--color-background-success);color:var(--color-text-success);}\n.cat-qu{background:var(--color-background-warning);color:var(--color-text-warning);}\n.cat-in{background:var(--color-background-secondary);color:var(--color-text-secondary);}\n.cc{background:var(--color-background-primary);border:1px solid var(--color-border-tertiary);border-radius:4px;padding:.875rem 1.25rem;margin-bottom:6px;display:flex;justify-content:space-between;align-items:center;}\n.cn{font-size:13px;font-weight:500;margin-bottom:3px;}\n.cd{font-size:11px;color:var(--color-text-secondary);}\n.ca{display:flex;flex-direction:column;align-items:flex-end;gap:6px;}\n.pb{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;font-family:var(--font-mono);background:transparent;}\n.sl2, .sec{font-size:13px;font-weight:500;color:var(--color-text-primary);margin:1.25rem 0 8px;}.sl2:first-child, .sec:first-child{margin-top:0;}\n.br{display:flex;align-items:center;gap:8px;margin-bottom:5px;font-size:12px;}\n.brl{width:120px;color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0;}\n.brt{flex:1;height:4px;background:var(--color-background-secondary);border-radius:3px;overflow:hidden;}\n.brf{height:100%;background:var(--p);border-radius:3px;}\n.brc{min-width:44px;text-align:right;color:var(--color-text-secondary);font-size:11px;}\n.sg{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:1rem;}\n.sk{background:var(--color-background-secondary);border-radius:8px;padding:10px 12px;}\n.skl{font-size:10px;color:var(--color-text-secondary);margin-bottom:3px;}\n.skv{font-family:var(--font-serif);font-style:italic;font-size:22px;font-weight:400;}.sks{font-size:10px;color:var(--color-text-secondary);margin-top:2px;}\n.rq{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:.75rem;}\n.rqp{font-size:10px;padding:3px 9px;border-radius:20px;background:var(--color-background-secondary);color:var(--color-text-secondary);border:.5px solid var(--color-border-tertiary);}\n.xb{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--color-background-secondary);border:.5px solid var(--color-border-tertiary);border-radius:8px;cursor:pointer;text-align:left;width:100%;margin-bottom:8px;font-family:var(--font-mono);transition:all .15s;}\n.xb:hover{background:var(--pl);border-color:var(--pm);}\n.xi{font-size:11px;width:28px;font-weight:500;flex-shrink:0;color:var(--color-text-secondary);}\n.xd{font-size:11px;color:var(--color-text-secondary);margin-top:2px;}\n.xbl{font-weight:500;font-size:12px;}\n.gf{display:flex;gap:5px;flex-wrap:wrap;margin-top:1.5rem;padding-top:1rem;border-top:.5px solid var(--color-border-tertiary);align-items:center;}\n.gfl{font-size:10px;color:var(--color-text-secondary);margin-right:2px;}\n.gp{font-size:10px;padding:2px 9px;border-radius:20px;background:var(--pl);color:var(--pl-on);border:.5px solid var(--pm);}\n.ap{background:var(--color-background-secondary);border-radius:8px;margin-bottom:6px;padding:.75rem 1rem;display:flex;justify-content:space-between;align-items:center;}\n.an2{font-size:12px;font-weight:500;}\n.am2{font-size:11px;color:var(--color-text-secondary);margin-top:2px;}\n.astar{font-size:11px;color:var(--p);}\n.note{font-size:10px;color:var(--color-text-secondary);margin-bottom:1.25rem;}\n.btn-out{font-size:9px;padding:2px 7px;cursor:pointer;border:.5px solid var(--pm);border-radius:20px;background:var(--pl);color:var(--pl-on);font-family:var(--font-mono);}\n.btn-out:hover{background:var(--p);color:#fff;border-color:var(--p);}\n.cp{font-size:11px;background:var(--pl);color:var(--pl-on);border:.5px solid var(--pm);border-radius:20px;padding:3px 10px;cursor:pointer;font-family:var(--font-mono);transition:all .15s;}\n.cp:hover{background:var(--p);color:#fff;}\n.cv{font-size:10px;background:var(--pl);color:var(--pl-on);border:.5px solid var(--pm);border-radius:20px;padding:2px 8px;cursor:pointer;font-family:var(--font-mono);transition:all .15s;}\n.cv:hover{background:var(--p);color:#fff;}\n.an{font-size:13px;line-height:1.7;color:var(--color-text-primary);}\n.an p{margin:0 0 .75rem;}\n.an strong{font-weight:500;}\n.si{font-size:12px;line-height:1.65;color:var(--color-text-secondary);font-style:italic;margin:0 0 1rem;}\n</style>\n\n<div class=\"w\">\n <div class=\"hd\">\n <div class=\"logo\">\n <img src=\"https://cdn.jsdelivr.net/gh/piers-fawkes/fodda-demo@main/public/fodda-mini-logo-claude.png\" alt=\"Fodda\" style=\"height:24px;width:24px;\"/>\n <div><div class=\"lt\">Fodda</div><div class=\"ls\">Brand Intelligence</div></div>\n </div>\n <div class=\"bfolio\">{{FOLIO}}</div>\n </div>\n\n <div class=\"bh\">\n <div class=\"bn\">{{BRAND_NAME}}</div>\n <span class=\"vc {{VELOCITY_CLASS}}\">{{VELOCITY_LABEL}}</span>\n </div>\n\n <div class=\"pv\">{{ONE_LINER}}</div>\n\n <div class=\"sec\">Case Studies</div>\n {{EVIDENCE_HTML}}\n\n {{EARNINGS_SECTION_HTML}}\n {{FINANCIAL_SNAPSHOT_SECTION_HTML}}\n\n <div class=\"sec\">Relevant trends</div>\n {{TREND_FOOTPRINT_INTRO}}\n <div class=\"lcb\">{{LIFECYCLE_BAR}}</div>\n <div class=\"lcl\">{{LIFECYCLE_LEGEND}}</div>\n {{TRENDS_HTML}}\n {{WEAK_SIGNALS_HTML}}\n\n <div class=\"sec\">Competitive</div>\n {{COMPETITOR_LIST_HTML}}\n\n <div class=\"sec\">Market data</div>\n {{MARKET_DATA_INTRO}}\n <div class=\"sl2\">US retail sales \u2014 Census Bureau</div>\n <div class=\"sg\">\n <div class=\"sk\"><div class=\"skl\">{{BEA_STAT_1_LABEL}}</div><div class=\"skv\">{{BEA_STAT_1_VALUE}}</div><div class=\"sks\">{{BEA_STAT_1_SUB}}</div></div>\n <div class=\"sk\"><div class=\"skl\">{{BEA_STAT_2_LABEL}}</div><div class=\"skv\">{{BEA_STAT_2_VALUE}}</div><div class=\"sks\">{{BEA_STAT_2_SUB}}</div></div>\n </div>\n\n {{GT_SECTION_HTML}}\n {{GT_COMPARISON_SECTION_HTML}}\n {{RELATED_QUERIES_SECTION_HTML}}\n\n <div class=\"sl2\">Wikipedia \u2014 avg daily pageviews</div>\n {{WIKI_BARS_HTML}}\n <p class=\"note\">{{WIKI_NOTE}}</p>\n\n <div class=\"sl2\">Amazon footprint</div>\n <div class=\"sg\">\n <div class=\"sk\"><div class=\"skl\">{{AMAZON_STAT_1_LABEL}}</div><div class=\"skv\">{{AMAZON_STAT_1_VALUE}}</div><div class=\"sks\">{{AMAZON_STAT_1_SUB}}</div></div>\n <div class=\"sk\"><div class=\"skl\">{{AMAZON_STAT_2_LABEL}}</div><div class=\"skv\">{{AMAZON_STAT_2_VALUE}}</div><div class=\"sks\">{{AMAZON_STAT_2_SUB}}</div></div>\n <div class=\"sk\"><div class=\"skl\">{{AMAZON_STAT_3_LABEL}}</div><div class=\"skv\">{{AMAZON_STAT_3_VALUE}}</div><div class=\"sks\">{{AMAZON_STAT_3_SUB}}</div></div>\n <div class=\"sk\"><div class=\"skl\">{{AMAZON_STAT_4_LABEL}}</div><div class=\"skv\">{{AMAZON_STAT_4_VALUE}}</div><div class=\"sks\">{{AMAZON_STAT_4_SUB}}</div></div>\n </div>\n {{AMAZON_PRODUCTS_HTML}}\n <p class=\"note\">{{AMAZON_CAPTION}}</p>\n\n {{GEO_SECTION_HTML}}\n\n <div class=\"sec\">Explore further</div>\n {{SUGGESTED_NEXT_HTML}}\n <button class=\"xb\" onclick=\"sendPrompt('{{EXPORT_1_PROMPT}}')\"><span class=\"xi\">\u2197</span><div><div class=\"xbl\">{{EXPORT_1_LABEL}}</div><div class=\"xd\">{{EXPORT_1_DESC}}</div></div></button>\n <button class=\"xb\" onclick=\"sendPrompt('{{EXPORT_2_PROMPT}}')\"><span class=\"xi\">\u2197</span><div><div class=\"xbl\">{{EXPORT_2_LABEL}}</div><div class=\"xd\">{{EXPORT_2_DESC}}</div></div></button>\n <button class=\"xb\" onclick=\"sendPrompt('{{EXPORT_3_PROMPT}}')\"><span class=\"xi\">\u2197</span><div><div class=\"xbl\">{{EXPORT_3_LABEL}}</div><div class=\"xd\">{{EXPORT_3_DESC}}</div></div></button>\n <button class=\"xb\" onclick=\"sendPrompt('{{EXPORT_4_PROMPT}}')\"><span class=\"xi\">\u2197</span><div><div class=\"xbl\">{{EXPORT_4_LABEL}}</div><div class=\"xd\">{{EXPORT_4_DESC}}</div></div></button>\n\n <div class=\"gf\">\n <span class=\"gfl\">Sources:</span>\n {{SOURCE_PILLS_HTML}}\n</div>";
13
+ export declare const TEMPLATE = "\n<style>\n.fodda-brand-widget, .w {\n --fodda-bg: #ffffff;\n --fodda-bg-secondary: #f8fafc;\n --fodda-text: #18181b;\n --fodda-muted: #71717a;\n --fodda-line: #e4e4e7;\n --fodda-accent: #663399;\n --fodda-accent-light: #f5f0ff;\n --p: var(--fodda-accent);\n --pl: var(--fodda-accent-light);\n --pm: var(--fodda-line);\n --pl-on: var(--fodda-accent);\n --color-text-primary: var(--fodda-text);\n --color-text-secondary: var(--fodda-muted);\n --color-border-tertiary: var(--fodda-line);\n --color-background-primary: var(--fodda-bg);\n --color-background-secondary: var(--fodda-bg-secondary);\n --color-text-info: #2563eb;\n --color-text-success: #16a34a;\n --color-text-warning: #d97706;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n color: var(--fodda-text);\n background: var(--fodda-bg);\n border: 1px solid var(--fodda-line);\n border-top: 3px solid var(--fodda-accent);\n border-radius: 6px;\n padding: 1.25rem;\n}\n@media (prefers-color-scheme: dark) {\n .fodda-brand-widget, .w {\n --fodda-bg: #18181b;\n --fodda-bg-secondary: #27272a;\n --fodda-text: #f4f4f5;\n --fodda-muted: #a1a1aa;\n --fodda-line: #3f3f46;\n --fodda-accent: #9d65d4;\n --fodda-accent-light: rgba(157, 101, 212, 0.15);\n --p: var(--fodda-accent);\n --pl: var(--fodda-accent-light);\n --pm: var(--fodda-line);\n --pl-on: #c4a7e8;\n --color-text-info: #60a5fa;\n --color-text-success: #4ade80;\n --color-text-warning: #fbbf24;\n }\n}\n.hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.25rem;padding-bottom:1rem;border-bottom:.5px solid var(--color-border-tertiary);}\n.logo{display:flex;align-items:center;gap:10px;}\n.lt{font-size:13px;font-weight:600;}.ls{font-size:10px;color:var(--color-text-secondary);}\n.bfolio{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10px;letter-spacing:0.18em;text-transform:uppercase;color:var(--color-text-secondary);}\n.bh{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.75rem;}\n.bn{font-family:Georgia,serif;font-style:italic;font-weight:400;font-size:22px;letter-spacing:-0.01em;}\n.vc{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;}\n.vc-up{color:var(--color-text-success);}\n.vc-build{color:var(--color-text-info);}\n.vc-steady{color:var(--color-text-secondary);}\n.vc-slow{color:var(--color-text-warning);}\n.pv{font-size:14px;font-family:Georgia,serif;font-style:italic;font-weight:400;line-height:1.65;padding:14px 16px;background:var(--pl);border:1px solid var(--p);border-left-width:3px;border-radius:4px;margin-bottom:1.25rem;color:var(--color-text-primary);}\n.lcb{display:flex;height:8px;border-radius:4px;overflow:hidden;margin-bottom:.75rem;gap:2px;}\n.lcl{display:flex;gap:12px;margin-bottom:1.25rem;flex-wrap:wrap;}\n.lci{display:flex;align-items:center;gap:5px;font-size:10px;color:var(--color-text-secondary);}\n.lcd{width:8px;height:8px;border-radius:2px;}\n.card{background:var(--color-background-primary);border:1px solid var(--color-border-tertiary);border-radius:4px;padding:1rem 1.25rem;margin-bottom:8px;transition:border-color .15s,background .15s;}\n.card:hover{border-color:var(--p);background:var(--pl);}\n.th{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:6px;gap:8px;}\n.tn{font-size:13px;font-weight:600;}\n.ta{display:flex;align-items:center;gap:4px;flex-shrink:0;}\n.td{font-size:12px;color:var(--color-text-secondary);margin-bottom:5px;line-height:1.5;}\n.lb{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;background:transparent;}\n.lb-b{color:var(--color-text-info);}\n.lb-e{color:var(--color-text-success);}\n.lb-m{color:var(--color-text-secondary);}\n.lb-f{color:var(--color-text-warning);}\n.bd{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;background:transparent;color:var(--color-text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;}\n.bd-fast{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;background:transparent;color:#7A4000;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;}\n.bdp{font-size:10px;padding:2px 8px;border-radius:20px;background:var(--pl);color:var(--pl-on);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;}\n.brow{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;}\n.wl{font-size:11px;color:var(--color-text-secondary);margin:1.25rem 0 8px;display:flex;align-items:center;gap:6px;}\n.wd{width:6px;height:6px;border-radius:50%;background:var(--color-text-warning);display:inline-block;}\n.ec{border:1px dashed var(--color-border-tertiary);border-radius:4px;margin-bottom:8px;padding:1rem 1.25rem;}\n.et a{color:var(--color-text-info);text-decoration:none;font-size:13px;font-weight:600;}.et a:hover{text-decoration:underline;}\n.ex{font-size:12px;color:var(--color-text-secondary);line-height:1.5;margin:6px 0 8px;}\n.em{display:flex;gap:6px;flex-wrap:wrap;}\n.cit{font-size:10px;color:var(--color-text-secondary);margin-top:8px;padding-top:8px;border-top:.5px solid var(--color-border-tertiary);}\n.cit a{color:var(--color-text-info);text-decoration:none;}\n.cat-cs{background:var(--color-background-secondary);color:var(--color-text-info);}\n.cat-si{background:var(--pl);color:var(--p);}\n.cat-me{background:var(--color-background-secondary);color:var(--color-text-success);}\n.cat-qu{background:var(--color-background-secondary);color:var(--color-text-warning);}\n.cat-in{background:var(--color-background-secondary);color:var(--color-text-secondary);}\n.cc{background:var(--color-background-primary);border:1px solid var(--color-border-tertiary);border-radius:4px;padding:.875rem 1.25rem;margin-bottom:6px;display:flex;justify-content:space-between;align-items:center;}\n.cn{font-size:13px;font-weight:600;margin-bottom:3px;}\n.cd{font-size:11px;color:var(--color-text-secondary);}\n.ca{display:flex;flex-direction:column;align-items:flex-end;gap:6px;}\n.pb{font-size:9px;font-weight:700;letter-spacing:0.18em;text-transform:uppercase;padding:3px 8px;border:1px solid currentColor;border-radius:2px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;background:transparent;}\n.sl2, .sec{font-size:13px;font-weight:600;color:var(--color-text-primary);margin:1.25rem 0 8px;}.sl2:first-child, .sec:first-child{margin-top:0;}\n.br{display:flex;align-items:center;gap:8px;margin-bottom:5px;font-size:12px;}\n.brl{width:120px;color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0;}\n.brt{flex:1;height:4px;background:var(--color-background-secondary);border-radius:3px;overflow:hidden;}\n.brf{height:100%;background:var(--p);border-radius:3px;}\n.brc{min-width:44px;text-align:right;color:var(--color-text-secondary);font-size:11px;}\n.sg{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:1rem;}\n.sk{background:var(--color-background-secondary);border-radius:8px;padding:10px 12px;}\n.skl{font-size:10px;color:var(--color-text-secondary);margin-bottom:3px;}\n.skv{font-family:Georgia,serif;font-style:italic;font-size:22px;font-weight:400;}.sks{font-size:10px;color:var(--color-text-secondary);margin-top:2px;}\n.rq{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:.75rem;}\n.rqp{font-size:10px;padding:3px 9px;border-radius:20px;background:var(--color-background-secondary);color:var(--color-text-secondary);border:.5px solid var(--color-border-tertiary);}\n.xb{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--color-background-secondary);border:.5px solid var(--color-border-tertiary);border-radius:8px;cursor:pointer;text-align:left;width:100%;margin-bottom:8px;font-family:inherit;transition:all .15s;}\n.xb:hover{background:var(--pl);border-color:var(--pm);}\n.xi{font-size:11px;width:28px;font-weight:600;flex-shrink:0;color:var(--color-text-secondary);}\n.xd{font-size:11px;color:var(--color-text-secondary);margin-top:2px;}\n.xbl{font-weight:600;font-size:12px;}\n.gf{display:flex;gap:5px;flex-wrap:wrap;margin-top:1.5rem;padding-top:1rem;border-top:.5px solid var(--color-border-tertiary);align-items:center;}\n.gfl{font-size:10px;color:var(--color-text-secondary);margin-right:2px;}\n.gp{font-size:10px;padding:2px 9px;border-radius:20px;background:var(--pl);color:var(--pl-on);border:.5px solid var(--pm);}\n.ap{background:var(--color-background-secondary);border-radius:8px;margin-bottom:6px;padding:.75rem 1rem;display:flex;justify-content:space-between;align-items:center;}\n.an2{font-size:12px;font-weight:600;}\n.am2{font-size:11px;color:var(--color-text-secondary);margin-top:2px;}\n.astar{font-size:11px;color:var(--p);}\n.note{font-size:10px;color:var(--color-text-secondary);margin-bottom:1.25rem;}\n.btn-out{font-size:9px;padding:2px 7px;cursor:pointer;border:.5px solid var(--pm);border-radius:20px;background:var(--pl);color:var(--pl-on);font-family:inherit;}\n.btn-out:hover{background:var(--p);color:#fff;border-color:var(--p);}\n.cp{font-size:11px;background:var(--pl);color:var(--pl-on);border:.5px solid var(--pm);border-radius:20px;padding:3px 10px;cursor:pointer;font-family:inherit;transition:all .15s;}\n.cp:hover{background:var(--p);color:#fff;}\n.cv{font-size:10px;background:var(--pl);color:var(--pl-on);border:.5px solid var(--pm);border-radius:20px;padding:2px 8px;cursor:pointer;font-family:inherit;transition:all .15s;}\n.cv:hover{background:var(--p);color:#fff;}\n.an{font-size:13px;line-height:1.7;color:var(--color-text-primary);}\n.an p{margin:0 0 .75rem;}\n.an strong{font-weight:600;}\n.si{font-size:12px;line-height:1.65;color:var(--color-text-secondary);font-style:italic;margin:0 0 1rem;}\n</style>\n\n<div class=\"fodda-brand-widget w\">\n <div class=\"hd\">\n <div class=\"logo\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"height:24px;width:24px;flex-shrink:0;\">\n <rect width=\"24\" height=\"24\" rx=\"6\" fill=\"var(--fodda-accent)\"/>\n <circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"#ffffff\"/>\n </svg>\n <div><div class=\"lt\">Fodda</div><div class=\"ls\">Brand Intelligence</div></div>\n </div>\n <div class=\"bfolio\">{{FOLIO}}</div>\n </div>\n\n <div class=\"bh\">\n <div class=\"bn\">{{BRAND_NAME}}</div>\n <span class=\"vc {{VELOCITY_CLASS}}\">{{VELOCITY_LABEL}}</span>\n </div>\n\n <div class=\"pv\">{{ONE_LINER}}</div>\n\n <div class=\"sec\">Case Studies</div>\n {{EVIDENCE_HTML}}\n\n {{EARNINGS_SECTION_HTML}}\n {{FINANCIAL_SNAPSHOT_SECTION_HTML}}\n\n <div class=\"sec\">Relevant trends</div>\n {{TREND_FOOTPRINT_INTRO}}\n <div class=\"lcb\">{{LIFECYCLE_BAR}}</div>\n <div class=\"lcl\">{{LIFECYCLE_LEGEND}}</div>\n {{TRENDS_HTML}}\n {{WEAK_SIGNALS_HTML}}\n\n {{COMPETITIVE_SECTION_HTML}}\n\n <div class=\"sec\">Market data</div>\n {{MARKET_DATA_INTRO}}\n <div class=\"sl2\">US retail sales \u2014 Census Bureau</div>\n <div class=\"sg\">\n <div class=\"sk\"><div class=\"skl\">{{BEA_STAT_1_LABEL}}</div><div class=\"skv\">{{BEA_STAT_1_VALUE}}</div><div class=\"sks\">{{BEA_STAT_1_SUB}}</div></div>\n <div class=\"sk\"><div class=\"skl\">{{BEA_STAT_2_LABEL}}</div><div class=\"skv\">{{BEA_STAT_2_VALUE}}</div><div class=\"sks\">{{BEA_STAT_2_SUB}}</div></div>\n </div>\n\n {{GT_SECTION_HTML}}\n {{GT_COMPARISON_SECTION_HTML}}\n {{RELATED_QUERIES_SECTION_HTML}}\n\n <div class=\"sl2\">Wikipedia \u2014 avg daily pageviews</div>\n {{WIKI_BARS_HTML}}\n <p class=\"note\">{{WIKI_NOTE}}</p>\n\n <div class=\"sl2\">Amazon footprint</div>\n <div class=\"sg\">\n <div class=\"sk\"><div class=\"skl\">{{AMAZON_STAT_1_LABEL}}</div><div class=\"skv\">{{AMAZON_STAT_1_VALUE}}</div><div class=\"sks\">{{AMAZON_STAT_1_SUB}}</div></div>\n <div class=\"sk\"><div class=\"skl\">{{AMAZON_STAT_2_LABEL}}</div><div class=\"skv\">{{AMAZON_STAT_2_VALUE}}</div><div class=\"sks\">{{AMAZON_STAT_2_SUB}}</div></div>\n <div class=\"sk\"><div class=\"skl\">{{AMAZON_STAT_3_LABEL}}</div><div class=\"skv\">{{AMAZON_STAT_3_VALUE}}</div><div class=\"sks\">{{AMAZON_STAT_3_SUB}}</div></div>\n <div class=\"sk\"><div class=\"skl\">{{AMAZON_STAT_4_LABEL}}</div><div class=\"skv\">{{AMAZON_STAT_4_VALUE}}</div><div class=\"sks\">{{AMAZON_STAT_4_SUB}}</div></div>\n </div>\n {{AMAZON_PRODUCTS_HTML}}\n <p class=\"note\">{{AMAZON_CAPTION}}</p>\n\n {{GEO_SECTION_HTML}}\n\n <div class=\"sec\">Explore further</div>\n {{SUGGESTED_NEXT_HTML}}\n <button class=\"xb\" onclick=\"sendPrompt('{{EXPORT_1_PROMPT}}')\"><span class=\"xi\">\u2197</span><div><div class=\"xbl\">{{EXPORT_1_LABEL}}</div><div class=\"xd\">{{EXPORT_1_DESC}}</div></div></button>\n <button class=\"xb\" onclick=\"sendPrompt('{{EXPORT_2_PROMPT}}')\"><span class=\"xi\">\u2197</span><div><div class=\"xbl\">{{EXPORT_2_LABEL}}</div><div class=\"xd\">{{EXPORT_2_DESC}}</div></div></button>\n <button class=\"xb\" onclick=\"sendPrompt('{{EXPORT_3_PROMPT}}')\"><span class=\"xi\">\u2197</span><div><div class=\"xbl\">{{EXPORT_3_LABEL}}</div><div class=\"xd\">{{EXPORT_3_DESC}}</div></div></button>\n <button class=\"xb\" onclick=\"sendPrompt('{{EXPORT_4_PROMPT}}')\"><span class=\"xi\">\u2197</span><div><div class=\"xbl\">{{EXPORT_4_LABEL}}</div><div class=\"xd\">{{EXPORT_4_DESC}}</div></div></button>\n\n <div class=\"gf\">\n <span class=\"gfl\">Sources:</span>\n {{SOURCE_PILLS_HTML}}\n </div>\n</div>";
14
14
  //# sourceMappingURL=brandTemplate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brandTemplate.d.ts","sourceRoot":"","sources":["../src/brandTemplate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsSH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAyfpI;AAGD,eAAO,MAAM,QAAQ,olYAkKd,CAAC"}
1
+ {"version":3,"file":"brandTemplate.d.ts","sourceRoot":"","sources":["../src/brandTemplate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmTH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA+gBpI;AAED,eAAO,MAAM,QAAQ,ombA+Md,CAAC"}