fodda-mcp 1.3.2 → 1.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +31 -0
- package/README.md +192 -20
- package/dist/a2aHandler.d.ts +20 -0
- package/dist/a2aHandler.d.ts.map +1 -0
- package/dist/a2aHandler.js +247 -0
- package/dist/a2aHandler.js.map +1 -0
- package/dist/agents/fodda-researcher/index.d.ts +35 -0
- package/dist/agents/fodda-researcher/index.d.ts.map +1 -0
- package/dist/agents/fodda-researcher/index.js +62 -0
- package/dist/agents/fodda-researcher/index.js.map +1 -0
- package/dist/agents/fodda-researcher/skills.d.ts +16 -0
- package/dist/agents/fodda-researcher/skills.d.ts.map +1 -0
- package/dist/agents/fodda-researcher/skills.js +163 -0
- package/dist/agents/fodda-researcher/skills.js.map +1 -0
- package/dist/brandTemplate.d.ts +14 -0
- package/dist/brandTemplate.d.ts.map +1 -0
- package/dist/brandTemplate.js +742 -0
- package/dist/brandTemplate.js.map +1 -0
- package/dist/catalogCache.d.ts +177 -0
- package/dist/catalogCache.d.ts.map +1 -0
- package/dist/catalogCache.js +708 -0
- package/dist/catalogCache.js.map +1 -0
- package/dist/editorialFill.d.ts +44 -0
- package/dist/editorialFill.d.ts.map +1 -0
- package/dist/editorialFill.js +377 -0
- package/dist/editorialFill.js.map +1 -0
- package/dist/enrichment.d.ts +74 -0
- package/dist/enrichment.d.ts.map +1 -0
- package/dist/enrichment.js +211 -0
- package/dist/enrichment.js.map +1 -0
- package/dist/errorHandling.d.ts +52 -0
- package/dist/errorHandling.d.ts.map +1 -0
- package/dist/errorHandling.js +327 -0
- package/dist/errorHandling.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.js +595 -410
- package/dist/index.js.map +1 -1
- package/dist/pricingCache.d.ts +99 -0
- package/dist/pricingCache.d.ts.map +1 -0
- package/dist/pricingCache.js +414 -0
- package/dist/pricingCache.js.map +1 -0
- package/dist/queryCache.d.ts +25 -0
- package/dist/queryCache.d.ts.map +1 -0
- package/dist/queryCache.js +194 -0
- package/dist/queryCache.js.map +1 -0
- package/dist/searchTemplate.d.ts +16 -0
- package/dist/searchTemplate.d.ts.map +1 -0
- package/dist/searchTemplate.js +318 -0
- package/dist/searchTemplate.js.map +1 -0
- package/dist/sessionTracker.d.ts +39 -0
- package/dist/sessionTracker.d.ts.map +1 -0
- package/dist/sessionTracker.js +187 -0
- package/dist/sessionTracker.js.map +1 -0
- package/dist/skillClient.d.ts +142 -0
- package/dist/skillClient.d.ts.map +1 -0
- package/dist/skillClient.js +256 -0
- package/dist/skillClient.js.map +1 -0
- package/dist/svgVisuals.d.ts +77 -0
- package/dist/svgVisuals.d.ts.map +1 -0
- package/dist/svgVisuals.js +323 -0
- package/dist/svgVisuals.js.map +1 -0
- package/dist/systemPrompt.d.ts +26 -0
- package/dist/systemPrompt.d.ts.map +1 -0
- package/dist/systemPrompt.js +546 -0
- package/dist/systemPrompt.js.map +1 -0
- package/dist/test-waverunner-response.d.ts +2 -0
- package/dist/test-waverunner-response.d.ts.map +1 -0
- package/dist/test-waverunner-response.js +20 -0
- package/dist/test-waverunner-response.js.map +1 -0
- package/dist/test_analyst.d.ts +2 -0
- package/dist/test_analyst.d.ts.map +1 -0
- package/dist/test_analyst.js +39 -0
- package/dist/test_analyst.js.map +1 -0
- package/dist/test_analyst_local.d.ts +2 -0
- package/dist/test_analyst_local.d.ts.map +1 -0
- package/dist/test_analyst_local.js +51 -0
- package/dist/test_analyst_local.js.map +1 -0
- package/dist/test_live_mcp.d.ts +2 -0
- package/dist/test_live_mcp.d.ts.map +1 -0
- package/dist/test_live_mcp.js +49 -0
- package/dist/test_live_mcp.js.map +1 -0
- package/dist/test_skills.d.ts +9 -0
- package/dist/test_skills.d.ts.map +1 -0
- package/dist/test_skills.js +267 -0
- package/dist/test_skills.js.map +1 -0
- package/dist/toolHandlers.d.ts +11 -0
- package/dist/toolHandlers.d.ts.map +1 -0
- package/dist/toolHandlers.js +2829 -0
- package/dist/toolHandlers.js.map +1 -0
- package/dist/tools.d.ts +80 -3
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +89 -186
- package/dist/tools.js.map +1 -1
- package/dist/trialTracker.d.ts +58 -0
- package/dist/trialTracker.d.ts.map +1 -0
- package/dist/trialTracker.js +179 -0
- package/dist/trialTracker.js.map +1 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/verify_hmac.js +1 -1
- package/dist/verify_hmac.js.map +1 -1
- package/dist/verify_tools_endpoint.js +5 -5
- package/dist/verify_tools_endpoint.js.map +1 -1
- package/dist/widgetShell.d.ts +15 -0
- package/dist/widgetShell.d.ts.map +1 -0
- package/dist/widgetShell.js +151 -0
- package/dist/widgetShell.js.map +1 -0
- package/package.json +10 -6
- package/server.json +12 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_analyst_local.d.ts","sourceRoot":"","sources":["../src/test_analyst_local.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createServer } from './toolHandlers.js';
|
|
2
|
+
import * as dotenv from 'dotenv';
|
|
3
|
+
import { initCatalogCache } from './catalogCache.js';
|
|
4
|
+
dotenv.config();
|
|
5
|
+
async function mockFoddaRequest(method, path, apiKey, userId, body) {
|
|
6
|
+
console.log(`[mockFoddaRequest] ${method} ${path}`);
|
|
7
|
+
if (path === '/v1/graphs/catalog')
|
|
8
|
+
return { graphs: [] };
|
|
9
|
+
if (path === '/v1/analysts')
|
|
10
|
+
return [
|
|
11
|
+
{ analyst_id: '123', name: 'Test Analyst', description: 'A test analyst.' }
|
|
12
|
+
];
|
|
13
|
+
if (path === '/v1/analysts/consult') {
|
|
14
|
+
console.log(`[mockFoddaRequest] Payload:`, body);
|
|
15
|
+
return { report: 'Mock report from Analyst 123' };
|
|
16
|
+
}
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
async function mockWaverunnerRequest() { return {}; }
|
|
20
|
+
async function main() {
|
|
21
|
+
console.log("Initializing cache...");
|
|
22
|
+
// Initialize cache, which should fetch from our mock API if we overwrite API_BASE_URL?
|
|
23
|
+
// Let's just rely on the actual API for catalog if it's available, otherwise it fails gracefully.
|
|
24
|
+
await initCatalogCache();
|
|
25
|
+
console.log("Creating server...");
|
|
26
|
+
const server = await createServer("sk_trial_test", "test_user",
|
|
27
|
+
// @ts-ignore
|
|
28
|
+
mockFoddaRequest, mockWaverunnerRequest, () => 'widget_id', () => 'http://localhost');
|
|
29
|
+
// Get the tool
|
|
30
|
+
// @ts-ignore
|
|
31
|
+
const tools = server._registeredTools;
|
|
32
|
+
const analystTools = Object.keys(tools).filter(name => name.startsWith('consult_'));
|
|
33
|
+
console.log(`Found Analyst Tools: ${analystTools.join(', ')}`);
|
|
34
|
+
if (analystTools.length > 0) {
|
|
35
|
+
const toolToCall = analystTools[0];
|
|
36
|
+
console.log(`Calling tool: ${toolToCall}`);
|
|
37
|
+
try {
|
|
38
|
+
const toolObj = tools[toolToCall];
|
|
39
|
+
const result = await toolObj.handler({ analyst_id: "brand-ceo", query: "Test query for analyst", company: "Tesla" });
|
|
40
|
+
console.log("Result:", result);
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
console.error("Error calling tool:", e.message);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log("No analyst tools found. (This might be expected if mock didn't populate cache properly).");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
main().catch(console.error);
|
|
51
|
+
//# sourceMappingURL=test_analyst_local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_analyst_local.js","sourceRoot":"","sources":["../src/test_analyst_local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,KAAK,UAAU,gBAAgB,CAAC,MAAsB,EAAE,IAAY,EAAE,MAAc,EAAE,MAAc,EAAE,IAAU;IAC5G,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,IAAI,KAAK,oBAAoB;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzD,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO;YAChC,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE;SAC9E,CAAC;IACF,IAAI,IAAI,KAAK,sBAAsB,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,KAAK,UAAU,qBAAqB,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAErD,KAAK,UAAU,IAAI;IACf,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,uFAAuF;IACvF,kGAAkG;IAClG,MAAM,gBAAgB,EAAE,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,YAAY,CAC7B,eAAe,EACf,WAAW;IACX,aAAa;IACb,gBAAgB,EAChB,qBAAqB,EACrB,GAAG,EAAE,CAAC,WAAW,EACjB,GAAG,EAAE,CAAC,kBAAkB,CAC3B,CAAC;IAEF,eAAe;IACf,aAAa;IACb,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACtC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,wBAAwB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE/D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,wBAAwB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACrH,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC;IAC5G,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_live_mcp.d.ts","sourceRoot":"","sources":["../src/test_live_mcp.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
3
|
+
async function main() {
|
|
4
|
+
console.log("Connecting to live Fodda MCP server over SSE...");
|
|
5
|
+
// Create an SSE transport pointed at the live Cloud Run endpoint
|
|
6
|
+
const transport = new SSEClientTransport(new URL("https://fodda-mcp-p3uz7zw7ja-uc.a.run.app/sse"));
|
|
7
|
+
// Initialize the client
|
|
8
|
+
const client = new Client({
|
|
9
|
+
name: "test-client",
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
}, { capabilities: {} });
|
|
12
|
+
try {
|
|
13
|
+
await client.connect(transport);
|
|
14
|
+
console.log("✅ Successfully connected to MCP Server transport");
|
|
15
|
+
// Test 1: List Tools
|
|
16
|
+
const toolsResult = await client.listTools();
|
|
17
|
+
console.log(`✅ Discovered ${toolsResult.tools.length} tools`);
|
|
18
|
+
toolsResult.tools.forEach(t => console.log(` - ${t.name}`));
|
|
19
|
+
// Test 2: Execute a Tool Call with API Key and tracing header
|
|
20
|
+
console.log("\nAttempting to invoke 'search_graph' to test rate limiting / auth boundaries...");
|
|
21
|
+
try {
|
|
22
|
+
const result = await client.callTool({
|
|
23
|
+
name: "search_graph",
|
|
24
|
+
arguments: {
|
|
25
|
+
graphId: "retail",
|
|
26
|
+
query: "test query",
|
|
27
|
+
userId: "self-test-user",
|
|
28
|
+
_meta: {
|
|
29
|
+
authorization: "Bearer sk_live_sample"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
console.log("\n✅ Tool result:");
|
|
34
|
+
console.log(JSON.stringify(result, null, 2));
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.error("\n❌ Tool Execution Caught Error:", err.message);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error("Connection failed:", error);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
// Close the connection
|
|
45
|
+
await client.close();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
main().catch(console.error);
|
|
49
|
+
//# sourceMappingURL=test_live_mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_live_mcp.js","sourceRoot":"","sources":["../src/test_live_mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,KAAK,UAAU,IAAI;IACf,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAE/D,iEAAiE;IACjE,MAAM,SAAS,GAAG,IAAI,kBAAkB,CACpC,IAAI,GAAG,CAAC,+CAA+C,CAAC,CAC3D,CAAC;IAEF,wBAAwB;IACxB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACtB,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;KACnB,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzB,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAEhE,qBAAqB;QACrB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAC9D,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9D,8DAA8D;QAC9D,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;QAEhG,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;gBACjC,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE;oBACP,OAAO,EAAE,QAAQ;oBACjB,KAAK,EAAE,YAAY;oBACnB,MAAM,EAAE,gBAAgB;oBACxB,KAAK,EAAE;wBACH,aAAa,EAAE,uBAAuB;qBACzC;iBACJ;aACJ,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACnE,CAAC;IAEL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACP,uBAAuB;QACvB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Stress Test — Tests both Paralogy and Igloo skill servers
|
|
3
|
+
* against the Fodda skill client contract.
|
|
4
|
+
*
|
|
5
|
+
* Run: npx ts-node src/test_skills.ts
|
|
6
|
+
* Or: node dist/test_skills.js (after npm run build)
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=test_skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_skills.d.ts","sourceRoot":"","sources":["../src/test_skills.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Stress Test — Tests both Paralogy and Igloo skill servers
|
|
3
|
+
* against the Fodda skill client contract.
|
|
4
|
+
*
|
|
5
|
+
* Run: npx ts-node src/test_skills.ts
|
|
6
|
+
* Or: node dist/test_skills.js (after npm run build)
|
|
7
|
+
*/
|
|
8
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
9
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Sample Fodda data (realistic search_graph output)
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const SAMPLE_FODDA_OUTPUT = {
|
|
14
|
+
query: "AI in retail personalization",
|
|
15
|
+
graphId: "retail",
|
|
16
|
+
context: {
|
|
17
|
+
graphName: "PSFK's Retail Graph",
|
|
18
|
+
curatorName: "PSFK Editorial",
|
|
19
|
+
domain: "Retail & Commerce",
|
|
20
|
+
},
|
|
21
|
+
trends: [
|
|
22
|
+
{
|
|
23
|
+
name: "AI-Powered Hyper-Personalization Engines",
|
|
24
|
+
summary: "Retailers deploying real-time AI systems that personalize every touchpoint — from homepage layout to checkout offers — based on behavioral micro-signals rather than demographic segments.",
|
|
25
|
+
signal_score: 98,
|
|
26
|
+
trendLifecycle: "growing",
|
|
27
|
+
momentum: "accelerating",
|
|
28
|
+
evidence_count: 12,
|
|
29
|
+
graphName: "PSFK's Retail Graph",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "Conversational Commerce Agents",
|
|
33
|
+
summary: "AI shopping assistants that maintain context across sessions, remember preferences, and proactively suggest products based on life events and seasonal patterns.",
|
|
34
|
+
signal_score: 85,
|
|
35
|
+
trendLifecycle: "emerging",
|
|
36
|
+
momentum: "accelerating",
|
|
37
|
+
evidence_count: 8,
|
|
38
|
+
graphName: "PSFK's Retail Graph",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "Predictive Inventory Allocation",
|
|
42
|
+
summary: "Machine learning models that pre-position inventory based on predicted demand signals from social media trends, weather patterns, and local events.",
|
|
43
|
+
signal_score: 72,
|
|
44
|
+
trendLifecycle: "established",
|
|
45
|
+
momentum: "stable",
|
|
46
|
+
evidence_count: 6,
|
|
47
|
+
graphName: "PSFK's Retail Graph",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "Privacy-First Personalization",
|
|
51
|
+
summary: "Zero-party data strategies where customers voluntarily share preferences in exchange for genuinely useful personalization, replacing surveillance-based targeting.",
|
|
52
|
+
signal_score: 65,
|
|
53
|
+
trendLifecycle: "emerging",
|
|
54
|
+
momentum: "accelerating",
|
|
55
|
+
evidence_count: 5,
|
|
56
|
+
graphName: "PSFK's Retail Graph",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "Digital Twin Shopping Experiences",
|
|
60
|
+
summary: "Virtual replicas of physical stores that let consumers browse, try on, and purchase in 3D environments powered by AI spatial computing.",
|
|
61
|
+
signal_score: 41,
|
|
62
|
+
trendLifecycle: "emerging",
|
|
63
|
+
momentum: "stable",
|
|
64
|
+
evidence_count: 3,
|
|
65
|
+
graphName: "PSFK's Retail Graph",
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
evidence: [
|
|
69
|
+
{
|
|
70
|
+
title: "Sephora's AI Color Match drives 28% conversion lift",
|
|
71
|
+
sourceUrl: "https://example.com/sephora-ai",
|
|
72
|
+
brandNames: ["Sephora"],
|
|
73
|
+
place: "United States",
|
|
74
|
+
snippet: "Sephora's Virtual Artist tool uses computer vision to match foundation shades...",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
title: "Amazon's predictive shipping cuts delivery time by 2 days",
|
|
78
|
+
sourceUrl: "https://example.com/amazon-predictive",
|
|
79
|
+
brandNames: ["Amazon"],
|
|
80
|
+
place: "Global",
|
|
81
|
+
snippet: "Amazon's anticipatory shipping patent places items in transit before purchase...",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
title: "Nike's .SWOOSH platform tokenizes digital fashion",
|
|
85
|
+
sourceUrl: "https://example.com/nike-swoosh",
|
|
86
|
+
brandNames: ["Nike"],
|
|
87
|
+
place: "United States",
|
|
88
|
+
snippet: "Nike's blockchain-backed membership platform allows co-creation of virtual sneakers...",
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
supplemental: {
|
|
92
|
+
google_trends: { interest_over_time: 78, trending: true },
|
|
93
|
+
census_retail: { total_retail_sales: "$7.2T", ecommerce_share: "16.4%" },
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
async function testSkill(name, mcpUrl, toolName) {
|
|
97
|
+
const result = {
|
|
98
|
+
skillName: name,
|
|
99
|
+
mcpUrl,
|
|
100
|
+
connectionSuccess: false,
|
|
101
|
+
connectionMs: 0,
|
|
102
|
+
toolsDiscovered: [],
|
|
103
|
+
toolCallSuccess: false,
|
|
104
|
+
toolCallMs: 0,
|
|
105
|
+
outputLength: 0,
|
|
106
|
+
outputPreview: '',
|
|
107
|
+
isRealMcpServer: false,
|
|
108
|
+
authRequired: false,
|
|
109
|
+
issues: [],
|
|
110
|
+
recommendations: [],
|
|
111
|
+
};
|
|
112
|
+
let client = null;
|
|
113
|
+
const connStart = Date.now();
|
|
114
|
+
try {
|
|
115
|
+
const url = new URL(mcpUrl);
|
|
116
|
+
client = new Client({ name: 'fodda-skill-tester', version: '1.0.0' });
|
|
117
|
+
const transport = new StreamableHTTPClientTransport(url);
|
|
118
|
+
// Test 1: Connection
|
|
119
|
+
console.log(`\n── Testing ${name} (${mcpUrl}) ──`);
|
|
120
|
+
console.log('Step 1: Connecting...');
|
|
121
|
+
await Promise.race([
|
|
122
|
+
client.connect(transport),
|
|
123
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Connection timeout (5s)')), 5000)),
|
|
124
|
+
]);
|
|
125
|
+
result.connectionSuccess = true;
|
|
126
|
+
result.connectionMs = Date.now() - connStart;
|
|
127
|
+
result.isRealMcpServer = true;
|
|
128
|
+
console.log(` ✅ Connected in ${result.connectionMs}ms`);
|
|
129
|
+
// Test 2: Tool Discovery
|
|
130
|
+
console.log('Step 2: Discovering tools...');
|
|
131
|
+
const toolsResult = await client.listTools();
|
|
132
|
+
const tools = toolsResult.tools || [];
|
|
133
|
+
result.toolsDiscovered = tools.map(t => `${t.name}: ${t.description || '(no description)'}`);
|
|
134
|
+
console.log(` ✅ Found ${tools.length} tool(s):`);
|
|
135
|
+
for (const t of tools) {
|
|
136
|
+
console.log(` - ${t.name}: ${(t.description || '').substring(0, 80)}`);
|
|
137
|
+
}
|
|
138
|
+
if (tools.length === 0) {
|
|
139
|
+
result.issues.push('No tools exposed — server responds to MCP protocol but has no callable tools');
|
|
140
|
+
result.recommendations.push('Register at least one tool that accepts Fodda data');
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
// Test 3: Tool Call with Fodda data
|
|
144
|
+
const targetTool = tools.find(t => t.name === toolName) || tools[0];
|
|
145
|
+
if (!targetTool) {
|
|
146
|
+
result.issues.push('No matching tool found');
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
console.log(`Step 3: Calling tool "${targetTool.name}" with sample Fodda data...`);
|
|
150
|
+
const callStart = Date.now();
|
|
151
|
+
const callResult = await Promise.race([
|
|
152
|
+
client.callTool({
|
|
153
|
+
name: targetTool.name,
|
|
154
|
+
arguments: {
|
|
155
|
+
fodda_output: SAMPLE_FODDA_OUTPUT,
|
|
156
|
+
query: SAMPLE_FODDA_OUTPUT.query,
|
|
157
|
+
trends: SAMPLE_FODDA_OUTPUT.trends,
|
|
158
|
+
evidence: SAMPLE_FODDA_OUTPUT.evidence,
|
|
159
|
+
},
|
|
160
|
+
}),
|
|
161
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Tool call timeout (10s)')), 10000)),
|
|
162
|
+
]);
|
|
163
|
+
result.toolCallMs = Date.now() - callStart;
|
|
164
|
+
const contentArr = Array.isArray(callResult.content) ? callResult.content : [];
|
|
165
|
+
const outputText = contentArr.map((c) => c.type === 'text' ? c.text : JSON.stringify(c)).join('\n');
|
|
166
|
+
result.toolCallSuccess = true;
|
|
167
|
+
result.outputLength = outputText.length;
|
|
168
|
+
result.outputPreview = outputText.substring(0, 500);
|
|
169
|
+
console.log(` ✅ Tool responded in ${result.toolCallMs}ms (${outputText.length} chars)`);
|
|
170
|
+
console.log(` Preview: ${outputText.substring(0, 200)}...`);
|
|
171
|
+
// Quality checks
|
|
172
|
+
if (outputText.length < 50) {
|
|
173
|
+
result.issues.push(`Output is very short (${outputText.length} chars) — may not be providing useful transformation`);
|
|
174
|
+
}
|
|
175
|
+
if (outputText.length > 10000) {
|
|
176
|
+
result.issues.push(`Output is very long (${outputText.length} chars) — may overwhelm the LLM context window`);
|
|
177
|
+
result.recommendations.push('Aim for 500-2000 characters of output');
|
|
178
|
+
}
|
|
179
|
+
if (result.toolCallMs > 8000) {
|
|
180
|
+
result.issues.push(`Tool call took ${result.toolCallMs}ms — close to the 10s timeout`);
|
|
181
|
+
result.recommendations.push('Optimize response time to stay well under 10 seconds');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
const elapsed = Date.now() - connStart;
|
|
186
|
+
if (err.message?.includes('401') || err.message?.includes('Unauthorized') || err.message?.includes('authentication')) {
|
|
187
|
+
result.authRequired = true;
|
|
188
|
+
result.connectionError = `Authentication required (401)`;
|
|
189
|
+
result.issues.push('Server requires authentication — Fodda sends no auth headers currently');
|
|
190
|
+
result.recommendations.push('Either: (a) whitelist Fodda\'s IP/user-agent, (b) provide an API key to store in Airtable, or (c) make the MCP endpoint auth-free for registered partners');
|
|
191
|
+
result.isRealMcpServer = true; // 401 confirms it's a real server
|
|
192
|
+
console.log(` ⚠️ Auth required (401) — server exists but needs credentials`);
|
|
193
|
+
}
|
|
194
|
+
else if (err.message?.includes('timeout')) {
|
|
195
|
+
result.connectionError = `Connection timed out after 5s`;
|
|
196
|
+
result.issues.push('Server did not respond within 5 seconds');
|
|
197
|
+
result.recommendations.push('Ensure the MCP endpoint is accessible and responding');
|
|
198
|
+
console.log(` ❌ Connection timeout`);
|
|
199
|
+
}
|
|
200
|
+
else if (err.message?.includes('ECONNREFUSED') || err.message?.includes('ENOTFOUND')) {
|
|
201
|
+
result.connectionError = `Server unreachable: ${err.message}`;
|
|
202
|
+
result.issues.push('Server is not reachable at the configured URL');
|
|
203
|
+
console.log(` ❌ Server unreachable: ${err.message}`);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
result.connectionError = err.message;
|
|
207
|
+
result.issues.push(`Unexpected error: ${err.message}`);
|
|
208
|
+
console.log(` ❌ Error: ${err.message}`);
|
|
209
|
+
}
|
|
210
|
+
result.connectionMs = elapsed;
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
try {
|
|
214
|
+
if (client)
|
|
215
|
+
await client.close();
|
|
216
|
+
}
|
|
217
|
+
catch { /* ignore */ }
|
|
218
|
+
}
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Run all tests
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
async function main() {
|
|
225
|
+
console.log('═══════════════════════════════════════════════════════');
|
|
226
|
+
console.log(' FODDA SKILL STRESS TEST');
|
|
227
|
+
console.log(' Testing skill MCP servers against the Fodda contract');
|
|
228
|
+
console.log('═══════════════════════════════════════════════════════');
|
|
229
|
+
const results = [];
|
|
230
|
+
// Test Paralogy
|
|
231
|
+
results.push(await testSkill('Paralogy', 'https://mcp.paralogy.ai/mcp', 'reframe_trends'));
|
|
232
|
+
// Test Igloo — try the MCP endpoint if it exists
|
|
233
|
+
// Based on prior testing, Igloo is a REST API, not MCP. Let's verify.
|
|
234
|
+
results.push(await testSkill('Igloo', 'https://igloo-api.example.com/mcp', 'validate'));
|
|
235
|
+
// Print summary
|
|
236
|
+
console.log('\n\n═══════════════════════════════════════════════════════');
|
|
237
|
+
console.log(' RESULTS SUMMARY');
|
|
238
|
+
console.log('═══════════════════════════════════════════════════════\n');
|
|
239
|
+
for (const r of results) {
|
|
240
|
+
console.log(`── ${r.skillName} (${r.mcpUrl}) ──`);
|
|
241
|
+
console.log(` Real MCP Server: ${r.isRealMcpServer ? '✅ Yes' : '❌ No'}`);
|
|
242
|
+
console.log(` Auth Required: ${r.authRequired ? '⚠️ Yes' : '✅ No (or not tested)'}`);
|
|
243
|
+
console.log(` Connection: ${r.connectionSuccess ? `✅ ${r.connectionMs}ms` : `❌ ${r.connectionError}`}`);
|
|
244
|
+
console.log(` Tools Found: ${r.toolsDiscovered.length > 0 ? r.toolsDiscovered.join(', ') : '(none discovered)'}`);
|
|
245
|
+
console.log(` Tool Call: ${r.toolCallSuccess ? `✅ ${r.toolCallMs}ms, ${r.outputLength} chars` : `❌ ${r.toolCallError || 'not reached'}`}`);
|
|
246
|
+
if (r.issues.length > 0) {
|
|
247
|
+
console.log(` Issues:`);
|
|
248
|
+
for (const i of r.issues)
|
|
249
|
+
console.log(` ⚠️ ${i}`);
|
|
250
|
+
}
|
|
251
|
+
if (r.recommendations.length > 0) {
|
|
252
|
+
console.log(` Recommendations:`);
|
|
253
|
+
for (const rec of r.recommendations)
|
|
254
|
+
console.log(` → ${rec}`);
|
|
255
|
+
}
|
|
256
|
+
if (r.outputPreview) {
|
|
257
|
+
console.log(` Output Preview:`);
|
|
258
|
+
console.log(` ${r.outputPreview.substring(0, 300).replace(/\n/g, '\n ')}`);
|
|
259
|
+
}
|
|
260
|
+
console.log('');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
main().catch(err => {
|
|
264
|
+
console.error('Test runner failed:', err);
|
|
265
|
+
process.exit(1);
|
|
266
|
+
});
|
|
267
|
+
//# sourceMappingURL=test_skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_skills.js","sourceRoot":"","sources":["../src/test_skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Handlers — MCP server factory with all tool registrations.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from index.ts to reduce monolith size.
|
|
5
|
+
* Contains createServer() which registers all 30+ MCP tools.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export type FoddaRequestFn = (method: 'GET' | 'POST' | 'PATCH', path: string, apiKey: string, userId: string, body?: any, requestId?: string) => Promise<any>;
|
|
9
|
+
export type WaverunnerRequestFn = (interactionType: import('./trialTracker.js').TrialInteractionType, tokenCost: number, apiKey: string, userId: string, waverunnerPayload: any) => Promise<any>;
|
|
10
|
+
export declare function createServer(apiKey: string, userId: string, foddaRequest: FoddaRequestFn, waverunnerRequest: WaverunnerRequestFn, storeWidget: (html: string) => string, getServiceUrl: () => string, entryId?: string): Promise<McpServer>;
|
|
11
|
+
//# sourceMappingURL=toolHandlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolHandlers.d.ts","sourceRoot":"","sources":["../src/toolHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqIpE,MAAM,MAAM,cAAc,GAAG,CACzB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,EAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,GAAG,EACV,SAAS,CAAC,EAAE,MAAM,KACjB,OAAO,CAAC,GAAG,CAAC,CAAC;AAElB,MAAM,MAAM,mBAAmB,GAAG,CAC9B,eAAe,EAAE,OAAO,mBAAmB,EAAE,oBAAoB,EACjE,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,GAAG,KACrB,OAAO,CAAC,GAAG,CAAC,CAAC;AA6DlB,wBAAsB,YAAY,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,cAAc,EAC5B,iBAAiB,EAAE,mBAAmB,EACtC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,aAAa,EAAE,MAAM,MAAM,EAC3B,OAAO,GAAE,MAAW,GACrB,OAAO,CAAC,SAAS,CAAC,CAo2FpB"}
|