RAG vs MCP na przykładzie jednej aplikacji
RAG czy MCP? Na przykładzie aplikacji z quizami pokazuję, kiedy model potrzebuje wiedzy z Twojego PDF-a, a kiedy narzędzia, które coś zrobi w aplikacji.

Mateusz Karwowski
Programista i nauczyciel · MattDevSpis treści
W aplikacji, którą budujemy w kursie DevChallenge, quiz można utworzyć na dwa sposoby. W pierwszym wgrywasz swoje notatki w PDF i prosisz o pytania z ich treści. W drugim piszesz do Claude Code w terminalu: „zrób mi quiz o pułapkach async/await i daj link”. W obu przypadkach dostajesz quiz, ale pod spodem działają dwa różne mechanizmy. Pierwszy to RAG, drugi to MCP. Na tym jednym projekcie pokażę Ci, czym się różnią i kiedy który z nich wybrać.
Krótka odpowiedź
RAG (Retrieval-Augmented Generation) dokłada modelowi wiedzę. Aplikacja wyszukuje fragmenty Twojego dokumentu i dodaje je do promptu. MCP (Model Context Protocol) daje modelowi narzędzia. Agent AI może wywołać funkcję Twojej aplikacji, na przykład utworzenie quizu. RAG odpowiada więc na pytanie „co model ma wiedzieć”, a MCP na pytanie „co model może zrobić”. Te podejścia się nie wykluczają i w jednej aplikacji często działają obok siebie.
RAG: model dostaje fragmenty Twojego PDF-a
Zacznijmy od quizu z notatek. Model językowy nie zna Twojego PDF-a, a cały dokument rzadko mieści się w prompcie i zużywa dużo tokenów. Dlatego aplikacja dzieli pracę na dwa etapy.
Najpierw przygotowuje dokument:
- serwer odczytuje tekst z przesłanego PDF-a,
- dzieli go na fragmenty po akapitach, najwyżej po 1500 znaków,
- zamienia każdy fragment na wektor (embedding) modelem
text-embedding-3-small, czyli na listę 1536 liczb, - zapisuje dokument, fragmenty i wektory w PostgreSQL z rozszerzeniem pgvector, w jednej transakcji.
Potem przy każdym generowaniu quizu zamienia jego temat na wektor i szuka fragmentów, których wektory leżą najbliżej. W kursie robi to jedna funkcja SQL:
select chunk.content
from public.document_chunks chunk
join public.documents document
on document.id = chunk.document_id
where chunk.document_id = target_document_id
and document.expires_at > now()
order by chunk.embedding operator(extensions.<=>) query_embedding
limit least(greatest(match_count, 0), 4);
Operator <=> liczy odległość kosinusową, więc zapytanie zwraca najwyżej cztery fragmenty najbardziej podobne do tematu. Te fragmenty trafiają do promptu jako materiał źródłowy, a model układa pytania na ich podstawie. Zwróć też uwagę na warunek expires_at. Dokument ma termin ważności, a jego fragmenty odczyta tylko ta sesja, która ma token dostępu do tego PDF-a.
RAG przydaje się wtedy, gdy odpowiedź zależy od treści, której model nie zna albo nie powinien zgadywać. Tak jest z Twoimi notatkami, regulaminem firmy czy dokumentacją projektu.
MCP: agent dostaje narzędzie Twojej aplikacji
Teraz drugi sposób. Claude Code, Codex albo Copilot w VS Code nie wiedzą, że Twoja aplikacja w ogóle istnieje. MCP to otwarty protokół, przez który taki agent uruchamia serwer z listą narzędzi i wywołuje je, kiedy uzna, że są potrzebne.
W kursie serwer MCP udostępnia narzędzie create-challenge. Przyjmuje ono cztery argumenty: temat (do 200 znaków), poziom, liczbę pytań od 3 do 10 i typ pytań. Kiedy agent je wywoła, serwer:
- wysyła temat do publicznego API aplikacji, które generuje szkic quizu,
- sprawdza odpowiedź schematem Zod,
- publikuje quiz pod własnym adresem,
- zwraca agentowi link do gry.
Serwer MCP nie zna kluczy OpenAI ani danych dostępu do bazy danych. Zna tylko adres API, więc podlega tym samym limitom i tej samej walidacji co przeglądarka. Generowanie ma limit 5 quizów na godzinę z jednego adresu IP.
MCP przydaje się wtedy, gdy model ma coś zrobić w Twoim systemie, na przykład utworzyć rekord, odczytać ranking albo uruchomić proces. Opis narzędzia i jego schemat podpowiadają agentowi, kiedy i z jakimi danymi może je wywołać.
Porównanie RAG i MCP w jednej tabeli
| Cecha | RAG | MCP |
|---|---|---|
| Co dostaje model | fragmenty dokumentu w prompcie | listę narzędzi z opisem i schematem argumentów |
| Kto decyduje | Twój kod: kiedy szukać i ile fragmentów dodać | agent proponuje wywołanie, a Ty je zatwierdzasz |
| Gdzie działa | wewnątrz Twojego backendu | między agentem AI a Twoim API |
| Główne ryzyko | instrukcje ukryte w dokumencie i nieprawdziwe informacje w źródle | płatne wywołanie o trwałych skutkach |
| Jak to sprawdzać | evals, czyli ocena, czy pytania są wierne źródłu | testy narzędzia i potwierdzenie przed płatnym wywołaniem |
Czym MCP różni się od zwykłego API
Serwer MCP z tego kursu nie zastępuje API aplikacji, tylko z niego korzysta. API powstaje dla programów, które z góry wiedzą, jaki adres wywołać i jakie pola wysłać. Agent AI tego nie wie, dlatego MCP opisuje mu każde narzędzie zwykłym językiem i podaje schemat argumentów. Agent pobiera tę listę na starcie i sam wybiera narzędzie pasujące do Twojej prośby, a host pyta Cię o zgodę, zanim je wywoła.
W praktyce MCP to cienka warstwa nad Twoim API. Jeśli aplikację wywołuje tylko Twój frontend albo inny serwer, wystarczy samo API. Jeśli ma z niej korzystać agent w Claude Code, Codex albo Copilot, dokładasz serwer MCP, który zamienia jego prośby na wywołania tego API.
Gdzie RAG i MCP się spotykają
Łatwo założyć, że agent z MCP „zrobi quiz z mojego kodu” albo „z mojego PDF-a”. Powiem wprost: w tej aplikacji tak nie jest. Narzędzie create-challenge wysyła do API pusty documentId, więc nie korzysta z RAG. Agent może przeczytać Twój kod, streścić go do tematu w 200 znakach i poprosić o quiz. Pytania powstają jednak z tego tematu i wiedzy modelu, a nie z plików projektu.
Jeśli chcesz pytań z treści PDF-a, wgrywasz go w aplikacji i tam generujesz quiz. Można zbudować narzędzie MCP, które też korzysta z dokumentu. Wtedy jednak agent musiałby dostać token dostępu do PDF-a i Twoją zgodę na jego analizę przez AI. To osobna decyzja o bezpieczeństwie, a nie jedna linijka kodu.
Na co uważać przy RAG i przy MCP
Przy RAG największym ryzykiem jest sam dokument. PDF może zawierać zdanie udające polecenie dla modelu, na przykład „zignoruj poprzednie instrukcje”. Dlatego w kursie fragmenty trafiają do promptu w osobnej sekcji opisanej jako niezaufane dane, a instrukcja systemowa każe ignorować polecenia z materiału źródłowego. Taka obrona zmniejsza ryzyko, ale go nie usuwa, więc sprawdzamy ją testami na PDF-ach z ukrytym poleceniem.
Drugi problem jest mniej oczywisty. PDF może zawierać nieprawdziwą informację, a quiz będzie wtedy wierny źródłu, ale błędny. Model oceniający, który porównuje pytania z dokumentem, tego nie wyłapie, bo z jego punktu widzenia wszystko się zgadza.
Przy MCP ryzykiem jest działanie. Wywołanie create-challenge uruchamia płatne generowanie quizu przez AI i publikuje go pod publicznym linkiem. Narzędzie ma więc w opisie ostrzeżenie o koszcie, a w adnotacjach readOnlyHint: false. Agent powinien pokazać Ci argumenty i poczekać na zgodę. Nie wyłączaj potwierdzeń globalnie tylko dlatego, że lokalnie wszystko działa.
Od czego zacząć
Jeśli Twój problem brzmi „model nie zna moich danych”, zacznij od RAG. Jeśli brzmi „chcę, żeby agent coś zrobił w mojej aplikacji”, zacznij od MCP. Prosty RAG działa wewnątrz backendu, który już kontrolujesz, więc zwykle wdrożysz go najpierw. MCP dokładasz wtedy, gdy aplikacja ma być narzędziem dla agentów.
Jak napisać taki serwer i podłączyć go do trzech agentów, pokazuję we wpisie Serwer MCP w TypeScript dla Claude Code, Codex i Copilot. Jeśli wolisz zacząć bez kodu, w tekście o automatyzacji pracy porównuję skrypty, n8n i agentów.
W DevChallenge przechodzimy tę drogę dwa razy. W Kursie 3 korzystasz z RAG w Pinecone, z klienta i z serwera MCP w n8n, bez programowania. W Kursie 4 budujesz oba mechanizmy samodzielnie w TypeScript, razem z testami i automatyczną oceną jakości quizów. Wszystkie lekcje znajdziesz w programie kursu.

Jestem programistą i nauczycielem, magistrem inżynierem informatyki po Politechnice Warszawskiej. Uczę programowania i matematyki na zajęciach 1:1. Wspólnie rozwiązujemy zadania, piszemy kod i wyjaśniamy kolejne kroki.
Czytaj dalej
Serwer MCP w TypeScript dla Claude Code, Codex i Copilot
Serwer MCP w TypeScript: narzędzie z Zod, test w MCP Inspector i ten sam serwer w Claude Code, Codex i Copilot w VS Code.
Czytaj artykuł AI w praktyceAutomatyzacja z AI w 6 poziomach: od skryptu po agenta
Jak zautomatyzować pracę z AI? Porównaj skrypt, RPA, n8n, czat z AI i agentów na raporcie z arkusza, który co tydzień wysyłasz mailem przełożonemu.
Czytaj artykułZbuduj RAG i serwer MCP w jednej aplikacji
W Kursie 4 DevChallenge dodamy do aplikacji quizy z Twoich PDF-ów i własny serwer MCP, przez który Claude Code, Codex albo Copilot tworzą quiz na podany temat. Pokażę Ci też testy, automatyczną ocenę pytań (evals) i koszt jednego quizu.