Blog JSystems - uwalniamy wiedzę!

Szukaj

Kurs Claude Code — Lekcja 5 z 11

Ten artykuł jest częścią bezpłatnego kursu Claude Code — największej polskojęzycznej serii 11 lekcji dla programistów. Od pierwszego uruchomienia do autonomicznych agentów AI.

← Spis wszystkich lekcji
← Lekcja 4: plik CLAUDE.md — konfiguracja agenta dla projektu

Claude + serwery MCP — jak podłączyć agenta do swoich systemów


Claude CodeSeria Claude Code · JSystems


Wyobraź sobie że Twój asystent AI może sprawdzić status PR, odpytać bazę danych i wysłać wiadomość na Slack — wszystko bez wychodzenia z terminala. Bez otwierania przeglądarki, bez kopiowania odpowiedzi między oknami, bez ręcznego przepisywania danych.


To nie jest science fiction. To właśnie robi Claude z serwerami MCP (Model Context Protocol). Ten artykuł pokazuje jak to skonfigurować — od zera, krok po kroku.




Czego się nauczysz z tego artykułu:



  • ✅ Czym jest protokół MCP i jak rozwiązuje problem integracji AI z narzędziami

  • ✅ Jak skonfigurować gotowe serwery MCP (GitHub, PostgreSQL, Slack, Playwright)

  • ✅ Jak zbudować własny serwer MCP dla firmowego systemu w TypeScript

  • ✅ Jak zadbać o bezpieczeństwo — tokeny, uprawnienia, read-only





Zanim zaczniesz — co powinieneś wiedzieć


Ten artykuł zakłada, że znasz Claude Code (narzędzie do pracy z kodem) i chcesz rozszerzyć jego możliwości. Jeśli nigdy nie słyszałeś o MCP, przeczytaj najpierw poniższe wyjaśnienie.



  • Znajomość podstaw pracy z terminalem (wiersz poleceń)

  • Podstawy JavaScript/TypeScript lub Python (do budowania własnych serwerów)

  • Ogólne pojęcie czym jest API (wyjaśniamy poniżej)




Krok 1 — Zrozum czym jest protokół MCP


Protokół to zestaw reguł komunikacji — tak jak w życiu codziennym mamy protokół dyplomatyczny (kto komu podaje rękę, kto mówi pierwszy). W informatyce protokół określa: jak dwa programy rozmawiają ze sobą, w jakim formacie wysyłają dane i jak odpowiadają na błędy.



💡 Co to znaczy? MCP (Model Context Protocol) to protokół stworzony przez Anthropic (twórców Claude), który odpowiada na konkretny problem: jak sprawić, żeby model AI mógł korzystać z zewnętrznych narzędzi i danych w ustandaryzowany sposób? Wyobraź sobie USB — jeden standard, który działa ze wszystkimi urządzeniami. MCP to "USB dla AI i narzędzi".


Analogia: Claude jako nowy pracownik w firmie


Wyobraź sobie, że zatrudniasz nowego pracownika (Claude). Jest bardzo inteligentny, ale nie ma dostępu do Waszych systemów: nie widzi bazy danych klientów, nie może sprawdzić historii zamówień, nie ma dostępu do firmowego Slacka. Żeby był użyteczny, musisz mu dać odpowiednie "klucze do drzwi" — dostęp do konkretnych systemów. MCP to właśnie system takich kluczy. Każdy serwer MCP to dostęp do jednego systemu (GitHub, baza danych, Slack itd.).



Problem przed MCP: Każde narzędzie AI musiało integrować się z każdym zewnętrznym systemem osobno, na swój własny sposób. Chaos. 10 narzędzi × 20 systemów = 200 różnych integracji.


Rozwiązanie MCP: Jeden standardowy protokół. Budujesz serwer MCP raz — działa z Claude, ale też z innymi narzędziami AI wspierającymi ten standard.



Krok 2 — Zrozum jak to działa (przepływ komunikacji)


Gdy piszesz do Claude "Sprawdź otwarte issue #234 na GitHubie", dzieje się tak:



  1. Claude decyduje, że potrzebuje narzędzia GitHub

  2. Claude wysyła żądanie do serwera MCP GitHub w ustandaryzowanym formacie JSON

  3. Serwer MCP tłumaczy to żądanie na API GitHuba i pobiera dane

  4. Dane wracają do Claude, który formułuje odpowiedź



💡 Co to znaczy? "JSON" to format danych — jak XML, ale prostszy. Wygląda tak: {"action": "get_issue", "number": 234}. Ty jako programista nie musisz zarządzać tym przepływem — konfigurujesz raz, potem Claude robi to automatycznie przy każdym wywołaniu.


Wolisz nauczyć się tego z trenerem? Szkolenie MCP z terminem gwarantowanym →



Krok 3 — Skonfiguruj swój pierwszy serwer MCP


MCP serwery konfiguruje się w pliku ~/.claude/settings.json (lub przez polecenie /mcp w Claude Code). Poniżej kompletna konfiguracja z czterema popularnymi serwerami — wytłumaczona linia po linii:


{
"mcpServers": {
// Każdy klucz to nazwa serwera MCP — możesz ją wybrać dowolnie
"github": {
"command": "npx", // Uruchom przez Node.js package manager
"args": ["-y", "@modelcontextprotocol/server-github"], // Paczka z npm
"env": {
// Token GitHub — wygeneruj w Settings → Developer Settings → Tokens
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_your_token_here"
}
},
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
// Connection string do bazy danych
// Format: postgresql://użytkownik:hasło@host:port/nazwa_bazy
"POSTGRES_CONNECTION_STRING": "postgresql://user:pass@localhost:5432/mydb"
}
},
"filesystem": {
"command": "npx",
// Ostatni argument to ścieżka do katalogu — Claude będzie miał dostęp TYLKO do niego
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/projects"]
},
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
// Bot Token ze Slack API — dodajesz aplikację do workspace
"SLACK_BOT_TOKEN": "xoxb-your-token"
}
}
}
}

Po zapisaniu pliku i ponownym uruchomieniu Claude Code, serwery MCP będą dostępne. Claude automatycznie użyje właściwego serwera gdy wykryje że potrzebuje danych z danego systemu.



Skąd wziąć tokeny? GitHub: github.com → Settings → Developer Settings → Personal Access Tokens. Slack: api.slack.com → Create an App → Bot Token. Tokeny to coś jak hasła — nigdy nie wklejaj ich bezpośrednio do kodu, tylko do zmiennych środowiskowych.



Popularne gotowe MCP serwery — co potrafią


Anthropic i społeczność stworzyły dziesiątki gotowych serwerów MCP. Nie musisz nic kodować — wystarczy skonfigurować:


GitHub MCP


Daje Claude dostęp do:



  • Listowania i czytania plików z repozytoriów

  • Przeglądania issues i pull requests

  • Tworzenia issues i komentarzy

  • Wyszukiwania kodu


Przykład: "Znajdź wszystkie otwarte PR gdzie jestem wymieniony jako reviewer i opisz co każdy zmienia"


Dlaczego to ważne dla programisty: Zamiast ręcznie przeglądać 20 otwartych PR, dostajesz podsumowanie w 10 sekund. Claude przeczyta kod, zrozumie kontekst i wyjaśni co każda zmiana robi — bez otwierania przeglądarki.


PostgreSQL / SQLite MCP


Claude może:



  • Wykonywać zapytania SELECT (read-only dla bezpieczeństwa — Claude nie może przypadkowo usunąć danych)

  • Przeglądać schemat bazy danych (jakie tabele, jakie kolumny)

  • Analizować dane i generować raporty


Przykład: "Pokaż mi 10 produktów z najwyższym wzrostem sprzedaży w tym miesiącu" — Claude sam napisze SQL, wykona i zwróci wyniki.



💡 Co to znaczy? "Read-only" to tryb tylko do odczytu — Claude może patrzeć na dane, ale nie może ich modyfikować. Jak przeglądanie dokumentu bez możliwości edycji. To bezpieczna konfiguracja dla danych produkcyjnych — nawet jeśli Claude popełni błąd w zapytaniu, niczego nie usunie ani nie nadpisze.

Filesystem MCP


Bezpieczny dostęp do plików — możesz ograniczyć do konkretnych katalogów. Claude może czytać, tworzyć i modyfikować pliki w wyznaczonym obszarze.


Analogia: To jak klucz do konkretnego pokoju, nie do całego budynku. Ustawiasz, że Claude ma dostęp tylko do folderu /home/user/projects, ale nie do /etc ani do plików systemowych.


Playwright MCP


Daje Claude dostęp do przeglądarki — może nawigować po stronach, klikać elementy, wypełniać formularze, robić screenshoty. Używany m.in. do automatyzacji i scrapingu.


Przykład użycia: "Sprawdź czy wszystkie linki na stronie działają i zwróć listę tych z błędem 404". Claude otworzy przeglądarkę, przejdzie przez każdy link i sporządzi raport — automatycznie.



Krok 4 — Zbuduj własny serwer MCP w TypeScript


Gdy gotowe serwery nie wystarczają, możesz zbudować własny. Poniższy przykład to serwer MCP dla firmowego systemu ERP (faktury, zamówienia). Serwer udostępnia Claude dwa narzędzia: sprawdzenie statusu faktury i listę przeterminowanych płatności.



💡 Co to znaczy? SDK (Software Development Kit) to zestaw gotowych narzędzi i bibliotek który ułatwia programowanie dla konkretnej platformy. Zamiast pisać protokół od zera, używasz gotowych klas. Tu: SDK dla MCP dostarcza gotowe klasy Server i StdioServerTransport — Ty skupiasz się tylko na logice biznesowej.

// Importujemy gotowe klasy z SDK MCP — nie piszemy protokołu od zera
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
// StdioServerTransport = komunikacja przez standardowe wejście/wyjście terminala
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema, // Schemat żądania wywołania narzędzia
ListToolsRequestSchema, // Schemat żądania listy dostępnych narzędzi
} from "@modelcontextprotocol/sdk/types.js";

// Tworzymy instancję serwera — podajemy jego nazwę i wersję
const server = new Server(
{ name: "my-company-erp", version: "1.0.0" },
{ capabilities: { tools: {} } } // Mówimy: ten serwer oferuje "narzędzia" (tools)
);

// Gdy Claude zapyta "jakie masz narzędzia?", zwracamy listę
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: "get_invoice_status", // Nazwa narzędzia (bez spacji!)
description: "Pobiera status faktury po numerze", // Claude czyta to i wie kiedy użyć narzędzia
inputSchema: {
// Definiujemy jakie parametry przyjmuje narzędzie (jak dokumentacja funkcji)
type: "object",
properties: {
invoice_number: {
type: "string",
description: "Numer faktury np. FV/2026/001" // Claude przekaże właściwy format
}
},
required: ["invoice_number"] // To pole jest obowiązkowe
}
},
{
name: "list_overdue_invoices",
description: "Lista przeterminowanych faktur",
inputSchema: {
type: "object",
properties: {
days_overdue: { type: "number", description: "Min. dni po terminie" }
}
// days_overdue nie jest w "required" — pole opcjonalne
}
}
]
}));

// Gdy Claude woła narzędzie, tutaj je obsługujemy
server.setRequestHandler(CallToolRequestSchema, async (request) => {
switch (request.params.name) {
case "get_invoice_status": {
// Wyciągamy parametry które Claude przekazał
const { invoice_number } = request.params.arguments;
// Wywołanie Twojego API/bazy danych — tu wstawiasz własną logikę
const status = await fetchInvoiceFromERP(invoice_number);
// Zwracamy wynik — Claude dostaje go jako tekst i może dalej pracować
return {
content: [{ type: "text", text: JSON.stringify(status) }]
};
}
default:
throw new Error(`Unknown tool: ${request.params.name}`);
}
});

// Uruchamiamy serwer — czeka na połączenia przez stdin/stdout
const transport = new StdioServerTransport();
await server.connect(transport);


Po uruchomieniu serwer nasłuchuje na standardowym wejściu terminala. Claude Code uruchamia go automatycznie gdy potrzebuje danych z ERP — Ty tylko konfigurujesz ścieżkę do skryptu w settings.json.



Bezpieczeństwo MCP — co kontrolować



  • Read-only by default — serwery baz danych powinny mieć uprawnienia tylko do SELECT. Utwórz osobnego użytkownika bazy z ograniczonymi prawami — jeśli Claude zostanie skompromitowany, nie będzie mógł usunąć danych

  • Approval flow — Claude Code może pytać użytkownika o potwierdzenie przed wrażliwymi operacjami (wysłanie emaila, zapis do bazy)

  • Scope ograniczony — filesystem MCP tylko do wskazanych katalogów, nie do / (katalogu głównego systemu)

  • Audit log — loguj każde wywołanie narzędzia MCP do pliku lub systemu monitoringu. Będziesz wiedział kto co robił i kiedy

  • Secrets w env — nigdy nie hardkoduj tokenów w CLAUDE.md ani w kodzie — używaj zmiennych środowiskowych (sekcja "env" w konfiguracji)



💡 Co to znaczy? "Hardkodowanie" to wpisanie wartości bezpośrednio w kod, np. token = "ghp_abc123". Problem: jeśli wrzucisz taki kod na GitHub, token jest widoczny dla wszystkich. Zamiast tego używaj zmiennych środowiskowych — tokeny są przechowywane poza kodem, w systemie operacyjnym lub pliku .env.


Częste błędy przy konfiguracji MCP



  • Błąd 1: Token z za szerokimi uprawnieniami
    Tworzysz jeden token GitHub z uprawnieniami do wszystkiego. Lepiej: stwórz token tylko z uprawnieniami read (read:repo, read:issues) — jeśli token wycieknie, atakujący nie może nic zapisać.

  • Błąd 2: Serwer MCP z dostępem do całego systemu plików
    Ustawienie / zamiast konkretnego katalogu daje Claude dostęp do WSZYSTKICH plików na dysku — w tym kluczy SSH, pliku hosts, konfiguracji systemu. Zawsze podawaj konkretny katalog projektu.

  • Błąd 3: Brak obsługi błędów w własnym serwerze MCP
    Jeśli serwer MCP crashuje bez odpowiedniego komunikatu, Claude dostaje tajemniczy błąd i nie wie co poszło nie tak. Zawsze owijaj wywołania zewnętrznych systemów w try/catch i zwracaj czytelny komunikat błędu.



Przykład workflow z wieloma MCP naraz


Wpisujesz do Claude Code: "Sprawdź otwarte issue #234 na GitHubie, znajdź powiązane pliki w kodzie i napisz fix z testem"



  1. Claude wywołuje GitHub MCP → pobiera treść issue #234 (wie czego szukać)

  2. Claude czyta powiązane pliki przez filesystem MCP (rozumie istniejący kod)

  3. Claude pisze fix bezpośrednio w plikach (modyfikuje kod)

  4. Claude uruchamia testy przez terminal (sprawdza czy fix działa)

  5. Claude tworzy PR przez GitHub MCP (publikuje zmiany)


Całość bez opuszczania terminalu, bez kopiowania kodu do chatbota, bez manualnego "popraw tu i tam".



Gdy masz skonfigurowane serwery MCP, Claude przestaje być chatbotem który odpowiada na pytania — staje się agentem który faktycznie wykonuje pracę w Twoich systemach. Zamiast "opisz mi jak to zrobić", możesz powiedzieć "zrób to". To fundamentalna zmiana w tym jak pracujesz z AI.


Szkolenie JSystems


Newsletter bloga JSystems


Otrzymuj każdą nową lekcję prosto na swoją skrzynkę


Nowe lekcje pojawiają się co poniedziałek i czwartek. Zapisz się do newslettera bloga JSystems — dostaniesz powiadomienie zaraz po publikacji każdej lekcji.






Szkolenie MCP — jedyne w Polsce


2 dni warsztatów: konfiguracja gotowych serwerów MCP + budowanie własnego serwera MCP dla firmowego systemu. Prowadzi Sebastian Koziatek.


Szkolenie MCP →
Szkolenie Claude Code →



Następna lekcja kursu Claude Code

Lekcja 6: 20 serwerów MCP które warto znać

Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu! Zapisz się do newslettera

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...