Rozwiązanie: własny serwer MCP podłączony bezpośrednio do PyPI API. Nie halucynuje, bo nie zgaduje — pyta wprost.
Film: własny serwer MCP w Pythonie krok po kroku
Poniżej pełny tutorial z kodem i komendami.
Co budujesz?
Dependency Guardian — serwer MCP w Pythonie który:
- Odpytuje PyPI API w czasie rzeczywistym
- Zwraca aktualną wersję każdej biblioteki
- Ocenia czy projekt jest "martwy" (brak aktualizacji >2 lata)
- Integruje się z Claude Code i każdym klientem MCP
Stack: Python + UV + Fast MCP + httpx
Krok 1: Środowisko z UV
UV to nowoczesny menedżer pakietów Python — szybszy niż pip, obsługuje wirtualne środowiska i projekty.
Instalacja (Linux/WSL):
Bash1 2curl -LsSf https://astral.sh/uv/install.sh | sh uv --version
Utwórz projekt:
Bash1 2 3mkdir mcp-dependency-guardian && cd mcp-dependency-guardian uv init pipcp cd pipcp
Dodaj zależności:
Bash1uv add "fast-mcp>=3.0.0" httpx
Dlaczego httpx zamiast requests? Serwer MCP operuje asynchronicznie — obsługuje wiele zapytań jednocześnie. httpx z async/await nie blokuje pętli zdarzeń gdy czeka na odpowiedź PyPI. To konieczność, nie opcja.
Krok 2: Kod serwera
Utwórz plik server.py:
Python1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70import re import httpx from datetime import datetime, timezone from fast_mcp import FastMCP mcp = FastMCP("Dependency Guardian") @mcp.tool() async def check_pip_package(package_name: str) -> str: """ Sprawdź status paczki Python na PyPI. Użyj tego narzędzia by wykryć porzucone projekty, sprawdzić najnowszą wersję lub datę ostatniej aktualizacji. """ # Walidacja nazwy — tylko bezpieczne znaki if not re.match(r'^[a-zA-Z0-9._-]+$', package_name): return f"Błąd: Wykryto nieprawidłowe znaki w nazwie paczki '{package_name}'" url = f"https://pypi.org/pypi/{package_name}/json" async with httpx.AsyncClient(timeout=10.0) as client: try: response = await client.get(url) except httpx.TimeoutException: return f"Błąd: Timeout podczas łączenia z PyPI dla '{package_name}'" if response.status_code == 404: return f"Błąd: Pakiet '{package_name}' nie istnieje w PyPI" if response.status_code != 200: return f"Błąd: PyPI zwróciło status {response.status_code}" data = response.json() info = data.get("info", {}) releases = data.get("releases", {}) latest_version = info.get("version", "nieznana") # Znajdź datę ostatniego uploadu latest_date = None if latest_version in releases: files = releases[latest_version] if files: upload_time = files[-1].get("upload_time") if upload_time: latest_date = datetime.fromisoformat(upload_time).replace(tzinfo=timezone.utc) if latest_date is None: return ( f"Pakiet: {package_name}\n" f"Wersja: {latest_version}\n" f"Status: Nie udało się ustalić daty ostatniej aktualizacji" ) # Sprawdź czy projekt jest "martwy" (brak aktualizacji >2 lata) now = datetime.now(timezone.utc) days_since = (now - latest_date).days is_dead = days_since > 730 status = "⚠️ PORZUCONY (brak aktualizacji >2 lata)" if is_dead else "✅ Aktywnie utrzymywany" return ( f"Pakiet: {package_name}\n" f"Wersja: {latest_version}\n" f"Ostatnia aktualizacja: {latest_date.strftime('%Y-%m-%d')} ({days_since} dni temu)\n" f"Status: {status}" ) if __name__ == "__main__": mcp.run()
Kluczowy element: docstring funkcji. To nie jest komentarz dla programisty — to instrukcja dla modelu AI. Bez precyzyjnego opisu Claude zgaduje kiedy używać tego narzędzia. Z opisem wie dokładnie: "używaj tego gdy ktoś pyta o paczki Pythona".
Krok 3: Test przez MCP Inspector
Przed podłączeniem do Claude — przetestuj lokalnie:
Bash1uv run fast-mcp dev server.py
Otworzy się MCP Inspector w przeglądarce. Kliknij Connect, przejdź do zakładki Tools — zobaczysz check_pip_package.
Wpisz requests w pole package_name → Run Tool:
Pakiet: requests
Wersja: 2.32.5
Ostatnia aktualizacja: 2024-08-18 (215 dni temu)
Status: ✅ Aktywnie utrzymywany
Wpisz nieistniejącą nazwę (kacpersieradzinski):
Błąd: Pakiet 'kacpersieradzinski' nie istnieje w PyPI
Wpisz nazwę z niedozwolonymi znakami (../etc):
Błąd: Wykryto nieprawidłowe znaki w nazwie paczki
Wszystkie przypadki obsłużone. Możemy podłączyć do Claude Code.
Krok 4: Podłącz do Claude Code
Bash1 2claude mcp add --transport pipe "Pipe Guardian" \ -- uv run fast-mcp run server.py
Uruchom Claude Code i sprawdź:
Bash1 2claude /mcp
Powinien pojawić się Pipe Guardian. Teraz zapytaj:
Jaka jest aktualna wersja biblioteki requests?
Claude użyje narzędzia check_pip_package, odpyta PyPI i odpowie na podstawie rzeczywistych danych — nie zgadując.
Dlaczego to jest inne niż zwykłe pytanie do AI?
Porównaj:
Bez MCP:
"Najnowsza wersja requests to 2.28.1" — dane z trenowania, mogą być rok stare
Z MCP (Dependency Guardian):
"Najnowsza wersja requests na PyPI to 2.32.5, wydana 18 sierpnia 2024" — żywe dane z API
Różnica polega na tym że AI nie zgaduje — wykonuje zapytanie HTTP do PyPI i interpretuje wynik. To fundamentalna zmiana: AI jako wykonawca, nie generator tekstu.
Rozbuduj według potrzeb
Ten serwer to punkt startowy. Co możesz dodać:
- Pobieranie dokumentacji — PyPI zwraca URL do docs, możesz pobrać i dołączyć do odpowiedzi
- Porównywanie wersji — "czy mam najnowszą wersję?"
- Sprawdzanie bezpieczeństwa — integracja z bazą CVE
- Analiza całego requirements.txt — sprawdź wszystkie paczki naraz
Dalej w tym klastrze
Chcesz wdrożyć agentów AI w swojej firmie bez budowania od zera? Porozmawiajmy →
