Skip to main content
Glama
surplus96

PM-MCP (Portfolio Management MCP Server)

by surplus96
portfolio_report.py1.67 kB
from __future__ import annotations from datetime import datetime from typing import List from mcp_server.tools.portfolio import evaluate_holdings from mcp_server.tools.analytics import rank_tickers_with_fundamentals from mcp_server.tools.reports import generate_report from mcp_server.tools.obsidian import write_markdown def run_portfolio_report(tickers: List[str]) -> str: evals = evaluate_holdings(tickers) # 펀더멘털 랭킹으로 점수 채우기 + 페이즈/ret20 병합 ranked = rank_tickers_with_fundamentals(tickers, dip_weight=0.12, use_dip_bonus=True) rmap = {r["ticker"]: r for r in ranked} scores = [] for e in evals: t = e["ticker"] base = rmap.get(t, {}).get("base_score", 0.0) dip = rmap.get(t, {}).get("dip_bonus", 0.0) total = rmap.get(t, {}).get("score", float(base) + float(dip)) item = { "ticker": t, "base_score": round(float(base), 4), "dip_bonus": round(float(dip), 4), "score": round(float(total), 4), "phase": e.get("phase"), "ret20": e.get("ret20"), } scores.append(item) payload = { "title": "Portfolio Phase Report", "date": datetime.now().strftime("%Y-%m-%d"), "tickers": tickers, "summary": "Phase signals for current holdings.", "news_summary": "", "filings_summary": "", "scores": scores, } md = generate_report(payload) path = write_markdown( "Portfolios/Phase Report.md", front_matter={"type": "portfolio", "date": payload["date"], "holdings": tickers}, body=md, ) return path

Latest Blog Posts

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/surplus96/PM-MCP'

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