Практычныя нататкі: фінансавы AI-агент на MCP-серверы EODHD
Практычны разбор тэмы «фінансавы AI-агент на MCP-серверы EODHD»: кантракты, праверкі і гатовыя фрагменты кода для каманд, якія ўкараняюць гэты падыход.
Крыніцы: Build an AI Financial Agent with EODHD’s MCP Server
У гэтым керавану парадоксальна дорага ад сыр'ёў да рабочай сістэмы для стварэння AI-фінансовага агента з серверам MCP ад EODHD. Акцэнт ставіцца на практычныя крокі, чысткія перакананні і код, які можна проста дадзіць у рэпазітарый без неабяснення меты. Для адгледжэння спачатку неабясніце вхідныя даны, адпаведальную особу за крок і крытэрыя завершэння перш чым зменіць код. Аперацыйныя працавнікі должны магчымае перадзеўсці крок з вядомага пункта контролю без неабяснення схованага стану. Спрэцыявайце гэты этап як кантракт між вхіднымі данымі і падтвердзенымі выходнымі рэзультатамі. Назвайце артыфакты, неабясніце крытэрыя успеху і адмовіцеся ад беззвучнага частковага завершэння.
Традыцыйны падход з API фінансавых дадзэнняў быстра выклікае проблемы
Калі працуеце над кнігай «The Traditional Financial Data API Approach Breaks Down Fast», спачатку запісаце кантракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неудачы. Такі спіс дапамагае заліцьварацца з пазнейшымі зменамі ў кодзе. Запісваце час выканання і кост токена або запыту разам з функцыйнальнымі рэзултатамі. Відразы відомасці коста запобегае неспакоўным рахункам, калі праця пераходзіць з дэмовай асяроддзя ў спакульную. Запісваце назву інструмента, хэш аргументаў, час затрымкі і рэзултат кожнага вызову. Без такога лёгкага следу дэбагаванне агента займае гадзіны.
Асловыя проблемы — гэта кантэкст, а не даны
Калі працуеце над кнігай «Праўdziва проблема — гэта кантэкст, а не даны», спачатку запісайце угоду: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковага невыпання. Такі спіс контроля дапамагае заліцварыць пазнейшыя змены ў кодзе. Зберагаюце настройкі паза кодам прыемліка. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аўдыт без неабходнасці чытання всей структуры. Зявляйце логі з назвай інструмента, хэшам аргументаў, часам затрымкі і рэзультатам кожнага вызову. Без такога следу дэбаггінг агента займае гадзіны.
Што зменяе сервер MCP для API фінансавых дадзеных
Калі працюеце над матэрыялам «Што зменяецца у сервера MCP для API фінансавых дадзей», спачатку запішыце кантракт: неабяжлівыя даныя, сігнал працявання і тое, што выходзіць на падзею частковага нявыпання. Такі спіс дапамагае заліцьваты пазнейшыя змены ў кодзе. Документавайце як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкія перакрыцця і апрацоўка некорэктных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам. Зявляйце логі з назвай інструмента, хэшам аргументаў, часам затрымкі і рэзультатам кожнага вызову. Без такога следу дэбагаванне агента губіць гадзіны. Калі працюеце над матэрыялам «Што зменяецца у сервера MCP для API фінансавых дадзей», спачатку запішыце кантракт: неабяжлівыя даныя, сігнал працявання і тое, што выходзіць на падзею частковага нявыпання. Такі спіс дапамагае заліцьваты пазнейшыя змены ў кодзе. Спрыймайце гэты этап як кантракт межа абавязковымі данымі і перакананымі рэзультатамі. Дайце назвы элементам, задаце правіла пераканання пра успех і адмовіцеся ад мовчазнага частковага завершэння.
Стварэнне AI-фінансовага агента з серверам MCP ад EODHD
Стварэнне AI-фінансовага агента з серверам MCP ад EODHD будзе эфектываўша, калі яго спрыяць як мерыемую структуру. Зберагачыце адна ідэальная транскрыпція, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Запісвайце час выканання і кост токеноў або запытаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмовай асяроддзя ў спакульную. Адкрывайце інструменты з вузкімі схемамі і чысткімі пазначэннямі побачных эфектаў. Адпаведальныя за хоставанне павінны знаты, якія вызовы мутуюць стан, перш чым автаматычна ўзяць іх на спрыт.
Настройка
Настройкі лепша працюе, калі яе спрыяваць як мерыемую паверхню. Запісаце адна «золатая» транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць сферу дзеяння. Зберагаце настройкі пазначыта ўне з кодам прыемліка. Файлы сераўнавання, хранілішчы секрэтных дадзеных і пазнакі функцый канаць быць у адным месца, якое аператары можаць пераглядаць без неабяжнага чытання всіх дадзеных. Адкрывайце інструменты з вузкімі схемамі і чысткімі пазначэннямі пабочных эфектаў. Хостам неабходна знаты, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць іх.
pip install anthropic
Прыяўленне агента да сервера MCP EODHD на Python
З’еднанне агента з серверам MCP EODHD на Python працюе найкрашча, калі яго розглядаць як мераючая паверхня. Запісаце адзін ідэальны транскрыпт, адзін прыклад неудачы і прыметку паўрануці перш чым расшырваць масштабы. Дакументаваце як успішны, так і патроны вяснавання проблем. Перапрыбуткі, людзкія контралі і обработка некорэктных паведамленняў ёсць часткаю продукту, а не пасляднім дапрацоўкам. Закрэпіце інтэрпрэтара і файл з блокаванням залежнасцяў прычым навучэнні цыклу. Разлік межаў межы ноутбука і CI ёсць найчастэйшым тыхім нарушэнням пад час дэманстрацый API. З’еднанне агента з серверам MCP EODHD на Python працюе найкрашча, калі яго розглядаць як мераючая паверхня. Запісаце адзін ідэальны транскрыпт, адзін прыклад неудачы і прыметку паўрануці перш чым расшырваць масштабы. Разглядвайце гэты этап як кантракт межаў вхідных дадзенняў і перакананых выходных рэзультатаў. Назваце артыфакты, задаце крытэрыя успеху і адмовіцеся ад тыхіх частковых завершэнняў.
import anthropic
client = anthropic.Anthropic(api_key="YOUR_ANTHROPIC_API_KEY")EODHD_API_KEY = "YOUR_EODHD_API_TOKEN"response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1500,
messages=[
{
"role": "user",
"content": (
"Give me a quick pre-earnings health check on AAPL: "
"key fundamentals, the next earnings date, and how the "
"stock has moved over the last month."
)
}
],
mcp_servers=[
{
"type": "url",
"url": f"https://mcp.eodhd.com/v1/mcp?apikey={EODHD_API_KEY}",
"name": "eodhd-mcp"
}
]
)for block in response.content:
if block.type == "text":
print(block.text)
Што на самай працо відбываецца тут
Для раздэлу «Што на самай працо відбываецца тут» неабяжна прадзеявіць вхідныя даны, абонента крока і крытэрыі завершэння перад змянайом коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы з’ясаваць захаваны стан. Запісваюць час выканання і кост токена або запыту праза функцыйнальнымі рэзултатамі. Відразы коста з самага пачатку запобегае неспакоўным рахункам, калі траекторыя пераходзіць з дэмавайнага сераўера ў спяльныя сераўеры. Автэнтыфікуецца на воратах і прадзеявляець правы пры доступе да дадзеных. Толькі токен-носіцель не ёсць межай абонента.
Чытанне адпаведзі
Ёнколі хочаце прачытаць адказ, перад змянайом код неабходна ўзначыць вхідныя даны, абавесця крока і крытэрыі завершэння. Аператары должны магчымае запускаваць крок з вядомай точкі контролю, не падозрываючы схованы стан. Конфігурацыю трэба заставляць праза код аплікацыі. Файлы сераўнавальнага сяродовішча, хранілішчы секрэтных даных і флагі функцый належыць у аднам месца, якое аператары можаць пераглядаць, не чытаяўшы весь лянцуг. Автэнтыфікуйцеся ў шлюзе і паўтарна автарызуйцеся на роўні дадзенняў. Сам токен-носіцель не ёсць межай арэндаванага рэсурсу.
tool_calls = [
{"name": b.name, "input": b.input}
for b in response.content
if b.type == "mcp_tool_use"
]
for call in tool_calls:
print(call["name"], call["input"])
Ранжыраванне можлівасцей інвеставання ў акцыі за дапамойкай API фінансавых дадзенняў EODHD
Для аналізу можлівасцей у сферэ акцыяў за дапамойку API фінансавых дадзенняў EODHD неабходна перад змянай коду задаць вхідныя даны, адпаведальнага за выкананне крока і крэтыярыя завершэння. Аператары должны магчымае перайсці на выкананне крока з вядомага пункта контролю, не спрабоўваючы здогадвацца пра схованы стан. Неабходна задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некорэктных паведамленняў ёсць часткай продукту, а не елементамі пазнейшай дапрацоўкі. Аўтэнтыфікацыя выкананае ў шлюзе, а прабыванне прав на выкарыстоўвання дадзенняў — у ўзле апрацоўкі дадзенняў. Толькі токэн-носіцель не ёсць межай адпаведальнасці. Для аналізу можлівасцей у сферэ акцыяў за дапамойку API фінансавых дадзенняў EODHD неабходна перад змянай коду задаць вхідныя даны, адпаведальнага за выкананне крока і крэтыярыя завершэння. Аператары должны магчымае перайсці на выкананне крока з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрыяйце цэму этапу як контракту між вхіднымі данымі і перакананымі выходнымі рэзультатамі. Назвайце всі элементы, задаць крэтыярыя успеху і адмовіцеся ад безадказных частковых рэшэнняў.
Завершэнне.Шаг 1: Выбір кандыдатаў за дапамойкай Screener API
Кал працуеце над Шагам 1: Выбір кандыдатаў за дапамойкай Screener API, спачатку запісаце умовы кантракту: неабходныя даны, сігнал успеху і тое, што выканаецца у разы ўзельнага неякшэння. Такі чарт дапамагае заліцвачыць змяны ў кодзе пазней. Запісвайце час выканання і вартасьць токена або запыту па боку рэзультатаў функцыяналу. Відразувая візуабільнасьць вартасцей запобегае неспакою, калі праця пераходзіць з дэмаверсіі ў спакульнаныя сераўсы. Запісвайце назву інструмента, хэш аргументаў, час затрымкі і рэзультат кожнага вызову. Без такога лёгкага следу дэбагаванне ціклам выканаецца гадзінамі.
import requests
API_TOKEN = "YOUR_EODHD_API_TOKEN"
def get_candidates():
url = "https://eodhd.com/api/screener"
params = {
"api_token": API_TOKEN,
"sort": "market_capitalization.desc",
"filters": '[["market_capitalization",">",1000000000],'
'["exchange","=","us"],'
'["sector","=","Technology"]]',
"limit": 20,
"fmt": "json",
}
response = requests.get(url, params=params)
return response.json()["data"]
candidates = get_candidates()
tickers = [c["code"] for c in candidates]
print(tickers)
Шаг 2: Збір базовых дадзенняў для кожнага кандыдата
Калі вы віконваеце 2-й крок: збір базовых даных працэўнікам, спачатку запісайце умовы контракту: неабходныя даны, сігнал успеху і тое, што выканаецца у разы частковага невялікога браку. Такі чэрнетак захоўвае чыстасць пазнейшых змян у кодзе. Зберагаюце настройкі праза код прыемніка. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аўдыт без неабходнасці чытання всей структуры. Запісвайце назву інструмента, хэш параметраў, час адклікання і рынковы рэзультат для кожнага вызову. Без такога лёгкага следу час на дэбагаванне працэўніка губіцца на гадзіны.
def get_fundamentals(symbol):
url = f"https://eodhd.com/api/fundamentals/{symbol}.US"
params = {"api_token": API_TOKEN, "fmt": "json"}
data = requests.get(url, params=params).json()
highlights = data.get("Highlights", {})
return {
"pe_ratio": highlights.get("PERatio"),
"peg_ratio": highlights.get("PEGRatio"),
"profit_margin": highlights.get("ProfitMargin"),
"eps_growth": highlights.get("EPSEstimateNextYear"),
}
3-й крок: Пераканацца ў няўзрывным рухе цэн
Калі вы працуеце над Крокам 3: Перакантрацья апошніх рухаў цэны, спачатку запісайце умовы дагавору: неабходныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі спіс пераконтроўкаў дапамагае заліцьваты пазнейшыя змены ў кодзе. Дакументавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некорэктных паведамленняў ёсць часткай продукту, а не пазнейшай дапрацоўкі. Зявляйце логі з назвай інструмента, хэшам параметраў, часам адклікання і рэзультатам кожнага вызову. Без такога следу дэбаггін агента губіць гадзіны. Калі вы працуеце над Крокам 3: Перакантрацья апошніх рухаў цэны, спачатку запісайце умовы дагавору: неабходныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі спіс пераконтроўкаў дапамагае заліцьваты пазнейшыя змены ў кодзе. Спрыймайце гэты этап як дагавор між вхіднымі данымі і паўнастацэннымі выходамі. Дайце назвы рэзультатам, задаць тэсты на успех і адмовіцеся ад мовчанкавага частковага выпання.
import pandas as pd
from datetime import date, timedelta
def get_price_trend(symbol):
url = f"https://eodhd.com/api/eod/{symbol}.US"
params = {
"api_token": API_TOKEN,
"period": "d",
"order": "d",
"from": (date.today() - timedelta(days=90)).isoformat(),
"fmt": "json",
}
prices = requests.get(url, params=params).json()
df = pd.DataFrame(prices)
last_close = df.iloc[0]["close"]
month_ago_close = df.iloc[21]["close"] if len(df) > 21 else df.iloc[-1]["close"]
change_pct = ((last_close - month_ago_close) / month_ago_close) * 100
return {"last_close": last_close, "change_30d_pct": round(change_pct, 2)}
Крок 4: Аналіз настрою новасей
Шаг 4: Аналіз настрою новасцей дае найлепшыя рэзультаты, калі яго расследжваюць як вімерную велічыну. Перш чым расшырваць масштабы, зафіксавайце адны ідэальны прыклад, адну справу з бягамі і прыметкі па поверненню да пачатковага стану. Запісвайце часы выканання, а таксу карточакоў чы запыткаў разам з функцыйнальнымі рэзултатамі. Відразы цены з самага пачатку запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмовай асяроддзя ў спяльныя сераўры. Актуалізавайце інструменты з вузкімі схемамі і чысткімі пазначэннямі побачных эфектаў. Адпаведальныя за хоставанне должны ведаць, якія запыткі мутуюць стан, перш чым автаматычна ўзяць іх на спрыянне.
def get_sentiment(symbol):
url = "https://eodhd.com/api/sentiments"
params = {
"s": f"{symbol}.US",
"api_token": API_TOKEN,
"from": (date.today() - timedelta(days=14)).isoformat(),
"fmt": "json",
}
data = requests.get(url, params=params).json()
entries = data.get(f"{symbol}.US", [])
if not entries:
return {"avg_sentiment": None}
avg = sum(e["normalized"] for e in entries) / len(entries)
return {"avg_sentiment": round(avg, 3)}
Шаг 5: Аб’еднайце все ў адзін бал
5-й крок: Адыягуванне всіх элементаў у аднай шкале эфектываўша, калі яго спрыяваць як вімерную велічыну. Зберагачыце адна ідэальная версія, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Канфігурацыю трэба залічыць паза кодам прыемліка. Файлы сераўнавання, хранілішчы секрэтных дадзеных і пазнакі функцый должны знаходзіцца ў адном месцы, куды аператары можаць пераглядаць без неабяжнага чытання всіх дадзеных. Абяўляйце інструменты з вузкімі схемамі і чысткімі пазначэннямі побачных эфектаў. Хостам неабходна знаты, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць іх.
def score_opportunity(symbol):
fundamentals = get_fundamentals(symbol)
price = get_price_trend(symbol)
sentiment = get_sentiment(symbol)
score = 0
if fundamentals["pe_ratio"] and fundamentals["pe_ratio"] < 25:
score += 1
if fundamentals["profit_margin"] and fundamentals["profit_margin"] > 0.10:
score += 1
if price["change_30d_pct"] < -5:
score += 1
if sentiment["avg_sentiment"] and sentiment["avg_sentiment"] > 0.15:
score += 1
return {
"symbol": symbol,
"score": score,
**fundamentals,
**price,
**sentiment,
}
results = [score_opportunity(t) for t in tickers]
ranked = sorted(results, key=lambda r: r["score"], reverse=True)
for r in ranked[:5]:
print(r["symbol"], "score:", r["score"], "| P/E:", r["pe_ratio"],
"| 30d change:", r["change_30d_pct"], "%",
"| sentiment:", r["avg_sentiment"])
Прыўязка гэтага да агента
Ўжоўвязанне гэтага з агентам работае наякша, калі яго спрыятаць як вімерную паверхню. Зберажыце адны ідэальны прыклад працы, адзін кейс неудачы і прыметку па абратанні змян перш чым расшырваць масштабы. Дакументавайце як шлях успеху, так і шлях вяснавання проблемы. Перапрыбуткі, людзкія перакрыцця і апрацоўка некорэктных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Абявляйце інструменты з вузкімі схемамі і чысткімі пазначэннямі побачных эфектаў. Хостам неабходна знаты, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць ўпрацоўкі. Ўжоўвязанне гэтага з агентам работае наякша, калі яго спрыятаць як вімерную паверхню. Зберажыце адны ідэальны прыклад працы, адзін кейс неудачы і прыметку па абратанні змян перш чым расшырваць масштабы. Спрыяйце гэты ўрадок як кантракт між вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задайце крытэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.
Звярнуўшыся сюды, вы можэце ствараць
Для раздэлу «Здэсь вы можэце стварыць» неабяжна пазначыць вхідныя даны, адпаведальнага за крок і крытэрыі завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымасць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выканання і вартасць токена або запыту разам з функцыйнальнымі рэзультатамі. Відразлівасць вартасцей з самага пачатку запобегае неспакоўным рахункам, калі траекторыя пераходзіць з дэмавайнага сераўера у спяльныя сераўеры. Автэнтыфікацыя выканаліцаецца на воратах, а паўторная автарызацыя — на роўні дадзеных. Сам токен-носіцель не ёсць межай арэндаванага прыемку.
Ключовыя выводы
Для выявленных ключовых моментаў неабходна пазначыць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння пры зміне коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Конфігурацыю трэба залічыць паза кодам прыкладнення. Файлы сераўнавання, хранільнікі секрэтных даных і флагі функцыяй должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Аўтэнтыфікацыя павінна выканацца на воратах, а пераправенне прав на доступ — у роўні дадзенаў. Сам токен-носіцель не ёсць межай адпаведнага тэнантства.
Частыя запітанні
Для частаў задаваных запытанняях неабходна перад змінайом коду адзначыць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння. Аператары должны магчымае перадзеісцавіць крок з вядомага пункта контролю без неабясненняя схованага стану. Неабходна аддзекаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцці і апрацоўка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней. Автэнтыфікуйцеся на воратах і паўторна автарызуйцеся на роўні дадзенняў. Толькі токэн-носіцель не ёсць межай арэндаванага рэсурсу. Для частаў задаваных запытанняях неабходна перад змінайом коду адзначыць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння. Аператары должны магчымае перадзеісцавіць крок з вядомага пункта контролю без неабясненняя схованага стану. Спрыятлівайце гэты ўрадок як кантракт межа вхідных даных і перакананых выходных рэзультатаў. Дайце назвы артыфактам, адзначыце крытэрыя успеху і не падтрымвайце бяспечнае частковае завершэння.
Чэк-ліст для эксплуатацыі
Чэкліст аператыўных задач работае наяўней, калі яго спрыяваць як мерыямую плошчу. Запісаце адну ідэальную версію, адзін прыклад неудачы і прыметку па адвярненню перад расшырэнням масштаба.
Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіце, неудача павінна адносіцца да конкрэтной адпаведальнасці, а не да заплутанага ланцоўка задач.
Адкройце інструменты з вузкімі схемамі і чыткімі пазначэннямі побачных эфектаў. Адпаведальныя за эксплуатацыю павінны ведаць, якія вызовы мутуюць стан, перш чым автаматычна схваліць іх.
Заставьце людзкую апраўду на тых этапах, дзе выконваюцца вітраты чы зміняюцыся даныя у працоўным рэжыме. Компіляцыйныя налаштаванні не ўзроўнаўцяюцься з пачытальнай полнымасцю бізнес-процэсаў.
Напісце кароткую інструкцыю: як роціраваць канты, як спрачыслаць чэргу, як адвярнуць пасляпэўныя зміны.
Зберагаце налаштаванні праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцый павінны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабходнасці чытання всей структуры.
Перш чым запускаць стак, заморозьце версіі, зафіксавце «золаты» транскрыпты для крытычных ліній і паказвце крокі з вярнення да пачатковага стану. У спільных серавысках неабходны ліміты частоты запытанняў, пераконтрольванне прав на выкарыстоўвання рэсурсаў і чысткі власнік для змены секрэтных даных. Валіце простую надзейнасць працы замест крэатывных, але разовых дэманстрацый.
Прыміткі для 5a103d42eb4a: не кладзіце ключы прадастальнікаў у рэпазітарый, задаце максімальны тэрмін дзейнасці токена на кожную сесію і зберагачыце транскрыпты празаўседлік з фікстурамі для ацэнкі, каб пазнейшыя замены мадэляў заставаліся пораўнанымі.