BigQuery RAG MCP Server
BigQuery RAG MCP Server
Ein privater Model Context Protocol (MCP)-Dienst, der eine natürlichsprachliche Frage in ein Embedding umwandelt, eine semantische Suche über in BigQuery gespeicherten Dokumentabschnitten durchführt und strukturierte Passagen mit Quellen- und Seitenmetadaten zurückgibt.
Dieses Repository besitzt die Retrieval-Schicht eines größeren dokumentengestützten Chatbots. Das begleitende Anwendungsrepository besitzt die Google ADK-Orchestrierung, die Gemini-Antwortgenerierung, die Firebase-Authentifizierung, die /chat-API und die React-Oberfläche.
Begleitende Anwendung: shrprabh/atomic-habits-adk-rag
Live-Bereitstellung
Ressource | Wert |
Cloud Run-Dienst |
|
Region |
|
Basis-URL |
|
MCP-Endpunkt |
|
Health-Endpunkt |
|
Zugriff | Privat; Cloud Run IAM-Authentifizierung erforderlich |
Die Dienst-URL ist absichtlich nicht öffentlich im Browser zugänglich. Ein Aufrufer muss roles/run.invoker auf dem Dienst haben und ein von Google signiertes Identitätstoken senden, dessen Zielgruppe die MCP-Basis-URL ist.
End-to-End-Architektur

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 metadataWas dieser Dienst tut
Stellt ein schreibgeschütztes MCP-Tool namens
semantic_searchbereit.Validiert
queryundtop_kmit Pydantic-generierten MCP-Schemas.Erstellt ein Query-Embedding mit
AI.GENERATE_EMBEDDINGunter Verwendung vonRETRIEVAL_QUERY.Führt eine Kosinus-Distanz
VECTOR_SEARCHüber gespeicherte Dokument-Embeddings durch.Verwendet einen parametrisierten Abfragewert anstatt Benutzereingaben in SQL einzufügen.
Gibt strukturierte Quellen-, Seiten-, Kapitel-, Abschnitts-, Distanz- und Ähnlichkeitsfelder zurück.
Läuft als zustandsloser Streamable HTTP MCP-Server.
Hält den Retrieval-Dienst mit Cloud Run IAM privat.
Ruft Gemini nicht auf, um eine Antwort zu verfassen; die Generierung gehört zum begleitenden ADK-Dienst.
Von diesem Projekt verwendete BigQuery-Ressourcen
Einstellung | Wert |
Google Cloud-Projekt |
|
BigQuery-Standort |
|
Dataset |
|
Cloud-Ressourcenverbindung |
|
Remote-Embedding-Modell |
|
Embedding-Tabelle |
|
Aktuelle Zeilen | 1.222 |
Embedding-Dimension | 1.536 |
Distanztyp | Kosinus |
Suchmodus | Exakte Brute-Force-Suche |
Die aktuelle Tabelle ist klein, daher verwendet diese Implementierung bewusst eine Brute-Force-Vektorsuche. Ein Vektorindex wird nützlich, sobald der Korpus groß genug ist, um eine approximative Nächste-Nachbarn-Suche und Indexwartung zu rechtfertigen.
MCP-Tool-Vertrag
semantic_search
Eingabe:
{
"query": "What is the two-minute rule?",
"top_k": 5
}Validierung:
Feld | Regeln |
| Zeichenkette, 2–500 Zeichen |
| Ganzzahl, 1–10; Standard |
Vereinfachte Ausgabe:
{
"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
}
]
}Repository-Struktur
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 importiert mcp aus server.py, sodass es das Tool im selben Python-Prozess ausführt. Es ist als lokaler Referenz- oder Regressionstest-Client nützlich, aber nicht Teil des bereitgestellten Produktionsanforderungspfads. Die begleitende ADK-Anwendung ruft diesen Dienst remote über /mcp auf.
Voraussetzungen
Python 3.12+
Google Cloud CLI
Ein Google Cloud-Projekt mit aktivierter Abrechnung
BigQuery-, BigQuery Connection-, Vertex AI-, Cloud Run-, Cloud Build- und Artifact Registry-APIs
Vorhandenes BigQuery-Dataset, Embedding-Modell und Embedding-Tabelle, die dem konfigurierten Schema entsprechen
Berechtigung zum Erstellen von Dienstkonten und Verwalten von Cloud Run- und BigQuery-IAM
1. Klonen und installieren
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.txtFür lokale Entwicklung außerhalb von Cloud Shell:
gcloud auth login
gcloud auth application-default login
gcloud config set project bigquery-semantic-searchCommitten Sie niemals Anwendungsstandard-Anmeldedaten oder Dienstkontoschlüsseldateien.
2. Umgebung konfigurieren
cp .env.example .envErwartete Werte:
GOOGLE_CLOUD_PROJECT=bigquery-semantic-search
BQ_DATASET=atomic_habits_rag
BQ_LOCATION=us-central1
EMBEDDING_DIM=1536server.py liest diese Werte aus der Prozessumgebung. Die eingecheckte .env.example dient nur als Dokumentation; verwenden Sie explizite Exports lokal oder Cloud Run-Umgebungsvariablen bei der Bereitstellung.
3. BigQuery-Assets überprüfen
Führen Sie im BigQuery-Editor aus:
SELECT
ARRAY_LENGTH(embedding) AS dimensions,
COUNT(*) AS row_count
FROM `bigquery-semantic-search.atomic_habits_rag.article_embeddings`
GROUP BY dimensions;Erwartet für das aktuelle Dataset:
dimensions row_count
1536 1222Bestätigen Sie, dass das Modell existiert:
SELECT
model_name,
model_type
FROM `bigquery-semantic-search.atomic_habits_rag.INFORMATION_SCHEMA.MODELS`
WHERE model_name = 'embedding_model';4. Laufzeit-IAM konfigurieren
Variablen setzen:
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"APIs aktivieren:
gcloud services enable \
bigquery.googleapis.com \
bigqueryconnection.googleapis.com \
aiplatform.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
--project="$PROJECT_ID"Erstellen Sie das Laufzeit-Dienstkonto, falls es noch nicht existiert:
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"Gewähren Sie dem Dienstkonto die Berechtigung, Abfragen auszuführen und das Dataset/Modell zu lesen:
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"Erforderliche Verbindungsberechtigung
Da AI.GENERATE_EMBEDDING die BigQuery Cloud-Ressourcenverbindung verwendet, muss die MCP-Laufzeitidentität auch die Berechtigung zur Nutzung von vertex_ai_connection haben.
In der Google Cloud-Konsole:
Öffnen Sie BigQuery → Ihr Projekt → Verbindungen.
Wählen Sie
vertex_ai_connectioninus-central1.Wählen Sie Freigeben.
Fügen Sie
bigquery-rag-mcp-sa@bigquery-semantic-search.iam.gserviceaccount.comhinzu.Gewähren Sie BigQuery Connection User (
roles/bigquery.connectionUser).
Verwenden Sie nicht bq add-iam-policy-binding --connection_type=...; dieses Flag teilt keine Verbindung und wird von aktuellen bq-Versionen abgelehnt. Verwenden Sie die Cloud-Konsole oder die BigQuery Connections-API für die Freigabe auf Verbindungsebene.
Die Verbindung selbst hat ein von Google verwaltetes Dienstkonto. Dieses Verbindungsdienstkonto muss die entsprechende Vertex AI/Agent Platform-Benutzerrolle im Projekt haben, damit das Remote-Embedding-Modell seinen Endpunkt aufrufen kann.
Ohne diese Verbindungsberechtigungen enthält das MCP-Protokoll einen Fehler ähnlich wie:
403 Access Denied: User does not have bigquery.connections.use permission5. Lokal testen
Kompilieren Sie die Dateien:
python -m py_compile server.py test_mcp.py rag_client.pyFühren Sie den direkten MCP-Regressionstest aus:
python test_mcp.pyStarten Sie den HTTP-Server:
python server.pyEndpunkte:
http://localhost:8000/health
http://localhost:8000/mcpVon einem anderen Terminal:
curl http://localhost:8000/healthErwartet:
{"status":"healthy"}Optional den lokalen Grounded-Generation-Referenzclient ausführen:
python rag_client.py6. Privaten MCP-Dienst bereitstellen
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 stellt PORT bereit; server.py bindet an 0.0.0.0 und verwendet diesen Port.
Die kanonische Dienst-URL abrufen:
export MCP_URL="$(
gcloud run services describe "$MCP_SERVICE" \
--project="$PROJECT_ID" \
--region="$REGION" \
--format='value(status.url)'
)"
echo "$MCP_URL"Die authentifizierte Health-Route testen:
curl -i \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
"$MCP_URL/health"Erwartet: HTTP 200 und {"status":"healthy"}.
7. Bereitgestelltes MCP-Tool testen
export MCP_URL="https://bigquery-rag-mcp-nfp4nl2vna-uc.a.run.app"
python test_deployed_mcp.pyFragen:
What is the two-minute rule?Der Testclient sollte eine MCP-Sitzung initialisieren, semantic_search aufrufen und strukturierte Retrieval-Ergebnisse ausgeben. Ein erfolgreicher HTTP-Status allein reicht nicht aus; überprüfen Sie, ob result_count größer als Null ist und das Ergebnis Seitenmetadaten enthält.
8. Begleitenden ADK-Dienst autorisieren
Nachdem Sie das Agent-Dienstkonto im begleitenden Repository erstellt haben, erlauben Sie ihm, diesen privaten Dienst aufzurufen:
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"Überprüfen:
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)"Das ADK-Dienstkonto benötigt run.invoker auf diesem Dienst. Es benötigt nicht die BigQuery-Rollen des MCP-Dienstes, da jeder Cloud Run-Dienst seine eigene Identität und Verantwortung hat.
Fahren Sie fort mit der ADK + React-Bereitstellungsanleitung.
Beobachtbarkeit
Aktuelle Protokolle lesen:
gcloud run services logs read "$MCP_SERVICE" \
--project="$PROJECT_ID" \
--region="$REGION" \
--limit=100Nützliche erfolgreiche Protokollnachricht:
Running semantic search with top_k=5Cloud Run-Metriken sind verfügbar unter:
Google Cloud Console → Cloud Run → bigquery-rag-mcp → MetricsBigQuery-Abfrageverlauf und verarbeitete Bytes sind im BigQuery-Jobverlauf oder in INFORMATION_SCHEMA.JOBS_BY_PROJECT verfügbar.
Fehlerbehebung
Symptom | Ursache | Lösung |
| Private Cloud Run-Anfrage hat kein gültiges Identitätstoken | Senden Sie ein ID-Token und stellen Sie sicher, dass der Aufrufer |
Tool-Ergebnis besagt, dass die semantische Suche nicht abgeschlossen werden konnte | Überprüfen Sie die MCP-Protokolle auf die zugrunde liegende BigQuery-Ausnahme | Führen Sie den obigen Protokollbefehl aus |
| MCP-Laufzeit-Dienstkonto kann | Teilen Sie die Verbindung mit dem Laufzeit-Dienstkonto als BigQuery Connection User |
Vertex/Remote-Modell-Berechtigung verweigert | Vom Verbindungsdienstkonto verwaltetes SA kann den Embedding-Endpunkt nicht aufrufen | Gewähren Sie dem Verbindungsdienstkonto die dokumentierte Vertex AI/Agent Platform-Benutzerrolle |
| Client-Code stimmt nicht mit der installierten MCP SDK-Version überein | Verwenden Sie das bereitgestellte |
| Das SDK kann Fehler über Inhaltsblöcke offenlegen | Überprüfen Sie das vollständige Tool-Ergebnis, nicht nur |
Origin/DNS-Rebinding-Fehler hinter Cloud Run | Transportsicherheit behandelt Proxy-Host-Header als nicht vertrauenswürdig | Der Server deaktiviert den DNS-Rebinding-Schutz nur, wenn |
Keine Zeilen zurückgegeben | Modell-/Tabellenort, Dimension oder Abfragestatus stimmen nicht überein | Überprüfen Sie Modell, Tabelle, Verbindung, Ort und die Dimension 1.536 |
Sicherheit und Datenverarbeitung
Der MCP Cloud Run-Dienst bleibt privat.
Es werden keine Dienstkontoschlüssel-JSONs bereitgestellt oder committet.
Es werden Cloud Run-Dienstidentität und kurzlebige Google-ID-Token verwendet.
Der Benutzerabfragetext wird als Parameter an BigQuery übergeben.
Das Tool ist als schreibgeschützt markiert und gibt nur Retrieval-Nachweise zurück.
.env, ADC-Dateien, PDFs, JSONL-Chunks, Protokolle und lokale Datenbanken werden von Git ignoriert.Das Quelldokument und die extrahierten Abschnitte werden in diesem Repository nicht weiterverteilt.
Setzen Sie Authentifizierungstoken nicht in Screenshots oder Protokollen offen.
Aktuelle Einschränkungen
Der Korpus enthält 1.222 Abschnitte aus einem Dokument.
Die Suche ist Brute-Force und hat keinen Vektorindex.
Es gibt noch kein Reranking oder Retrieval-Evaluierungssuite.
Das MCP-Tool gibt Passagen zurück; Antwortqualität und Zitate hängen vom begleitenden Agenten ab.
Die aktuelle öffentliche Portfolio-Implementierung ist dokumentspezifisch und keine Multi-Tenant-Ingestionsplattform.
Empfohlene nächste Verbesserungen
Retrieval-Evaluierung mit einem Frage-/Erwartete-Quelle-Datensatz hinzufügen.
Ähnlichkeitsschwellenwerte und Enthaltungstests hinzufügen.
Dokumenten-Ingestion und Metadatenvalidierung als separate Pipeline unterstützen.
Mandanten-/Dokumentenfilter vor dem Retrieval hinzufügen.
Einen Vektorindex hinzufügen, nachdem das Dataset groß genug ist.
Strukturierte Cloud Logging-Felder für Latenz und Ergebnisanzahl hinzufügen, ohne Passageninhalte zu protokollieren.
Unit-Tests, die BigQuery mocken, und Integrationstests für den bereitgestellten MCP-Dienst hinzufügen.
GitHub-Veröffentlichung
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 mainWenn origin bereits existiert, fügen Sie es nicht erneut hinzu. Überprüfen Sie mit git remote -v, führen Sie dann nur git push aus.
Offizielle Referenzen
Autor
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