Szybka odpowiedź
Jak dodać czytnik stron internetowych do Claude Desktop lub Cursor przez MCP?
Uruchom mały serwer MCP, który udostępnia narzędzie read_url wywołujące WebReaderAPI, a następnie zarejestruj go w ustawieniach MCP swojego klienta, umieszczając klucz w env. Model może wtedy czytać dowolną publiczną stronę jako czysty Markdown. Każde odczytanie strony kosztuje 1 kredyt, a 2 z przeglądarką, od 0,07 USD/1K stron według stanu na październik 2026. Bez KYC; płatność kryptowalutą.
Serwer MCP w skrócie
| Język | Python 3.10+, z pakietami mcp i httpx |
|---|---|
| Transport | stdio: klient uruchamia serwer jako lokalny proces |
| Narzędzie | read_url(url, max_chars) → tytuł, źródłowy URL, a następnie Markdown strony |
| Dlaczego nie web_fetch | Claude Code i OpenClaw mają już wbudowane narzędzie o tej nazwie |
| Klucz | Odczytywany z WEBREADER_API_KEY w środowisku serwera |
| Rozliczanie | 1 kredyt = 1 odczytana strona bez przeglądarki; 2 kredyty, gdy strona wymaga przeglądarki do wyrenderowania JavaScript. Zapytanie, które się nie powiedzie lub które zostanie odrzucone przez robots.txt witryny, nie jest obciążane opłatą |
Dlaczego narzędzie read_url, a nie web_fetch?
Bo dwa narzędzia o tej samej nazwie mylą zarówno klienta, jak i model. Claude Code i OpenClaw zawierają już narzędzie o nazwie web_fetch. Odmienna nazwa, read_url, i jasny opis pozwalają modelowi wybrać nasze narzędzie, gdy potrzebuje głównej treści strony, w tym stron z JavaScriptem i PDF-ów.
Narzędzie zwraca tekst, nie JSON. Modele lepiej radzą sobie z krótkim nagłówkiem i Markdownem niż z zagnieżdżonymi polami, a nagłówek trzyma źródłowy URL w zasięgu wzroku, dzięki czemu odpowiedź może go zacytować.
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()
Jak zainstalować i przetestować serwer?
Utwórz środowisko wirtualne, zainstaluj mcp i httpx, i zapisz plik powyżej. Pakiet mcp to oficjalny Python SDK Model Context Protocol; FastMCP zamienia otypowaną funkcję Pythona w narzędzie, używając docstringa jako jego opisu.
Zanim podłączysz go do klienta, uruchom plik raz z terminala z ustawionym kluczem. Czeka w ciszy na klienta na stdin, co oznacza, że wystartował poprawnie; zatrzymaj go przez Ctrl+C.
python -m venv .venv
. .venv/bin/activate
pip install "mcp[cli]" httpx
WEBREADER_API_KEY="your-key" python webreader_mcp.pyJak zarejestrować go w Claude Desktop?
Otwórz ustawienia deweloperskie Claude Desktop, edytuj claude_desktop_config.json i dodaj wpis w mcpServers. Użyj ścieżek bezwzględnych: Pythona ze swojego środowiska wirtualnego i pliku serwera. Umieść klucz w env, aby nigdy nie pojawił się w argumentach narzędzia ani w rozmowie. Uruchom ponownie Claude Desktop, a read_url pojawi się na liście narzędzi.
Cursor czyta tę samą strukturę mcpServers ze swojego własnego pliku konfiguracji MCP, a Claude Code może zarejestrować to samo polecenie swoim poleceniem claude mcp add. W przypadku OpenClaw zobacz stronę OpenClaw.
{
"mcpServers": {
"webreaderapi": {
"command": "/home/you/webreader/.venv/bin/python",
"args": ["/home/you/webreader/webreader_mcp.py"],
"env": { "WEBREADER_API_KEY": "your-key" }
}
}
}Jak utrzymać strony w kontekście modelu?
Zmniejsz max_chars. Domyślne 20 000 znaków wystarcza na większość artykułów i nie pozwala długiej stronie zapełnić kontekstu. Model czytający kilka stron w jednej odpowiedzi radzi sobie lepiej z 8 000 do 12 000 znaków na stronę.
Poproś model, aby czytał strony, których potrzebuje, a nie każdy link, który widzi. Krótkie zdanie w instrukcjach projektu, takie jak „czytaj najwyżej trzy strony na pytanie”, kontroluje zarówno koszt, jak i kontekst.
Co się dzieje, gdy witryna odmówi odczytu?
Narzędzie zwraca krótki komunikat z kodem błędu, takim jak blocked_by_robots lub target_refused, i nic nie jest naliczane. Respektujemy robots.txt: nasz crawler identyfikuje się jako WebReaderAPI, przestrzega reguł napisanych dla niego lub dla wszystkich robotów i nie czyta strony, której witryna zabrania. Odrzucone strony nie są obciążane opłatą. Jeśli witryna odrzuci nasze zapytanie, zwracamy jej odpowiedź: nigdy nie rozwiązujemy CAPTCHA, nie logujemy się do kont ani nie próbujemy obejść blokady lub paywalla. Model może wtedy powiedzieć, że strona nie jest dostępna dla zautomatyzowanych czytników, i użyć innego źródła.
Serwer MCP: najczęstsze pytania
Czy istnieje oficjalny pakiet MCP WebReaderAPI?
Nie. Plik na tej stronie to cała integracja: 40 linii, które możesz przeczytać, zmienić i uruchomić samodzielnie. Niczego nie trzeba instalować od nas, a Twój klucz nie opuszcza Twojej maszyny poza wywołaniami naszego API.
Czy model może przeszukiwać internet za pomocą tego serwera?
Nie. read_url czyta stronę, której adres Ty lub model już macie. Połącz go z dowolnym narzędziem wyszukiwania oferowanym przez klienta; model wyszukuje, a potem czyta strony, które mają znaczenie.
Ile kosztuje uruchomienie asystenta z tym serwerem?
Jeden kredyt za odczytanie strony, dwa, gdy potrzebna jest przeglądarka. Asystent czytający 50 stron dziennie zużywa około 1500 kredytów miesięcznie, a 10 000 stron (3,75 USD) pokrywa to na około sześć miesięcy.
Czy serwer działa offline?
Nie. Przy każdej stronie wywołuje https://webreaderapi.com/api/v1/read, więc potrzebuje dostępu do internetu i ważnego klucza.