tefas-fund-comparator
# tefas-fund-comparator
**MCP (Model Context Protocol)** sunucusu: [TEFAS](https://www.tefas.gov.tr/) fonlarını listeleme, karşılaştırma, getiri/performans analizi ve portföy dağılımı inceleme.
Sunucu adı: **`tefas-fund-comparator`**
## Özellikler
| Tool | Açıklama |
|------|----------|
| `list_funds` | Fon tipi + tarih aralığı + kod/isim filtresi ile fon listesi |
| `get_fund_details` | Fiyat geçmişi, özet metrikler, portföy dağılımı |
| `compare_funds` | Çoklu fon: getiri, volatilite, Sharpe, max drawdown, AUM |
| `get_portfolio_breakdown` | Varlık dağılımı (hisse, repo, eurobond, …) |
| `get_historical_returns` | RB / SB / MB bazlı TEFAS getiri tabloları |
| `analyze_performance` | Risk/getiri istatistikleri (pandas) |
- **stdio** + **Streamable HTTP** transport
- **pytefas**: otomatik chunking + rate-limit retry
- **tefasfon**: RB/SB/MB getiri tabloları
- Çıktı: **markdown tablo** veya **JSON**
## Kurulum
### Gereksinimler
- Python **3.10+**
- İnternet erişimi (TEFAS API)
### pip
```bash
cd TEFAS-MCP
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS / Linux
# source .venv/bin/activate
pip install -e .
# veya
pip install -r requirements.txt
pip install -e .
```
### uv
```bash
cd TEFAS-MCP
uv venv
uv pip install -e .
```
## Çalıştırma
### stdio (Claude Code / Cline / Cursor — varsayılan)
```bash
python -m tefas_mcp.server
# veya
tefas-fund-comparator
```
### Streamable HTTP
```bash
python -m tefas_mcp.server --transport http --host 127.0.0.1 --port 8000
# Endpoint: http://127.0.0.1:8000/mcp
# Health: http://127.0.0.1:8000/health
```
### Yardım
```bash
python -m tefas_mcp.server --help
```
## Docker (yerel)
```bash
# Image build + run (port 8000)
docker compose up --build
# veya
docker build -t tefas-fund-comparator .
docker run --rm -p 8000:8000 -e PORT=8000 tefas-fund-comparator
```
Kontrol:
```bash
curl http://127.0.0.1:8000/health
curl http://127.0.0.1:8000/
```
## Render.com (Docker Web Service)
Hazır dosyalar: `Dockerfile`, `render.yaml`, `.dockerignore`.
### A) Blueprint (önerilen)
1. Kodu GitHub’a push edin.
2. [Render Dashboard](https://dashboard.render.com/) → **New** → **Blueprint**.
3. Repo’yu seçin; `render.yaml` otomatik okunur.
4. Deploy sonrası URL örneği: `https://tefas-fund-comparator.onrender.com`
5. MCP endpoint: `https://tefas-fund-comparator.onrender.com/mcp`
Health: `https://tefas-fund-comparator.onrender.com/health`
### B) Manuel Web Service
1. **New** → **Web Service** → repo bağla
2. **Runtime:** Docker
3. **Dockerfile path:** `./Dockerfile`
4. **Health Check Path:** `/health`
5. Env (opsiyonel; Dockerfile varsayılanları yeter):
| Key | Value |
|-----|--------|
| `MCP_TRANSPORT` | `http` |
| `HOST` | `0.0.0.0` |
| `MCP_PATH` | `/mcp` |
| `LOG_LEVEL` | `INFO` |
> `PORT` Render tarafından otomatik enjekte edilir; elle yazmayın.
### Claude / Cline ile Render URL
Claude genelde uzak HTTP MCP’ye doğrudan bağlanmaz; `mcp-remote` kullanın
(`examples/mcp_config.render.json`):
```json
{
"mcpServers": {
"tefas-fund-comparator": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://YOUR-SERVICE.onrender.com/mcp"
]
}
}
}
```
`YOUR-SERVICE` kısmını kendi Render servis adınızla değiştirin.
### Render notları
- **Free plan** idle sonrası uykuya geçer; ilk istek ~30–60 sn sürebilir.
- TEFAS rate-limit nedeniyle uzun analizler yavaş / timeout olabilir; gerekirse plan yükseltin veya timeout’ları artırın.
- Servis herkese açıksa istek koruması (auth, IP allowlist, Cloudflare) eklemeniz önerilir — bu imajda API anahtarı yoktur.
## MCP istemci yapılandırması
Aşağıda `PYTHON` yolunu kendi venv’inize göre düzenleyin.
### Claude Code / Claude Desktop (`claude_desktop_config.json` veya proje `.mcp.json`)
```json
{
"mcpServers": {
"tefas-fund-comparator": {
"command": "C:\\Users\\kerem\\Documents\\TEFAS-MCP\\.venv\\Scripts\\python.exe",
"args": ["-m", "tefas_mcp.server"],
"cwd": "C:\\Users\\kerem\\Documents\\TEFAS-MCP"
}
}
}
```
macOS/Linux örneği:
```json
{
"mcpServers": {
"tefas-fund-comparator": {
"command": "/path/to/TEFAS-MCP/.venv/bin/python",
"args": ["-m", "tefas_mcp.server"],
"cwd": "/path/to/TEFAS-MCP"
}
}
}
```
Global `pip install -e .` yaptıysanız:
```json
{
"mcpServers": {
"tefas-fund-comparator": {
"command": "tefas-fund-comparator",
"args": []
}
}
}
```
### Cline (VS Code)
Cline → MCP Settings:
```json
{
"mcpServers": {
"tefas-fund-comparator": {
"command": "python",
"args": ["-m", "tefas_mcp.server"],
"cwd": "C:\\Users\\kerem\\Documents\\TEFAS-MCP",
"disabled": false
}
}
}
```
### HTTP + mcp-remote (isteğe bağlı)
Önce sunucuyu HTTP modunda başlatın, sonra:
```json
{
"mcpServers": {
"tefas-fund-comparator-http": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://127.0.0.1:8000/mcp"]
}
}
}
```
### uvx (paket yayımlanmışsa)
```json
{
"mcpServers": {
"tefas-fund-comparator": {
"command": "uvx",
"args": ["tefas-fund-comparator"]
}
}
}
```
Yerel dizinden `uv run`:
```json
{
"mcpServers": {
"tefas-fund-comparator": {
"command": "uv",
"args": ["run", "--directory", "C:\\Users\\kerem\\Documents\\TEFAS-MCP", "python", "-m", "tefas_mcp.server"]
}
}
}
```
## Fon tipleri
| Kod | Anlam | tefasfon alias |
|-----|--------|----------------|
| `YAT` | Yatırım fonu | `SEC` |
| `EMK` | Emeklilik | `PEN` |
| `BYF` | Borsa yatırım fonu (ETF) | `ETF` |
| `GYF` | Gayrimenkul | `RE` |
| `GSYF` | Girişim sermayesi | `VC` |
## Örnek tool çağrıları
Agent / istemci üzerinden (anlamsal örnekler):
```text
list_funds(fund_type="YAT", name_contains="ALTIN", limit=20)
get_fund_details(fund_code="AAL", fund_type="YAT")
compare_funds(
fund_codes=["AAL", "AAK"],
start_date="2026-01-01",
end_date="2026-04-01",
metrics=["return", "volatility", "sharpe", "max_drawdown"]
)
get_portfolio_breakdown(fund_code="AAL")
get_historical_returns(fund_type="YAT", basis="RB", limit=25)
analyze_performance(
fund_codes=["AAL", "AAK"],
start_date="2025-04-01",
end_date="2026-04-01",
risk_free_annual=0.40
)
```
## Rate limit ve süre
TEFAS yaklaşık **dakikada 6 istek** sınırına yakındır. pytefas uzun aralıkları ~28 günlük parçalara böler:
| Aralık | Kabaca süre |
|--------|-------------|
| 1 ay | ~10 sn |
| 3 ay | ~1 dk |
| 1 yıl | ~3 dk |
Aynı istekler ~60 sn TTL ile bellekte önbelleğe alınır.
## Test
```bash
pip install -e ".[dev]"
pytest -q
```
Ağ gerektiren smoke test (manuel):
```bash
python -c "from tefas_mcp.client import get_service; print(get_service().fetch_info('2026-04-20','2026-04-24',kind='YAT',fund_code='AAL').head())"
```
## Proje yapısı
```
src/tefas_mcp/
server.py # FastMCP entrypoint
client/ # pytefas + tefasfon façade
tools/ # 6 MCP tools
analytics/ # Sharpe, vol, max DD
models/ # enums / validation
utils/ # dates, formatters, errors
```
## Bağımlılıklar
- [fastmcp](https://github.com/PrefectHQ/fastmcp)
- [pytefas](https://github.com/mirzazad/pytefas)
- [tefasfon](https://pypi.org/project/tefasfon/)
- pandas, pydantic, httpx
## Uyarı
Bu araç yatırım tavsiyesi değildir. TEFAS API’si resmi olarak dokümante edilmemiştir; site değişikliklerinde paket güncellemesi gerekebilir. Metrikler eğitim / karşılaştırma amaçlı basitleştirilmiş istatistiklerdir.
## Lisans
MIT
TDQS
Scored across 6 tools
Tools like analyze_performance and compare_funds compute similar metrics (return, volatility, Sharpe, drawdown, AUM), and get_fund_details overlaps with get_portfolio_breakdown on portfolio allocation. While descriptions help differentiate, the boundaries between these tools are fuzzy, causing potential confusion.
All tool names follow a consistent verb_noun pattern in snake_case: analyze_performance, compare_funds, get_fund_details, get_historical_returns, get_portfolio_breakdown, list_funds. No mixing of styles or irregular patterns.
With 6 tools, the server is well-scoped for the purpose of comparing TEFAS funds. Each tool addresses a distinct aspect (listing, details, performance, comparison, historical returns, portfolio breakdown) without being excessive or thin.
The tool set covers listing, detailed info, performance analysis, comparison, and portfolio breakdown. Minor gaps exist, such as lacking a direct raw price history endpoint (included in get_fund_details) and no filter for top performers, but overall the surface is sufficient for fund comparison.