Skip to main content
Glama

Gold IRA Sales Analysis MCP Server

by the-funky-1
http-server.ts11.5 kB
#!/usr/bin/env node /** * HTTP Server wrapper for Gold IRA Analysis MCP * Implements Smithery.ai HTTP transport for MCP servers */ import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; import express, { Request, Response } from 'express'; import cors from 'cors'; import { CallToolRequestSchema, ListToolsRequestSchema, InitializeRequestSchema, } from "@modelcontextprotocol/sdk/types.js"; import { z } from "zod"; // Input validation schema (same as original) const AnalyzeTranscriptSchema = z.object({ transcript: z.string().min(100).max(100000), metadata: z.object({ agentName: z.string().optional(), duration: z.number().optional(), retirementStatus: z.enum(["pre-retirement", "recently-retired", "retired"]).optional(), accountTypes: z.array(z.enum(["ira", "401k", "403b", "roth-ira", "cash", "brokerage"])).optional(), investmentExperience: z.enum(["novice", "intermediate", "experienced"]).optional(), familyMembers: z.number().optional(), }).optional(), }); // Create express app const app = express(); app.use(cors()); app.use(express.json()); // Health check endpoint app.get('/health', (req: Request, res: Response) => { res.json({ status: 'ok', service: 'goldira-analysis-mcp' }); }); // SSE endpoint for MCP app.get('/sse', async (req: Request, res: Response) => { console.log('SSE connection established'); // Set SSE headers res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': '*', }); // Create MCP server const server = new Server( { name: "goldira-analysis-mcp", version: "1.0.0", }, { capabilities: { tools: {}, }, } ); // Handle initialization server.setRequestHandler(InitializeRequestSchema, async (request) => { return { protocolVersion: "2024-11-05", capabilities: { tools: {}, }, serverInfo: { name: "goldira-analysis-mcp", version: "1.0.0", }, }; }); // List available tools server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: "analyze_goldira_transcript", description: "Analyze B2C Gold IRA sales call transcripts through 6 specialized prompts in strategic order (2→3→4→5→6→1). Returns structured analysis instructions and prompts for AI execution.", inputSchema: { type: "object", properties: { transcript: { type: "string", description: "The sales call transcript to analyze", minLength: 100, maxLength: 100000, }, metadata: { type: "object", description: "Optional metadata about the call", properties: { agentName: { type: "string" }, duration: { type: "number" }, retirementStatus: { type: "string", enum: ["pre-retirement", "recently-retired", "retired"], }, accountTypes: { type: "array", items: { type: "string", enum: ["ira", "401k", "403b", "roth-ira", "cash", "brokerage"], }, }, investmentExperience: { type: "string", enum: ["novice", "intermediate", "experienced"], }, familyMembers: { type: "number" }, }, }, }, required: ["transcript"], }, }, ], }; }); // Handle tool execution server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; if (name === "analyze_goldira_transcript") { try { // Validate input const validatedArgs = AnalyzeTranscriptSchema.parse(args); // Generate analysis instructions for AI execution const result = generateAnalysisInstructions(validatedArgs); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error"; return { content: [ { type: "text", text: JSON.stringify({ error: "Analysis failed", message: errorMessage }, null, 2), }, ], isError: true, }; } } throw new Error(`Unknown tool: ${name}`); }); // Create SSE transport const transport = new SSEServerTransport('/sse', res); // Connect server to transport await server.connect(transport); // Keep connection alive const keepAlive = setInterval(() => { res.write(':ping\n\n'); }, 30000); // Clean up on disconnect req.on('close', () => { clearInterval(keepAlive); console.log('SSE connection closed'); }); }); // POST endpoint for direct tool calls (alternative to SSE) app.post('/analyze', async (req: Request, res: Response) => { try { const validatedArgs = AnalyzeTranscriptSchema.parse(req.body); const result = generateAnalysisInstructions(validatedArgs); res.json(result); } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error"; res.status(400).json({ error: "Analysis failed", message: errorMessage }); } }); // Analysis function (copy from original) function generateAnalysisInstructions(input: z.infer<typeof AnalyzeTranscriptSchema>) { const { transcript, metadata = {} } = input; const sessionId = Math.random().toString(36).substring(2, 15); console.log(`[${sessionId}] Starting Gold IRA analysis...`); try { // Execute the 6-prompt analysis in order: 2→3→4→5→6→1 const conversationAnalysis = executePrompt2(transcript, metadata); const psychologyProfile = executePrompt3(transcript, metadata); const objectionAnalysis = executePrompt4(transcript, metadata, psychologyProfile); const riskAssessment = executePrompt5(transcript, metadata, conversationAnalysis, psychologyProfile); const actionPlan = executePrompt6(transcript, metadata, conversationAnalysis, psychologyProfile, objectionAnalysis, riskAssessment); const qualification = executePrompt1(transcript, metadata, conversationAnalysis, psychologyProfile, objectionAnalysis, riskAssessment, actionPlan); console.log(`[${sessionId}] Analysis complete - 6 prompts executed`); return { sessionId, timestamp: new Date().toISOString(), analysisComplete: true, results: { conversationDynamics: conversationAnalysis, psychologyProfile: psychologyProfile, objectionAnalysis: objectionAnalysis, dealRiskAssessment: riskAssessment, actionPlan: actionPlan, strategicQualification: qualification }, summary: { overallScore: qualification.qualificationSummary.opportunityScore, recommendation: qualification.qualificationSummary.recommendation, primaryObjective: actionPlan.executiveSummary.primaryObjective, successProbability: actionPlan.executiveSummary.successProbability, keyInsights: [ ...conversationAnalysis.conversationFlow.improvementAreas.slice(0,2), ...psychologyProfile.strategicApproach.keyMessages.slice(0,2), qualification.qualificationSummary.recommendation ] }, metadata }; } catch (error) { console.error(`[${sessionId}] Analysis failed:`, error); throw error; } } // Copy all the analysis helper functions from original index.ts // (For brevity, importing them - in production, copy the full implementations) // Placeholder implementations - copy full versions from index.ts function executePrompt1(transcript: string, metadata: any, conversationAnalysis: any, psychologyProfile: any, objectionAnalysis: any, riskAssessment: any, actionPlan: any) { return { qualificationSummary: { opportunityScore: 72, recommendation: "proceed_cautiously", confidence: 75, keyQualifiers: ["Strong conservative investor profile match"], redFlags: ["Advisor dependency could block decision"] }, needs_assessment: {}, financial_qualification: {}, decision_process_analysis: {}, competitive_landscape: {}, organizational_readiness: {}, disqualification_criteria: [], opportunity_sizing: {}, go_no_go_analysis: {}, strategic_recommendations: [] }; } function executePrompt2(transcript: string, metadata: any) { return { conversationScorecard: { overallQuality: 75, discovery: 70, rapportBuilding: 80, valuePresentation: 75, objectionHandling: 70, nextStepsClarity: 80 }, keyMoments: [], missedOpportunities: [], conversationFlow: { talkTimeRatio: "60:40", questionQuality: 70, listeningQuality: 75, engagementLevel: 80, improvementAreas: ["Deeper financial discovery needed", "Timeline clarity lacking"] }, tacticalRecommendations: [], coachingPriorities: [] }; } function executePrompt3(transcript: string, metadata: any) { return { profileSummary: "Conservative retiree focused on security", personalityType: { primary: "analytical", confidence: 85 }, motivationDrivers: [], communicationPreferences: {}, buyingProcess: {}, strategicApproach: { recommendedStrategy: "consultative", keyMessages: ["Gold is the most conservative investment", "Perfect inheritance vehicle"], approachTactics: [], avoid: [] }, nextStepRecommendations: [] }; } function executePrompt4(transcript: string, metadata: any, psychologyProfile: any) { return { objectionInventory: [], underlyingConcerns: [], responseStrategy: [], preventionStrategy: [], objectionHandlingSkills: {} }; } function executePrompt5(transcript: string, metadata: any, conversationAnalysis: any, psychologyProfile: any) { return { dealHealth: { overallScore: 72 }, stakeholderMap: [], riskAnalysis: [], competitiveThreats: [], criticalSuccessFactors: [], escalationPlan: {} }; } function executePrompt6(transcript: string, metadata: any, conversationAnalysis: any, psychologyProfile: any, objectionAnalysis: any, riskAssessment: any) { return { executiveSummary: { dealStatus: "Qualified prospect", keyInsights: [], primaryObjective: "Secure advisor consultation", successProbability: 65 }, immediateActions: [], followUpSequence: [], resourceRequirements: [], stakeholderOutreach: [], trackingPlan: {}, contingencyPlans: [] }; } // Start the server const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Gold IRA Analysis MCP HTTP server listening on port ${PORT}`); console.log(`SSE endpoint: http://localhost:${PORT}/sse`); console.log(`Direct analysis endpoint: http://localhost:${PORT}/analyze`); console.log(`Health check: http://localhost:${PORT}/health`); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/the-funky-1/MCP_Analysis'

If you have feedback or need assistance with the MCP directory API, please join our Discord server