Jak utworzyć serwer MCP za pomocą interfejsu wiersza poleceń Gemini i Go

1. Wprowadzenie

Z tego ćwiczenia dowiesz się, jak utworzyć i wdrożyć serwer protokołu kontekstu modelu (MCP), aby rozszerzyć możliwości interfejsu Gemini CLI. Utworzysz godoctor, czyli serwer oparty na Go, który udostępnia niestandardowe narzędzia do programowania w Go, przekształcając interfejs wiersza poleceń Gemini z ogólnego asystenta programistycznego w specjalistycznego eksperta w zakresie programowania w Go.

W tym laboratorium używamy podejścia „opartego na promptach”. Będziesz pełnić rolę lidera technicznego, przekazując prompty asystentowi AI (interfejsowi wiersza poleceń Gemini). Twoim celem jest nauczenie się, jak przekładać wymagania projektu na skuteczne prompty i jak pozwolić AI zajmować się szczegółami wdrożenia.

Podstawą tego projektu jest protokół kontekstu modelu (MCP). MCP to protokół open source, który standaryzuje sposób, w jaki duże modele językowe (LLM), takie jak Gemini, komunikują się z narzędziami i usługami zewnętrznymi. Działa on jako pomost, który umożliwia AI dostęp do informacji ze świata rzeczywistego i wykonywanie działań wykraczających poza jej wbudowaną wiedzę. Tworząc serwer MCP, tworzysz niestandardową wtyczkę, którą interfejs wiersza poleceń Gemini może wykrywać i używać, co skutecznie uczy go nowych umiejętności.

Czego się nauczysz

  • Instalowanie i konfigurowanie interfejsu wiersza poleceń Gemini
  • Jak formułować skuteczne prompty, aby kierować asystentem AI w procesie tworzenia oprogramowania
  • Jak przekazywać asystentowi AI kontekst i wskazówki
  • Jak utworzyć i skonfigurować serwer MCP, aby zwiększyć możliwości interfejsu wiersza poleceń Gemini
  • Konteneryzacja i wdrażanie aplikacji w Go w Google Cloud Run

Czego potrzebujesz

Te warsztaty można w całości przeprowadzić w Google Cloud Shell, które ma zainstalowane wszystkie niezbędne zależności (gcloud CLI, Go, Docker, Gemini CLI).

Możesz też pracować na własnym komputerze. W tym celu potrzebujesz:

  • Node.js w wersji 20 lub nowszej
  • Zainstalowany i zainicjowany pakiet SDK Google Cloud (interfejs wiersza poleceń gcloud)
  • Go w wersji 1.24 lub nowszej zainstalowany w systemie
  • Docker zainstalowany w systemie

Kluczowe technologie

Więcej informacji o technologiach, z których będziemy korzystać, znajdziesz tutaj:

Wskazówki dotyczące skutecznego ćwiczenia w Codelab

Praca z asystentem AI to nowy sposób tworzenia oprogramowania. Oto kilka wskazówek, które pomogą Ci sprawnie i skutecznie korzystać z tej funkcji:

  1. Nie bój się nacisnąć klawisza ESC. AI może czasami proponować działania lub kod, z którymi się nie zgadzasz. Naciśnij klawisz ESC, aby anulować proponowane działanie i wpisać nowy prompt, który naprowadzi model na właściwe rozwiązanie. Ty jesteś pilotem.
  2. Zachęcaj do korzystania z narzędzi. Jeśli AI wydaje się zagubiona lub zmyśla informacje, zachęć ją do korzystania z dostępnych narzędzi. Skuteczne mogą być takie prompty jak „Czy możesz to sprawdzić w wyszukiwarce Google?” lub „Użyj narzędzia read_file, aby zrozumieć bieżący kod przed wprowadzeniem zmian”.
  3. Nie zezwalaj na ręczne zmiany. Spróbuj zlecić AI wykonanie wszystkich zadań. To podstawowa umiejętność, którą ćwiczysz. Jeśli jednak musisz wprowadzić zmianę ręcznie, poinformuj o tym AI. Prompt, np. „I have manually updated the README.md file. „Przeczytaj jeszcze raz, aby odświeżyć wiedzę” zapewni synchronizację AI z Twoim projektem.
  4. Czy próbowałeś/próbowałaś wyłączyć i włączyć urządzenie ponownie? W rzadkich przypadkach, gdy AI próbuje wymusić określoną ścieżkę wbrew Twojemu poleceniu, może to być spowodowane pogorszeniem kontekstu (czasami nazywanym też „rozkładem kontekstu”). W takim przypadku możesz użyć polecenia interfejsu wiersza poleceń Gemini „/compress”, aby zmniejszyć szum kontekstowy, lub w ekstremalnych przypadkach użyć polecenia „/clear”, aby wyczyścić całą historię sesji.

2. Konfiguracja środowiska

Wybierz jedną z tych opcji: Self-paced environment setup (Konfiguracja środowiska we własnym tempie), jeśli chcesz uruchomić to

samouczek na własnym komputerze lub uruchomić Cloud Shell, jeśli chcesz przeprowadzić ten samouczek w całości w chmurze.

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym module praktycznym będziesz używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

Aktywowanie Cloud Shell

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po zakończeniu powinno wyświetlić się coś takiego:

Zrzut ekranu terminala Google Cloud Shell pokazujący, że środowisko zostało połączone

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Wszystkie zadania w tym laboratorium możesz wykonać w przeglądarce. Nie musisz niczego instalować.

3. Pierwsze kroki z interfejsem wiersza poleceń Gemini

W tej sekcji dowiesz się więcej o interfejsie wiersza poleceń Gemini, w tym jak go zainstalować i skonfigurować w swoim środowisku.

Czym jest interfejs wiersza poleceń Gemini?

Interfejs wiersza poleceń Gemini to oparty na AI interfejs wiersza poleceń, który może Ci pomóc w wykonywaniu różnorodnych zadań programistycznych. Może zrozumieć kontekst projektu, odpowiadać na pytania, generować kod i korzystać z narzędzi zewnętrznych, aby rozszerzać swoje możliwości.

Instalacja

Zainstaluj interfejs wiersza poleceń Gemini globalnie za pomocą npm.

npm install -g @google/gemini-cli

Aby sprawdzić, czy interfejs wiersza poleceń jest zainstalowany, uruchom to polecenie:

gemini --version

Konfiguracja

Działanie interfejsu wiersza poleceń Gemini jest kontrolowane przez pliki konfiguracyjne i zmienne środowiskowe. Istnieją 2 główne pliki:

  • GEMINI.md: ten plik zawiera wytyczne i kontekst dla AI. Interfejs wiersza poleceń odczytuje ten plik, aby poznać standardy i konwencje kodowania projektu.
  • .gemini/settings.json: ten plik kontroluje konfigurację interfejsu wiersza poleceń, w tym sposób łączenia się z narzędziami zewnętrznymi. Użyjemy tego pliku później, aby skonfigurować interfejs wiersza poleceń do korzystania z serwera MCP, który tworzymy w tym module.

Najpierw skonfigurujemy środowisko, a potem utworzymy plik GEMINI.md. Plik settings.json zostanie skonfigurowany w późniejszym kroku.

  1. Utwórz i zainicjuj katalog projektu:
mkdir godoctor && cd godoctor
go mod init godoctor
  1. Uwierzytelnij się za pomocą domyślnego uwierzytelniania aplikacji Google Cloud:

Musisz zalogować się na konto, które ma dostęp do projektu GCP, którego będziesz używać w tym samouczku:

gcloud auth application-default login

4. Plik kontekstu (GEMINI.md)

Pliki kontekstowe, które używają domyślnej nazwy GEMINI.md, służą do przekazywania modelu Gemini kontekstu instruktażowego. Możesz używać tych plików, aby podawać instrukcje dotyczące projektu, określać personę lub udostępniać przewodniki po stylu kodowania, dzięki czemu odpowiedzi AI będą dokładniejsze i dopasowane do Twoich potrzeb.

Aby mieć pewność, że asystent AI generuje wysokiej jakości, idiomatyczny kod Go, napiszemy plik GEMINI.md z kilkoma typowymi sprawdzonymi metodami dla deweloperów Go.

Cel: utworzenie pliku GEMINI.md, który będzie zawierać zestaw reguł dla asystenta AI w tym projekcie.

Otwórz IDE, aby utworzyć plik GEMINI.md z treścią poniżej. Jeśli używasz Cloud Shell, możesz otworzyć edytor za pomocą tego polecenia:

cloudshell edit .

Zadanie: w katalogu głównym katalogu godoctor utwórz plik o nazwie GEMINI.md i wklej do niego tę treść.

# Go Development Guidelines
All code contributed to this project must adhere to the following principles.

## 1. Formatting
All Go code **must** be formatted with `gofmt` before being submitted.

## 2. Naming Conventions
- **Packages:** Use short, concise, all-lowercase names.
- **Variables, Functions, and Methods:** Use `camelCase` for unexported identifiers and `PascalCase` for exported identifiers.
- **Interfaces:** Name interfaces for what they do (e.g., `io.Reader`), not with a prefix like `I`.

## 3. Error Handling
- Errors are values. Do not discard them.
- Handle errors explicitly using the `if err != nil` pattern.
- Provide context to errors using `fmt.Errorf("context: %w", err)`.

## 4. Simplicity and Clarity
- "Clear is better than clever." Write code that is easy to understand.
- Avoid unnecessary complexity and abstractions.
- Prefer returning concrete types, not interfaces.

## 5. Documentation
- All exported identifiers (`PascalCase`) **must** have a doc comment.
- Comments should explain the *why*, not the *what*.

## 6. Project structure
- cmd/ contains source code for target binaries (e.g. server, client)
- internal/ contains source code for packages not meant to be exported (e.g. internal/tools/hello)
- bin/ contains the compiled binaries
- At the root place README.md, go.mod and go.sum

Środowisko programistyczne jest już w pełni skonfigurowane.

5. Pierwsza kompilacja: serwer dokumentacji

Twoim pierwszym celem jest utworzenie początkowej wersji godoctor serwera. Ta wersja powinna być minimalną aplikacją zawierającą jedno narzędzie o nazwie read_docs, które umożliwia wyszukiwanie dokumentacji Go.

Cel: utworzenie serwera MCP gotowego do wykorzystania w środowisku produkcyjnym, który udostępnia polecenie go doc, umożliwiając LLM wysyłanie zapytań do dokumentacji Go.

Uruchom polecenie interfejsu wiersza poleceń Gemini w powłoce:

gemini

Gdy uruchomisz interfejs CLI po raz pierwszy, pojawi się prośba o wybranie trybu uwierzytelniania i motywu.

Jeśli wykonujesz to ćwiczenie w Cloud Shell, wybierz opcję Use Cloud Shell user credentials (Użyj danych logowania użytkownika Cloud Shell). Jeśli nie, możesz użyć logowania przez Google, aby zalogować się na osobiste konto Google i korzystać z obszernych bezpłatnych zasobów interfejsu wiersza poleceń Gemini. Ekran wyboru uwierzytelniania będzie wyglądać podobnie do tego:

ea1ed66807150f3f.png

Jeśli chcesz zmienić wybór, wpisz /auth i naciśnij Enter, aby ponownie otworzyć to menu.

Następnie pojawi się prośba o wybranie motywu:

6289bdfb3b519fa7.png

Podobnie jak w przypadku /auth, możesz później zmienić motyw za pomocą polecenia /theme.

Po wybraniu metody uwierzytelniania i preferowanego motywu przejdziesz do wiersza poleceń. Możesz tu wpisywać polecenia, na przykład:

Write a hello world application in Go

Interfejs wiersza poleceń wykorzystuje do wykonywania zadań własne wnioskowanie (za pomocą modelu Gemini, np. Gemini Flash lub Gemini Pro) i narzędzia. Korzysta z narzędzi, gdy musi wchodzić w interakcję z systemem plików lub usługami zewnętrznymi, takimi jak interfejsy API, bazy danych itp. Przykładami narzędzi dostępnych od razu, czyli „narzędzi wewnętrznych”, są read_file, write_file, web_fetchgoogle_search. Tworzony przez nas serwer MCP stanie się też narzędziem dostępnym w interfejsie CLI.

Gdy narzędzie zostanie uruchomione po raz pierwszy, pojawi się prośba o zgodę. Możesz przyznać uprawnienia jednorazowo (Zezwól raz), zatwierdzić je na czas trwania sesji (Zezwól zawsze) lub odrzucić prośbę. Jeśli jest to operacja edycji pliku, znajdziesz też opcję edycji pliku za pomocą edytora zewnętrznego, na wypadek gdybyś chciał wprowadzić jakieś zmiany. Oto na przykład wynik powyższego prompta, który służy do utworzenia programu „Hello World”:

2cfd761183e4b770.png

Oprócz promptów możesz też używać poleceń rozpoczynających się ukośnikiem. Jeśli wpiszesz „/”, interfejs CLI automatycznie wyświetli opcje autouzupełniania. Możesz wpisać całe polecenie lub wybrać je z opcji. Wspomniane wyżej polecenia /auth/theme to tylko niektóre z nich.

26c3f3f7b8bceb3f.png

Gdy zapoznasz się z interfejsem, możesz rozpocząć główne zadanie tej sekcji, czyli poprosić interfejs wiersza poleceń o napisanie serwera MCP.

Tworzenie serwera MCP Hello World

Jednym z najlepszych sposobów na zapewnienie większej spójności działania modelu jest podzielenie złożonych zadań na mniejsze etapy. Model może być w stanie samodzielnie wykonać złożone zadanie, ale bez odpowiedniej konfiguracji odkrycie właściwego sposobu jego realizacji zajmie mu dużo czasu.

Aby uzyskać bardziej spójne podejście, najpierw poprosimy go o utworzenie serwera MCP „Hello World”, a potem o wdrożenie funkcji, której potrzebujemy (odczytywanie dokumentacji Go).

Przykładowy prompt:

Create a Model Context Protocol (MCP) server that exposes a "hello_world" tool. This tool, when called, should return the message "Hello, MCP world!"

For the MCP implementation, you should use the official Go SDK for MCP (github.com/modelcontextprotocol/go-sdk/mcp) and use the stdio transport.

TODO:
- Download the dependency: `go get github.com/modelcontextprotocol/go-sdk/mcp`
- Inspect the documentation of the SDK: `go doc github.com/modelcontextprotocol/go-sdk/mcp`
- Build a `server` command that supports stdio transport only
- Build a `client` command that connects to the server over command transport to test the server

Acceptance Criteria:
- `./bin/client --list-tools` returns the list of server tools including "hello_world"
- `./bin/client --call-tool` "hello_world" returns the output "Hello, MCP world!"

Zwróć uwagę, że powyższy prompt składa się z 3 głównych segmentów:

  1. Specyfikacja problemu, w tym to, co chcemy zbudować, i ograniczenia (np.użycie oficjalnego pakietu SDK zamiast dowolnego pakietu SDK, transport stdio zamiast HTTP).
  2. Podział zadań do wykonania (TODO)
  3. Kryteria akceptacji zadania, które działają jak procedura testowa, dzięki czemu agent wie, kiedy zadanie jest wykonane.

Te 3 komponenty pomogą modelowi w bardziej spójny sposób osiągać pożądane rezultaty.

Implementacja narzędzia read_docs

Gdy będziesz mieć działającą implementację, możemy przejść do wdrożenia prawdziwego narzędzia „read_docs”:

Add a new tool to our MCP server called "read_docs" that invokes the "go doc" shell command. The tool will take a mandatory "package" argument and an optional "symbol" argument.

TODO:
- create a package `./internal/tools/docs`
- register the tool with the MCP server
- update the client to support the "read_docs" tool by providing arguments to the tool call

Acceptance Criteria:
- `./bin/client --tools-list` show both hello_world and read_docs
- `./bin/client --tool-call read_docs fmt` returns the documentation for the `fmt` package
- `./bin/client --tool-call read_docs fmt.Println` returns the documentation for the `fmt.Println` function
- `./bin/client --tool-call read_docs github.com/modelcontextprotocol/go-sdk/mcp` returns documentation for the `mcp` package

Uwaga: możesz eksperymentować z tym promptem lub spróbować wymyślić własny.

Przydatne wskazówki

Biorąc pod uwagę, że MCP to wciąż nowa koncepcja, a pakiet Go SDK do MCP jest nową biblioteką, na tym etapie Gemini może potrzebować dużo czasu, aby samodzielnie znaleźć właściwą implementację. Aby pomóc modelowi w znalezieniu właściwego rozwiązania, możesz wykonać te czynności:

  1. Jeśli model pominął odczytanie dokumentacji na którymkolwiek etapie, naciśnij ESC i przypomnij mu o tym. Jeśli nie znasz języka Go, uruchomienie polecenia „go doc” wraz z nazwą pakietu „go doc github.com/modelcontextprotocol/go-sdk/mcp” spowoduje wyświetlenie odpowiedniej dokumentacji.
  2. Moduł najwyższego poziomu „github.com/modelcontextprotocol/go-sdknie ma dokumentacji (ponieważ nie zawiera kodu Go). Musisz poinformować model, aby szukał pełnej ścieżki.
  3. Z drugiej strony, jeśli model wygeneruje pakiet, który nie istnieje, np. „go doc github.com/modelcontextprotocol/go-sdk/mcp/server” – wystarczy, że skierujesz go na pakiet najwyższego poziomu.

6. Konfigurowanie godoctor jako serwera MCP dla interfejsu Gemini CLI

Gdy asystent AI wygeneruje kod zarówno dla klienta, jak i serwera, możesz poprosić go o przeprowadzenie kilku testów ręcznych. Na przykład:

retrieve the documentation for the package net/http

Sprawdź też, czy działa z zewnętrzną zależnością (nie w bibliotece standardowej):

retrieve the documentation for the github.com/modelcontextprotocol/go-sdk/mcp package

Gdy będziesz zadowolony z wyników, poproś go o napisanie pliku README.md z instrukcjami dotyczącymi korzystania z tego projektu i jego rozwijania.

Now write a detailed README.md file explaining both from a user and a developer perspective how to use and to build this project.

Teraz skonfigurujemy serwer, aby interfejs Gemini CLI mógł go używać w następnej fazie rozwoju.

  1. Poproś interfejs wiersza poleceń o zaktualizowanie pliku GEMINI.md, aby używać znaku read_docs jako preferowanej metody odczytywania dokumentacji:
update the GEMINI.md file to include instructions to always use the read_docs tool to retrieve documentation about Go packages or symbols. This should be done whenever seeing an import for the first time in a session or after a new dependency is installed to the project (e.g. via `go get`)
  1. Teraz musimy ponownie uruchomić interfejs wiersza poleceń Gemini, aby skonfigurować serwer MCP. Najpierw zapiszmy sesję czatu, aby po ponownym uruchomieniu można było kontynuować rozmowę od miejsca, w którym została przerwana.
/chat save godoctor-workshop
  1. Zamknij interfejs CLI, naciskając dwukrotnie Ctrl+D lub wpisując polecenie /quit.
  2. W poprzednich krokach agent powinien skompilować dla Ciebie binarny plik serwera, ale my skompilujemy go ponownie pod inną nazwą, aby nie miał wpływu na modyfikacje kodu źródłowego:
mkdir -p bin && go build -o ./bin/godoctor ./cmd/server
  1. Skonfiguruj interfejs wiersza poleceń Gemini dla narzędzia lokalnego: utwórz plik .gemini/settings.json w katalogu głównym projektu i dodaj sekcję mcpServers, aby poinformować interfejs wiersza poleceń Gemini, jak uruchomić skompilowany serwer.
mkdir -p .gemini && touch .gemini/settings.json
  1. Teraz dodaj do nowego pliku poniższą treść, korzystając z edytora Cloud Shell lub ulubionego środowiska IDE.
{
  "mcpServers": {
    "godoctor": {
      "command": "./bin/godoctor"
    }
  }
}
  1. Uruchamianie interfejsu wiersza poleceń Gemini za pomocą polecenia gemini
  2. Aby sprawdzić, czy narzędzie zostało wczytane, wpisz polecenie /mcp. Możesz też wyświetlić pełny opis narzędzi, używając tego symbolu: /mcp desc.

13a5a979b9d5408d.png

  1. Przetestuj integrację, prosząc interfejs wiersza poleceń Gemini o użycie narzędzia za pomocą prompta takiego jak „Pokaż mi dokumentację pakietu net/http”.

Powinien pojawić się ekran podobny do tego:

fdaa342e76dc5b52.png

Jeśli narzędzie działa prawidłowo, powinna się wyświetlić dokumentacja pobrana w ramach wywołania narzędzia:

defa9d11314522d4.png

Gratulujemy, udało Ci się utworzyć narzędzie MCP. Ale to nie koniec. Możemy jeszcze zwiększyć przydatność tego serwera.

7. Dodawanie weryfikatora kodu opartego na AI

Dodajmy bardziej zaawansowaną funkcję opartą na AI: narzędzie do sprawdzania kodu, które korzysta z interfejsu Gemini API.

Możesz teraz przywrócić poprzednią sesję czatu za pomocą polecenia /chat resume godoctor-workshop.. Spowoduje to wczytanie kontekstu sesji do momentu, w którym zakończyliśmy tworzenie read_docs, dzięki czemu model będzie miał wiedzę potrzebną do zbudowania nowego narzędzia.

To narzędzie będzie potrzebować dostępu do Vertex AI, więc musimy najpierw włączyć interfejs API. Możesz uruchamiać polecenia powłoki bez opuszczania interfejsu wiersza poleceń Gemini, wpisując wykrzyknik (!) w pustym promcie. Spowoduje to przełączenie interfejsu Gemini CLI w tryb powłoki.

Aby włączyć interfejs Vertex AI API, uruchom to polecenie w trybie powłoki:

gcloud services enable aiplatform.googleapis.com

Gdy polecenie zostanie wykonane, możesz wrócić do trybu prompta, naciskając klawisz Escape (Esc).

Cel: dodaj do istniejącego projektu nowe narzędzie o nazwie code_review. To narzędzie będzie używać interfejsu Gemini API do analizowania kodu w Go i przekazywania opinii.

Przykładowy prompt:

Add a new tool to my project called code_review. This tool should use the Gemini API on Vertex AI (with model id gemini-2.5-pro) to analyze Go code and provide a list of improvements according to the best practices accepted by the Go community.

The tool should take the Go code content and an optional hint as input. The hint will be used to provide additional guidance for the AI reviewer, like "focus on security" or "help me simplify this code".

The tool output should be text in Markdown format.

TODO:
- add the genai SDK dependency with `go get import google.golang.org/genai`
- create the tool code in ./internal/tools/code/review.go
- create a code review prompt to be used by the tool
- use go-genai with Vertex AI authentication to call gemini-2.5-pro
- register the tool with the server
- add a flag to the server to set the Google Cloud Project ID: --project
- add a flag to the server to set the Google Cloud Location: --location
- add support to the review tool in the client CLI

NOT TO DO:
- DO NOT use the package github.com/google/generative-ai-go/genai as it is DEPRECATED
- DO NOT use the package cloud.google.com/go/vertexai/genai as it has been superseded by google.golang.org/genai

Acceptance Criteria:
- `./bin/client --tools-list` show all tools including `code_review`
- `./bin/client --tool-call code_review internal/tools/code/review.go` returns the code review for the "review.go" file

Przydatne wskazówki

  1. Gdy model zacznie pracować nad tym zadaniem, może automatycznie poprosić o wywołanie narzędzia read_docs w celu przeglądania dokumentacji pakietu genai. Jeśli tak się nie stanie, zawsze możesz przerwać proces, naciskając klawisz Esc, i przypomnieć mu, że ma teraz do dyspozycji narzędzie read_docs.
  2. Jeśli zauważysz, że próbuje użyć nieprawidłowego pakietu GenAI SDK (mimo że w prompcie znajduje się wyraźna lista „niedozwolonych” pakietów), skieruj go z powrotem na właściwy pakiet.

Testowanie narzędzia do weryfikacji kodu

  1. Zapisz sesję czatu, naciskając /chat save godoctor-workshop, a następnie zamknij interfejs CLI, naciskając dwukrotnie Ctrl+D.
  2. Ponownie skompiluj serwer z nową definicją narzędzia:
go build -o ./bin/godoctor ./cmd/server
  1. W IDE zaktualizuj plik .gemini/settings.json, aby uwzględnić konfigurację środowiska dla Vertex AI:
{
  "mcpServers": {
    "godoctor": {
      "command": "./bin/godoctor",
      "env": {
        "GOOGLE_CLOUD_USE_VERTEXAI": "true",
        "GOOGLE_CLOUD_PROJECT": "<your-project-id>",
        "GOOGLE_CLOUD_LOCATION": "<your-preferred-region>"
      }
    }
  }
}
  1. Ponownie uruchom interfejs wiersza poleceń Gemini. Przywróć sesję czatu z użytkownikiem /chat resume godoctor-workshop
  2. Sprawdź, czy narzędzie jest włączone, wpisując polecenie /mcp. Powinien pojawić się ekran podobny do tego:

f78b39f95edf358a.png

  1. Teraz przetestujmy narzędzie code_review, sprawdzając jeden z jego plików źródłowych:
Use the code_review tool to review cmd/server/main.go
    You should see something like this:

d946dcc99f5e37b9.png

Gdy narzędzie do sprawdzania kodu działa, możesz zaproponować modelowi zastosowanie niektórych znalezionych przez niego ulepszeń, aby uzyskać pełny przepływ pracy „samodoskonalenia”.

Potwierdzasz, że narzędzie code-review działa. W następnej sekcji dowiesz się, jak wdrożyć go w chmurze. Zapisz bieżącą sesję za pomocą polecenia /chat save godoctor-workshop i zamknij interfejs CLI.

8. Przygotowywanie serwera do pracy w chmurze

Opracowany przez nas serwer MCP działa tylko na komputerze lokalnym, co jest w porządku, jeśli tworzysz narzędzia do własnego użytku. Jednak w środowiskach korporacyjnych często musimy wdrażać narzędzia do szerszego użytku przez setki, a nawet tysiące programistów.

Aby skalować nasz serwer MCP, musimy przekształcić go z serwera, który obsługuje tylko standardowe wejście/wyjście, w serwer, który może komunikować się za pomocą protokołu HTTP, i wdrożyć go w miejscu, w którym będzie dostępny dla różnych deweloperów. W tym celu użyjemy trybu transportu zdefiniowanego w specyfikacji MCP jako HTTP z możliwością przesyłania strumieniowego, a jako miejsce wdrożenia wykorzystamy Cloud Run.

Cel: zmodyfikować serwer godoctor, aby korzystał z przesyłania strumieniowego HTTP.

Przykładowy prompt:

The godoctor server is currently using the stdio transport. I want to prepare it to be deployed to Cloud Run, so we need to add support to use the Streamable HTTP transport.

TODO:
- Update server to enable Streamable HTTP via the -http flag.
- An optional -listen flag can be specified to set the port to listen
- If no -http flag is specified, the server defaults to stdio transport and -listen is ignored
- Update client to use Streamable HTTP via the -addr flag
- If no flag is specified, the client defaults to command transport
- Create a shell script test_server.sh to support testing

NOT TO DO:
- DO NOT use the HTTP+SSE protocol as it has been deprecated by the MCP specification

Acceptance Criteria
- Create a shell script that:
  - Runs the server in the background;
  - Runs the client connecting over HTTP and call list tools
  - Kills the background process
- The shell script should run without failures

Przydatne wskazówki

  1. Model może próbować użyć protokołu HTTP+SSE, który został wycofany. Jeśli zauważysz, że tak się dzieje, skieruj go z powrotem na strumieniowy protokół HTTP.
  2. Obecna wersja interfejsu wiersza poleceń Gemini (0.26.0) nie obsługuje uruchamiania procesów w tle (każdy proces uruchomiony za pomocą run_shell_command jest zamykany po powrocie wywołania narzędzia), dlatego prosimy Gemini o zautomatyzowanie procesu testowania za pomocą skryptu. Ta funkcja jest planowana i zostanie dodana w najbliższej przyszłości, co może uprościć proces testowania.

Opcjonalnie: testowanie serwera MCP za pomocą protokołu HTTP

Jeśli chcesz skonfigurować interfejs wiersza poleceń Gemini tak, aby używał serwera przez HTTP:

  1. Zapisz sesję i zamknij interfejs CLI
  2. Edytuj plik .gemini/settings.json i zmień konfigurację, aby wskazywała lokalnie działający serwer.
"mcpServers": {
  "godoctor": {
    "httpUrl": "http://localhost:8080"
  }
}
  1. W drugim terminalu uruchom lokalnie serwer z włączonym protokołem HTTP:
go build -o ./bin/godoctor ./cmd/server && ./bin/godoctor -listen=:8080
  1. Uruchom ponownie interfejs wiersza poleceń Gemini i wyślij mu prompta, aby przetestować połączenie, np. „Użyj narzędzia godoctor, aby uzyskać dokumentację funkcji fmt.Println”.
  2. Po zakończeniu testowania zatrzymaj serwer, naciskając Ctrl+C.

9. Konteneryzacja aplikacji za pomocą Dockera

Teraz, gdy nasz serwer korzysta z prawidłowego protokołu transportowego, możemy go umieścić w kontenerze na potrzeby wdrożenia.

Cel: utworzyć plik Dockerfile, aby spakować serwer godoctor do przenośnego obrazu kontenera gotowego do wykorzystania w środowisku produkcyjnym.

Przykładowy prompt:

Please create a multi-stage Dockerfile that compiles the Go binary and copies it into a minimal golang image like golang:1.25.6-alpine. The image should support the following environment variables:
- GOOGLE_CLOUD_USE_VERTEXAI
- GOOGLE_CLOUD_PROJECT
- GOOGLE_CLOUD_LOCATION

Acceptance Criteria:
- The image builds successfully
- Create a script test_docker.sh to launch the docker image in background and test the connectivity with the client:
    - Call list_tools on the client pointing to the server running on Docker
    - Call read_docs for fmt.Println
    - Stop the server
- The script should run without failures

Opcjonalnie: ręczne testowanie obrazu Dockera

Po utworzeniu Dockerfile skompiluj obraz i uruchom go, aby upewnić się, że działa prawidłowo.

  1. Utwórz kontener:
docker build -t godoctor:latest .
  1. Uruchom kontener lokalnie:
docker run -p 8080:8080 -e PORT=8080 godoctor:latest
  1. Testowanie działającego kontenera: w innym terminalu uruchom interfejs wiersza poleceń Gemini i poproś go o pobranie dokumentacji.
  2. Po zakończeniu testowania zatrzymaj serwer, naciskając Ctrl+C.

10. Wdrażanie w Cloud Run

Teraz możemy wdrożyć kontener w chmurze.

Cel: wdrożenie skonteneryzowanego serwera godoctor w Google Cloud Run.

Przykładowy prompt:

Now please deploy this image to Cloud Run and return me an URL I can use to call the MCP tool. Configure Cloud Run to use the following environment variables:
- GOOGLE_CLOUD_USE_VERTEXAI: true,
- GOOGLE_CLOUD_PROJECT: <your-project-id>
- GOOGLE_CLOUD_LOCATION: <your-preferred-region>

TODO:
- Run `docker build -t gcr.io/daniela-genai-sandbox/godoctor .`
- Run `gcloud run deploy godoctor --image` with the image created above

Acceptance Criteria:
- Call list-tools with the client pointing to the CloudRun endpoint

Po zakończeniu wdrażania skonfigurujemy interfejs wiersza poleceń Gemini, aby korzystał z narzędzia, które właśnie zostało wdrożone.

Zaktualizuj plik .gemini/settings.json, aby zmienić konfigurację narzędzia MCP tak, aby wskazywało wdrożoną usługę, lub poproś o to interfejs wiersza poleceń Gemini:

now update the .gemini/settings.json file to use this URL for the godoctor server

Ostatnia sekcja mcpServers powinna wyglądać tak (pamiętaj, aby zastąpić zmienną rzeczywistym adresem URL aplikacji Cloud Run):

"mcpServers": {
  "godoctor": {
    "httpUrl": "https://<your-cloud-run-id>.us-central1.run.app"
  }
}

Testowanie wdrożenia Cloud Run

Możesz teraz przeprowadzić końcowy test kompleksowy.

Jeszcze raz uruchom ponownie interfejs wiersza poleceń Gemini (używając /chat save/chat resume, jeśli chcesz zachować kontekst). Interfejs CLI powinien teraz móc wywoływać zdalny serwer MCP. Spróbuj poprosić o dokumentację dowolnych pakietów.

Możesz też przetestować narzędzie do sprawdzania kodu:

Use the godoctor tool to review the cmd/godoctor/main.go file

Czyszczenie

Po zakończeniu testowania pamiętaj o wyczyszczeniu środowiska. Możesz poprosić Gemini o usunięcie projektu lub tylko wdrożenia Cloud Run. Przykładowy prompt:

I'm done with my tests on the CloudRun server, please delete this deployment for me and revert my .gemini/settings.json to use the local version.

11. Gratulacje!

Udało Ci się poprowadzić asystenta AI w procesie tworzenia, konteneryzacji i wdrażania zaawansowanego narzędzia opartego na AI. Co ważniejsze, przećwiczysz podstawową umiejętność nowoczesnego tworzenia oprogramowania: przekształcanie wymagań w skuteczne prompty. Udało Ci się rozszerzyć interfejs wiersza poleceń Gemini o niestandardowe narzędzie MCP, dzięki czemu stał się on bardziej zaawansowanym i wyspecjalizowanym asystentem programowania w Go.

Dokumentacja