Claude + serwery MCP — jak podłączyć agenta do swoich systemów
Seria Claude Code · JSystemsWyobraź 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:
- Claude decyduje, że potrzebuje narzędzia GitHub
- Claude wysyła żądanie do serwera MCP GitHub w ustandaryzowanym formacie JSON
- Serwer MCP tłumaczy to żądanie na API GitHuba i pobiera dane
- 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"
- Claude wywołuje GitHub MCP → pobiera treść issue #234 (wie czego szukać)
- Claude czyta powiązane pliki przez filesystem MCP (rozumie istniejący kod)
- Claude pisze fix bezpośrednio w plikach (modyfikuje kod)
- Claude uruchamia testy przez terminal (sprawdza czy fix działa)
- 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.

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 →
Komentarze (0)
Brak komentarzy...