fonlar-mcp
Provides tools to query Turkish investment fund data (prices, performance, portfolio, search, comparison) from the TEFAS public API, usable within Windsurf (by Codeium).
Provides tools to query Turkish investment fund data (prices, performance, portfolio, search, comparison) from the TEFAS public API, usable within Antigravity (by Google).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fonlar-mcpAAK fonunun son fiyatı ve getirisi"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fonlar-mcp
Türkiye'deki yatırım fonlarının (TEFAS) verilerini Claude'a sunan Model Context Protocol sunucusu.
Claude Desktop veya Claude Code üzerinden doğrudan TEFAS'a sorgu atmanı sağlar:
"AAK fonunun son fiyatı ve 1 yıllık getirisi nedir?"
"GO9 ve TTE fonlarını portföy ve performans olarak karşılaştır."
"İçinde 'altın' geçen fonları listele."
Özellikler
Kimlik bilgisi gerektirmez — TEFAS'ın public API'sini kullanır.
Stdio transport — yerel makinede çalışır, dışarı port açmaz.
Rate-limit dostu — TEFAS'ın 6 req/dk sınırına otomatik saygı.
6 araç + 2 kaynak + 1 hazır prompt sunar.
Related MCP server: Elliot Foster – Brazilian Funds
Araçlar (Tools)
Tool | Açıklama |
| Güncel fiyat, günlük getiri, portföy büyüklüğü |
| Hafta / 1ay / 3ay / 6ay / 1yıl / 3yıl / 5yıl geçmiş |
| Kategori bazlı portföy dağılımı |
| İki fonun getiri ve portföy karşılaştırması |
| Fon kodu / ünvan araması |
| 1a/3a/6a/yb/1y/3y/5y getiri tablosu |
Kurulum
1. Bağımlılıkları kur
git clone https://github.com/maku-cpu/fonlar-mcp.git
cd fonlar-mcp
uv syncuv yüklü değilse: https://docs.astral.sh/uv/getting-started/installation/
2. Claude Desktop'a ekle
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) veya
%APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"fonlar": {
"command": "uv",
"args": [
"--directory", "/MUTLAK/PATH/fonlar-mcp",
"run", "fonlar-mcp"
]
}
}
}Claude Desktop'u kapat-aç. Sağ alttaki bağlantı ikonunda fonlar görünmeli.
3. Claude Code'a ekle
claude mcp add fonlar -- uv --directory /MUTLAK/PATH/fonlar-mcp run fonlar-mcpveya proje kökünde .mcp.json:
{
"mcpServers": {
"fonlar": {
"command": "uv",
"args": ["--directory", "/MUTLAK/PATH/fonlar-mcp", "run", "fonlar-mcp"]
}
}
}Diğer MCP Client'larla Kullanım
MCP standart bir protokol — Claude'a özel değil. fonlar-mcp aşağıdaki tüm
client'larla aynı server kodu ile çalışır, sadece config dosyasının
yeri/formatı değişir.
Cursor
~/.cursor/mcp.json veya proje kökünde .cursor/mcp.json:
{
"mcpServers": {
"fonlar": {
"command": "uv",
"args": ["--directory", "/MUTLAK/PATH/fonlar-mcp", "run", "fonlar-mcp"]
}
}
}Windsurf
~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"fonlar": {
"command": "uv",
"args": ["--directory", "/MUTLAK/PATH/fonlar-mcp", "run", "fonlar-mcp"]
}
}
}Antigravity (Google)
Settings → MCP Servers, veya ~/.antigravity/mcp_settings.json:
{
"mcpServers": {
"fonlar": {
"command": "uv",
"args": ["--directory", "/MUTLAK/PATH/fonlar-mcp", "run", "fonlar-mcp"]
}
}
}Zed
~/.config/zed/settings.json içinde context_servers bloğu:
{
"context_servers": {
"fonlar": {
"command": {
"path": "uv",
"args": ["--directory", "/MUTLAK/PATH/fonlar-mcp", "run", "fonlar-mcp"]
}
}
}
}
uvyoksa alternatif olarak doğrudan Python kullanılabilir:"command": "python3", "args": ["-m", "fonlar_mcp.server"], "env": {"PYTHONPATH": "/MUTLAK/PATH/fonlar-mcp/src"}
Test
MCP Inspector ile araçları manuel deneyebilirsin:
cd fonlar-mcp
npx @modelcontextprotocol/inspector uv run fonlar-mcpTarayıcıda açılan UI'dan tool'ları çağır, JSON çıktıyı gör.
Periyod Kodları
get_fon_fiyat_gecmisi ve karsilastir_fonlar aşağıdaki periyodları kabul eder:
hafta · 1ay · 3ay · 6ay · 1yil · 3yil · 5yil
Önemli Uyarı
Bu araç bilgilendirme amaçlıdır. TEFAS verilerini doğrudan iletir, yatırım tavsiyesi değildir. Yatırım kararlarınız size aittir.
Lisans
MIT — bkz. LICENSE.
Veri Kaynağı
Tüm veriler tefas.gov.tr public API'sinden alınır.
Available Tools
6 toolsara_fonA
Fon kodu veya ünvanına göre TEFAS'ta fon arar / listeler.
Bu tool fon listeleme, filtreleme ve keşif için ana giriş noktasıdır. Kullanım örnekleri:
"Altın fonlarını listele" → ara_fon("altın")
"AK Portföy'ün tüm fonları" → ara_fon("AK PORTFÖY")
"Hangi BIST 30 fonları var?" → ara_fon("BIST 30")
"Teknoloji fonları neler?" → ara_fon("teknoloji")
Çoklu adımlı sorularda (örn: "altın fonlarının en getirili olanı") İLK ADIM olarak bu tool'u çağır, sonra dönen kodları diğer tool'lara (donemsel_getiri_ozeti, get_fon_portfoy vb.) besle.
Args: metin: Aranacak kelime/fon kodu (örn: "altın", "AK PORTFÖY", "TTE"). limit: Dönecek maksimum sonuç sayısı (default 20).
| Name | Required | Description | Default |
|---|---|---|---|
| metin | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only states it searches and lists funds, but omits any behavioral details such as side effects (likely none), authentication needs, rate limits, or response format. For a read-like operation, this minimal disclosure is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with several purposeful sentences and examples. It front-loads the main action and uses a clear structure. Slight room for improvement by separating sections, but overall efficient and not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 0% schema coverage, the description is fairly complete, covering tool role, usage examples, and connection to sibling tools. However, it lacks details on return format, error handling, or limitations, leaving gaps for a search tool. It is adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description adds significant meaning. It explains that 'metin' is a keyword or fund code (with examples like 'altın', 'AK PORTFÖY', 'TTE'), and 'limit' defaults to 20. This goes well beyond the schema's bare types and titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches/lists TEFAS funds by code or title, using specific verbs and examples. It distinguishes itself as the primary entry point for fund listing, filtering, and exploration, differentiating from siblings like donemsel_getiri_ozeti and karsilastir_fonlar which handle returns and comparisons.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use this tool first in multi-step queries, with concrete examples. It guides the agent to call this tool initially and then feed returned codes to other tools. While it doesn't explicitly state when not to use it, the examples and first-step guidance make usage clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
donemsel_getiri_ozetiB
Bir fonun standart dönemsel getirilerini (1a, 3a, 6a, yb, 1y, 3y, 5y) döner.
Args: fon_kodu: TEFAS fon kodu.
| Name | Required | Description | Default |
|---|---|---|---|
| fon_kodu | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as read-only nature, authentication requirements, or error behavior. It only states the output without additional context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences that front-load the main purpose and then list the argument. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description should explain the return format or provide more behavioral context. It omits details like the structure of the returned data, making it incomplete for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds minimal value over the schema by specifying 'fon_kodu: TEFAS fon kodu', clarifying the parameter's domain. With zero schema description coverage, this is helpful but still lacks detail on format or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns standard periodic returns for a fund, listing the specific periods (1a, 3a, etc.). This distinguishes it from sibling tools like get_fon_fiyat (price) and get_fon_fiyat_gecmisi (price history).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. The description only states what it does, without mentioning when it is appropriate or when other tools might be better.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fon_fiyatA
Bir fonun güncel fiyat ve günlük getiri bilgisini döner.
Args: fon_kodu: 3 karakterli TEFAS fon kodu (örn: "AAK", "GO9", "TTE").
| Name | Required | Description | Default |
|---|---|---|---|
| fon_kodu | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. Only states return type; lacks info on side effects, auth requirements, rate limits, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded with main purpose. No wasted words. Could include a brief note on usage context but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple one-parameter tool, but missing return format details and error handling. No output schema, so description could compensate but doesn't.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, but description adds format ('3 karakterli TEFAS fon kodu') and examples, which is highly informative for an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it returns current price and daily return of a fund (verb 'döner' and resource 'fon fiyat'). It distinguishes from sibling tools like historical price or portfolio tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. Does not mention prerequisites or conditions where other tools would be better.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fon_fiyat_gecmisiB
Fonun günlük fiyat geçmişini döner.
Args: fon_kodu: TEFAS fon kodu. periyod: "hafta" | "1ay" | "3ay" | "6ay" | "1yil" | "3yil" | "5yil"
| Name | Required | Description | Default |
|---|---|---|---|
| fon_kodu | Yes | ||
| periyod | No | 1ay |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully convey behavior. It states the tool returns daily price history, but omits details like whether it is read-only, rate limits, response format, or error handling. This is minimal disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: a single sentence for purpose followed by a clear Args section. Every word is necessary, and the structure is front-loaded with the main function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose and parameters adequately. However, it lacks details on output format, error states, or prerequisites (e.g., valid fund code). For a simple historical query, it is sufficient but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds significant value by explaining fon_kodu as 'TEFAS fon kodu' and listing exact allowed values for periyod. This compensates for the 0% schema description coverage in the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns the fund's daily price history (Fonun günlük fiyat geçmişini döner), matching the tool name. However, it does not explicitly distinguish itself from sibling tools like get_fon_fiyat (current price) or get_fon_portfoy (portfolio), though the resource is distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus siblings such as get_fon_fiyat or karsilastir_fonlar. The description implies usage for historical data, but there are no explicit conditions or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fon_portfoyA
Bir fonun portföy dağılımını döner (kategori bazlı yüzdeler).
Args: fon_kodu: TEFAS fon kodu. tarih: YYYYMMDD formatında. Boş ise son iş günü kullanılır.
| Name | Required | Description | Default |
|---|---|---|---|
| fon_kodu | Yes | ||
| tarih | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description bears full burden. It discloses the return type (percentages) and default behavior for 'tarih' (last business day if empty), but lacks information on whether the operation is read-only, required permissions, or any side effects. Adequate for a simple query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: a one-line purpose statement followed by two parameter descriptions. No unnecessary words, information is front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 parameters, no output schema), the description fully covers purpose, parameters with defaults, and return type (category-based percentages). No gaps for a query tool of this nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description adds meaningful semantics: 'fon_kodu' is a TEFAS fund code, 'tarih' is in YYYYMMDD format with a default of last business day. This covers all parameters and adds value beyond the schema's type-only definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'returns' and resource 'portfolio distribution of a fund (category-based percentages)', clearly distinguishing it from sibling tools like 'get_fon_fiyat' (price) and 'karsilastir_fonlar' (compare).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description only states what it does, without providing context or exclusions for similar tools like 'donemsel_getiri_ozeti' or 'ara_fon'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
karsilastir_fonlarA
İki fonun fiyat performansını ve portföy dağılımlarını karşılaştırır.
Args: fon_1: Birinci fon kodu. fon_2: İkinci fon kodu. periyod: Getiri karşılaştırması için periyod (hafta..5yil).
| Name | Required | Description | Default |
|---|---|---|---|
| fon_1 | Yes | ||
| fon_2 | Yes | ||
| periyod | No | 1yil |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description lacks behavioral details such as data freshness, error handling, or side effects. It only states what is compared without further transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with a single-line purpose and a bulleted args list. No wasted words; front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given lack of output schema and annotations, the description covers purpose and parameter meanings adequately but omits behavioral context, usage boundaries, and return format, leaving gaps for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description includes an Args section explaining each parameter: fon_1/fon_2 as fund codes and periyod with a range ('hafta..5yil'). This adds meaning beyond the schema's bare types and titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it compares price performance and portfolio distributions of two funds, using the verb 'karşılaştırır'. It distinguishes from siblings which are single-fund operations like get_fon_fiyat or ara_fon.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fund comparison but provides no explicit when-to-use or when-not-to-use guidance compared to siblings like donemsel_getiri_ozeti or get_fon_portfoy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
ara_fon - First observed
donemsel_getiri_ozeti - First observed
get_fon_fiyat - First observed
get_fon_fiyat_gecmisi - First observed
get_fon_portfoy - First observed
karsilastir_fonlar
TDQS
Scored across 6 tools
Each tool targets a distinct operation: searching funds, getting period returns, current price, historical prices, portfolio distribution, and comparing two funds. There is no overlap in purpose.
Most tools follow a verb_noun pattern in Turkish (ara_fon, get_fon_fiyat, get_fon_fiyat_gecmisi, get_fon_portfoy, karsilastir_fonlar), but donemsel_getiri_ozeti uses a different structure (adjective_noun_noun), creating a minor inconsistency.
With 6 tools, the set is well-scoped for a mutual fund information server. Each tool provides necessary functionality without unnecessary bloat or missing critical operations for common queries.
The tool set covers core fund operations: search, period returns, current and historical prices, portfolio composition, and comparison. Minor gaps include the inability to list all funds without a search term and lack of detailed fund metadata (e.g., management fees, fund manager).
Maintenance
Related MCP Connectors
Global stock research, ML forecasts, valuation signals, screeners & portfolio tracking in Claude
Connect your portfolio to Claude, ChatGPT, or Codex to analyze it and make smarter investments.
Bring FINTRX's family office and RIA intelligence into Claude.
Not another dashboard. A wealth analyst for every asset a bank can't sync, inside Claude.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables Claude Desktop to access investment fund data in Turkey through the FonParam API, allowing users to list, compare, and analyze funds, view company statistics, and get inflation data.1525 npm3MIT
- AlicenseNot gradedqualityDmaintenanceBrazilian investment-fund analytics for AI clients via the Model Context Protocol (MCP). Connect Claude Desktop, Cursor, ChatGPT, or any MCP-compatible client to query 30,000+ Brazilian investment funds: daily NAV, complete holdings (CDA), fund-of-funds look-through, portfolio overlap analysis, and your personal favorites/watchlist.MIT

finhay-mcp-serverofficial
AlicenseNot gradedqualityFmaintenanceEnables querying real-time stock prices, gold, crypto, interest rates, portfolio data, and financial analysis from Finhay Securities via Claude AI.28 npmMIT- FlicenseAqualityDmaintenanceEnables querying Turkish economic data (inflation, FX rates, policy rates, etc.) from TCMB EVDS via curated tools, preventing LLM hallucination.6-