UNPKG

octagon-stock-market-data-mcp

Version:

MCP server for Stock Market Data. Provides specialized AI-powered stock market data and valuation analysis capabilities with real-time data, technical indicators, and comprehensive market intelligence.

115 lines (114 loc) 4.83 kB
#!/usr/bin/env node import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import dotenv from "dotenv"; import { readFile } from "fs/promises"; import OpenAI from "openai"; import path from "path"; import { fileURLToPath } from "url"; import { z } from "zod"; // Get package.json info const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const packageJsonPath = path.join(__dirname, "..", "package.json"); const packageJsonContent = await readFile(packageJsonPath, "utf8"); const packageInfo = JSON.parse(packageJsonContent); // Load environment variables dotenv.config(); // Check for required environment variables const OCTAGON_API_KEY = process.env.OCTAGON_API_KEY; const OCTAGON_API_BASE_URL = process.env.OCTAGON_API_BASE_URL || "https://api.octagonagents.com/v1"; if (!OCTAGON_API_KEY) { console.error("Error: OCTAGON_API_KEY is not set in the environment variables"); console.error("Please set the OCTAGON_API_KEY environment variable or use 'env OCTAGON_API_KEY=your_key npx -y octagon-stock-market-data-mcp'"); process.exit(1); } // Initialize OpenAI client with Octagon API const octagonClient = new OpenAI({ apiKey: OCTAGON_API_KEY, baseURL: OCTAGON_API_BASE_URL, defaultHeaders: { "User-Agent": `${packageInfo.name}/${packageInfo.version} (Node.js/${process.versions.node})` }, }); // Create MCP server const server = new McpServer({ name: packageInfo.name, version: packageInfo.version, }); // Helper function to process streaming responses async function processStreamingResponse(stream) { let fullResponse = ""; let citations = []; try { // Process the streaming response for await (const chunk of stream) { // For Chat Completions API if (chunk.choices && chunk.choices[0]?.delta?.content) { fullResponse += chunk.choices[0].delta.content; // Check for citations in the final chunk if (chunk.choices[0]?.finish_reason === "stop" && chunk.choices[0]?.citations) { citations = chunk.choices[0].citations; } } // For Responses API if (chunk.type === "response.output_text.delta") { fullResponse += chunk.text?.delta || ""; } } return fullResponse; } catch (error) { console.error("Error processing streaming response:", error); throw error; } } // Define a schema for the 'prompt' parameter that all tools will use const promptSchema = z.object({ prompt: z.string().describe("Your natural language query or request for the agent"), }); // Stock Market Data Agent server.tool("octagon-stock-data-agent", "[PUBLIC MARKET INTELLIGENCE] Specialized agent for stock market data and valuation analysis. Capabilities: Analyze stock price movements, trading volumes, stock indices performance by sector and industry, valuation metrics by company, sector, industry including P/E, EV/S ratios, analysts' price target and ratings, and technical indicators. Best for: Stock market research, equity analysis, and trading pattern identification. Example queries: 'How has Apple's stock performed compared to the S&P 500 over the last 6 months?', 'What is the monthly P/E ratio for NVDA over the past 24 months?', 'Analyze the trading volume patterns for Tesla stock before and after earnings releases', 'What were the major price movements for NVIDIA in 2023 and what were the catalysts?'.", { prompt: z.string().describe("Your natural language query or request for the agent"), }, async ({ prompt }) => { try { const response = await octagonClient.chat.completions.create({ model: "octagon-stock-data-agent", messages: [{ role: "user", content: prompt }], stream: true, metadata: { tool: "mcp" } }); const result = await processStreamingResponse(response); return { content: [ { type: "text", text: result, }, ], }; } catch (error) { console.error("Error calling Stock Data agent:", error); return { isError: true, content: [ { type: "text", text: `Error: Failed to process stock market data query. ${error}`, }, ], }; } }); // Start the server with stdio transport async function main() { try { const transport = new StdioServerTransport(); await server.connect(transport); } catch (error) { process.exit(1); } } main();