Serwer MCP w Pythonie: FastMCP, Claude Code i PyPI

Streszczenie
  • Film: własny serwer MCP w Pythonie krok po kroku
  • Co budujesz?
  • Krok 1: Środowisko z UV
  • Krok 2: Kod serwera
Serwer MCP w Pythonie: FastMCP, Claude Code i PyPI

Piątek, 16:00. Dostajesz projekt po innym programiście. Wpisujesz pip install i widzisz ścianę czerwonego tekstu — konflikty zależności, martwe biblioteki, wersje których już nie ma. Wklejasz logi do ChatGPT i słyszysz: "Spróbuj wersji 1.0". Instalujesz. Dalej nie działa. Bo ta biblioteka nie jest wspierana od dwóch lat — a model o tym nie wie, jego wiedza jest odcięta w przeszłości.

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):

Bash
1 2 curl -LsSf https://astral.sh/uv/install.sh | sh uv --version

Utwórz projekt:

Bash
1 2 3 mkdir mcp-dependency-guardian && cd mcp-dependency-guardian uv init pipcp cd pipcp

Dodaj zależności:

Bash
1 uv add "fast-mcp>=3.0.0" httpx

Dlaczego httpx zamiast requests? Serwer MCP operuje asynchronicznie — obsługuje wiele zapytań jednocześnie. httpxasync/await nie blokuje pętli zdarzeń gdy czeka na odpowiedź PyPI. To konieczność, nie opcja.

Krok 2: Kod serwera

Utwórz plik server.py:

Python
1 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 70 import 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:

Bash
1 uv 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

Bash
1 2 claude mcp add --transport pipe "Pipe Guardian" \ -- uv run fast-mcp run server.py

Uruchom Claude Code i sprawdź:

Bash
1 2 claude /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 →

Tagi

#AI#automatyzacja#Python#Claude Code#MCP#PyPI