Aperçu
Les investisseurs particuliers passent à côté des actualités qui font bouger les marchés car ils vérifient manuellement ou se fient à des flux retardés. Ce workflow surveille votre liste de surveillance d'actions via le serveur MCP de Scavio : recherche chaque ticker quotidiennement, détecte les annonces de résultats, les changements de notation d'analystes et les dépôts SEC, et envoie un briefing matinal avant l'ouverture du marché. Le tout via MCP pour s'intégrer directement avec votre assistant IA.
Déclencheur
Quotidiennement à 6h30 HE, avant l'ouverture du marché.
Planification
Quotidiennement à 6h30
Étapes du workflow
Charger la liste de surveillance d'actions
Lire la liste des tickers à surveiller depuis la configuration. Inclure les noms des sociétés pour de meilleurs résultats de recherche.
Rechercher chaque ticker via MCP
Appeler la recherche Scavio MCP pour chaque ticker avec des requêtes axées sur l'actualité : résultats, analyste, dépôt SEC.
Classer les événements d'actualité
Catégoriser les résultats : EARNINGS, ANALYST_RATING, SEC_FILING, GENERAL_NEWS selon les mots-clés du titre et de l'extrait.
Noter l'impact sur le marché
Attribuer des scores d'impact : les surprises de résultats et les relèvements/abaissements d'analystes obtiennent des scores élevés.
Envoyer le briefing matinal
Formater les principaux événements en un briefing et l'envoyer via Slack, email ou l'afficher dans votre assistant IA.
Implémentation Python
import requests, os, json
from datetime import date
API_KEY = os.environ["SCAVIO_API_KEY"]
MCP_URL = "https://mcp.scavio.dev/mcp"
MH = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
WATCHLIST = [
{"ticker": "AAPL", "name": "Apple"},
{"ticker": "NVDA", "name": "NVIDIA"},
{"ticker": "MSFT", "name": "Microsoft"},
{"ticker": "GOOGL", "name": "Alphabet"},
]
EVENT_KEYWORDS = {
"EARNINGS": ["earnings", "revenue", "quarterly", "beat", "miss", "eps"],
"ANALYST": ["upgrade", "downgrade", "price target", "analyst", "rating"],
"SEC_FILING": ["sec filing", "10-k", "10-q", "8-k", "proxy"],
"GENERAL": [],
}
def mcp_search(query: str) -> dict:
payload = {
"jsonrpc": "2.0", "id": 1,
"method": "tools/call",
"params": {"name": "search", "arguments": {"query": query, "country_code": "us"}}
}
resp = requests.post(MCP_URL, headers=MH, json=payload, timeout=15)
return resp.json().get("result", {})
def classify_event(title: str) -> str:
title_lower = title.lower()
for event_type, keywords in EVENT_KEYWORDS.items():
if any(kw in title_lower for kw in keywords):
return event_type
return "GENERAL"
def monitor_stocks():
briefing = []
for stock in WATCHLIST:
query = f"{stock['ticker']} {stock['name']} stock news {date.today()}"
data = mcp_search(query)
results = data.get("organic_results", [])[:5] if isinstance(data, dict) else []
for r in results:
title = r.get("title", "")
event_type = classify_event(title)
briefing.append({
"ticker": stock["ticker"],
"event": event_type,
"title": title,
"url": r.get("link", ""),
"snippet": r.get("snippet", ""),
})
briefing.sort(key=lambda x: 0 if x["event"] in ["EARNINGS", "ANALYST"] else 1)
return briefing
news = monitor_stocks()
print(f"Stock briefing for {date.today()}: {len(news)} items")
for n in news[:10]:
print(f" [{n['ticker']}] [{n['event']}] {n['title']}")Implémentation JavaScript
const MCP_URL = 'https://mcp.scavio.dev/mcp';
const MH = {'Authorization': 'Bearer '+process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const WATCHLIST = [
{ticker:'AAPL', name:'Apple'},
{ticker:'NVDA', name:'NVIDIA'},
{ticker:'MSFT', name:'Microsoft'},
{ticker:'GOOGL', name:'Alphabet'},
];
const EVENT_KEYWORDS = {EARNINGS:['earnings','revenue','quarterly','beat','miss','eps'], ANALYST:['upgrade','downgrade','price target','analyst','rating'], SEC_FILING:['sec filing','10-k','10-q','8-k','proxy']};
async function mcpSearch(query) {
const payload = {jsonrpc:'2.0', id:1, method:'tools/call', params:{name:'search', arguments:{query, country_code:'us'}}};
const r = await fetch(MCP_URL, {method:'POST', headers:MH, body:JSON.stringify(payload)});
return (await r.json()).result || {};
}
function classifyEvent(title) {
const t = title.toLowerCase();
for (const [type, kws] of Object.entries(EVENT_KEYWORDS)) {
if (kws.some(kw=>t.includes(kw))) return type;
}
return 'GENERAL';
}
async function monitorStocks() {
const briefing = [];
const today = new Date().toISOString().split('T')[0];
for (const stock of WATCHLIST) {
const data = await mcpSearch(stock.ticker+' '+stock.name+' stock news '+today);
const results = (data.organic_results || []).slice(0,5);
for (const r of results) {
briefing.push({ticker:stock.ticker, event:classifyEvent(r.title||''), title:r.title||'', url:r.link||'', snippet:r.snippet||''});
}
}
briefing.sort((a,b)=>(['EARNINGS','ANALYST'].includes(a.event)?0:1)-(['EARNINGS','ANALYST'].includes(b.event)?0:1));
return briefing;
}
const news = await monitorStocks();
console.log('Stock briefing: '+news.length+' items');
for (const n of news.slice(0,10)) console.log(' ['+n.ticker+'] ['+n.event+'] '+n.title);Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA