BigQuery RAG MCP Server
BigQuery RAG MCP 서버
자연어 질문을 임베딩으로 변환하고, BigQuery에 저장된 문서 청크에 대해 의미론적 검색을 수행하며, 소스 및 페이지 메타데이터와 함께 구조화된 구절을 반환하는 비공개 Model Context Protocol(MCP) 서비스입니다.
이 저장소는 더 큰 문서 기반 챗봇의 검색 계층을 담당합니다. 동반 애플리케이션 저장소는 Google ADK 오케스트레이션, Gemini 답변 생성, Firebase 인증, /chat API 및 React 인터페이스를 담당합니다.
동반 애플리케이션: shrprabh/atomic-habits-adk-rag
라이브 배포
리소스 | 값 |
Cloud Run 서비스 |
|
리전 |
|
기본 URL |
|
MCP 엔드포인트 |
|
헬스 엔드포인트 |
|
액세스 | 비공개; Cloud Run IAM 인증 필요 |
서비스 URL은 의도적으로 브라우저에서 공개되지 않습니다. 호출자는 서비스에 대해 roles/run.invoker 권한이 있어야 하며, 대상이 MCP 기본 URL인 Google 서명 ID 토큰을 전송해야 합니다.
종단 간 아키텍처

React application on Firebase Hosting
│ Firebase ID token
▼
ADK Agent API on Cloud Run
│ Google service identity token
▼
Private MCP service on Cloud Run ◀── this repository
│ parameterized BigQuery SQL
▼
AI.GENERATE_EMBEDDING
│ 1,536-dimensional query vector
▼
BigQuery VECTOR_SEARCH (COSINE)
│
▼
Top document passages + page metadata이 서비스가 하는 일
semantic_search라는 읽기 전용 MCP 도구를 노출합니다.Pydantic 생성 MCP 스키마를 사용하여
query및top_k를 검증합니다.RETRIEVAL_QUERY를 사용하여AI.GENERATE_EMBEDDING으로 쿼리 임베딩을 생성합니다.저장된 문서 임베딩에 대해 코사인 거리
VECTOR_SEARCH를 수행합니다.사용자 입력을 SQL에 직접 삽입하는 대신 매개변수화된 쿼리 값을 사용합니다.
구조화된 소스, 페이지, 장, 섹션, 거리 및 유사성 필드를 반환합니다.
상태 비저장 Streamable HTTP MCP 서버로 실행됩니다.
Cloud Run IAM을 사용하여 검색 서비스를 비공개로 유지합니다.
답변을 구성하기 위해 Gemini를 호출하지 않습니다. 생성은 동반 ADK 서비스에 속합니다.
이 프로젝트에서 사용하는 BigQuery 리소스
설정 | 값 |
Google Cloud 프로젝트 |
|
BigQuery 위치 |
|
데이터셋 |
|
Cloud 리소스 연결 |
|
원격 임베딩 모델 |
|
임베딩 테이블 |
|
현재 행 수 | 1,222 |
임베딩 차원 | 1,536 |
거리 유형 | 코사인 |
검색 모드 | 정확 brute-force 검색 |
현재 테이블은 작으므로 이 구현에서는 의도적으로 brute-force 벡터 검색을 사용합니다. 벡터 인덱스는 코퍼스가 근사 최근접 이웃 검색 및 인덱스 유지 관리를 정당화할 만큼 충분히 커진 후에 유용해집니다.
MCP 도구 계약
semantic_search
입력:
{
"query": "What is the two-minute rule?",
"top_k": 5
}검증:
필드 | 규칙 |
| 문자열, 2–500자 |
| 정수, 1–10; 기본값 |
간소화된 출력:
{
"query": "What is the two-minute rule?",
"result_count": 5,
"results": [
{
"chunk_id": 480,
"document_id": "atomic_habits",
"content": "Retrieved passage text...",
"title": "Atomic Habits",
"author": "James Clear",
"source": "atomic-habits.pdf",
"page_start": 96,
"page_end": 96,
"chapter": "...",
"section": "...",
"distance": 0.18,
"similarity": 0.82
}
]
}저장소 구조
bigquery-rag-mcp/
├── server.py # MCP tool, BigQuery query, health route
├── test_mcp.py # In-process MCP regression test
├── test_deployed_mcp.py # Authenticated test against Cloud Run
├── rag_client.py # Local in-process RAG reference client
├── requirements.txt
├── Dockerfile
├── .env.example
└── .gitignorerag_client.py는 server.py에서 mcp를 임포트하므로 동일한 Python 프로세스에서 도구를 실행합니다. 로컬 참조 또는 회귀 클라이언트로 유용하지만, 배포된 프로덕션 요청 경로의 일부가 아닙니다. 동반 ADK 애플리케이션은 이 서비스를 원격으로 /mcp를 통해 호출합니다.
전제 조건
Python 3.12+
Google Cloud CLI
결제가 활성화된 Google Cloud 프로젝트
BigQuery, BigQuery Connection, Vertex AI, Cloud Run, Cloud Build 및 Artifact Registry API
구성된 스키마와 일치하는 기존 BigQuery 데이터셋, 임베딩 모델 및 임베딩 테이블
서비스 계정을 생성하고 Cloud Run 및 BigQuery IAM을 관리할 권한
1. 클론 및 설치
git clone https://github.com/shrprabh/bigquery-rag-mcp.git
cd bigquery-rag-mcp
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txtCloud Shell 외부의 로컬 개발:
gcloud auth login
gcloud auth application-default login
gcloud config set project bigquery-semantic-search애플리케이션 기본 자격 증명 또는 서비스 계정 키 파일을 커밋하지 마십시오.
2. 환경 구성
cp .env.example .env예상 값:
GOOGLE_CLOUD_PROJECT=bigquery-semantic-search
BQ_DATASET=atomic_habits_rag
BQ_LOCATION=us-central1
EMBEDDING_DIM=1536server.py는 프로세스 환경에서 이러한 값을 읽습니다. 체크인된 .env.example은 문서 전용입니다. 로컬에서는 명시적 내보내기를 사용하거나 배포에서는 Cloud Run 환경 변수를 사용하십시오.
3. BigQuery 자산 확인
BigQuery 편집기에서 실행:
SELECT
ARRAY_LENGTH(embedding) AS dimensions,
COUNT(*) AS row_count
FROM `bigquery-semantic-search.atomic_habits_rag.article_embeddings`
GROUP BY dimensions;현재 데이터셋에 대한 예상:
dimensions row_count
1536 1222모델이 존재하는지 확인:
SELECT
model_name,
model_type
FROM `bigquery-semantic-search.atomic_habits_rag.INFORMATION_SCHEMA.MODELS`
WHERE model_name = 'embedding_model';4. 런타임 IAM 구성
변수 설정:
export PROJECT_ID="bigquery-semantic-search"
export REGION="us-central1"
export CONNECTION_ID="vertex_ai_connection"
export MCP_SERVICE="bigquery-rag-mcp"
export MCP_SA_NAME="bigquery-rag-mcp-sa"
export MCP_SA="${MCP_SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud config set project "$PROJECT_ID"API 활성화:
gcloud services enable \
bigquery.googleapis.com \
bigqueryconnection.googleapis.com \
aiplatform.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
--project="$PROJECT_ID"런타임 서비스 계정이 아직 없으면 생성:
gcloud iam service-accounts describe "$MCP_SA" \
--project="$PROJECT_ID" >/dev/null 2>&1 || \
gcloud iam service-accounts create "$MCP_SA_NAME" \
--project="$PROJECT_ID" \
--display-name="BigQuery RAG MCP Server"서비스 계정에 쿼리 실행 및 데이터셋/모델 읽기 권한 부여:
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member="serviceAccount:${MCP_SA}" \
--role="roles/bigquery.jobUser"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member="serviceAccount:${MCP_SA}" \
--role="roles/bigquery.dataViewer"필요한 연결 권한
AI.GENERATE_EMBEDDING은 BigQuery Cloud 리소스 연결을 사용하므로 MCP 런타임 ID도 vertex_ai_connection을 사용할 수 있어야 합니다.
Google Cloud 콘솔에서:
BigQuery → 프로젝트 → 연결을 엽니다.
us-central1에서vertex_ai_connection을 선택합니다.공유를 선택합니다.
bigquery-rag-mcp-sa@bigquery-semantic-search.iam.gserviceaccount.com을 추가합니다.BigQuery Connection User(
roles/bigquery.connectionUser)를 부여합니다.
bq add-iam-policy-binding --connection_type=...를 사용하지 마십시오. 해당 플래그는 연결을 공유하지 않으며 현재 bq 버전에서 거부됩니다. 연결 수준 공유에는 Cloud 콘솔 또는 BigQuery Connections API를 사용해야 합니다.
연결 자체에는 Google 관리 서비스 계정이 있습니다. 해당 연결 서비스 계정은 원격 임베딩 모델이 엔드포인트를 호출할 수 있도록 프로젝트에서 적절한 Vertex AI/Agent Platform 사용자 역할을 가지고 있어야 합니다.
이러한 연결 권한이 없으면 MCP 로그에 다음과 유사한 오류가 포함됩니다:
403 Access Denied: User does not have bigquery.connections.use permission5. 로컬 테스트
파일 컴파일:
python -m py_compile server.py test_mcp.py rag_client.py직접 MCP 회귀 테스트 실행:
python test_mcp.pyHTTP 서버 시작:
python server.py엔드포인트:
http://localhost:8000/health
http://localhost:8000/mcp다른 터미널에서:
curl http://localhost:8000/health예상:
{"status":"healthy"}선택적으로 로컬 근거 생성 참조 클라이언트 실행:
python rag_client.py6. 비공개 MCP 서비스 배포
gcloud run deploy "$MCP_SERVICE" \
--source=. \
--project="$PROJECT_ID" \
--region="$REGION" \
--service-account="$MCP_SA" \
--no-allow-unauthenticated \
--memory="1Gi" \
--timeout="300" \
--set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID,BQ_DATASET=atomic_habits_rag,BQ_LOCATION=$REGION,EMBEDDING_DIM=1536"Cloud Run이 PORT를 제공합니다. server.py는 0.0.0.0에 바인딩하고 해당 포트를 사용합니다.
정식 서비스 URL 가져오기:
export MCP_URL="$(
gcloud run services describe "$MCP_SERVICE" \
--project="$PROJECT_ID" \
--region="$REGION" \
--format='value(status.url)'
)"
echo "$MCP_URL"인증된 헬스 경로 테스트:
curl -i \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
"$MCP_URL/health"예상: HTTP 200 및 {"status":"healthy"}.
7. 배포된 MCP 도구 테스트
export MCP_URL="https://bigquery-rag-mcp-nfp4nl2vna-uc.a.run.app"
python test_deployed_mcp.py질문:
What is the two-minute rule?테스트 클라이언트는 MCP 세션을 초기화하고 semantic_search를 호출하며 구조화된 검색 결과를 출력해야 합니다. HTTP 상태만 성공으로는 충분하지 않습니다. result_count가 0보다 크고 결과에 페이지 메타데이터가 포함되어 있는지 확인하십시오.
8. 동반 ADK 서비스 인증
동반 저장소에서 에이전트 서비스 계정을 생성한 후, 이 비공개 서비스를 호출할 수 있도록 허용:
export AGENT_SA="bigquery-rag-agent-sa@bigquery-semantic-search.iam.gserviceaccount.com"
gcloud run services add-iam-policy-binding "$MCP_SERVICE" \
--project="$PROJECT_ID" \
--region="$REGION" \
--member="serviceAccount:${AGENT_SA}" \
--role="roles/run.invoker"확인:
gcloud run services get-iam-policy "$MCP_SERVICE" \
--project="$PROJECT_ID" \
--region="$REGION" \
--flatten="bindings[].members" \
--filter="bindings.members:serviceAccount:${AGENT_SA}" \
--format="table(bindings.role,bindings.members)"ADK 서비스 계정은 이 서비스에 대해 run.invoker가 필요합니다. 각 Cloud Run 서비스는 고유한 ID와 책임이 있으므로 MCP 서비스의 BigQuery 역할은 필요하지 않습니다.
ADK + React 배포 가이드를 계속 진행합니다.
관찰 가능성
최근 로그 읽기:
gcloud run services logs read "$MCP_SERVICE" \
--project="$PROJECT_ID" \
--region="$REGION" \
--limit=100유용한 성공 로그 메시지:
Running semantic search with top_k=5Cloud Run 메트릭은 다음에서 확인 가능:
Google Cloud Console → Cloud Run → bigquery-rag-mcp → MetricsBigQuery 쿼리 기록 및 처리된 바이트는 BigQuery 작업 기록 또는 INFORMATION_SCHEMA.JOBS_BY_PROJECT에서 확인할 수 있습니다.
문제 해결
증상 | 원인 | 해결 방법 |
| 비공개 Cloud Run 요청에 유효한 ID 토큰이 없음 | ID 토큰을 전송하고 호출자에게 |
도구 결과에 의미론적 검색을 완료할 수 없다고 표시됨 | MCP 로그에서 기본 BigQuery 예외 확인 | 위의 로그 명령 실행 |
| MCP 런타임 SA가 | 런타임 SA와 연결을 BigQuery Connection User로 공유 |
Vertex/원격 모델 권한 거부됨 | 연결 관리 SA가 임베딩 엔드포인트를 호출할 수 없음 | 문서화된 Vertex AI/Agent Platform 사용자 역할을 연결 SA에 부여 |
| 클라이언트 코드가 설치된 MCP SDK 버전과 일치하지 않음 | 커밋된 |
| SDK가 콘텐츠 블록을 통해 오류를 노출할 수 있음 |
|
Cloud Run 뒤에서 출처/DNS 재바인딩 오류 | 전송 보안이 프록시 호스트 헤더를 신뢰하지 않음으로 처리 |
|
반환된 행 없음 | 모델/테이블 위치, 차원 또는 쿼리 상태 불일치 | 모델, 테이블, 연결, 위치 및 1,536 차원 확인 |
보안 및 데이터 처리
MCP Cloud Run 서비스는 비공개로 유지됩니다.
서비스 계정 JSON 키는 배포되거나 커밋되지 않습니다.
Cloud Run 서비스 ID 및 단기 Google ID 토큰이 사용됩니다.
사용자 쿼리 텍스트는 매개변수로 BigQuery에 전달됩니다.
도구는 읽기 전용으로 표시되며 검색 증거만 반환합니다.
.env, ADC 파일, PDF, JSONL 청크, 로그 및 로컬 데이터베이스는 Git에서 무시됩니다.소스 문서 및 추출된 청크는 이 저장소에 재배포되지 않습니다.
스크린샷이나 로그에 인증 토큰을 노출하지 마십시오.
현재 제한 사항
코퍼스는 하나의 문서에서 1,222개의 청크를 포함합니다.
검색은 brute-force이며 벡터 인덱스가 없습니다.
아직 재순위화기나 검색 평가 제품군이 없습니다.
MCP 도구는 구절을 반환합니다. 답변 품질과 인용은 동반 에이전트에 따라 다릅니다.
현재 공개 포트폴리오 구현은 다중 테넌트 수집 플랫폼이 아닌 문서별로 되어 있습니다.
권장되는 다음 개선 사항
질문/예상 소스 데이터셋을 사용한 검색 평가를 추가합니다.
유사성 임계값 및 기권 테스트를 추가합니다.
별도의 파이프라인으로 문서 수집 및 메타데이터 검증을 지원합니다.
검색 전에 테넌트/문서 필터를 추가합니다.
데이터셋이 충분히 커진 후 벡터 인덱스를 추가합니다.
구절 내용을 로깅하지 않고 지연 시간 및 결과 수에 대한 구조화된 Cloud Logging 필드를 추가합니다.
BigQuery를 모킹하는 단위 테스트와 배포된 MCP 서비스에 대한 통합 테스트를 추가합니다.
GitHub 게시
git add README.md
git commit -m "Add end-to-end MCP deployment documentation"
git remote add origin https://github.com/shrprabh/bigquery-rag-mcp.git
git push -u origin mainorigin이 이미 존재하는 경우 다시 추가하지 마십시오. git remote -v로 확인한 후 git push만 실행하십시오.
공식 참조
저자
Shreyas Prabhakar
GitHub: @shrprabh
LinkedIn: linkedin.com/in/shreyasprabhakar
Medium: @pshreyasgowda1997
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/shrprabh/bigquery-rag-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server