Skip to main content
Glama
shrprabh

BigQuery RAG MCP Server

by shrprabh

BigQuery RAG MCP 서버

Python BigQuery Cloud Run MCP

자연어 질문을 임베딩으로 변환하고, BigQuery에 저장된 문서 청크에 대해 의미론적 검색을 수행하며, 소스 및 페이지 메타데이터와 함께 구조화된 구절을 반환하는 비공개 Model Context Protocol(MCP) 서비스입니다.

이 저장소는 더 큰 문서 기반 챗봇의 검색 계층을 담당합니다. 동반 애플리케이션 저장소는 Google ADK 오케스트레이션, Gemini 답변 생성, Firebase 인증, /chat API 및 React 인터페이스를 담당합니다.

동반 애플리케이션: shrprabh/atomic-habits-adk-rag

라이브 배포

리소스

Cloud Run 서비스

bigquery-rag-mcp

리전

us-central1

기본 URL

https://bigquery-rag-mcp-nfp4nl2vna-uc.a.run.app

MCP 엔드포인트

/mcp

헬스 엔드포인트

/health

액세스

비공개; Cloud Run IAM 인증 필요

서비스 URL은 의도적으로 브라우저에서 공개되지 않습니다. 호출자는 서비스에 대해 roles/run.invoker 권한이 있어야 하며, 대상이 MCP 기본 URL인 Google 서명 ID 토큰을 전송해야 합니다.

종단 간 아키텍처

Secure BigQuery RAG and Google ADK Architecture

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 스키마를 사용하여 querytop_k를 검증합니다.

  • RETRIEVAL_QUERY를 사용하여 AI.GENERATE_EMBEDDING으로 쿼리 임베딩을 생성합니다.

  • 저장된 문서 임베딩에 대해 코사인 거리 VECTOR_SEARCH를 수행합니다.

  • 사용자 입력을 SQL에 직접 삽입하는 대신 매개변수화된 쿼리 값을 사용합니다.

  • 구조화된 소스, 페이지, 장, 섹션, 거리 및 유사성 필드를 반환합니다.

  • 상태 비저장 Streamable HTTP MCP 서버로 실행됩니다.

  • Cloud Run IAM을 사용하여 검색 서비스를 비공개로 유지합니다.

  • 답변을 구성하기 위해 Gemini를 호출하지 않습니다. 생성은 동반 ADK 서비스에 속합니다.

이 프로젝트에서 사용하는 BigQuery 리소스

설정

Google Cloud 프로젝트

bigquery-semantic-search

BigQuery 위치

us-central1

데이터셋

atomic_habits_rag

Cloud 리소스 연결

vertex_ai_connection

원격 임베딩 모델

atomic_habits_rag.embedding_model

임베딩 테이블

atomic_habits_rag.article_embeddings

현재 행 수

1,222

임베딩 차원

1,536

거리 유형

코사인

검색 모드

정확 brute-force 검색

현재 테이블은 작으므로 이 구현에서는 의도적으로 brute-force 벡터 검색을 사용합니다. 벡터 인덱스는 코퍼스가 근사 최근접 이웃 검색 및 인덱스 유지 관리를 정당화할 만큼 충분히 커진 후에 유용해집니다.

MCP 도구 계약

입력:

{
  "query": "What is the two-minute rule?",
  "top_k": 5
}

검증:

필드

규칙

query

문자열, 2–500자

top_k

정수, 1–10; 기본값 5

간소화된 출력:

{
  "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
└── .gitignore

rag_client.pyserver.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.txt

Cloud 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=1536

server.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 콘솔에서:

  1. BigQuery → 프로젝트 → 연결을 엽니다.

  2. us-central1에서 vertex_ai_connection을 선택합니다.

  3. 공유를 선택합니다.

  4. bigquery-rag-mcp-sa@bigquery-semantic-search.iam.gserviceaccount.com을 추가합니다.

  5. 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 permission

5. 로컬 테스트

파일 컴파일:

python -m py_compile server.py test_mcp.py rag_client.py

직접 MCP 회귀 테스트 실행:

python test_mcp.py

HTTP 서버 시작:

python server.py

엔드포인트:

http://localhost:8000/health
http://localhost:8000/mcp

다른 터미널에서:

curl http://localhost:8000/health

예상:

{"status":"healthy"}

선택적으로 로컬 근거 생성 참조 클라이언트 실행:

python rag_client.py

6. 비공개 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.py0.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=5

Cloud Run 메트릭은 다음에서 확인 가능:

Google Cloud Console → Cloud Run → bigquery-rag-mcp → Metrics

BigQuery 쿼리 기록 및 처리된 바이트는 BigQuery 작업 기록 또는 INFORMATION_SCHEMA.JOBS_BY_PROJECT에서 확인할 수 있습니다.

문제 해결

증상

원인

해결 방법

/health403 반환

비공개 Cloud Run 요청에 유효한 ID 토큰이 없음

ID 토큰을 전송하고 호출자에게 roles/run.invoker가 있는지 확인

도구 결과에 의미론적 검색을 완료할 수 없다고 표시됨

MCP 로그에서 기본 BigQuery 예외 확인

위의 로그 명령 실행

bigquery.connections.use 거부됨

MCP 런타임 SA가 vertex_ai_connection을 사용할 수 없음

런타임 SA와 연결을 BigQuery Connection User로 공유

Vertex/원격 모델 권한 거부됨

연결 관리 SA가 임베딩 엔드포인트를 호출할 수 없음

문서화된 Vertex AI/Agent Platform 사용자 역할을 연결 SA에 부여

streamable_http_client()headers 또는 auth 거부

클라이언트 코드가 설치된 MCP SDK 버전과 일치하지 않음

커밋된 test_deployed_mcp.py를 사용하고 mcp 종속성 버전을 일치시키십시오

structured_contentnull

SDK가 콘텐츠 블록을 통해 오류를 노출할 수 있음

structured_content만이 아닌 전체 도구 결과를 검사

Cloud Run 뒤에서 출처/DNS 재바인딩 오류

전송 보안이 프록시 호스트 헤더를 신뢰하지 않음으로 처리

K_SERVICE가 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 도구는 구절을 반환합니다. 답변 품질과 인용은 동반 에이전트에 따라 다릅니다.

  • 현재 공개 포트폴리오 구현은 다중 테넌트 수집 플랫폼이 아닌 문서별로 되어 있습니다.

권장되는 다음 개선 사항

  1. 질문/예상 소스 데이터셋을 사용한 검색 평가를 추가합니다.

  2. 유사성 임계값 및 기권 테스트를 추가합니다.

  3. 별도의 파이프라인으로 문서 수집 및 메타데이터 검증을 지원합니다.

  4. 검색 전에 테넌트/문서 필터를 추가합니다.

  5. 데이터셋이 충분히 커진 후 벡터 인덱스를 추가합니다.

  6. 구절 내용을 로깅하지 않고 지연 시간 및 결과 수에 대한 구조화된 Cloud Logging 필드를 추가합니다.

  7. 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 main

origin이 이미 존재하는 경우 다시 추가하지 마십시오. git remote -v로 확인한 후 git push만 실행하십시오.

공식 참조

저자

Shreyas Prabhakar

-
license - not tested
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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.

View all MCP Connectors

Latest Blog Posts

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