Hızlı yanıt
MCP ile Claude Desktop veya Cursor'a nasıl web sayfası okuyucu eklerim?
WebReaderAPI'ı çağıran bir read_url aracı sunan küçük bir MCP sunucusu çalıştırın, ardından istemcinizin MCP ayarlarında env ile kaydedin. Model bundan sonra herkese açık herhangi bir sayfayı temiz Markdown olarak okuyabilir. Her sayfa okuması 1 kredi, tarayıcıyla 2 kredi; Ekim 2026 itibarıyla $0,07/1K sayfa'dan. KYC olmadan; kripto ile ödeme.
MCP sunucusuna genel bakış
| Dil | Python 3.10+, mcp ve httpx paketleriyle |
|---|---|
| Aktarım | stdio: istemci sunucuyu yerel bir süreç olarak başlatır |
| Araç | read_url(url, max_chars) → başlık, kaynak URL, ardından sayfanın Markdown'ı |
| Neden web_fetch değil | Claude Code ve OpenClaw bu isimde yerleşik bir araç zaten sunuyor |
| Anahtar | Sunucunun ortam değişkenlerinde WEBREADER_API_KEY'dan okunur |
| Faturalandırma | 1 kredi = tarayıcı olmadan 1 sayfa okuma; sayfa JavaScript render etmek için tarayıcı gerektiriyorsa 2 kredi. Başarısız olan veya bir sitenin robots.txt'inin reddettiği istek için ücret alınmaz |
Neden web_fetch değil de read_url aracı?
Çünkü aynı isimli iki araç hem istemciyi hem de modeli karıştırır. Claude Code ve OpenClaw web_fetch adlı bir araç zaten içeriyor. Farklı bir isim, read_url, ve net bir açıklama, modelin bir sayfanın ana içeriğine, JavaScript sayfaları ve PDF'ler dahil, ihtiyaç duyduğunda bizimkini seçmesini sağlar.
Araç JSON değil, metin döndürür. Modeller kısa bir başlık ve Markdown'ı iç içe alanlardan daha iyi işler; başlık da kaynak URL'yi görünür tutar, böylece yanıt onu kaynak gösterebilir.
import os
import httpx
from mcp.server.fastmcp import FastMCP
API = "https://webreaderapi.com/api/v1/read"
KEY = os.environ["WEBREADER_API_KEY"]
mcp = FastMCP("webreaderapi")
@mcp.tool()
def read_url(url: str, max_chars: int = 20000) -> str:
"""Read a public web page and return its main content as Markdown.
Use it when the user gives a link or when a page must be read to answer.
max_chars caps the length of the returned text (1,000 to 500,000).
"""
params = {"url": url, "max_chars": max(1000, min(int(max_chars), 500000))}
try:
resp = httpx.get(API, params=params, headers={"Authorization": "Bearer " + KEY}, timeout=75)
except httpx.HTTPError as exc:
return "Network error while reading the page: " + str(exc)
body = resp.json()
if resp.status_code != 200:
err = body.get("error", {})
return "Could not read the page: " + err.get("code", str(resp.status_code)) + ". " + err.get("message", "")
title = body.get("title") or url
return "# " + title + "\nSource: " + body.get("final_url", url) + "\n\n" + body.get("markdown", "")
if __name__ == "__main__":
mcp.run()
Sunucuyu nasıl kurar ve test ederim?
Bir sanal ortam oluşturun, mcp ve httpx paketlerini kurun ve yukarıdaki dosyayı kaydedin. mcp paketi, Model Context Protocol'ün resmi Python SDK'sıdır; FastMCP ise tiplenmiş bir Python fonksiyonunu, docstring'i açıklaması olarak kullanarak bir araca dönüştürür.
İstemciye bağlamadan önce dosyayı anahtarınız tanımlıyken bir terminalden bir kez çalıştırın. stdin'de sessizce bir istemci bekler; bu, doğru başladığı anlamına gelir; Ctrl+C ile durdurun.
python -m venv .venv
. .venv/bin/activate
pip install "mcp[cli]" httpx
WEBREADER_API_KEY="your-key" python webreader_mcp.pyClaude Desktop'ta nasıl kaydederim?
Claude Desktop'ın geliştirici ayarlarını açın, claude_desktop_config.json dosyasını düzenleyin ve mcpServers altına bir giriş ekleyin. Mutlak yollar kullanın: sanal ortamınızın Python'u ve sunucu dosyası. Anahtarı env içine koyun, böylece aracın argümanlarında veya konuşmada hiç görünmez. Claude Desktop'ı yeniden başlatın; read_url araçlar listesinde görünür.
Cursor aynı mcpServers yapısını kendi MCP yapılandırma dosyasından okur; Claude Code da aynı komutu claude mcp add komutuyla kaydedebilir. OpenClaw için OpenClaw sayfasına bakın.
{
"mcpServers": {
"webreaderapi": {
"command": "/home/you/webreader/.venv/bin/python",
"args": ["/home/you/webreader/webreader_mcp.py"],
"env": { "WEBREADER_API_KEY": "your-key" }
}
}
}Sayfaları modelin context'i içinde nasıl tutarım?
max_chars değerini düşürün. Varsayılan 20.000 karakter çoğu makale için yeterlidir ve uzun bir sayfanın context'i doldurmasını önler. Tek bir yanıtta birkaç sayfa okuyan bir model, sayfa başına 8.000 ila 12.000 karakterle daha iyi sonuç verir.
Modelden gördüğü her bağlantıyı değil, ihtiyaç duyduğu sayfaları okumasını isteyin. Proje talimatlarınızdaki "soru başına en fazla üç sayfa oku" gibi kısa bir cümle hem maliyeti hem de context'i kontrol altında tutar.
Bir site okumayı reddettiğinde ne olur?
Araç, hata koduyla birlikte kısa bir mesaj döndürür; örneğin blocked_by_robots veya target_refused, ve hiçbir ücret kesilmez. robots.txt'e uyarız: crawler'ımız kendini WebReaderAPI olarak tanıtır, kendisi için veya tüm robotlar için yazılmış kurallara uyar ve bir sitenin izin vermediği sayfayı okumaz. Reddedilen sayfalar için ücret alınmaz. Bir site isteğimizi reddederse, verdiği yanıtı döndürürüz: CAPTCHA'ları asla çözmeyiz, hesaplara giriş yapmayız veya bir engeli ya da ödeme duvarını aşmaya çalışmayız. Model bundan sonra sayfanın otomatik okuyucular için kullanılamadığını söyleyip başka bir kaynak kullanabilir.
MCP sunucusu: sık sorulan sorular
Resmi bir WebReaderAPI MCP paketi var mı?
Hayır. Bu sayfadaki dosya entegrasyonun kendisidir: okuyabileceğiniz, değiştirebileceğiniz ve kendiniz çalıştırabileceğiniz 40 satır. Bizden kurulacak bir şey yok ve anahtarınız API'mize yapılan çağrılar dışında makinenizden çıkmaz.
Model bu sunucuyla web'de arama yapabilir mi?
Hayır. read_url, sizin veya modelin adresini zaten bildiği bir sayfayı okur. İstemcinizin sunduğu herhangi bir arama aracıyla birlikte kullanın; model arar, sonra önemli sayfaları okur.
Bununla çalışan bir asistanın maliyeti ne kadar?
Sayfa okuması başına 1 kredi, tarayıcı gerektiğinde 2 kredi. Günde 50 sayfa okuyan bir asistan ayda yaklaşık 1.500 kredi kullanır ve 10.000 sayfa ($3,75) bunu yaklaşık altı ay boyunca karşılar.
Sunucu çevrimdışı çalışır mı?
Hayır. Her sayfa için https://webreaderapi.com/api/v1/read'ı çağırır, dolayısıyla internet erişimi ve geçerli bir anahtar gerektirir.