1. 소개

최종 업데이트: 2026년 6월 22일
ADK로 간단한 여행 에이전트 빌드
Gemini CLI 덕분에 필요한 모든 것이 포함된 ADK Python(*) 워크숍에 오신 것을 환영합니다.
이 Codelab은 두 가지 🏅 마일스톤으로 나뉩니다.
- 일반적이고 간단한 학습 과정: 설정 + 즉각적인 만족감
- Gemini CLI의 도움을 받아 해결할 퀘스트를 선택하는 맞춤형 경로
두 번째 부분은 이 Codelab을 해커톤에 적합하게 만듭니다(가장 창의적인 솔루션에 대한 상금도 제공).
마일스톤 1: ADK 및 Gemini CLI를 사용한 첫 번째 에이전트
이 마일스톤의 목표는 ADK를 사용하여 간단한 여행 에이전트를 단계별로 빌드하는 것입니다. 이를 위해 먼저 ADK로 코딩하는 데 도움이 되도록 Gemini CLI를 설정합니다. 이렇게 하면 로컬 셸에서 최신 버전의 Python ADK를 선택하고, 코드와 문서를 이해하고, 목표에 맞는 최신/최적의 코드를 제공할 수 있습니다.
이 부분은 직접 안내를 받으며 작고 간단한 단계를 통해 완전히 작동하는 앱을 완성하는 과정입니다. 이 작업은 일반적으로 1시간 정도 걸립니다(설치 시간 제외).
마일스톤 2: 에이전트 확장
그런 다음 원하는 대로 앱을 확장할 수 있는 12가지 옵션(다양한 난이도)을 제공합니다. 이를 통해 다양한 측면(UI, 운영, 복잡한 에이전트 상호작용 등)을 살펴볼 수 있습니다.
빌드할 항목
이 Codelab에서는 ADK와 Gemini CLI를 사용하여 여행 에이전트 앱을 빌드합니다. 이 앱에는 아래의 기능이 있습니다.
- Airbnb MCP를 통해 Airbnb API에 연결합니다.
- 온라인에서 최신 정보(날씨, 날짜 등) 검색
- 커스텀 도구를 실행합니다.
- NanoBanana를 사용하여 아파트/객실 이미지를 만듭니다.
Gemini CLI는 코드 작성/검토, ADK 저장소의 로컬 미러에서 최신 문서 찾기(Python 또는 원하는 언어) 등 이 모든 과정을 안내합니다.
학습할 내용
- ADK로 앱을 만들고 생성하는 방법
- Gemini CLI를 사용하여 로컬 문서를 기반으로 앱을 코딩하는 방법
- MCP 서버와 상호작용하여 실시간 외부 데이터 소스에 연결하는 방법은 다음과 같습니다.
필요한 항목
- 패키지를 설치할 수 있는 컴퓨터(예:
npm install ..) - Python, TypeScript, Go, Java 중 하나를 사용하는 기본적인 코딩 능력
- IDE(Antigravity, vscode, IntelliJ, vim)를 사용하는 것이 좋습니다.
ADK + Gemini CLI를 사용해야 하는 이유
일부 사용자는 왜 ADK(에이전트 빌더 SDK)를 로컬 에이전트 코드 도우미(예: Gemini CLI)와 함께 사용해야 하는지 궁금할 수 있습니다. 두 도구 모두 매우 강력하지만 상호작용이 간단하지 않기 때문입니다. 많은 사람들이 두 도구를 함께 사용하려고 시도했지만 대부분 '루프 내 루프' 문제로 인해 실패했습니다. 이 Codelab에서는 이러한 공존을 가능하게 하는 방법에 관한 몇 가지 팁을 공유합니다.
2. 설정
자신의 머신에서 이 Codelab을 실행하려면 셀프설정 환경 설정 옵션을 선택하고, 이 Codelab을 전적으로 클라우드에서 실행하려면 Cloud Shell 시작 옵션을 선택합니다.
자습형 환경 설정
- Google Cloud 콘솔에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.



- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Google Cloud 콘솔의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.
3. 기본 요건(설치)
이 튜토리얼을 진행하려면 다음을 설치해야 합니다.
1. Python 및 uv
python 및 uv(Python용 패키지 관리자) ADK에 필요합니다. uv가 설치되어 있는지 확인합니다.
$ curl -LsSf https://astral.sh/uv/install.sh | sh
uv를 사용하는 이유 원하는 Python 관리자를 사용할 수 있지만 uv를 사용하면 Python의 ENV/PATH 설정이 사용자와 Gemini CLI에 동일하게 적용되므로 셸 환경이 Gemini CLI와 거의 동일하게 유지됩니다. 예를 들어 virtualenv를 사용하면 Gemini CLI가 환경을 모방하기 위해 'source .env/venv/bin/activate && my-original-command'와 같은 작업을 강제로 수행합니다.
2. Gemini CLI
Gemini CLI의 경우 https://github.com/google-gemini/gemini-cli에서 설치 안내를 확인하세요.
# Note: This requires having npm or npx installed. npm install -g @google/gemini-cli
- Mac에서는 공식 문서에 따라
brew를 사용할 수 있습니다. - Windows에서는
chocolatey를 사용하거나 https://nodejs.org/en/download에서 실행 파일을 다운로드하면 됩니다.
4단계(이후)에서는 npx도 설치해야 합니다. npm 및 npx 모두 Gemini CLI의 일부로 자연스럽게 제공됩니다. 그렇지 않은 경우 Gemini CLI에 도움을 요청하세요.

인증
Vertex AI가 사용 설정된 Google Cloud 프로젝트 또는 Google AI Studio API 키가 필요합니다.
옵션 A(워크숍에 권장): API 키 내보내기:
export GOOGLE_API_KEY="your-api-key"
옵션 B(Vertex AI): gcloud로 인증합니다.
export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID" export GOOGLE_CLOUD_LOCATION="YOUR_PROJECT_LOCATION" export GOOGLE_GENAI_USE_VERTEXAI=true gcloud auth application-default login
작업 환경 설정하기
mysolution/ 아래에 자체 솔루션을 만들 예정이므로 폴더와 필요한 파일 두 개를 만들어 보겠습니다.
이때 IDE(Visual Studio Code, IntelliJ, RubyMine 등)를 열고 폴더를 열 수 있습니다.
# 1. Find an empty directory, and download this repo. git clone https://github.com/palladius/adk-gemini-cli-workshop cd adk-gemini-cli-workshop/ # 2. Create your solution empty skeleton mkdir -p mysolution/ touch mysolution/__init__.py mysolution/agent.py # 3. This installs ADK and MCP via `uv` by reading pyproject.toml uv init uv sync # 4. Call Gemini CLI gemini # This runs Gemini CLI under the adk-gemini-cli-workshop/ folder. # Login with your GMail account.
uv 동기화가 반드시 필요한 것은 아니지만 실패하면 Python 또는 uv 설치를 수정해야 합니다. 이렇게 하면 adk 및 기타 유용한 스크립트가 ./.venv/bin/ 폴더에 설치됩니다.
설정을 테스트하려면 make test-step1를 실행하고 403가 표시되지 않는지 확인하면 됩니다. PERMISSION DENIED.
사용 가능한 솔루션
코드는 모두 📂 steps/에 포함되어 있습니다. 여기에서 코드를 복사할 수 있습니다.
이 Codelab은 좋은 ADK 코드를 작성하는 방법을 배우는 것이 아니라, 사용자의 지시에 따라 좋은 코드가 자동으로 작성되도록 환경을 설정하는 방법을 다룹니다.
- 소프트웨어 설치
- 구성/작동,
- 선순환 피드백 루프에 진입하는 것입니다.
이것이 바로 이 과정에서 배우고자 하는 내용입니다. $ make web-4steps를 통해 모두 동시에 테스트할 수도 있습니다.
4. 1단계: 기본 에이전트

먼저 대화할 수 있는 기본 에이전트를 만들어 보겠습니다.
다음 콘텐츠를 추가하여 mysolution/__init__.py 파일을 수정합니다.
from .agent import root_agent
아주 간단하죠! 이렇게 하면 ADK가 코드의 위치(agent.py)를 알 수 있습니다.
다음 콘텐츠를 추가하여 mysolution/agent.py 파일을 수정합니다.
from google.adk.agents import Agent
root_agent = Agent(
name="travel_basic",
model="gemini-2.5-flash",
instruction="You are a helpful travel assistant." +
"You can help with general travel advice based on your knowledge.",
)
에이전트 테스트
이는 모든 단계에 적용됩니다. ADK를 사용하면 CLI와 웹의 두 가지 방법으로 에이전트를 테스트할 수 있습니다.
- CLI는 빠른 자동 테스트에 가장 적합합니다.
- 웹은 진행 상황을 시각적으로 확인하고, 마이크를 사용하고(!), 문제를 해결하는 데 가장 적합합니다.
도움말: 이 연습에서는 단위 테스트를 제외한 모든 작업을 수행하기 위해 웹을 사용합니다. 정말 놀랍습니다. 자동 테스트용으로만 CLI를 유지합니다.
1~4단계를 제대로 테스트하는 좋은 프롬프트는 다음과 같습니다(스마트 '리트머스 프롬프트').
안녕하세요. 내일 저녁에 파리 도심에서 혼자 1박을 할 호텔을 예약하고 싶습니다. 파리 리옹역과 가까운 이상적인 위치에 있습니다. 예산: 1박당 200유로 미만
- 내일의 YYYYMMDD와 요일을 알려 줘.
- 내일 예약 가능한 호텔을 3개 이상 알려줘. 가격, 주소, 평점(XX/YY 형식, 예: '4.7/5' - Google 호텔, Booking 또는 Airbnb), 리뷰 수를 확인하고 싶습니다. 표 형식으로 알려줘. 호텔 이름은 호텔의 URL에 연결되어야 합니다(URL 열을 추가하지 마세요). 링크가 유효한지 확인합니다(링크가 작동하고 페이지가 호텔에 관한 정보를 가리킴).
이 프롬프트는 시간과 호텔을 테스트하는 스마트 프롬프트로, 1, 2, 3단계에서 각각 다른 방식으로 실패하고 4단계에서만 완전히 성공합니다. 물론 원하는 프롬프트를 사용할 수 있습니다.
bash(CLI)에서 실행합니다.
# 1. If ADK was installed: adk run mysolution/ # ... but if you get: -bash: adk: command not found" # 2. Call ADK cli script through UV to avoid python install nightmares. uv run adk run mysolution/
위의 '리트머스 프롬프트'를 사용해 보세요.
특정 날짜를 알지 못할 가능성이 높습니다. 날짜를 알 수 있도록 가르쳐야 합니다.
웹의 경우 다음 단계를 따르세요.
uv run adk web .: 이 폴더의 모든 에이전트를 실행합니다. 'mysolution/' 하위 폴더를 가리키도록 하려고 합니다.- 오른쪽 상단에서
mysolution/를 선택합니다(옆의 이미지 참고). - 텍스트 또는 마이크를 통해 '리트머스 프롬프트'와 유사한 질문을 합니다.

CLI 버전에 따라 상위 폴더에서 adk web를 호출해야 합니다.

다음은 날짜가 부분적으로 할루시네이션된 가능한 해결 방법입니다. 예약 링크 5개 중 3개가 작동합니다. 양호합니다.
5. 2단계: now() 도구 추가

root_agent 정의 바로 앞에 있는 agent.py에 이 함수를 추가합니다.
from datetime import datetime
def now() -> dict:
"""Returns the current date and time."""
my_datetime = ... # Ask Gemini CLI to help you!
return {
"status": "success",
"current_time": my_datetime
}
도구를 포함하도록 에이전트 정의를 업데이트합니다.
# file XXX.py
root_agent = Agent(
name="..",
model="..",
instruction="..",
tools=[now] # <== This is the only line you want to add.
)
다시 실행하고 동일한 질문을 합니다. 이제 날짜를 알고(좋음) 호텔에 대해 모호하게 답변합니다(나쁨).
다음과 같이 테스트할 수도 있습니다.
# Let's pretend we're in Milan. This should call the tool # and respond correctly (possibly with some TZ math issues) echo "What time is it in Milan?" | uv run adk run mysolution/
6. 3단계: 이제 집중해 볼까요? google_search
google_search. 이렇게 하면 에이전트가 웹에서 실시간 정보에 액세스할 수 있습니다.

2단계에서 만든 에이전트를 수정하는 것이 목표입니다. now 도구를 사용하는 대신 ADK 라이브러리에서 google_search 도구를 가져와 사용합니다.
# Full Code: `steps/step03_search/agent.py`
# Remember to REMOVE the now() tool here. See above why.
from google.adk.agents import Agent
from google.adk.tools import google_search
root_agent = Agent(
name="travel_agent",
model="gemini-2.5-flash",
tools=[google_search],
instruction="""You are a travel agent.
Your job is to help the user plan a trip.
You have access to a search engine.
If you don't know the answer, you can use the search engine.
When you are done, reply with "DONE".""",
)
실행 방법
1단계와 동일합니다.
전문가만 해당. google_search 및 now를 함께 사용하는 고급 통합의 경우 steps/step03b_search_and_tool/agent.py의 코드를 확인하고 make run-step3b로 실행합니다. 이 기능은 전적으로 선택사항입니다.
7. 4단계: 더 정교한 도구: MCP

커스텀 도구와 기본 제공 도구를 모두 살펴보았으니 이제 더 강력한 도구인 모델 컨텍스트 프로토콜(MCP)을 사용하는 도구로서의 모델 패턴을 살펴보겠습니다.
이 단계에서는 MCP의 강력한 기능에 집중하기 위해 이전 도구(google_search)를 다시 한번 교체합니다. 간단한 now 도구를 다시 도입하여 airbnb_mcp 도구와 함께 실행합니다. 이는 에이전트가 호환되는 여러 도구(이 경우 FunctionTool 및 MCPToolset)를 사용하여 복잡한 작업을 수행하는 방법을 보여줍니다.
# Full Code: steps/step04_mcp/agent.py
# ... Imports as before
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset
from google.adk.tools.mcp_tool.mcp_session_manager import StdioConnectionParams
from mcp import StdioServerParameters
def now() -> dict:
# ... as before
# Configure the Airbnb MCP Toolset
airbnb_mcp = MCPToolset(
connection_params=StdioConnectionParams(
server_params=StdioServerParameters(
command='npx',
args=["-y", "@openbnb/mcp-server-airbnb", "--ignore-robots-txt"],
),
)
)
root_agent = Agent(
name="travel_mcp",
model="gemini-2.5-flash",
instruction="You are a helpful travel assistant. You can find accommodation using Airbnb, and have access to the current time.",
tools=[now, airbnb_mcp],
)
실행 방법
이 단계를 수행하려면 시스템에 npx이 설치되어 있어야 합니다. 나머지는 위와 동일합니다.
주의사항/오류
robots.txt제한 오류가 발생하면 로봇 무시 지시어로 MCP를 패치할 수 있습니다. 자세한 내용은 문서를 참고하세요. https://github.com/openbnb-org/mcp-server-airbnbtimeout오류가 발생하면(Airbnb에서 응답을 받기에 5초는 너무 짧음) ADK 문서에서 제한 시간을 30초로 늘리는 방법을 확인하세요. 아니면 Gemini CLI를 사용해 보세요. 2025년 12월 3일에 Cloud Shell에서 제한 시간 초과 오류가 발생했습니다. 제한 시간 초과 오류를 수정했지만 이전 버전(args=["-y", "@openbnb/mcp-server-airbnb@0.1.2", "--ignore-robots-txt"])으로 강제 전환할 때까지 계속 오류가 발생했습니다.
8. 🏅 목표 1 완료
🏅 축하합니다. 🏅 이제 ADK 전문가가 되었습니다. 워크숍의 첫 번째 부분을 완료하고 커스텀 도구, 기본 제공 도구, 고급 MCP 도구를 사용하여 AI 에이전트를 성공적으로 빌드하고 테스트했습니다. 이제 Google 에이전트 개발 키트를 사용하여 나만의 멋진 에이전트를 빌드할 준비가 되었습니다.
이제 시간을 알고 웹을 검색할 수 있는 실용적인 여행 에이전트가 생겼습니다. 이제 한계는 없습니다.
이제 'Gemini CLI'를 사용하여 추가 기능을 추가할 차례입니다.
9. 🏅 마일스톤 2: Gemini CLI를 통해 ADK로 바이브 코딩하기
이제 워크숍의 흥미로운 부분으로 들어가겠습니다.
- 코드를 안전한 곳에
git commit해 두었는지 확인하세요. 원본 코드를 포크하거나 브랜치를 만들 수 있습니다. Gemini CLI가 이 작업을 도와주므로 걱정하지 마세요. - 구현할 💡 아이디어를 찾습니다. 아래 아이디어를 확인하거나, 직접 아이디어를 찾거나, Gemini에게 rag/의 문서를 살펴보고 몇 가지 스마트한 아이디어를 제안해 달라고 요청할 수 있습니다.
- 기본 요건에 따라 Gemini가 ADK 문서를 읽을 수 있도록 하면 준비가 완료됩니다.
💡 아이디어
- 🟢 [쉬움] 다국어를 구사하시나요?
go,java,TypeScript중 무엇을 제공하시겠어요? 기존 코드를 리팩터링하는 것은 매우 간단합니다. 적절한 ADK를 다운로드하고 Gemini CLI에 변환을 요청하기만 하면 됩니다. - 🟢 [쉬움] 이모티콘을 추가하거나 원하는 출력 형식을 지정합니다(예: 호텔 이모티콘, 가격, 1~5개 별 이모티콘이 있는 표, 🌕🌕🌕🌗🌑를 사용하여 절반도 표시).
- 🟢 [쉬움] 프롬프트를 변경하여 구체적으로 원하는 사항 또는 원하지 않는 사항(반려동물 동반 가능, 1층 제외, 조용함, 대중교통과 가까움 등)을 알려주고 테스트합니다. 위의 내용을 바탕으로 'YOUR_NAME 평점 1~10점'과 같은 개인 평점을 추가하고 해당 평점을 기준으로 정렬해 줘.
- 🟢 [쉬움] 방에 운영자가 있나요? Cloud Run에 배포합니다. 또는 Vertex AI Agent Engine으로 이동합니다. 이 에이전트를 통합하고 새로운 Gemini Enterprise에서 직접 호출할 수 있다는 사실을 알고 계셨나요?
- 🟢 [쉬움]
adk run를 🍌 NanoBanana MCP와 통합합니다. Gemini API 키가 필요합니다. 여기에서 이미지를 만들 수 있지만 시각화할 수는 없습니다. 더 어려운 변형은 아래를 참고하세요. - 🟡 [중간]
HotelSearch를 수행하는 하위 에이전트를 만들고, 위치 요구사항(예: 'LOCATION에서 Xkm 이내')을 고려하여 호텔을 반복적으로 검색할 수 있는BudgetAgent또는LocationAgent를 만듭니다. API에서 이를 허용하지 않는 경우 Google 검색의 도움을 받아 몇 번의 상호작용이 필요할 수 있습니다. 참고: Gemini CLI를 사용하면 도움이 됩니다. - 🟡 [중간] 검색 결과로 나온 1개 또는 N개의 호텔에 대해 리뷰를 살펴보고 긍정적인 점과 부정적인 점을 색상으로 구분된 몇 개의 글머리 기호로 요약하는
AirbnbReviewAgent를 구현합니다. 이미 두 가지 요소(Google 검색 및 MCP Airbnb)가 있으므로 이를 기본 에이전트에 연결하고 이들이 통신할 수 있는 일종의 프로토콜을 만들어야 합니다. - 🟡 [보통] A2A와 통합합니다. A2A 에이전트로 전환 Gemini CLI에 다시 도움을 요청하세요.
- 🔴 [복잡] 항공편 또는 기타 MCP 기능과 통합하여 다각적이고 다기능적인 여행 에이전트를 만들 수 있습니다.
- 🔴 [복잡] ADK 웹을 🍌 NanoBanana MCP와 통합합니다. 이 작업은 위의 작업보다 더 어려우며 https://github.com/palladius/ai-friendly-agents/issues/11에서 몇 가지 팁을 확인할 수 있습니다. 이 작업을 위해 작성자는 Gemini CLI, Gemini 3와 3시간 동안 상호작용하고, 두 사람 모두
rag/의 문서/코드를 읽어야 했습니다.
아이디어가 더 필요하신가요?
- 공식 ADK 튜토리얼에서 아이디어를 확인하세요.
- Gemini CLI에
rag/의 문서를 살펴보고 아이디어를 찾아달라고 요청합니다. 가능한 프롬프트는Is there a feature in here which seems very succulent to you? Give me 3 proposals and let's implement together the one I choose입니다.
ADK 'RAG' 기본 요건
기능을 바이브 코딩하려면 전체 ADK Python ADK를 다운로드하는 것이 좋습니다(참고: Java 또는 Go와 같이 선호하는 언어에 맞게 매우 쉽게 조정할 수 있음).
코드는 ./rag에 있으며 ./download-adk.sh로 다운로드할 수 있습니다.
rag 폴더가 .gitignore 파일에 나열되어 있으므로 .gemini/settings.json에 다음이 포함되어 있는지 확인합니다.
{
"context": {
"includeDirectories": ["rag"]
}
}
이유: Gemini가 이러한 파일을 읽을 수 있으면서도 git-ignored로 안전하게 보호되기를 원합니다. 기술적으로는 context.fileFiltering.respectGitIgnore를 false로 설정하여 모든 .gitignore 파일을 숨기기 해제할 수도 있지만, 이렇게 하면 node_modules/ 및 __pycache__/ 가비지가 많이 열리므로 명시적 폴더 포함이 선호되는 옵션입니다.
10. 다음 단계
호기심: 이 워크숍은 Gemini CLI의 도움을 받아 빌드되었습니다. 궁금하다면 이 폴더의 GEMINI.md 및 WORKSHOP_PLAN.md를 확인하여 방법을 알아볼 수 있습니다.
교훈
ADK를 Gemini CLI와 페어링하는 방법을 알아봤습니다.
추가 자료
- 다음 두 가지 공식 Antigravity Codelab을 확인하세요.
- 공식 ADK 튜토리얼에서 아이디어를 확인하세요.
