Używasz Claude albo ChatGPT codziennie. Jesteś w tym dobry — prompty, follow-upy, cały ten taniec. Ale za każdym razem, gdy potrzebujesz danych z firmowego CRM-a, trackera projektów albo wewnętrznej bazy, zamieniasz się w ludzki kabel USB: kopiuj z karty A, wklej do karty B, powtarzaj aż dusza opuści ciało.

I jest coś, czego większość tutoriali nie powie wprost: przepaść między 'AI, które zna internet" a 'AI, które zna twój biznes" to dokładnie jeden plik Pythona. Żadnej migracji platformy. Żadnego sześciocyfrowego kontraktu z vendorem. Jeden plik z dekoratorem i docstringiem. Protokół już istnieje, każda duża firma AI go adoptowała, a ty możesz to podpiąć w jedno popołudnie. Pokażę ci jak.

Dlaczego oczywiste rozwiązania nie działają

'Po prostu użyj API" — świetna rada, tylko że twoje AI nie ma rąk. Nie potrafi samo wywołać firmowego REST API (adresu URL, który zwraca dane gdy grzecznie poprosisz). Możesz wkleić dokumentację API do chatu, ale to pożera context window — ile tekstu AI może 'widzieć" naraz, jego pamięć roboczą — a ty dalej robisz za kopiarkę. Integracje w stylu Zapiera istnieją, ale są sztywne: predefiniowane triggery, predefiniowane akcje i cennik, od którego twój CFO dostaje palpitacji.

To czego naprawdę potrzebujesz, to sposób, żeby twoje AI samo odkrywało i wywoływało twoje wewnętrzne narzędzia — bez ciebie jako pośrednika.

MCP: standard, który to rozwiązał

MCP (Model Context Protocol) to uniwersalny standard wtyczek dla narzędzi AI — pomyśl USB-C, ale do podłączania AI do twoich danych. Anthropic udostępnił go jako open source w listopadzie 2024. Do marca 2026 osiągnął 97 milionów pobrań SDK miesięcznie. OpenAI, Google i Microsoft — wszyscy go adoptowali. Na dzień 26 kwietnia 2026 ponad 17 000 serwerów MCP jest zaindeksowanych w rejestrach.

Pythonowe SDK pozwala zbudować działający serwer w jednym pliku. Oto jak.

Krok 1: Zainstaluj SDK

Potrzebujesz Pythona 3.10+ i albo uv (menedżer pakietów rekomendowany przez Anthropic), albo zwykłego pip.

# Opcja A: uv (rekomendowane)
uv init my-mcp-server && cd my-mcp-server
uv add "mcp[cli]" httpx

# Opcja B: pip
pip install "mcp[cli]" httpx

httpx to pythonowa biblioteka HTTP — twój serwer używa jej do pobierania danych z zewnętrznych API. Jeśli twoje dane siedzą w bazie, zamień ją na odpowiedni sterownik bazodanowy.

Krok 2: Napisz serwer

Utwórz server.py. Oto kompletny serwer MCP, który pobiera alerty pogodowe z US National Weather Service — prawdziwe API, bez klucza autoryzacji, idealne do nauki:

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# FastMCP — wysokopoziomowy wrapper, który zamienia
# zwykłe funkcje Pythona w narzędzia MCP
mcp = FastMCP("weather")

NWS_API_BASE = "https://api.weather.gov"

async def make_request(url: str) -> dict[str, Any] | None:
    headers = {
        "User-Agent": "mcp-weather-demo/1.0",
        "Accept": "application/geo+json",
    }
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(
                url, headers=headers, timeout=30.0
            )
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

@mcp.tool()
async def get_alerts(state: str) -> str:
    """Get active weather alerts for a US state.

    Args:
        state: Two-letter US state code (e.g. CA, NY)
    """
    data = await make_request(
        f"{NWS_API_BASE}/alerts/active/area/{state}"
    )
    if not data or "features" not in data:
        return "No alerts found."

    alerts = []
    for feature in data["features"][:5]:
        props = feature["properties"]
        alerts.append(
            f"Event: {props.get('event', 'Unknown')}\n"
            f"Area: {props.get('areaDesc', 'Unknown')}\n"
            f"Severity: {props.get('severity', 'Unknown')}"
        )
    return "\n---\n".join(alerts) or "No active alerts."

if __name__ == "__main__":
    mcp.run(transport="stdio")

Około 40 linijek prawdziwego kodu. Dekorator @mcp.tool() — pythonowy skrót, który rejestruje twoją funkcję jako narzędzie wywoływalne przez AI — robi całą robotę. FastMCP czyta twoje type hinty (state: str) i docstring (opis w potrójnych cudzysłowach), żeby automatycznie wygenerować definicje narzędzi, które AI rozumie.

To jest wzorzec bazowy. Każdy serwer MCP jaki kiedykolwiek widziałeś — Slack, GitHub, Figma, wszystkie 17 000+ — to ten sam szkielet z większą liczbą endpointów.

Krok 3: Podłącz do Claude Desktop

Claude Desktop czyta plik konfiguracyjny JSON (plik ustawień w określonym formacie), żeby wiedzieć jakie serwery MCP uruchomić. Znajdziesz go tutaj:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Utwórz lub edytuj:

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/my-mcp-server",
        "run",
        "server.py"
      ]
    }
  }
}

Zamień /absolute/path/to/my-mcp-server na faktyczną pełną ścieżkę. Ścieżki względne nie działają — na tym się wywala każdy za pierwszym razem.

Zrestartuj Claude Desktop. Szukaj ikony młotka w prawym dolnym rogu pola czatu. Kliknij — powinieneś zobaczyć get_alerts na liście. Jeśli nie widzisz, sprawdź ~/Library/Logs/Claude/mcp*.log na macOS.

Krok 4: Zapytaj Claude o coś

Wpisz: 'Czy są jakieś alerty pogodowe w Kalifornii?"

Claude rozpoznaje, że ma narzędzie get_alerts, prosi o zgodę na jego wywołanie, uderza do twojego serwera i odpowiada żywymi danymi z NWS, do których pięć minut temu nie miał dostępu.

To jest ten moment 'aha". Twój chatbot właśnie przestał być generyczny.

Krok 5: Zamień API pogodowe na swoje

Teraz podmień make_request na dowolne API, którego używa twój zespół — Jira, Linear, wewnętrzny dashboard. Jeśli ma endpoint zwracający dane, to jedna funkcja dzieli go od zostania narzędziem AI. Wzorzec jest zawsze ten sam:

  1. Napisz funkcję async, która pobiera dane
  2. Udekoruj ją @mcp.tool()
  3. Napisz porządny docstring (niżej wyjaśniam dlaczego to ważne)
  4. Dodaj do configa, zrestartuj

Kilka zasad projektowych, które odróżniają użyteczne narzędzia MCP od frustrujących: nazywaj narzędzia parami czasownik-rzeczownik (get_alerts, search_tickets, create_issue), żeby model mógł wywnioskować intencję z samej nazwy. Każde narzędzie powinno robić jedną rzecz — funkcja, która pobiera, filtruje i zapisuje, to trzy narzędzia udające jedno. A w kwestii parametrów — wybieraj jawne typowane argumenty zamiast catch-all stringów; state: str z docstringiem mówiącym 'Dwuliterowy kod stanu USA" daje modelowi wystarczająco dużo, żeby sam zwalidował swój input.

Pułapki, które cię ugryzą

1. Opis twojego narzędzia TO jest produkt

Badanie Queen's University z lutego 2026 przeanalizowało 856 narzędzi MCP z 103 serwerów. Wynik: 97,1% opisów narzędzi miało co najmniej jeden defekt jakościowy. 56% nawet nie artykułowało swojego przeznaczenia. Gdy badacze poprawili opisy, wskaźnik sukcesu zadań skoczył o +5,85 punktu procentowego. Twój docstring to nie dokumentacja — to interfejs użytkownika, który czyta twoje AI. Pisz go jak specyfikację produktu: cel, objaśnienie parametrów, ograniczenia, przykłady.

2. Nigdy print() na stdout

Dla serwerów opartych na stdio (tego używa Claude Desktop), pisanie na stdout psuje wiadomości JSON-RPC — protokół, którym twoje AI i serwer się komunikują. Serwer po cichu się sypie i spędzasz 45 minut gapiąc się w nicość. Używaj print("debug", file=sys.stderr) albo modułu logging w Pythonie.

3. Bezpieczeństwo to TWOJA robota

MCP nie ma wbudowanej autoryzacji dla serwerów lokalnych. To jest OK, gdy działa na twoim laptopie przez stdio — to po prostu lokalny proces. Ale w momencie, gdy rozważasz wystawienie go po HTTP: stop. OWASP MCP Top 10, opublikowany na początku 2026, istnieje dlatego, że ludzie pominęli ten krok. Ponad 30 CVE wylądowało na toolingu MCP tylko w styczniu–lutym 2026. Sam FastMCP miał podatność na command injection (CVE-2025-64340, ujawnione pod koniec 2025) we wszystkich wersjach poniżej 3.2.0.

Jeśli twój serwer dotyka wewnętrznych API, traktuj go jak każdy serwis backendowy: waliduj każdy input, który model wysyła (będzie halucynował wartości parametrów — licz na to), wymuszaj zasadę najmniejszych uprawnień, żeby każde narzędzie miało dostęp tylko do danych, których potrzebuje, i przypnij wersje zależności. Lokalne stdio to jedyny bezpieczny domyślny tryb, dopóki nie ogarniesz autoryzacji porządnie.

4. Ścieżka w configu musi być absolutna

Ścieżki względne w claude_desktop_config.json failują po cichu. Żadnego błędu, żadnego loga, tylko brakująca ikona młotka i developer powoli tracący wiarę w ludzkość. Używaj /Users/twojanazwa/... na macOS — ekspansja tyldy jest tutaj nieprzewidywalna.

Co możesz teraz zrobić

Masz powtarzalny wzorzec. Każde API, którego twój zespół już używa — tracker projektów, CRM, wewnętrzny dashboard, baza danych — jest o jeden plik Pythona od tego, żeby twoje AI mogło je odpytywać bezpośrednio. Żadnej kolejki do integracji z vendorem. Żadnego podatku Zapierowego. Żadnego kopiuj-wklej między kartami jak w 2019.

Mur między 'AI, które zna internet" a 'AI, które zna twój biznes" ma teraz drzwi. Zbudowałeś je w mniejszej liczbie linijek niż typowy plik konfiguracyjny.