Skip to main content
Glama
maku-cpu

fonlar-mcp

by maku-cpu

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

get_fon_fiyat(fon_kodu)

Güncel fiyat, günlük getiri, portföy büyüklüğü

get_fon_fiyat_gecmisi(fon_kodu, periyod)

Hafta / 1ay / 3ay / 6ay / 1yıl / 3yıl / 5yıl geçmiş

get_fon_portfoy(fon_kodu, tarih?)

Kategori bazlı portföy dağılımı

karsilastir_fonlar(fon_1, fon_2, periyod)

İki fonun getiri ve portföy karşılaştırması

ara_fon(metin, limit)

Fon kodu / ünvan araması

donemsel_getiri_ozeti(fon_kodu)

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 sync

uv 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-mcp

veya 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"]
      }
    }
  }
}

uv yoksa 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-mcp

Tarayı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 tools
ara_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).

ParametersJSON Schema
NameRequiredDescriptionDefault
metinYes
limitNo

TDQS

A3.8/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fon_koduYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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").

ParametersJSON Schema
NameRequiredDescriptionDefault
fon_koduYes

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
fon_koduYes
periyodNo1ay

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fon_koduYes
tarihNo

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
fon_1Yes
fon_2Yes
periyodNo1yil

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv0.1.0
    • First observedara_fon
    • First observeddonemsel_getiri_ozeti
    • First observedget_fon_fiyat
    • First observedget_fon_fiyat_gecmisi
    • First observedget_fon_portfoy
    • First observedkarsilastir_fonlar

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A 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.
    15
    25 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Brazilian 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
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables querying real-time stock prices, gold, crypto, interest rates, portfolio data, and financial analysis from Finhay Securities via Claude AI.
    28 npm
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables querying Turkish economic data (inflation, FX rates, policy rates, etc.) from TCMB EVDS via curated tools, preventing LLM hallucination.
    6
    -