Google ADK
TwexAPI MCP를 통해 트윗 검색, 프로필, 트렌드 및 검토된 X 쓰기 작업을 위한 Gemini ADK 에이전트를 구축합니다.
TwexAPI MCP 서버를 통해 Google ADK Twitter API 에이전트를 구축합니다. 트윗을 검색하고, 프로필을 조회하며, 트렌드를 읽고, 쓰기 작업을 검토합니다. 트윗 ID, 커서 및 경로 이름을 영속 JSON으로 보존합니다.
TwexAPI와 함께 Google ADK를 사용하는 이유
ADK는 Gemini 우선 프레임워크입니다. TwexAPI는 원격 MCP 도구 세트로 나타납니다. explore가 경로를 발견하고, twexapi_request가 이를 실행합니다.
| 에이전트 작업 | TwexAPI 경로 | 다음 단계를 위해 보존 |
|---|---|---|
| 트윗 검색 | POST /twitter/advanced_search/page |
쿼리, 트윗 ID, 작성자, created_at, 커서 |
| 프로필 조회 | GET /twitter/{screen_name}/about |
사용자 ID, 사용자명, 약력, 팔로워 수 |
| 트렌드 읽기 | GET /twitter/global-trending/tweets |
국가, 주제, 트윗 행 |
| 게시 또는 답글 | POST /twitter/tweets/create |
트윗 ID, 경로, 사람 승인, 쿠키 확인 |
런타임이 Gemini인 경우 ADK를 사용하세요. 모델이 필요 없는 예약 작업에는 Python SDK 또는 Prefect를 사용하세요.
전제조건
- Python 3.10 이상
- TwexAPI API 키
- Google AI API 키 Public docs focus on API-key reads.
공개 X 읽기에는 X Developer 자격 증명이 필요하지 않습니다. TwexAPI로 인증하세요.
설치
python -m pip install "google-adk>=1.0" python-dotenv
TWEXAPI_API_KEY=YOUR_API_KEY
GOOGLE_API_KEY=...
TwexAPI MCP 연결
import os
from google.adk.tools.mcp_tool import McpToolset, StreamableHTTPConnectionParams
twexapi_toolset = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://api.twexapi.io/mcp",
headers={"x-api-key": os.environ["TWEXAPI_API_KEY"]},
)
)
인증되지 않은 MCP 요청은 401을 반환합니다. 첫 요청에 x-api-key를 보내세요.
전체 예제
import asyncio
import os
from pathlib import Path
from typing import Literal
from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.runners import InMemoryRunner
from google.adk.tools.mcp_tool import McpToolset, StreamableHTTPConnectionParams
from google.genai import types
from pydantic import BaseModel
class TweetRow(BaseModel):
tweet_id: str
text: str
author_username: str | None = None
created_at: str | None = None
class TweetSearchHandoff(BaseModel):
query: str
route_used: str
tweets: list[TweetRow]
has_more: bool
next_cursor: str | None = None
stop_reason: Literal[
"complete",
"requested_limit",
"cursor_stalled",
"page_cap",
]
async def main() -> None:
load_dotenv()
twexapi_toolset = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://api.twexapi.io/mcp",
headers={"x-api-key": os.environ["TWEXAPI_API_KEY"]},
)
)
agent = LlmAgent(
model="gemini-2.5-flash",
name="twexapi_agent",
instruction=(
"Use TwexAPI for Twitter API requests. Call explore before twexapi_request. "
"Preserve exact IDs and cursors. Never invent missing tweet fields. "
"Ask for confirmation before read_only: false actions. "
"Return only valid JSON for TweetSearchHandoff."
),
tools=[twexapi_toolset],
)
runner = InMemoryRunner(agent=agent, app_name="twexapi_app")
session = await runner.session_service.create_session(
app_name="twexapi_app",
user_id="user-1",
)
response_parts: list[str] = []
async for event in runner.run_async(
user_id="user-1",
session_id=session.id,
new_message=types.Content(
role="user",
parts=[
types.Part(
text=(
"Search 25 recent tweets about Google ADK MCP. "
"Return query, route_used, tweet rows, has_more, "
"next_cursor, and stop_reason as JSON."
)
)
],
),
):
if event.content and event.content.parts:
response_parts.extend(
part.text for part in event.content.parts if part.text
)
handoff = TweetSearchHandoff.model_validate_json("".join(response_parts))
Path("twexapi-adk-handoff.json").write_text(
handoff.model_dump_json(indent=2),
encoding="utf-8",
)
await twexapi_toolset.close()
asyncio.run(main())
모델이 JSON을 Markdown 펜스로 감싸면 model_validate_json 전에 제거하세요. 파일을 ADK 세션 외부에 영속 저장합니다.
MCP 응답 계약 보존
모든 페이지에서 동일한 쿼리와 필터를 재사용하세요. 각 커서는 불투명 값으로 취급합니다.
요청한 총량에 도달하거나, has_more가 false이거나, next_cursor가 반복되거나, 페이지 상한에 도달하면 페이지네이션을 중지합니다.
재개 가능한 에이전트 핸드오프 유지
트윗 페이지
tweet_id, text, author_username, created_at, has_more, next_cursor, 원본 쿼리를 저장합니다.
프로필 행
user_id, username, name, description, 팔로워 수를 저장합니다.
트렌드 행
국가, 주제, 콘텐츠 태그, 트윗 ID를 저장합니다.
쓰기 작업
경로, 미리보기 텍스트, 승인을 저장합니다. 쿠키는 비밀 저장소에 보관하세요. 참조.
Agent MCP Handoff를 참조하세요.
오류 처리 구축
| 상태 | 의미 | 에이전트 결정 |
|---|---|---|
400 |
잘못된 경로 또는 매개변수 | 재시도 전에 요청을 수정합니다 |
401 |
API 키 누락 또는 유효하지 않음 | 중지하고 자격 증명을 교체합니다 |
403 |
액세스 거부 또는 크레딧 | 쓰기 일시 중지; Get Balance 확인 |
429 |
속도 제한 도달 | 백오프 후 동일 커서로 재개합니다 |
5xx |
일시적 서버 오류 | 안전한 읽기에 제한된 백오프를 적용합니다 |
Error Handling 및 Rate Limits를 참조하세요.
멀티 에이전트 설정
TwexAPI 도구는 수집기에만 부여하세요. 분석 및 쓰기 에이전트는 도구 없이 유지하여 쓰기 승인을 명시적으로 유지합니다.
researcher = LlmAgent(
model="gemini-2.5-flash",
name="researcher",
instruction="Collect X/Twitter data through TwexAPI MCP and return compact JSON.",
tools=[twexapi_toolset],
)
analyst = LlmAgent(
model="gemini-2.5-flash",
name="analyst",
instruction="Analyze structured tweet rows. Do not call external tools.",
)
동적 헤더 및 도구 필터링
하나의 ADK 앱이 여러 TwexAPI 계정을 제공할 때 동적 헤더를 사용합니다.
def get_headers(context):
return {"x-api-key": context.state["twexapi_api_key"]}
twexapi_toolset = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://api.twexapi.io/mcp",
),
header_provider=get_headers,
)
계획 에이전트에는 발견만 노출합니다.
planning_toolset = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://api.twexapi.io/mcp",
headers={"x-api-key": os.environ["TWEXAPI_API_KEY"]},
),
tool_filter=["explore"],
)
패키지 버전
| 패키지 | 지원 범위 |
|---|---|
| Python | >=3.10 |
google-adk |
>=1.0 |
pydantic |
>=2.7 |