BigQuery RAG MCP Server
BigQuery RAG MCP Server
Частный сервис Model Context Protocol (MCP), который преобразует вопрос на естественном языке в эмбеддинг, выполняет семантический поиск по фрагментам документов, хранящимся в BigQuery, и возвращает структурированные отрывки с метаданными источника и страницы.
Этот репозиторий владеет уровнем поиска более крупного чат-бота, основанного на документах. Репозиторий сопутствующего приложения владеет оркестрацией Google ADK, генерацией ответов Gemini, аутентификацией Firebase, API /chat и интерфейсом React.
Сопутствующее приложение: shrprabh/atomic-habits-adk-rag
Развертывание в реальном времени
Ресурс | Значение |
Сервис Cloud Run |
|
Регион |
|
Базовый URL |
|
Конечная точка MCP |
|
Конечная точка здоровья |
|
Доступ | Частный; требуется аутентификация Cloud Run IAM |
URL сервиса намеренно не является общедоступным в браузере. Вызывающий должен иметь роль roles/run.invoker на сервисе и отправлять подписанный Google токен идентификации, аудиторией которого является базовый URL MCP.
Сквозная архитектура

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Что делает этот сервис
Предоставляет инструмент MCP только для чтения с именем
semantic_search.Проверяет
queryиtop_kс помощью схем MCP, сгенерированных Pydantic.Создает эмбеддинг запроса с помощью
AI.GENERATE_EMBEDDING, используяRETRIEVAL_QUERY.Выполняет
VECTOR_SEARCHпо косинусному расстоянию для сохраненных эмбеддингов документов.Использует параметризованное значение запроса вместо вставки пользовательского ввода в SQL.
Возвращает структурированные поля источника, страницы, главы, раздела, расстояния и схожести.
Работает как stateless Streamable HTTP MCP сервер.
Сохраняет сервис поиска частным с помощью Cloud Run IAM.
Не вызывает Gemini для составления ответа; генерация принадлежит сопутствующему сервису ADK.
Ресурсы BigQuery, используемые этим проектом
Настройка | Значение |
Проект Google Cloud |
|
Расположение BigQuery |
|
Набор данных |
|
Подключение к облачным ресурсам |
|
Удаленная модель эмбеддинга |
|
Таблица эмбеддингов |
|
Текущее количество строк | 1,222 |
Размерность эмбеддинга | 1,536 |
Тип расстояния | Косинусное |
Режим поиска | Точный полный перебор |
Текущая таблица мала, поэтому в этой реализации намеренно используется полный перебор векторов. Векторный индекс становится полезным после того, как корпус вырастет достаточно, чтобы оправдать приближенный поиск ближайших соседей и обслуживание индекса.
Контракт инструмента 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 импортирует mcp из server.py, поэтому он выполняет инструмент в том же процессе Python. Он полезен как локальный эталонный или регрессионный клиент, но не является частью развернутого производственного пути запроса. Сопутствующее приложение ADK вызывает этот сервис удаленно через /mcp.
Предварительные требования
Python 3.12+
Google Cloud CLI
Проект Google Cloud с включенным биллингом
API BigQuery, BigQuery Connection, Vertex AI, Cloud Run, Cloud Build и Artifact Registry
Существующий набор данных BigQuery, модель эмбеддинга и таблица эмбеддингов, соответствующие настроенной схеме
Разрешение на создание сервисных аккаунтов и управление IAM для Cloud Run и BigQuery
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=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, идентификатор времени выполнения MCP также должен иметь разрешение на использование vertex_ai_connection.
В консоли Google Cloud:
Откройте BigQuery → ваш проект → Connections.
Выберите
vertex_ai_connectionвus-central1.Выберите Share.
Добавьте
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 или API BigQuery Connections.
Само подключение имеет управляемый 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.pyЗапустите HTTP-сервер:
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 больше нуля и результат содержит метаданные страницы.
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 на этом сервисе. Ему не нужны роли BigQuery сервиса MCP, потому что каждый сервис Cloud Run имеет свою собственную идентичность и ответственность.
Продолжите с руководством по развертыванию 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.
Устранение неполадок
Симптом | Причина | Решение |
| Частный запрос Cloud Run не имеет действительного токена идентификации | Отправьте ID-токен и убедитесь, что вызывающий имеет |
Результат инструмента говорит, что семантический поиск не удалось выполнить | Проверьте журналы MCP на предмет базового исключения BigQuery | Выполните команду просмотра журналов выше |
Отказано в | Сервисный аккаунт времени выполнения MCP не может использовать | Предоставьте общий доступ к подключению для сервисного аккаунта времени выполнения как BigQuery Connection User |
Отказано в разрешении Vertex/удаленной модели | Управляемый подключением сервисный аккаунт не может вызвать конечную точку эмбеддинга | Предоставьте документированную роль пользователя Vertex AI/Agent Platform сервисному аккаунту подключения |
| Клиентский код не соответствует установленной версии SDK MCP | Используйте зафиксированный |
| SDK может предоставлять ошибку через блоки содержимого | Проверьте полный результат инструмента, а не только |
Ошибка источника/DNS-привязки за Cloud Run | Безопасность транспорта считает заголовки прокси-хоста ненадежными | Сервер отключает защиту от DNS-привязки только когда |
Не возвращено строк | Несоответствие расположения модели/таблицы, размерности или статуса запроса | Проверьте модель, таблицу, подключение, расположение и размерность 1,536 |
Безопасность и обработка данных
Сервис Cloud Run MCP остается частным.
Ключи JSON сервисных аккаунтов не развертываются и не коммитятся.
Используются идентичность сервиса Cloud Run и кратковременные ID-токены Google.
Текст пользовательского запроса передается в BigQuery как параметр.
Инструмент помечен как только для чтения и возвращает только доказательства поиска.
.env, файлы ADC, PDF, фрагменты JSONL, журналы и локальные базы данных игнорируются Git.Исходный документ и извлеченные фрагменты не распространяются в этом репозитории.
Не раскрывайте токены аутентификации в скриншотах или журналах.
Текущие ограничения
Корпус содержит 1 222 фрагмента из одного документа.
Поиск выполняется полным перебором и не имеет векторного индекса.
Пока нет реранкера или набора для оценки поиска.
Инструмент 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 mainЕсли origin уже существует, не добавляйте его снова. Проверьте с помощью git remote -v, затем выполните только git push.
Официальные ссылки
Автор
Шрейас Прабхакар
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