A Model Context Protocol (MCP) demo application that provides AI agents with real-time currency exchange rate capabilities using Frankfurter API and fawazahmed0 as fallback.
Currency MCP server has 4 tools with Turkish names and descriptions. All tools have basic input schemas with type and description fields. However, critical gaps exist: (1) Tool names use Turkish verbs (kur_sorgula, kur_cevir) rather than English action verbs, LLMs trained on English patterns will struggle to infer intent. (2) Descriptions are present but minimal (10-30 chars), below the 50-200 char baseline for LLM optimization. (3) No output schemas documented, LLMs cannot predict response structure for chaining. (4) Error handling returns unstructured error objects without recovery guidance. (5) No parameter constraints (enums, ranges) despite currency codes being a fixed set. (6) No tool annotations (readOnlyHint, idempotentHint) despite all tools being read-only. Average per-tool score: 42.
Belirtilen miktarı bir para biriminden diğerine çevirir
Son 7 günün kur geçmişini döner
Desteklenen tüm para birimlerini listeler
İki para birimi arasındaki güncel kuru döner
Tool names in Turkish (kur_sorgula, kur_cevir, kur_listele, kur_gecmis) violate English verb_noun convention. LLMs trained on English patterns cannot infer intent from Turkish verbs. Rename to: get_exchange_rate, convert_currency, list_currencies, get_rate_history.
No output schemas documented. Tools return unstructured dicts with varying fields (basarili, hata, kur, tarih, aciklama, kaynak_api). LLMs cannot predict response structure for downstream chaining or field extraction.
Descriptions are 10-30 characters (e.g., 'İki para birimi arasındaki güncel kuru döner'). Below 50-char minimum for LLM optimization. Expand to 50-200 chars explaining WHAT, WHEN, and WHAT IT RETURNS. Example: 'Get the current exchange rate between two currencies. Use this to check today's rate before converting amounts. Returns rate, date, and source API.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 36 | 2026-07-28+ | v2 |
Currency code parameters (kaynak, hedef) accept free-form strings. No enum constraint. Should declare: enum=['USD', 'EUR', 'TRY', 'GBP', ...] to prevent hallucinated codes and guide LLM selection.
Error responses lack recovery guidance. 'hata' field returns bare strings like 'Kaynak ve hedef para birimi aynı olamaz.' LLMs cannot infer next action. Should return: {error: '...', recovery: 'Try different currency codes', retryable: false}.