fodda-mcp 1.32.1 → 1.46.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -16
- package/dist/a2aHandler.d.ts +33 -3
- package/dist/a2aHandler.d.ts.map +1 -1
- package/dist/a2aHandler.js +189 -36
- package/dist/a2aHandler.js.map +1 -1
- package/dist/agentFacts.d.ts +21 -0
- package/dist/agentFacts.d.ts.map +1 -0
- package/dist/agentFacts.js +72 -0
- package/dist/agentFacts.js.map +1 -0
- package/dist/agents/fodda-researcher/index.d.ts +6 -0
- package/dist/agents/fodda-researcher/index.d.ts.map +1 -1
- package/dist/agents/fodda-researcher/index.js +18 -0
- package/dist/agents/fodda-researcher/index.js.map +1 -1
- package/dist/agents/fodda-researcher/skills.d.ts +1 -1
- package/dist/agents/fodda-researcher/skills.d.ts.map +1 -1
- package/dist/agents/fodda-researcher/skills.js +8 -3
- package/dist/agents/fodda-researcher/skills.js.map +1 -1
- package/dist/brandTemplate.d.ts +1 -1
- package/dist/brandTemplate.d.ts.map +1 -1
- package/dist/brandTemplate.js +179 -11
- package/dist/brandTemplate.js.map +1 -1
- package/dist/catalogCache.d.ts +14 -13
- package/dist/catalogCache.d.ts.map +1 -1
- package/dist/catalogCache.js +266 -67
- package/dist/catalogCache.js.map +1 -1
- package/dist/coverageRelevance.d.ts +156 -0
- package/dist/coverageRelevance.d.ts.map +1 -0
- package/dist/coverageRelevance.js +1062 -0
- package/dist/coverageRelevance.js.map +1 -0
- package/dist/deepResearch.d.ts +43 -0
- package/dist/deepResearch.d.ts.map +1 -0
- package/dist/deepResearch.js +498 -0
- package/dist/deepResearch.js.map +1 -0
- package/dist/enrichment.d.ts.map +1 -1
- package/dist/enrichment.js +51 -1
- package/dist/enrichment.js.map +1 -1
- package/dist/errorHandling.d.ts +1 -1
- package/dist/errorHandling.d.ts.map +1 -1
- package/dist/errorHandling.js +26 -6
- package/dist/errorHandling.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +548 -38
- package/dist/index.js.map +1 -1
- package/dist/linkedinEngine.d.ts +150 -0
- package/dist/linkedinEngine.d.ts.map +1 -0
- package/dist/linkedinEngine.js +696 -0
- package/dist/linkedinEngine.js.map +1 -0
- package/dist/oauthRegisterShim.d.ts +13 -0
- package/dist/oauthRegisterShim.d.ts.map +1 -0
- package/dist/oauthRegisterShim.js +83 -0
- package/dist/oauthRegisterShim.js.map +1 -0
- package/dist/pricingCache.d.ts +6 -8
- package/dist/pricingCache.d.ts.map +1 -1
- package/dist/pricingCache.js +69 -13
- package/dist/pricingCache.js.map +1 -1
- package/dist/queryCache.d.ts +2 -0
- package/dist/queryCache.d.ts.map +1 -1
- package/dist/queryCache.js +11 -2
- package/dist/queryCache.js.map +1 -1
- package/dist/resources.d.ts +27 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +126 -0
- package/dist/resources.js.map +1 -0
- package/dist/sessionTracker.d.ts +24 -2
- package/dist/sessionTracker.d.ts.map +1 -1
- package/dist/sessionTracker.js +198 -4
- package/dist/sessionTracker.js.map +1 -1
- package/dist/systemPrompt.d.ts +3 -3
- package/dist/systemPrompt.d.ts.map +1 -1
- package/dist/systemPrompt.js +81 -61
- package/dist/systemPrompt.js.map +1 -1
- package/dist/telemetry.d.ts +43 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +101 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/test_analyst.js +2 -2
- package/dist/test_analyst.js.map +1 -1
- package/dist/test_book_a_call_live.d.ts +2 -0
- package/dist/test_book_a_call_live.d.ts.map +1 -0
- package/dist/test_book_a_call_live.js +148 -0
- package/dist/test_book_a_call_live.js.map +1 -0
- package/dist/test_brand_intelligence_endpoint.d.ts +2 -0
- package/dist/test_brand_intelligence_endpoint.d.ts.map +1 -0
- package/dist/test_brand_intelligence_endpoint.js +20 -0
- package/dist/test_brand_intelligence_endpoint.js.map +1 -0
- package/dist/test_coverage_relevance.d.ts +12 -0
- package/dist/test_coverage_relevance.d.ts.map +1 -0
- package/dist/test_coverage_relevance.js +121 -0
- package/dist/test_coverage_relevance.js.map +1 -0
- package/dist/test_dcr_and_legacy_deprecation.d.ts +2 -0
- package/dist/test_dcr_and_legacy_deprecation.d.ts.map +1 -0
- package/dist/test_dcr_and_legacy_deprecation.js +148 -0
- package/dist/test_dcr_and_legacy_deprecation.js.map +1 -0
- package/dist/test_financial_snapshot_render.d.ts +2 -0
- package/dist/test_financial_snapshot_render.d.ts.map +1 -0
- package/dist/test_financial_snapshot_render.js +167 -0
- package/dist/test_financial_snapshot_render.js.map +1 -0
- package/dist/test_gap_alert.d.ts +12 -0
- package/dist/test_gap_alert.d.ts.map +1 -0
- package/dist/test_gap_alert.js +43 -0
- package/dist/test_gap_alert.js.map +1 -0
- package/dist/test_list_graphs_topics.d.ts +2 -0
- package/dist/test_list_graphs_topics.d.ts.map +1 -0
- package/dist/test_list_graphs_topics.js +26 -0
- package/dist/test_list_graphs_topics.js.map +1 -0
- package/dist/test_live_endpoint_runner.d.ts +2 -0
- package/dist/test_live_endpoint_runner.d.ts.map +1 -0
- package/dist/test_live_endpoint_runner.js +65 -0
- package/dist/test_live_endpoint_runner.js.map +1 -0
- package/dist/test_local_list_graphs.d.ts +2 -0
- package/dist/test_local_list_graphs.d.ts.map +1 -0
- package/dist/test_local_list_graphs.js +53 -0
- package/dist/test_local_list_graphs.js.map +1 -0
- package/dist/test_next_moves.d.ts +2 -0
- package/dist/test_next_moves.d.ts.map +1 -0
- package/dist/test_next_moves.js +349 -0
- package/dist/test_next_moves.js.map +1 -0
- package/dist/test_next_moves_transcripts.d.ts +2 -0
- package/dist/test_next_moves_transcripts.d.ts.map +1 -0
- package/dist/test_next_moves_transcripts.js +413 -0
- package/dist/test_next_moves_transcripts.js.map +1 -0
- package/dist/test_nike_cmo_alias.d.ts +2 -0
- package/dist/test_nike_cmo_alias.d.ts.map +1 -0
- package/dist/test_nike_cmo_alias.js +76 -0
- package/dist/test_nike_cmo_alias.js.map +1 -0
- package/dist/test_session_next_moves_telemetry.d.ts +2 -0
- package/dist/test_session_next_moves_telemetry.d.ts.map +1 -0
- package/dist/test_session_next_moves_telemetry.js +100 -0
- package/dist/test_session_next_moves_telemetry.js.map +1 -0
- package/dist/test_token_resolution.d.ts +2 -0
- package/dist/test_token_resolution.d.ts.map +1 -0
- package/dist/test_token_resolution.js +82 -0
- package/dist/test_token_resolution.js.map +1 -0
- package/dist/toolHandlers.d.ts +7 -3
- package/dist/toolHandlers.d.ts.map +1 -1
- package/dist/toolHandlers.js +1678 -364
- package/dist/toolHandlers.js.map +1 -1
- package/dist/tools.d.ts +7 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +12 -3
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +9 -46
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/dist/verify_tools_endpoint.js +4 -3
- package/dist/verify_tools_endpoint.js.map +1 -1
- package/package.json +5 -2
- package/server.json +16 -3
- package/dist/scripts/simulate_gemini.d.ts +0 -2
- package/dist/scripts/simulate_gemini.d.ts.map +0 -1
- package/dist/scripts/simulate_gemini.js +0 -100
- package/dist/scripts/simulate_gemini.js.map +0 -1
- package/dist/scripts/verify_registry.d.ts +0 -2
- package/dist/scripts/verify_registry.d.ts.map +0 -1
- package/dist/scripts/verify_registry.js +0 -77
- package/dist/scripts/verify_registry.js.map +0 -1
- package/dist/src/index.d.ts +0 -2
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -332
- package/dist/src/index.js.map +0 -1
- package/dist/src/tools.d.ts +0 -12
- package/dist/src/tools.d.ts.map +0 -1
- package/dist/src/tools.js +0 -104
- package/dist/src/tools.js.map +0 -1
- package/dist/src/types.d.ts +0 -44
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/types.js.map +0 -1
- package/dist/src/verify.d.ts +0 -2
- package/dist/src/verify.d.ts.map +0 -1
- package/dist/src/verify.js +0 -47
- package/dist/src/verify.js.map +0 -1
- package/dist/src/verify_hmac.d.ts +0 -2
- package/dist/src/verify_hmac.d.ts.map +0 -1
- package/dist/src/verify_hmac.js +0 -106
- package/dist/src/verify_hmac.js.map +0 -1
- package/dist/src/verify_tools_endpoint.d.ts +0 -2
- package/dist/src/verify_tools_endpoint.d.ts.map +0 -1
- package/dist/src/verify_tools_endpoint.js +0 -40
- package/dist/src/verify_tools_endpoint.js.map +0 -1
- package/dist/test-waverunner-response.d.ts +0 -2
- package/dist/test-waverunner-response.d.ts.map +0 -1
- package/dist/test-waverunner-response.js +0 -20
- package/dist/test-waverunner-response.js.map +0 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { createSessionTracker } from './sessionTracker.js';
|
|
3
|
+
console.log('--- Running Session Tracker Next Moves Telemetry Tests ---');
|
|
4
|
+
const tracker = createSessionTracker();
|
|
5
|
+
// Initial state: no prior turns, evaluateNextMoveMatch returns undefined
|
|
6
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Tell me about Nike', 'search_graph'), undefined);
|
|
7
|
+
// Turn 1 recommendation
|
|
8
|
+
const nextMovesTurn1 = {
|
|
9
|
+
thread: {
|
|
10
|
+
kind: 'more_in_graph',
|
|
11
|
+
graph_id: 'retail',
|
|
12
|
+
graph_display: 'Retail Strategy & Innovation',
|
|
13
|
+
remaining_count: 5,
|
|
14
|
+
theme: 'Autonomous Checkout'
|
|
15
|
+
},
|
|
16
|
+
specific: {
|
|
17
|
+
brands: ['Nike', 'Adidas'],
|
|
18
|
+
statistics_source: 'Census retail trade reports',
|
|
19
|
+
expert: {
|
|
20
|
+
analyst_id: 'ben-dietz-sic',
|
|
21
|
+
display_name: 'Ben Dietz',
|
|
22
|
+
reason: 'cultural strategy and youth marketing'
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
scope_prompt: true,
|
|
26
|
+
known_brand: 'Nike',
|
|
27
|
+
presentation: 'internal'
|
|
28
|
+
};
|
|
29
|
+
tracker.recordNextMoves(nextMovesTurn1, 'retail innovation trends');
|
|
30
|
+
assert.deepStrictEqual(tracker.getLastNextMoves(), nextMovesTurn1);
|
|
31
|
+
// Test Scope Match
|
|
32
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Cut this specifically to Nike', 'search_graph'), 'scope');
|
|
33
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Working on a brief for our brand', 'search_graph'), 'scope');
|
|
34
|
+
// Test Specific Brand Match
|
|
35
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('What about Adidas in this space?', 'search_graph'), 'specific_brand');
|
|
36
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Look up Nike', 'brand_tracker', { brand_name: 'Nike' }), 'specific_brand');
|
|
37
|
+
// Test Specific Expert Match
|
|
38
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Can I consult Ben Dietz on this?', 'consult_analyst', { analyst_id: 'ben-dietz-sic' }), 'specific_expert');
|
|
39
|
+
// Test Specific Stat Match
|
|
40
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Search statistics for retail spending', 'search_statistics', { graph_id: 'retail' }), 'specific_stat');
|
|
41
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Get census retail trade reports data', 'get_supplemental_context'), 'specific_stat');
|
|
42
|
+
// Test Thread Match
|
|
43
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Pull the remaining signals on Autonomous Checkout', 'search_graph', { graphId: 'retail' }), 'thread');
|
|
44
|
+
// Test None Match (unrelated query)
|
|
45
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Tell me the weather in Seattle', 'search_graph'), 'none');
|
|
46
|
+
// Test that stat query returns none when statistics_source was NOT in recommendations
|
|
47
|
+
const nextMovesNoStats = {
|
|
48
|
+
scope_prompt: true,
|
|
49
|
+
presentation: 'internal'
|
|
50
|
+
};
|
|
51
|
+
tracker.recordNextMoves(nextMovesNoStats, 'some query');
|
|
52
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Search statistics for retail', 'search_statistics', { graph_id: 'retail' }), 'none', 'Should not classify as specific_stat if statistics_source was never offered');
|
|
53
|
+
// ── Consult-Specific Next Moves Telemetry Tests (Render Spec 1.3) ──
|
|
54
|
+
const consultNextMoves = {
|
|
55
|
+
scope_prompt: true,
|
|
56
|
+
presentation: 'internal',
|
|
57
|
+
thread: {
|
|
58
|
+
kind: 'expert_thread',
|
|
59
|
+
graph_id: 'ben-dietz-sic',
|
|
60
|
+
graph_display: 'Ben Dietz',
|
|
61
|
+
next_angle: 'We can explore creator-led retail formats next.',
|
|
62
|
+
uncited_themes: ['Discord Communities'],
|
|
63
|
+
text: 'We can explore creator-led retail formats next.'
|
|
64
|
+
},
|
|
65
|
+
shelf: [
|
|
66
|
+
{ graph_id: 'retail', graph_display: 'Retail Strategy & Innovation', reason: 'Retail operations' },
|
|
67
|
+
{ graph_id: 'fashion', graph_display: 'Fashion & Luxury Systems', reason: 'Luxury circularity' }
|
|
68
|
+
],
|
|
69
|
+
specific: {
|
|
70
|
+
expert: {
|
|
71
|
+
analyst_id: 'retail-lead',
|
|
72
|
+
display_name: 'Retail Strategy Lead',
|
|
73
|
+
reason: 'omnichannel retail'
|
|
74
|
+
},
|
|
75
|
+
shelf_graphs: [
|
|
76
|
+
{ graph_id: 'retail', graph_display: 'Retail Strategy & Innovation', reason: 'Retail operations' }
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
consult_envelope: {
|
|
80
|
+
thread_line: 'We can explore creator-led retail formats next.',
|
|
81
|
+
shelf_line: 'Fodda also holds trend signals on this in Retail Strategy & Innovation and Fashion & Luxury Systems if you want the wider picture.',
|
|
82
|
+
scope_line: "If you tell me the brand or brief you're working on, I'll cut this to that."
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
tracker.recordNextMoves(consultNextMoves, 'cultural commerce');
|
|
86
|
+
// 1. Thread match: continuing with current expert
|
|
87
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Tell me more about creator-led retail formats', 'consult_human_agent', { analyst_id: 'ben-dietz-sic' }), 'thread', 'Follow-up with same expert should match thread');
|
|
88
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Let us look into Discord Communities', 'consult_analyst', { analyst_id: 'ben-dietz-sic' }), 'thread', 'Follow-up on uncited theme with same expert should match thread');
|
|
89
|
+
// 2. Shelf graph match: exploring shelf graphs recommended in sentence 2 -> must emit 'shelf' per §2.C
|
|
90
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Show me retail operations research', 'search_graph', { graphId: 'retail' }), 'shelf', 'Exploring shelf graph should match shelf per telemetry spec §2.C');
|
|
91
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Explore Fashion & Luxury Systems', 'get_domain_intelligence', { query: 'fashion luxury systems' }), 'shelf', 'Exploring shelf graph by name should match shelf');
|
|
92
|
+
// 3. Alternate expert referral match
|
|
93
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('I want to consult Retail Strategy Lead', 'consult_analyst', { analyst_id: 'retail-lead' }), 'specific_expert', 'Consulting referred expert should match specific_expert');
|
|
94
|
+
// 4. Scope deliverable match
|
|
95
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('Scope a deliverable on creator commerce', 'request_deliverable', { analyst_id: 'ben-dietz-sic', offering_key: 'brief' }), 'scope', 'Scoping deliverable should match scope');
|
|
96
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('To turn this into an executive brief, please scope a project deliverable', 'consult_human_agent', { analyst_id: 'ben-dietz-sic' }), 'scope', 'Scoping text prompt should match scope');
|
|
97
|
+
// 5. None match
|
|
98
|
+
assert.strictEqual(tracker.evaluateNextMoveMatch('How is the weather in Tokyo?', 'search_graph'), 'none', 'Unrelated topic should match none');
|
|
99
|
+
console.log('✅ All Session Tracker Next Moves Telemetry tests passed successfully!');
|
|
100
|
+
//# sourceMappingURL=test_session_next_moves_telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_session_next_moves_telemetry.js","sourceRoot":"","sources":["../src/test_session_next_moves_telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_token_resolution.d.ts","sourceRoot":"","sources":["../src/test_token_resolution.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { Server } from 'http';
|
|
3
|
+
import { resolveMcpToken } from './index.js';
|
|
4
|
+
async function main() {
|
|
5
|
+
console.log('--- Verification: resolveMcpToken header auth ---');
|
|
6
|
+
let receivedHeaders = {};
|
|
7
|
+
let mockStatusCode = 200;
|
|
8
|
+
let mockResponseBody = { apiKey: 'test_key_123', email: 'user@example.com', name: 'Test User' };
|
|
9
|
+
const app = express();
|
|
10
|
+
app.get('/api/mcp-tokens/:token', (req, res) => {
|
|
11
|
+
receivedHeaders = req.headers;
|
|
12
|
+
if (mockStatusCode !== 200) {
|
|
13
|
+
res.status(mockStatusCode).json({ error: 'Unauthorized' });
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
res.json(mockResponseBody);
|
|
17
|
+
});
|
|
18
|
+
const server = await new Promise((res) => {
|
|
19
|
+
const s = app.listen(0, () => res(s));
|
|
20
|
+
});
|
|
21
|
+
const port = server.address().port;
|
|
22
|
+
const baseUrl = `http://localhost:${port}`;
|
|
23
|
+
try {
|
|
24
|
+
// Test 1: FODDA_MCP_SECRET set
|
|
25
|
+
process.env.FODDA_MCP_SECRET = 'test-secret-999';
|
|
26
|
+
delete process.env.ONBOARD_SECRET;
|
|
27
|
+
const res1 = await resolveMcpToken('token_abc_1', baseUrl);
|
|
28
|
+
if (res1.apiKey !== 'test_key_123' || res1.email !== 'user@example.com') {
|
|
29
|
+
throw new Error(`Test 1 Failed: unexpected response payload ${JSON.stringify(res1)}`);
|
|
30
|
+
}
|
|
31
|
+
const h1 = String(receivedHeaders['x-fodda-mcp-secret'] || '');
|
|
32
|
+
if (h1 !== 'test-secret-999') {
|
|
33
|
+
throw new Error(`Test 1 Failed: header X-Fodda-Mcp-Secret was '${h1}', expected 'test-secret-999'`);
|
|
34
|
+
}
|
|
35
|
+
console.log('✅ Test 1 Passed: Outbound token resolution attaches X-Fodda-Mcp-Secret header when configured.');
|
|
36
|
+
// Test 2: ONBOARD_SECRET fallback
|
|
37
|
+
delete process.env.FODDA_MCP_SECRET;
|
|
38
|
+
process.env.ONBOARD_SECRET = 'onboard-secret-777';
|
|
39
|
+
const res2 = await resolveMcpToken('token_abc_2', baseUrl);
|
|
40
|
+
const h2 = String(receivedHeaders['x-fodda-mcp-secret'] || '');
|
|
41
|
+
if (h2 !== 'onboard-secret-777') {
|
|
42
|
+
throw new Error(`Test 2 Failed: header X-Fodda-Mcp-Secret was '${h2}', expected 'onboard-secret-777'`);
|
|
43
|
+
}
|
|
44
|
+
console.log('✅ Test 2 Passed: Outbound token resolution falls back to ONBOARD_SECRET.');
|
|
45
|
+
// Test 3: Secret missing fallback warning
|
|
46
|
+
delete process.env.FODDA_MCP_SECRET;
|
|
47
|
+
delete process.env.ONBOARD_SECRET;
|
|
48
|
+
const res3 = await resolveMcpToken('token_abc_3', baseUrl);
|
|
49
|
+
const h3 = receivedHeaders['x-fodda-mcp-secret'];
|
|
50
|
+
if (h3) {
|
|
51
|
+
throw new Error(`Test 3 Failed: expected no X-Fodda-Mcp-Secret header when secrets unset, got '${h3}'`);
|
|
52
|
+
}
|
|
53
|
+
console.log('✅ Test 3 Passed: Outbound token resolution handles missing secrets gracefully with debug warning.');
|
|
54
|
+
// Test 4: 401 Unauthorized handling
|
|
55
|
+
process.env.FODDA_MCP_SECRET = 'invalid-secret';
|
|
56
|
+
mockStatusCode = 401;
|
|
57
|
+
let caughtError = false;
|
|
58
|
+
try {
|
|
59
|
+
await resolveMcpToken('token_abc_4', baseUrl);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
caughtError = true;
|
|
63
|
+
if (!err.message.includes('unauthorized (HTTP 401)')) {
|
|
64
|
+
throw new Error(`Test 4 Failed: unexpected error message: ${err.message}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!caughtError) {
|
|
68
|
+
throw new Error('Test 4 Failed: expected 401 error to be thrown');
|
|
69
|
+
}
|
|
70
|
+
console.log('✅ Test 4 Passed: 401 Unauthorized handled cleanly with informative error.');
|
|
71
|
+
console.log('\nAll resolveMcpToken tests passed successfully! 🎉');
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
server.close();
|
|
75
|
+
process.exit(0);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
main().catch((err) => {
|
|
79
|
+
console.error('❌ Verification failed:', err);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=test_token_resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_token_resolution.js","sourceRoot":"","sources":["../src/test_token_resolution.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,KAAK,UAAU,IAAI;IACf,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAEjE,IAAI,eAAe,GAAkD,EAAE,CAAC;IACxE,IAAI,cAAc,GAAG,GAAG,CAAC;IACzB,IAAI,gBAAgB,GAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAErG,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC;QAC9B,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAC3D,OAAO;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAW,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC7C,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAI,MAAM,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;IAC5C,MAAM,OAAO,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAE3C,IAAI,CAAC;QACD,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAElC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,IAAI,CAAC,KAAK,KAAK,kBAAkB,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,EAAE,KAAK,iBAAiB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iDAAiD,EAAE,+BAA+B,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,gGAAgG,CAAC,CAAC;QAE9G,kCAAkC;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,oBAAoB,CAAC;QAElD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,EAAE,KAAK,oBAAoB,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iDAAiD,EAAE,kCAAkC,CAAC,CAAC;QAC3G,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;QAExF,0CAA0C;QAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACpC,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAElC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,EAAE,GAAG,eAAe,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,EAAE,EAAE,CAAC;YACL,MAAM,IAAI,KAAK,CAAC,iFAAiF,EAAE,GAAG,CAAC,CAAC;QAC5G,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,mGAAmG,CAAC,CAAC;QAEjH,oCAAoC;QACpC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QAChD,cAAc,GAAG,GAAG,CAAC;QAErB,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC;YACD,MAAM,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,4CAA4C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,CAAC;QACL,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QAEzF,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACP,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
package/dist/toolHandlers.d.ts
CHANGED
|
@@ -5,11 +5,15 @@
|
|
|
5
5
|
* Contains createServer() which registers all 30+ MCP tools.
|
|
6
6
|
*/
|
|
7
7
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
-
export
|
|
9
|
-
|
|
8
|
+
export declare function resolveAnalystAlias(analystIdInput: string, companyInput?: string): {
|
|
9
|
+
analyst_id: string;
|
|
10
|
+
company?: string | undefined;
|
|
11
|
+
};
|
|
12
|
+
export type { FoddaRequestFn, WaverunnerRequestFn } from './types.js';
|
|
13
|
+
import type { FoddaRequestFn, WaverunnerRequestFn } from './types.js';
|
|
10
14
|
export declare function createServer(apiKey: string, userId: string, foddaRequest: FoddaRequestFn, waverunnerRequest: WaverunnerRequestFn, storeWidget: (html: string) => string, getServiceUrl: () => string, entryId?: string, sptCtx?: {
|
|
11
15
|
token: string;
|
|
12
16
|
maxAmountCents: number | null;
|
|
13
17
|
prices: Record<string, number>;
|
|
14
|
-
}): Promise<McpServer>;
|
|
18
|
+
}, allowedTools?: Set<string> | string[]): Promise<McpServer>;
|
|
15
19
|
//# sourceMappingURL=toolHandlers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolHandlers.d.ts","sourceRoot":"","sources":["../src/toolHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"toolHandlers.d.ts","sourceRoot":"","sources":["../src/toolHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkCpE,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CA+CvI;AAwGD,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA8DtE,wBAAsB,YAAY,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,cAAc,EAC5B,iBAAiB,EAAE,mBAAmB,EACtC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,aAAa,EAAE,MAAM,MAAM,EAC3B,OAAO,GAAE,MAAW,EAEpB,MAAM,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EACzF,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GACtC,OAAO,CAAC,SAAS,CAAC,CA8iJpB"}
|