YÖK Atlas MCP Server
MCP server that provides Turkish university preference guide data, enabling users to query provinces, universities, and program groups, and to search university programs with filters, while reminding users to verify results against official sources.
README
yokatlas-mcp-server
A Python MCP server exposing YÖK ATLAS
"tercih kılavuzu" (preference guide) reference-data tools: provinces, universities, and program
groups (each tagged with its exam score type). Built on FastMCP
with pydantic-settings config, a standard {ok, data, error} tool envelope, and a rate-limited
HTTP client with retries.
⚠️ Sorumluluk Reddi Beyanı (Disclaimer)
Bu proje tamamen deneysel amaçlarla oluşturulmuştur. Yapay zeka modelleri hata yapabilir; bu sunucunun ürettiği hiçbir sonuç %100 doğru veya güncel olarak kabul edilmemelidir. Hangi okulu veya bölümü seçeceğinize karar verirken mutlaka bir rehber öğretmen, eğitim danışmanı veya alanında uzman bir kişiden profesyonel destek alın.
Bu proje, yalnızca puanınıza göre hangi okul/bölümlerin mevcut olabileceği konusunda size bir fikir vermek amacıyla oluşturulmuştur; resmî bir tercih/danışmanlık aracı değildir. Burada elde ettiğiniz sonuçları her zaman resmî YÖK ATLAS verileriyle karşılaştırıp doğrulayın.
Bu proje ve geliştiricisi, bu sunucunun ürettiği bilgilere dayanılarak yapılan üniversite/bölüm tercihlerinden veya bu tercihlerin sonuçlarından hiçbir şekilde sorumlu tutulamaz. Tercih sürecinde yapılan hatalardan dolayı proje sahibine sorumluluk yüklenemez.
A Turkish version of this same warning is returned in every tool response's disclaimer field
(see below) — the server instructions tell the calling model to always surface it to the user
verbatim, not just leave it in this file.
Bu projeyi (bu MCP sunucusunu) indirerek, kurarak, çalıştırarak veya Claude Desktop, Codex, ChatGPT ya da başka bir istemci üzerinden bu sunucuya bağlanıp kullanarak, yukarıdaki sorumluluk reddi beyanının tamamını okuduğunuzu, anladığınızı ve kabul ettiğinizi beyan etmiş sayılırsınız.
MCP İstemcilerine Bağlanma (Claude Desktop, Codex, ChatGPT)
Herkese Açık Sunucu (kurulum gerektirmez)
Bu sunucu zaten https://yokatlas.aykutbuyukkaya.com/mcp adresinde yayında. Kendi bilgisayarınızda
hiçbir şey kurmadan/çalıştırmadan, aşağıdaki "Custom Connector" adımlarında bu URL'yi kullanarak
doğrudan bağlanabilirsiniz. Kendi kopyanızı çalıştırmak isterseniz aşağıdaki yerel kurulum
adımlarını izleyebilirsiniz.
Sunucu varsayılan olarak stdio üzerinden çalışır; Claude Desktop, Claude Code ve Codex gibi
istemciler sunucuyu doğrudan yerel bir alt süreç olarak başlattığı için ayrı bir HTTP kurulumu
gerekmez. ChatGPT ise yalnızca internetten erişilebilen (HTTPS) bir MCP sunucusuna
bağlanabildiği için ya yukarıdaki herkese açık adresi ya da kendi deploy ettiğiniz bir adresi
kullanmanız gerekir.
Kendi kopyanızı çalıştırmak için önce bağımlılıkları kurun:
git clone <bu-repo-url>
cd yokatlas-mcp-server
uv sync
Claude Desktop
Claude Desktop'ın ayar dosyasını açın:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
mcpServers altına aşağıdaki girdiyi ekleyin (yolu kendi klonladığınız dizinle değiştirin) ve
Claude Desktop'ı yeniden başlatın:
{
"mcpServers": {
"yokatlas-mcp-server": {
"command": "uv",
"args": ["--directory", "/path/to/yokatlas-mcp-server", "run", "yokatlas-mcp-server"]
}
}
}
Claude Code CLI kullanıyorsanız aynı işi tek satırla yapabilirsiniz:
claude mcp add yokatlas-mcp-server -- uv --directory /path/to/yokatlas-mcp-server run yokatlas-mcp-server
Custom Connector (uzak/HTTP sunucu) ile bağlanma: Kendi bilgisayarınızda hiçbir şey kurmadan, herkese açık sunucuyu kullanarak bağlanabilirsiniz:
- Claude Desktop'ta Settings → Connectors'a gidin.
- Add custom connector'a tıklayıp
https://yokatlas.aykutbuyukkaya.com/mcpadresini MCP sunucu URL'si olarak girin ve ekleyin. - Yeni bir sohbette bu connector'ı etkinleştirip araçları kullanmaya başlayın.
Kendi deploy ettiğiniz bir sunucuyu kullanmak isterseniz (bkz. Docker), 2. adımda
kendi https://<alan-adiniz> adresinizi girmeniz yeterlidir.
Codex CLI (OpenAI)
~/.codex/config.toml dosyasına aşağıdaki bloğu ekleyin:
[mcp_servers.yokatlas-mcp-server]
command = "uv"
args = ["--directory", "/path/to/yokatlas-mcp-server", "run", "yokatlas-mcp-server"]
Codex CLI sürümünüz destekliyorsa aynı satırı komut satırından da ekleyebilirsiniz:
codex mcp add yokatlas-mcp-server -- uv --directory /path/to/yokatlas-mcp-server run yokatlas-mcp-server
ChatGPT (Connectors / Developer mode)
ChatGPT yerel bir komut çalıştıramadığı için sunucunun internetten erişilebilir bir HTTPS
adresi olması gerekir. Herkese açık sunucuyu kullanabilir ya da kendi kopyanızı
MCP_TRANSPORT=streamable-http ile (bkz. Docker) bir alan adının arkasına deploy
edebilirsiniz, ardından:
- ChatGPT'de Settings → Connectors → Advanced → Developer mode'u açın (bu özellik hesap planınıza göre farklı bir menüde görünebilir).
- Add custom connector ile
https://yokatlas.aykutbuyukkaya.com/mcpadresini (veya kendi deploy ettiğinizhttps://<alan-adiniz>adresini) MCP sunucu URL'si olarak girin. - Sohbette bu connector'ı etkinleştirip
get_university_cities,get_universities,get_university_programsvesearch_university_programsaraçlarını kullanmaya başlayın.
command/argsyollarıuv'nin sistem PATH'inizde bulunduğunu varsayar; değilsecommandalanınauv'nin tam yolunu (örn./opt/homebrew/bin/uv) yazmanız gerekir.
Diğer HTTP tabanlı istemciler için de MCP_TRANSPORT=streamable-http (veya sse) ayarlayıp
http://<MCP_HOST>:<MCP_PORT> adresine bağlanmanız yeterlidir.
Tools
| Tool | Upstream endpoint | Filters |
|---|---|---|
get_university_cities |
GET /api/tercih-kilavuz/universite-iller |
name_contains, limit |
get_universities |
GET /api/tercih-kilavuz/universiteler |
name_contains, limit |
get_university_programs |
GET /api/tercih-kilavuz/universite-programlar |
name_contains, score_type, limit |
search_university_programs |
POST /api/tercih-kilavuz/search |
see below |
get_university_cities, get_universities, and get_university_programs are reference-data
lookups. search_university_programs is the actual preference search — it returns program
placements (university + program + quota + fee + scholarship + prior guide's minimum success
rank / score cutoff), and its university_ids, program_group_ids, and city_codes filters are
meant to be resolved first from the three lookup tools' id/ilKodu fields, not guessed.
search_university_programs also filters by program_type (46/"LİSANS", 47/"ÖNLİSANS"),
university_type (DEVLET, VAKIF, "VAKIF MYO", KKTC, "YURTDIŞI KAMU", "YURTDIŞI VAKIF"),
scholarship_type (0/"ÜCRETSİZ", 154/"ÜCRETLİ", 158/"BURSLU", 155/"%25 İNDİRİMLİ",
156/"%50 İNDİRİMLİ"), study_mode (86/"ÖRGÜN ÖĞRETİM", 182/"UZAKTAN ÖĞRETİM",
203/"AÇIK ÖĞRETİM"), an exact guide_code (to fetch one specific placement), a
min_success_rank/max_success_rank range, and standard page/size (max 50)/sort_by/
direction pagination. All of the above accept either the raw id/code or the Turkish label —
with or without diacritics, in any case ("lisans", "LİSANS", and 46 are equivalent). Set
include_conditions_text=True to also get each result's full admission-condition paragraphs
(conditions_text); left off by default since they can be long.
score_type accepts SAY, EA, SÖZ (or ASCII SOZ), DİL (or ASCII DIL), and TYT.
Name filters are case-insensitive substring matches that handle Turkish dotted/dotless I
correctly (e.g. name_contains="istanbul" matches İSTANBUL).
Every tool returns a standard envelope so callers can branch on success/failure without parsing
exceptions. Every response also carries a disclaimer field with the Turkish warning above
(experimental/AI-generated data, verify against the official YÖK ATLAS, get professional
guidance):
{"ok": true, "data": {...}, "error": null, "disclaimer": "Bu sonuç deneysel..."}
{"ok": false, "data": null, "error": {"code": "INVALID_INPUT", "message": "...", "retryable": false}, "disclaimer": "Bu sonuç deneysel..."}
This full envelope (including disclaimer) is always available as structuredContent. But
relying only on a JSON field inside structuredContent, plus the server's MCP instructions
telling the model to relay it, turned out not to be reliable in practice — not every client
forwards instructions to the model, and a field buried in a large JSON blob is easy for a
model to summarize away. So each tool's actual text output (content) leads with the
disclaimer as its own explicit, unmissable directive block, ahead of the JSON data — see
envelope.to_call_tool_result().
Project layout
src/yokatlas_mcp_server/
__init__.py
settings.py # pydantic-settings config, loaded from env vars / .env
errors.py # domain exceptions + {code, message, retryable} error payloads
envelope.py # shared {ok, data, error, disclaimer} response helpers
text_utils.py # Turkish-aware casefold/upper + int/limit validation
enums.py # search filter value normalization (labels <-> ids)
rate_limiter.py # async token-bucket limiter for the upstream client
models.py # City, University, ProgramGroup dataclasses
yokatlas_client.py # TercihKilavuzuClient: retries, rate limiting, error mapping
server.py # FastMCP app: tool/resource/prompt registration, entry point
tools/
__init__.py
get_university_cities.py
get_universities.py
get_university_programs.py
search_university_programs.py
tests/
test_scaffold.py # settings + transport validation
test_envelope.py # {ok, data, error, disclaimer} response helpers
test_server_tool_dispatch.py # real FastMCP tool-call dispatch, not execute_* directly
test_enums.py # filter value normalization
test_yokatlas_client.py # HTTP client behavior against a mocked transport
test_get_university_cities_tool.py
test_get_universities_tool.py
test_get_university_programs_tool.py
test_search_university_programs_tool.py
Getting started
uv sync
cp .env.example .env
uv run pytest
uv run yokatlas-mcp-server
The default transport is stdio, so uv run yokatlas-mcp-server will sit waiting for an MCP
client to speak to it over stdin/stdout — that's expected. Use mcp dev for an interactive
inspector instead:
uv run mcp dev src/yokatlas_mcp_server/server.py
Adding a new tool
- Add a method to
TercihKilavuzuClientinyokatlas_client.py, or create a new<domain>_client.pymodule following the same pattern (owns retries, rate limiting viaRateLimiter, and translates HTTP/network failures into theerrors.pyexception hierarchy). - Create
tools/<name>.pywith aProtocoldescribing the client methods the tool needs and anasync def execute_<name>(...)that validates input, calls the client, and returns the envelope viaenvelope.make_success_response/make_error_response(copytools/get_university_cities.pyas a starting point). - Register it in
server.pywith@mcp.tool(name=..., description=...), describing each parameter with a pydanticField(description=...)so MCP clients get useful tool docs. - Add tests mirroring
test_get_university_cities_tool.py(fake client, no network) and, if you added a client method,test_yokatlas_client.py(real client,httpx.MockTransport, no network).
Docker
uv lock
docker build -t yokatlas-mcp-server .
docker run --rm -p 8000:8000 yokatlas-mcp-server
The image defaults MCP_TRANSPORT to streamable-http and binds to 0.0.0.0:8000. uv lock
must be run once (and whenever dependencies change) to produce uv.lock, which the Dockerfile
installs from with --frozen for reproducible builds.
Configuration
See .env.example for all supported environment variables: MCP transport/host/port, logging, and the YÖK ATLAS API's base URL, timeouts, retry policy, and rate limit.
License
MIT — see LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。