איך בונים שרת MCP באמצעות Gemini CLI ו-Go

1. מבוא

ב-codelab הזה תלמדו איך ליצור ולפרוס שרת Model Context Protocol ‏ (MCP) כדי להרחיב את היכולות של Gemini CLI. תבנו את godoctor, שרת מבוסס-Go שמספק כלים מותאמים אישית לפיתוח ב-Go, ותהפכו את Gemini CLI מעוזר תכנות למטרות כלליות למומחה לפיתוח ב-Go.

ב-codelab הזה אנחנו משתמשים בגישה של 'הנחיות'. אתה תפעל כראש צוות טכני ותספק הנחיות לעוזר ה-AI שלך (Gemini CLI). המטרה שלכם היא ללמוד איך לתרגם דרישות של פרויקט להנחיות יעילות, ולאפשר ל-AI לטפל בפרטי ההטמעה.

בבסיס הפרויקט הזה נמצא Model Context Protocol‏ (MCP). ‫MCP הוא פרוטוקול קוד פתוח שמבצע סטנדרטיזציה של האופן שבו מודלים גדולים של שפה (LLM) כמו Gemini מתקשרים עם כלים ושירותים חיצוניים. הוא משמש כגשר ומאפשר ל-AI לגשת למידע מהעולם האמיתי ולבצע פעולות מעבר לידע המובנה שלו. כשבונים שרת MCP, יוצרים תוסף בהתאמה אישית ש-Gemini CLI יכול לגלות ולהשתמש בו, וכך ללמד אותו מיומנויות חדשות.

מה תלמדו

  • איך מתקינים ומגדירים את Gemini CLI
  • איך לנסח הנחיות יעילות כדי להנחות עוזר AI בפיתוח תוכנה
  • איך מספקים הקשר והנחיות לעוזר דיגיטלי מבוסס-AI
  • איך ליצור ולהגדיר שרת MCP כדי לשפר את היכולות של Gemini CLI
  • איך יוצרים קונטיינר לאפליקציית Go ופורסים אותה ב-Google Cloud Run

הדרישות

אפשר להשתתף בסדנה הזו באופן מלא ב-Google Cloud Shell, שכולל את כל התלויות הנדרשות (gcloud CLI, ‏ Go, ‏ Docker, ‏ Gemini CLI) שמותקנות מראש.

לחלופין, אם אתם מעדיפים לעבוד על המחשב שלכם, תצטרכו את הדברים הבאים:

  • ‫Node.js 20 ואילך
  • ה-SDK של Google Cloud‏ (gcloud CLI) מותקן ומופעל
  • גרסה 1.24 ואילך של Go מותקנת במערכת
  • ‫Docker מותקן במערכת

טכנולוגיות מרכזיות

ריכזנו כאן מידע נוסף על הטכנולוגיות שבהן נשתמש:

  • Gemini CLI: ממשק שורת הפקודה מבוסס-AI שאנחנו נרחיב
  • Model Context Protocol (MCP): פרוטוקול קוד פתוח שמאפשר ל-Gemini CLI לתקשר עם הכלי המותאם אישית שלנו
  • Go SDK for MCP: ספריית Go שבה נשתמש כדי להטמיע את שרת ה-MCP שלנו

טיפים ליצירת Codelab מוצלח

עבודה עם עוזר מבוסס-AI היא דרך חדשה לפתח תוכנה. הנה כמה טיפים שיעזרו לכם ליהנות מחוויה חלקה ומוצלחת:

  1. אל תחששו להקיש על ESC. לפעמים ה-AI יציע פעולות או קוד שלא תסכימו איתם. אפשר להשתמש במקש ESC כדי לבטל את הפעולה המוצעת ולתת הנחיה חדשה שתכוון אותו לכיוון הנכון. אתם משתתפים בתוכנית הפיילוט.
  2. מעודדים את השימוש בכלים. אם נראה שה-AI לא מבין את ההקשר או שהוא ממציא מידע, כדאי לעודד אותו להשתמש בכלים הזמינים שלו. הנחיות כמו "תשתמש בחיפוש Google כדי לאמת את זה" או "תשתמש בכלי read_file כדי להבין את הקוד הנוכחי לפני שתבצע שינויים" יכולות להיות יעילות מאוד.
  3. לא לבצע שינויים ידניים. כדאי לנסות שה-AI יבצע את כל העבודה. זו המיומנות העיקרית שאתם מתרגלים. עם זאת, אם אתם חייבים לבצע שינוי ידני, חשוב לספר על כך ל-AI אחר כך. הנחיה כמו "עדכנתי ידנית את הקובץ README.md. כדי לוודא שה-AI יישאר מסונכרן עם הפרויקט, אפשר להוסיף את ההנחיה הבאה: "כדאי לקרוא שוב כדי לרענן את הידע".
  4. ניסית לכבות את המכשיר ולהדליק אותו מחדש? במקרים נדירים, יכול להיות שה-AI ינסה לכפות נתיב מסוים בניגוד לפקודה שלכם. זה יכול לקרות בגלל ירידה באיכות ההקשר (לפעמים נקראת גם 'התדרדרות ההקשר'). במקרה כזה, אפשר להשתמש בפקודה ‎/compress ב-Gemini CLI כדי לצמצם את הרעשים בהקשר, או במקרים קיצוניים, להשתמש בפקודה ‎/clear כדי לנקות את כל היסטוריית השיחות.

2. הגדרת הסביבה

בוחרים אחת מהאפשרויות הבאות: הגדרת סביבה בקצב אישי אם רוצים להפעיל את

במחשב שלכם, או להפעיל את Cloud Shell אם אתם רוצים להריץ את ה-codelab הזה כולו בענן.

הגדרת סביבה בקצב אישי

  1. נכנסים ל-Google Cloud Console ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • שם הפרויקט הוא השם המוצג של המשתתפים בפרויקט הזה. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. תמיד אפשר לעדכן את המיקום.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שהוא מוגדר). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית. בדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל מסומן כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא נשארת לאורך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על שלושת הערכים האלה מופיע במאמרי העזרה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. השלמת ה-codelab הזה לא תעלה לכם הרבה, אם בכלל. כדי להשבית את המשאבים ולוודא שלא תחויבו על שימוש בהם אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

הפעלת Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Google Cloud Shell, סביבת שורת פקודה שפועלת ב-Cloud.

ב-Google Cloud Console, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:

הפעלת Cloud Shell

הקצאת המשאבים והחיבור לסביבה יימשכו רק כמה רגעים. בסיום התהליך, אמור להופיע משהו כזה:

צילום מסך של טרמינל Google Cloud Shell שבו מוצג שהסביבה מחוברת

המכונה הווירטואלית הזו טעונה בכל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את כל העבודה ב-Codelab הזה בדפדפן. לא צריך להתקין שום דבר.

3. איך מתחילים להשתמש ב-Gemini CLI

בקטע הזה מוסבר על Gemini CLI, כולל איך להתקין אותו ולהגדיר אותו לסביבה שלכם.

מה זה Gemini CLI?

‫Gemini CLI הוא ממשק שורת פקודה מבוסס-AI שיכול לעזור לכם במגוון רחב של משימות פיתוח. הוא יכול להבין את ההקשר של הפרויקט, לענות על שאלות, ליצור קוד ולהשתמש בכלים חיצוניים כדי להרחיב את היכולות שלו.

התקנה

מתקינים את Gemini CLI באופן גלובלי באמצעות npm.

npm install -g @google/gemini-cli

כדי לוודא שה-CLI מותקן, מריצים את הפקודה:

gemini --version

הגדרות אישיות

התנהגות Gemini CLI נשלטת על ידי קובצי תצורה ומשתני סביבה. יש שני קבצים מרכזיים:

  • GEMINI.md: הקובץ הזה מספק הנחיות והקשר ל-AI. ממשק ה-CLI קורא את הקובץ הזה כדי להבין את התקנים והמוסכמות של הקידוד בפרויקט.
  • .gemini/settings.json: הקובץ הזה שולט בתצורה של ה-CLI, כולל איך להתחבר לכלים חיצוניים. נשתמש בקובץ הזה בהמשך כדי להגדיר את ה-CLI כך שישתמש בשרת ה-MCP שאנחנו בונים במעבדה הזו.

קודם נגדיר את הסביבה ואז ניצור את הקובץ GEMINI.md. הגדרת הקובץ settings.json תתבצע בשלב מאוחר יותר.

  1. יוצרים ומפעילים ספריית פרויקט:
mkdir godoctor && cd godoctor
go mod init godoctor
  1. אימות באמצעות Application Default Credentials של Google Cloud:

צריך להתחבר לחשבון שיש לו גישה לפרויקט Google Cloud Platform שבו תשתמשו בסדנת התכנות הזו:

gcloud auth application-default login

4. קובץ הקשר (GEMINI.md)

קבצים של הקשר, שמשתמשים בשם ברירת המחדל GEMINI.md, משמשים כדי לספק הקשר הדרכתי למודל Gemini. אתם יכולים להשתמש בקבצים האלה כדי לתת הוראות ספציפיות לפרויקט, להגדיר פרסונה או לספק הנחיות לגבי סגנון כתיבת קוד, כדי שהתשובות של ה-AI יהיו מדויקות יותר ומותאמות לצרכים שלכם.

כדי לוודא שעוזר ה-AI יוצר קוד Go איכותי ואידיומטי, אנחנו הולכים לכתוב קובץ GEMINI.md עם כמה שיטות מומלצות נפוצות למפתחי Go.

יעד: ליצור קובץ GEMINI.md שישמש כקבוצת הכללים של העוזר הדיגיטלי מבוסס-AI במהלך הפרויקט הזה.

פותחים את סביבת הפיתוח המשולבת כדי ליצור את הקובץ GEMINI.md עם התוכן שבהמשך. אם אתם משתמשים ב-Cloud Shell, אתם יכולים לפתוח עורך באמצעות הפקודה הבאה:

cloudshell edit .

משימה: יוצרים קובץ בשם GEMINI.md בתיקיית השורש של godoctor ומדביקים בו את התוכן הבא.

# 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

סביבת הפיתוח שלכם מוגדרת עכשיו באופן מלא.

5. הגרסה הראשונית: שרת תיעוד

היעד הראשון הוא ליצור את הגרסה הראשונית של השרת godoctor. הגרסה הזו צריכה להיות אפליקציה מינימלית שמספקת כלי יחיד בשם read_docs, שמאפשר לחפש תיעוד של Go.

המטרה: ליצור שרת MCP מוכן לייצור שחושף את הפקודה go doc, כדי לאפשר ל-LLM לשלוח שאילתות לתיעוד של Go.

מריצים את הפקודה Gemini CLI ב-Shell:

gemini

כשמריצים את ה-CLI בפעם הראשונה, תתבקשו לבחור מצב אימות ועיצוב.

אם אתם מריצים את ה-codelab הזה ב-Cloud Shell, בוחרים באפשרות Use Cloud Shell user credentials (שימוש בפרטי הכניסה של המשתמש ב-Cloud Shell). אם לא, אפשר להשתמש בכניסה באמצעות חשבון Google כדי להיכנס עם חשבון Google אישי וליהנות מהתוכנית הנדיבה לשימוש חינמי ב-Gemini CLI. מסך הבחירה של האימות ייראה בערך כך:

ea1ed66807150f3f.png

אם רוצים לשנות את הבחירה, אפשר להקליד /auth ולהקיש על Enter כדי לפתוח שוב את התפריט הזה.

בשלב הבא תתבקשו לבחור עיצוב:

6289bdfb3b519fa7.png

בדומה ל-/auth, אפשר גם לשנות את העיצוב בהמשך באמצעות הפקודה /theme.

אחרי שבוחרים את שיטת האימות ואת העיצוב המועדף, מועברים לשורת הפקודה. כאן אפשר להקליד את הפקודות, למשל:

Write a hello world application in Go

ממשק ה-CLI משתמש בשילוב של יכולות ניתוח משלו (באמצעות מודל Gemini כמו Gemini Flash או Gemini Pro) וכלים כדי לבצע את המשימות. הוא משתמש בכלים כשהוא צריך ליצור אינטראקציה עם מערכת הקבצים או עם שירותים חיצוניים, כמו ממשקי API, מסדי נתונים וכו'. דוגמאות לכלים שזמינים מראש, או 'כלים פנימיים', הם read_file,‏ write_file,‏ web_fetch ו-google_search. שרת ה-MCP שאנחנו בונים יהפוך גם לכלי שיהיה זמין ל-CLI.

בפעם הראשונה שמריצים כלי, תתבקשו לתת הרשאה. אתם יכולים לתת לה הרשאה חד-פעמית (אישור חד-פעמי), אישור גורף לשאר הסשן (אישור תמיד) או לדחות את הבקשה שלה. אם מדובר בפעולת עריכה של קובץ, תופיע גם האפשרות לערוך את הקובץ באמצעות עורך חיצוני, למקרה שתרצו לבצע שינויים. לדוגמה, זה הפלט של הפרומפט שלמעלה, ליצירת תוכנית Hello World:

2cfd761183e4b770.png

בנוסף להנחיות, אפשר גם להשתמש בפקודות עם לוכסן. אם מקלידים '/', ה-CLI יציג אוטומטית את אפשרויות ההשלמה האוטומטית. אפשר להמשיך להקליד את הפקודה המלאה או לבחור אחת מהאפשרויות. הפקודות /auth ו-/theme שצוינו למעלה הן דוגמאות לפקודות כאלה.

26c3f3f7b8bceb3f.png

אחרי שתכירו את הממשק, תוכלו להתחיל במשימה העיקרית של הקטע הזה, שהיא לבקש מ-CLI לכתוב את שרת ה-MCP בשבילכם.

יצירת שרת MCP של Hello World

אחת הדרכים הטובות ביותר לוודא שהמודל יבנה דברים בצורה עקבית יותר היא לחלק משימות מורכבות לשלבים מצטברים. יכול להיות שהמודל יוכל להבין משימה מורכבת בעצמו, אבל בלי ההגדרה הנכונה ייקח לו הרבה זמן לגלות את ההטמעה הנכונה.

כדי להשיג גישה עקבית יותר, נורה אותו קודם ליצור שרת MCP של Hello World לפני שנחיל את הפונקציונליות הרצויה (קריאת תיעוד של Go).

דוגמה להנחיה:

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!"

שימו לב שההנחיה שלמעלה מורכבת משלושה פלחים עיקריים:

  1. פירוט הבעיה, כולל מה רוצים לבנות והאילוצים (למשל, שימוש ב-SDK הרשמי במקום בכל SDK אחר, העברת נתונים ב-stdio במקום ב-http)
  2. פירוט של המשימות לביצוע (TODOs)
  3. קריטריונים לקבלת המשימה, שמשמשים כהליך בדיקה כדי שהסוכן יידע מתי המשימה הושלמה

שלושת הרכיבים האלה עוזרים למודל להשיג את התוצאות הרצויות בצורה עקבית יותר.

הטמעה של הכלי read_docs

אחרי שתהיה לכם הטמעה תקינה, נוכל להמשיך להטמעה של הכלי האמיתי 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

הערה: אתם יכולים להתנסות בהנחיה הזו או לנסות ליצור הנחיה משלכם.

טיפים שימושיים

בהתחשב בכך ש-MCP הוא עדיין מושג חדש ושה-Go SDK ל-MCP הוא ספרייה חדשה, בשלב הזה יכול להיות שיעבור זמן רב עד ש-Gemini יגלה בעצמו את ההטמעה הנכונה. כדי לעזור למודל להגיע לפתרון הנכון, אפשר לנסות את הפעולות הבאות:

  1. אם המודל דילג על קריאת התיעוד בשלב כלשהו, מקישים על מקש ESC ומזכירים לו לעשות זאת. אם אתם לא מכירים את go, הפעלת הפקודה go doc בתוספת שם החבילה go doc github.com/modelcontextprotocol/go-sdk/mcp תחזיר את התיעוד הנכון.
  2. למודול ברמה העליונה github.com/modelcontextprotocol/go-sdk אין תיעוד (כי הוא לא כולל קוד Go). צריך להנחות את המודל לחפש את הנתיב המלא.
  3. לעומת זאת, אם המודל ימציא חבילה שלא קיימת, למשל: ‫"go doc github.com/modelcontextprotocol/go-sdk/mcp/server", פשוט מכוונים אותו לחבילה ברמה העליונה.

6. הגדרת godoctor כשרת MCP ל-Gemini CLI

אחרי שעוזר ה-AI יצור את הקוד גם ללקוח וגם לשרת, תוכלו להנחות אותו להריץ כמה בדיקות ידניות. לדוגמה:

retrieve the documentation for the package net/http

חשוב לבדוק את זה גם עם תלות חיצונית (לא בספרייה הרגילה):

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

אם מרוצים מהתוצאות, מבקשים ממנו לכתוב קובץ README.md עם הוראות לשימוש בפרויקט הזה ולפיתוח שלו.

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

עכשיו נגדיר את השרת כך ש-Gemini CLI יוכל להשתמש בו במהלך השלב הבא של הפיתוח.

  1. מבקשים מ-CLI לעדכן את GEMINI.md כדי להשתמש ב-read_docs כשיטה המועדפת לקריאת תיעוד:
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. עכשיו צריך להפעיל מחדש את Gemini CLI כדי להגדיר את שרת ה-MCP. קודם כל, נשמור את סשן הצ'אט כדי שתוכלו להמשיך מהמקום שבו הפסקתם אחרי שהוא יופעל מחדש.
/chat save godoctor-workshop
  1. כדי לצאת מ-CLI, לוחצים פעמיים על Ctrl+D או מקלידים את הפקודה /quit.
  2. בשלבים הקודמים, הסוכן אמור היה לקמפל עבורכם קובץ בינארי של השרת, אבל אנחנו מקמפלים את השרת שוב עם שם אחר כדי שהוא לא יושפע כשנשנה את קוד המקור שלו:
mkdir -p bin && go build -o ./bin/godoctor ./cmd/server
  1. מגדירים את Gemini CLI עבור הכלי המקומי: יוצרים קובץ .gemini/settings.json בשורש הפרויקט ומוסיפים קטע mcpServers כדי להגדיר ל-Gemini CLI איך להריץ את השרת המהודר.
mkdir -p .gemini && touch .gemini/settings.json
  1. עכשיו, מוסיפים את התוכן הבא לקובץ החדש באמצעות כלי העריכה של Cloud Shell או סביבת הפיתוח המשולבת (IDE) המועדפת.
{
  "mcpServers": {
    "godoctor": {
      "command": "./bin/godoctor"
    }
  }
}
  1. הפעלת Gemini CLI באמצעות הפקודה gemini
  2. כדי לראות שהכלי נטען, מקלידים את הפקודה /mcp. אפשר גם להציג את התיאור המלא של הכלים באמצעות /mcp desc:

13a5a979b9d5408d.png

  1. בודקים את השילוב על ידי בקשה מ-Gemini CLI להשתמש בכלי עם הנחיה כמו 'הצגת התיעוד של החבילה net/http'

אתם אמורים לראות משהו כזה:

fdaa342e76dc5b52.png

אם הכלי פועל בצורה תקינה, אמורה להופיע תיעוד שאוחזר באמצעות קריאה לכלי:

defa9d11314522d4.png

יצרת כלי MCP אבל זה לא הסוף, עדיין אפשר לשפר את השרת הזה.

7. הוספת כלי מבוסס-AI לבדיקת קוד

בואו נוסיף תכונה מתוחכמת יותר שמבוססת על AI: בודק קוד שמשתמש ב-Gemini API.

עכשיו אפשר לשחזר את סשן הצ'אט הקודם באמצעות הפקודה /chat resume godoctor-workshop.. כך יטען ההקשר של הסשן עד לנקודה שבה סיימנו לפתח את read_docs, ולכן למודל יהיה הידע הנדרש לבניית הכלי החדש.

הכלי הזה יצטרך גישה ל-Vertex AI, לכן צריך להפעיל קודם את ה-API. אתם יכולים להריץ פקודות של מעטפת בלי לצאת מ-Gemini CLI. לשם כך, מקלידים סימן קריאה (!) בהנחיה ריקה. ממשק Gemini CLI יעבור למצב מעטפת.

מריצים את הפקודה הבאה במצב מעטפת כדי להפעיל את Vertex AI API:

gcloud services enable aiplatform.googleapis.com

אחרי שהפקודה מסתיימת, אפשר להקיש על מקש Esc כדי לחזור למצב הנחיה.

יעד: הוספת כלי חדש בשם code_review לפרויקט הקיים. הכלי הזה ישתמש ב-Gemini API כדי לנתח קוד Go ולספק משוב.

הנחיה לדוגמה:

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

טיפים שימושיים

  1. אחרי שהמודל יתחיל לעבוד על זה, יכול להיות שתראו באופן אוטומטי בקשה להפעיל את הכלי read_docs כדי לעיין במסמכי התיעוד של חבילת genai. אם לא, תמיד אפשר להפסיק את התהליך באמצעות מקש Escape ולהזכיר לו שעכשיו יש לו את הכלי read_docs.
  2. אם אתם רואים שהיא מנסה להשתמש ב-SDK הלא נכון של AI גנרטיבי (גם אם יש רשימה ברורה של SDK שאסור להשתמש בהם בהנחיה), כדאי להפנות אותה בחזרה ל-SDK הנכון.

בדיקת כלי בודק הקוד

  1. שומרים את שיחת הצ'אט באמצעות /chat save godoctor-workshop ואז יוצאים מ-CLI על ידי הקשה על Ctrl+D פעמיים.
  2. קומפילציה מחדש של השרת עם הגדרת הכלי החדשה:.
go build -o ./bin/godoctor ./cmd/server
  1. בסביבת הפיתוח המשולבת (IDE), מעדכנים את הקובץ .gemini/settings.json כך שיכלול את הגדרות הסביבה של 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. מפעילים שוב את Gemini CLI. שחזור סשן הצ'אט עם /chat resume godoctor-workshop
  2. כדי לוודא שהכלי מופעל, מקלידים את הפקודה /mcp. אתם אמורים לראות משהו כזה:

f78b39f95edf358a.png

  1. עכשיו נבדוק את הכלי code_review על ידי עיון באחד מקובצי המקור של הכלי:
Use the code_review tool to review cmd/server/main.go
    You should see something like this:

d946dcc99f5e37b9.png

אחרי שהכלי לבדיקת קוד פועל, אפשר להציע למודל ליישם חלק מהשיפורים שהוא מצא, כדי ליצור תהליך עבודה מלא של "שיפור עצמי".

עכשיו אפשר לאשר שהכלי code-review פועל. בקטע הבא תעבדו על פריסת האפליקציה בענן. שמירת הסשן הנוכחי באמצעות /chat save godoctor-workshop ויציאה מ-CLI.

8. הכנת השרת לענן

שרת ה-MCP שפיתחנו עד עכשיו פועל רק במחשב המקומי, וזה בסדר אם אתם מפתחים כלים לשימוש עצמי. אבל לעיתים קרובות בסביבות ארגוניות אנחנו צריכים לפרוס כלים לשימוש נרחב של מאות או אפילו אלפי מפתחים.

כדי להרחיב את שרת ה-MCP שלנו, אנחנו צריכים להמיר אותו משרת שמדבר רק I/O רגיל לשרת שיכול לדבר HTTP, ולפרוס אותו במקום שבו מפתחים שונים יוכלו לגשת אליו. לצורך המטרה הזו, נשתמש במצב העברה שמוגדר במפרט של MCP כ-HTTP שניתן להזרמה, ונשתמש ב-Cloud Run כיעד הפריסה שלנו.

המטרה: לבצע רפקטורינג בשרת godoctor כדי להשתמש ב-HTTP transport שניתן להזרמה.

הנחיה לדוגמה:

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

טיפים שימושיים

  1. יכול להיות שהמודל ינסה להשתמש ב-HTTP+SSE במקום זאת, אבל הפרוטוקול הזה הוצא משימוש. אם אתם רואים שהבקשה עוברת בנתיב הזה, נסו להפנות אותה חזרה ל-HTTP שאפשר להזרים.
  2. הגרסה הנוכחית של Gemini CLI‏ (0.26.0) לא תומכת בהרצת תהליכים ברקע (כל תהליך שמופעל באמצעות run_shell_command נסגר ברגע שהקריאה לכלי מסתיימת), ולכן אנחנו מבקשים מ-Gemini להפוך את תהליך הבדיקה לאוטומטי באמצעות סקריפט. התכונה הזו מתוכננת ותתווסף בעתיד הקרוב, כדי לפשט את תהליך הבדיקה.

אופציונלי: בדיקת שרת ה-MCP באמצעות HTTP

אם רוצים להגדיר את Gemini CLI כך שישתמש בשרת באמצעות HTTP:

  1. שמירת הסשן ויציאה מה-CLI
  2. עורכים את קובץ .gemini/settings.json ומשנים את ההגדרה כך שתצביע על השרת המקומי הפעיל.
"mcpServers": {
  "godoctor": {
    "httpUrl": "http://localhost:8080"
  }
}
  1. בטרמינל השני, מריצים את השרת עם HTTP באופן מקומי:
go build -o ./bin/godoctor ./cmd/server && ./bin/godoctor -listen=:8080
  1. מפעילים מחדש את Gemini CLI ונותנים לו הנחיה לבדיקת החיבור, למשל: ‫"Use the godoctor tool to get the documentation for fmt.Println."
  2. בסיום הבדיקה, עוצרים את השרת באמצעות Ctrl+C.

9. יצירת קונטיינר לאפליקציה באמצעות Docker

עכשיו שהשרת שלנו משתמש בפרוטוקול התעבורה הנכון, אנחנו יכולים להכניס אותו למאגר לצורך פריסה.

המטרה: ליצור קובץ Docker כדי לארוז את שרת godoctor בקובץ אימג' נייד של קונטיינר שמוכן לייצור.

הנחיה לדוגמה:

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

אופציונלי: בדיקה ידנית של תמונת Docker

אחרי שיוצרים את Dockerfile, בונים את התמונה ומריצים אותה כדי לוודא שהיא פועלת בצורה תקינה.

  1. בונים את המאגר:
docker build -t godoctor:latest .
  1. מריצים את הקונטיינר באופן מקומי:
docker run -p 8080:8080 -e PORT=8080 godoctor:latest
  1. בדיקת קונטיינר פועל: במסוף אחר, מפעילים את Gemini CLI ומבקשים ממנו לאחזר תיעוד.
  2. בסיום הבדיקה, עוצרים את השרת באמצעות Ctrl+C.

10. פריסה ב-Cloud Run

עכשיו הגיע הזמן לפרוס את הקונטיינר שלנו בענן.

המטרה: פריסת שרת godoctor בקונטיינר ב-Google Cloud Run.

הנחיה לדוגמה:

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

אחרי שהפריסה תסתיים, נגדיר את Gemini CLI כך שישתמש בכלי שפרסתם.

מעדכנים את קובץ .gemini/settings.json כדי לשנות את ההגדרה של כלי ה-MCP כך שיצביע על השירות שנפרס, או מבקשים מ-Gemini CLI לעשות זאת בשבילכם:

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

הקטע הסופי mcpServers צריך להיראות כך (חשוב לזכור להחליף את ה-placeholder בכתובת ה-URL בפועל של אפליקציית Cloud Run):

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

בדיקת הפריסה של Cloud Run

עכשיו אפשר לבצע את הבדיקה הסופית מקצה לקצה.

מפעילים מחדש את Gemini CLI בפעם האחרונה (באמצעות /chat save ו-/chat resume אם רוצים לשמור את ההקשר). עכשיו ה-CLI אמור להיות מסוגל להתקשר לשרת ה-MCP המרוחק. אפשר לנסות לבקש תיעוד של חבילות.

אפשר גם לבדוק את כלי בקרת הקוד:

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

ניקוי

אחרי שמסיימים את הבדיקה, חשוב לנקות את הסביבה. אתם יכולים להנחות את Gemini למחוק את הפרויקט או רק להסיר את הפריסה של CloudRun. הנחיה לדוגמה:

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. מעולה!

הצלחתם להנחות עוזר מבוסס-AI ליצור כלי מתוחכם שמבוסס על AI, להוסיף אותו לקונטיינר ולפרוס אותו. חשוב מכך, תרגלתם את המיומנות החיונית של פיתוח תוכנה מודרני: תרגום דרישות להנחיות יעילות. הרחבתם בהצלחה את Gemini CLI באמצעות כלי MCP בהתאמה אישית, והפכתם אותו לעוזר פיתוח Go יעיל וייעודי יותר.

מסמכי עזר