import jsonimport osfrom datetime import datetime, timedeltaimport openaifrom dotenv import load_dotenvfrom mcp.server.fastmcp import FastMCPfrom pydantic import BaseModelfrom phoenix.otel import registerload_dotenv()# You must also connect your MCP server to Phoenixtracer_provider = register(auto_instrument=True)# Get a tracer to add additional instrumentattiontracer = tracer_provider.get_tracer("financial-analysis-server")# Configure OpenAI clientclient = openai.OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))MODEL = "gpt-4-turbo"# Create MCP servermcp = FastMCP("Financial Analysis Server")class StockAnalysisRequest(BaseModel): ticker: str time_period: str = "short-term" # short-term, medium-term, long-term@mcp.tool()@tracer.tool(name="MCP.analyze_stock") # this OpenInference call adds tracing to this methoddef analyze_stock(request: StockAnalysisRequest) -> dict: """Analyzes a stock based on its ticker symbol and provides investment recommendations.""" # Make LLM API call to analyze the stock prompt = f""" Provide a detailed financial analysis for the stock ticker: {request.ticker} Time horizon: {request.time_period} Please include: 1. Company overview 2. Recent financial performance 3. Key metrics (P/E ratio, market cap, etc.) 4. Risk assessment 5. Investment recommendation Format your response as a JSON object with the following structure: {{ "ticker": "{request.ticker}", "company_name": "Full company name", "overview": "Brief company description", "financial_performance": "Analysis of recent performance", "key_metrics": {{ "market_cap": "Value in billions", "pe_ratio": "Current P/E ratio", "dividend_yield": "Current yield percentage", "52_week_high": "Value", "52_week_low": "Value" }}, "risk_assessment": "Analysis of risks", "recommendation": "Buy/Hold/Sell recommendation with explanation", "time_horizon": "{request.time_period}" }} """ response = client.chat.completions.create( model=MODEL, messages=[{"role": "user", "content": prompt}], response_format={"type": "json_object"}, ) analysis = json.loads(response.choices[0].message.content) return analysis# ... define any additional MCP tools you wishif __name__ == "__main__": mcp.run()