В этом руководстве мы рассмотрим создание локального MCP-сервера на Python для поиска данных о товарах Amazon по запросу. Вы узнаете об основах MCP, о том, как написать и запустить собственный сервер, а также как подключить его к таким инструментам разработчика, как Claude Desktop и Cursor IDE. В завершение мы продемонстрируем реальную интеграцию Bright Data с MCP для получения веб-данных в режиме реального времени, готовых к искусственному интеллекту.
Давайте погрузимся.
Узкое место: Почему магистранты испытывают трудности с взаимодействием с реальным миром (и как MCP решает эту проблему)
Большие языковые модели (LLM) невероятно мощно обрабатывают и генерируют текст из массивных обучающих наборов данных. Но у них есть одно ключевое ограничение – они не могут взаимодействовать с реальным миром. Это означает отсутствие доступа к локальным файлам, запуска пользовательских скриптов и получения данных из Интернета.
Возьмем простой пример: попросите Claude получить данные о продукте с живой страницы Amazon, и он не сможет этого сделать. Почему? Потому что у него нет встроенной возможности просматривать веб-страницы или запускать внешние действия.
Без внешнего инструментария LLM не могут выполнять практические задачи, которые зависят от данных в реальном времени или интеграции с внешними системами.
Именно здесь на помощь приходит протокол контекста модели Anthropic (MCP). Он позволяет LLM общаться с внешними инструментами – скреперами, API или скриптами – безопасным и стандартизированным способом.
Вот разница в действии. После интеграции пользовательского MCP-сервера мы смогли извлекать структурированные данные о товарах Amazon непосредственно через Claude:
Не беспокойтесь пока о том, как это работает – мы расскажем обо всем пошагово далее в руководстве.
Почему MCP имеет значение?
- Стандартизация: MCP предоставляет стандартизированный интерфейс для подключения систем на базе LLM к внешним инструментам и данным – подобно тому, как API стандартизируют веб-интеграции. Это значительно сокращает потребность в пользовательских интеграциях и ускоряет разработку.
- Гибкость и масштабируемость: Разработчики могут менять LLM или хостинговые платформы, не переписывая интеграцию инструментов. MCP поддерживает множество коммуникационных транспортов (например,
stdio
), что делает его адаптируемым к различным настройкам. - Расширенные возможности LLM: Подключая LLM к живым данным и внешним инструментам, MCP позволяет им выйти за рамки статичных ответов. Теперь они могут возвращать актуальную, релевантную информацию и запускать реальные действия, основанные на контексте.
Аналогия: Считайте, что MCP – это USB-интерфейс для LLM. Как USB позволяет подключать различные устройства (клавиатуры, принтеры, внешние накопители) к любой совместимой машине, не требуя специальных драйверов, так и MCP позволяет LLM подключаться к широкому спектру инструментов по стандартизированному протоколу – без необходимости каждый раз интегрировать их по своему усмотрению.
Что такое контекстный протокол модели (MCP)?
Model Context Protocol (MCP) – это открытый стандарт, разработанный компанией Anthropic, который позволяет большим языковым моделям (LLM) взаимодействовать с внешними инструментами, API и источниками данных согласованным и безопасным способом. Он выступает в качестве универсального коннектора, позволяющего LLM выполнять такие реальные задачи, как поиск веб-сайтов, запрос баз данных или запуск скриптов.
Стандарт MCP является открытым и расширяемым, то есть любой желающий может его внедрить или внести свой вклад в его развитие. Если вы работали с Retrieval-Augmented Generation (RAG), вы оцените эту концепцию. MCP опирается на эту идею, стандартизируя взаимодействие через легкий интерфейс JSON-RPC, чтобы модели могли получать доступ к живым данным и предпринимать действия.
Архитектура MCP: Как это работает
По своей сути MCP стандартизирует связь между моделью ИИ и внешними возможностями.
Основная идея: Стандартизированный интерфейс (обычно JSON-RPC 2.0 через транспорты типа stdio
) позволяет LLM (через клиента) обнаруживать и вызывать инструменты, предоставляемые внешними серверами.
MCP работает по архитектуре клиент-сервер, состоящей из трех ключевых компонентов:
- MCP Host: Среда или приложение, которое инициирует и управляет взаимодействием между LLM и внешними инструментами. Примерами могут служить помощники ИИ, такие как Claude Desktop, или IDE, такие как Cursor.
- Клиент MCP: Компонент хоста, который устанавливает и поддерживает соединения с серверами MCP, обрабатывает протоколы связи и управляет обменом данными.
- MCP-сервер: Программа (которую создаем мы, разработчики), реализующая протокол MCP и предоставляющая определенный набор возможностей. MCP-сервер может взаимодействовать с базой данных, веб-сервисом или, как в нашем случае, с веб-сайтом (Amazon). Серверы раскрывают свою функциональность стандартными способами
:Polylang placeholder do not modify
Вот схема архитектуры MCP:
Источник изображения: Контекстный протокол модели
При такой настройке хост (Claude Desktop или Cursor IDE) порождает MCP-клиент, который затем подключается к внешнему MCP-серверу. Этот сервер открывает инструменты, ресурсы и подсказки, позволяя ИИ взаимодействовать с ними по мере необходимости.
Вкратце, рабочий процесс выглядит следующим образом:
- Пользователь отправляет сообщение типа “Получить информацию о продукте по этой ссылке Amazon”.
- Клиент MCP проверяет наличие зарегистрированного инструмента, который может справиться с этой задачей
- Клиент отправляет структурированный запрос на сервер MCP
- Сервер MCP выполняет соответствующее действие (например, запускает безголовый браузер).
- Сервер возвращает структурированные результаты клиенту MCP
- Клиент передает результаты в LLM, который представляет их пользователю.
Создание пользовательского сервера MCP
Давайте создадим MCP-сервер на Python, который будет скрести страницы товаров Amazon.
На этом сервере будут представлены два инструмента: один для загрузки HTML, а другой – для извлечения структурированной информации. Вы будете взаимодействовать с сервером через LLM-клиент в Cursor или Claude Desktop.
Шаг 1: Настройка среды
Во-первых, убедитесь, что у вас установлен Python 3. Затем создайте и активируйте виртуальную среду:
python -m venv mcp-amazon-scraper
# On macOS/Linux:
source mcp-amazon-scraper/bin/activate
# On Windows:
.\mcp-amazon-scraper\Scripts\activate
Установите необходимые библиотеки: MCP Python SDK, Playwright и LXML.
pip install mcp playwright lxml
# Install browser binaries for Playwright
python -m playwright install
Это устанавливает:
- mcp: Python SDK для серверов и клиентов Model Context Protocol, который обрабатывает все детали взаимодействия JSON-RPC
- playwright: Библиотека автоматизации браузера, предоставляющая возможности “безголового” браузера для рендеринга и создания веб-сайтов на JavaScript
- lxml: Библиотека для быстрого разбора XML/HTML, которая позволяет легко извлекать определенные элементы данных из веб-страниц с помощью запросов XPath
Короче говоря, MCP Python SDK(mcp
) обрабатывает все детали протокола, позволяя вам создавать инструменты, которые Claude или Cursor могут вызывать с помощью подсказок на естественном языке. Playwright позволяет нам полностью рендерить веб-страницы (включая содержимое JavaScript), а lxml дает нам мощные возможности разбора HTML.
Шаг 2: Инициализация сервера MCP
Создайте Python-файл с именем amazon_scraper_mcp.py
. Начните с импорта необходимых модулей и инициализации сервера FastMCP
:
import os
import asyncio
from lxml import html as lxml_html
from mcp.server.fastmcp import FastMCP
from playwright.async_api import async_playwright
# Define a temporary file path for the HTML content
HTML_FILE = os.path.join(os.getenv("TMPDIR", "/tmp"), "amazon_product_page.html")
# Initialize the MCP server with a descriptive name
mcp = FastMCP("Amazon Product Scraper")
print("MCP Server Initialized: Amazon Product Scraper")
Это создаст экземпляр сервера MCP. Теперь мы добавим на него инструменты.
Шаг 3: Реализация инструмента fetch_page
Этот инструмент принимает URL-адрес, использует Playwright для перехода на страницу, дожидается загрузки содержимого, загружает HTML и сохраняет его во временном файле.
@mcp.tool()
async def fetch_page(url: str) -> str:
"""
Fetches the HTML content of the given Amazon product URL using Playwright
and saves it to a temporary file. Returns a status message.
"""
print(f"Executing fetch_page for URL: {url}")
try:
async with async_playwright() as p:
# Launch headless Chromium browser
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
# Navigate to the URL with a generous timeout
await page.goto(url, timeout=90000, wait_until="domcontentloaded")
# Wait for a key element (e.g., body) to ensure basic loading
await page.wait_for_selector("body", timeout=30000)
# Add a small delay for any dynamic content rendering via JavaScript
await asyncio.sleep(5)
html_content = await page.content()
with open(HTML_FILE, "w", encoding="utf-8") as f:
f.write(html_content)
await browser.close()
print(f"Successfully fetched and saved HTML to {HTML_FILE}")
return f"HTML content for {url} downloaded and saved successfully to {HTML_FILE}."
except Exception as e:
error_message = f"Error fetching page {url}: {str(e)}"
print(error_message)
return error_message
Эта асинхронная функция использует Playwright для обработки потенциального рендеринга JavaScript на страницах Amazon. Декоратор @mcp.tool()
регистрирует эту функцию как вызываемый инструмент на нашем сервере.
Шаг 4: Реализация инструмента extract_info
Этот инструмент считывает HTML-файл, сохраненный fetch_page
, разбирает его с помощью селекторов LXML и XPath и возвращает словарь, содержащий извлеченные сведения о продукте.
def _extract_xpath(tree, xpath, default="N/A"):
"""Helper function to extract text using XPath, returning default if not found."""
try:
# Use text_content() to get text from node and children, strip whitespace
result = tree.xpath(xpath)
if result:
return result[0].text_content().strip()
return default
except Exception:
return default
def _extract_price(price_str):
"""Helper function to parse price string into a float."""
if price_str == "N/A":
return None
try:
# Remove currency symbols and commas, handle potential whitespace
cleaned_price = "".join(filter(str.isdigit or str.__eq__("."), price_str))
return float(cleaned_price)
except (ValueError, TypeError):
return None
@mcp.tool()
def extract_info() -> dict:
"""
Parses the saved HTML file (downloaded by fetch_page) to extract
Amazon product details like title, price, rating, features, etc.
Returns a dictionary of the extracted data.
"""
print(f"Executing extract_info from file: {HTML_FILE}")
if not os.path.exists(HTML_FILE):
return {
"error": f"HTML file not found at {HTML_FILE}. Please run fetch_page first."
}
try:
with open(HTML_FILE, "r", encoding="utf-8") as f:
page_html = f.read()
tree = lxml_html.fromstring(page_html)
# --- XPath Selectors for Amazon Product Details ---
title = _extract_xpath(tree, '//span[@id="productTitle"]')
# Handle different price structures (main price, sale price)
price_whole = _extract_xpath(tree, '//span[contains(@class, "a-price-whole")]')
price_fraction = _extract_xpath(
tree, '//span[contains(@class, "a-price-fraction")]'
)
price_str = (
f"{price_whole}.{price_fraction}"
if price_whole != "N/A"
else _extract_xpath(tree, '//span[contains(@class,"a-offscreen")]')
) # Fallback to offscreen if needed
price = _extract_price(price_str)
# Original price (strike-through)
original_price_str = _extract_xpath(
tree, '//span[@class="a-price a-text-price"]//span[@class="a-offscreen"]'
)
original_price = _extract_price(original_price_str)
# Rating
rating_text = _extract_xpath(tree, '//span[@id="acrPopover"]/@title')
rating = None
if rating_text != "N/A":
try:
rating = float(rating_text.split()[0])
except (ValueError, IndexError):
rating = None
# Review Count
reviews_text = _extract_xpath(tree, '//span[@id="acrCustomerReviewText"]')
review_count = None
if reviews_text != "N/A":
try:
review_count = int(reviews_text.split()[0].replace(",", ""))
except (ValueError, IndexError):
review_count = None
# Availability
availability = _extract_xpath(
tree,
'//div[@id="availability"]//span/text()',
)
# Features (bullet points)
feature_elements = tree.xpath(
'//div[@id="feature-bullets"]//li//span[@class="a-list-item"]'
)
features = [
elem.text_content().strip()
for elem in feature_elements
if elem.text_content().strip()
]
# Calculate Discount
discount = None
if price and original_price and original_price > price:
discount = round(((original_price - price) / original_price) * 100)
extracted_data = {
"title": title,
"price": price,
"original_price": original_price,
"discount_percent": discount,
"rating_stars": rating,
"review_count": review_count,
"features": features,
"availability": availability.strip(),
}
print(f"Successfully extracted data: {extracted_data}")
return extracted_data
except Exception as e:
error_message = f"Error parsing HTML: {str(e)}"
print(error_message) # Added for logging
return {"error": error_message}
Эта функция использует функцию LXML fromstring
для разбора HTML и надежные селекторы XPath для поиска нужных элементов.
Шаг 5: Запустите сервер
Наконец, добавьте следующие строки в конец сценария amazon_scraper_mcp.py
, чтобы запустить сервер, используя транспортный механизм stdio
, который является стандартным для локальных MCP-серверов, взаимодействующих с такими клиентами, как Claude Desktop или Cursor.
if __name__ == "__main__":
print("Starting MCP Server with stdio transport...")
# Run the server, listening via standard input/output
mcp.run(transport="stdio")
Полный код(amazon_scraper_mcp.py
)
import os
import asyncio
from lxml import html as lxml_html
from mcp.server.fastmcp import FastMCP
from playwright.async_api import async_playwright
# Define a temporary file path for the HTML content
HTML_FILE = os.path.join(os.getenv("TMPDIR", "/tmp"), "amazon_product_page.html")
# Initialize the MCP server with a descriptive name
mcp = FastMCP("Amazon Product Scraper")
print("MCP Server Initialized: Amazon Product Scraper")
@mcp.tool()
async def fetch_page(url: str) -> str:
"""
Fetches the HTML content of the given Amazon product URL using Playwright
and saves it to a temporary file. Returns a status message.
"""
print(f"Executing fetch_page for URL: {url}")
try:
async with async_playwright() as p:
# Launch headless Chromium browser
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
# Navigate to the URL with a generous timeout
await page.goto(url, timeout=90000, wait_until="domcontentloaded")
# Wait for a key element (e.g., body) to ensure basic loading
await page.wait_for_selector("body", timeout=30000)
# Add a small delay for any dynamic content rendering via JavaScript
await asyncio.sleep(5)
html_content = await page.content()
with open(HTML_FILE, "w", encoding="utf-8") as f:
f.write(html_content)
await browser.close()
print(f"Successfully fetched and saved HTML to {HTML_FILE}")
return f"HTML content for {url} downloaded and saved successfully to {HTML_FILE}."
except Exception as e:
error_message = f"Error fetching page {url}: {str(e)}"
print(error_message)
return error_message
def _extract_xpath(tree, xpath, default="N/A"):
"""Helper function to extract text using XPath, returning default if not found."""
try:
# Use text_content() to get text from node and children, strip whitespace
result = tree.xpath(xpath)
if result:
return result[0].text_content().strip()
return default
except Exception:
return default
def _extract_price(price_str):
"""Helper function to parse price string into a float."""
if price_str == "N/A":
return None
try:
# Remove currency symbols and commas, handle potential whitespace
cleaned_price = "".join(filter(str.isdigit or str.__eq__("."), price_str))
return float(cleaned_price)
except (ValueError, TypeError):
return None
@mcp.tool()
def extract_info() -> dict:
"""
Parses the saved HTML file (downloaded by fetch_page) to extract
Amazon product details like title, price, rating, features, etc.
Returns a dictionary of the extracted data.
"""
print(f"Executing extract_info from file: {HTML_FILE}")
if not os.path.exists(HTML_FILE):
return {
"error": f"HTML file not found at {HTML_FILE}. Please run fetch_page first."
}
try:
with open(HTML_FILE, "r", encoding="utf-8") as f:
page_html = f.read()
tree = lxml_html.fromstring(page_html)
# --- XPath Selectors for Amazon Product Details ---
title = _extract_xpath(tree, '//span[@id="productTitle"]')
# Handle different price structures (main price, sale price)
price_whole = _extract_xpath(tree, '//span[contains(@class, "a-price-whole")]')
price_fraction = _extract_xpath(
tree, '//span[contains(@class, "a-price-fraction")]'
)
price_str = (
f"{price_whole}.{price_fraction}"
if price_whole != "N/A"
else _extract_xpath(tree, '//span[contains(@class,"a-offscreen")]')
) # Fallback to offscreen if needed
price = _extract_price(price_str)
# Original price (strike-through)
original_price_str = _extract_xpath(
tree, '//span[@class="a-price a-text-price"]//span[@class="a-offscreen"]'
)
original_price = _extract_price(original_price_str)
# Rating
rating_text = _extract_xpath(tree, '//span[@id="acrPopover"]/@title')
rating = None
if rating_text != "N/A":
try:
rating = float(rating_text.split()[0])
except (ValueError, IndexError):
rating = None
# Review Count
reviews_text = _extract_xpath(tree, '//span[@id="acrCustomerReviewText"]')
review_count = None
if reviews_text != "N/A":
try:
review_count = int(reviews_text.split()[0].replace(",", ""))
except (ValueError, IndexError):
review_count = None
# Availability
availability = _extract_xpath(
tree,
'//div[@id="availability"]//span/text()',
)
# Features (bullet points)
feature_elements = tree.xpath(
'//div[@id="feature-bullets"]//li//span[@class="a-list-item"]'
)
features = [
elem.text_content().strip()
for elem in feature_elements
if elem.text_content().strip()
]
# Calculate Discount
discount = None
if price and original_price and original_price > price:
discount = round(((original_price - price) / original_price) * 100)
extracted_data = {
"title": title,
"price": price,
"original_price": original_price,
"discount_percent": discount,
"rating_stars": rating,
"review_count": review_count,
"features": features,
"availability": availability.strip(),
}
print(f"Successfully extracted data: {extracted_data}")
return extracted_data
except Exception as e:
error_message = f"Error parsing HTML: {str(e)}"
print(error_message) # Added for logging
return {"error": error_message}
if __name__ == "__main__":
print("Starting MCP Server with stdio transport...")
# Run the server, listening via standard input/output
mcp.run(transport="stdio")
Интеграция вашего пользовательского сервера MCP
Теперь, когда сценарий сервера готов, давайте подключим его к MCP-клиентам, таким как Claude Desktop и Cursor.
Подключение к рабочему столу Claude
Шаг 1: Откройте рабочий стол Claude Desktop.
Шаг 2: Перейдите в Настройки
-> Разработчик
-> Редактировать конфигурацию
. Это откроет файл claude_desktop_config.json
в вашем стандартном текстовом редакторе.
Шаг 3: Добавьте запись для вашего сервера в ключе mcpServers
. Убедитесь, что путь в args
заменен на абсолютный путь к вашему файлу amazon_scraper_mcp.py
.
{
"mcpServers": {
"amazon_product_scraper": {
"command": "python", // Or python3 if needed
"args": ["/full/path/to/your/amazon_scraper_mcp.py"], // <-- IMPORTANT: Use the correct absolute path
}
}
}
Шаг 4: Сохраните файл claude_desktop_config.json
, полностью закройте и снова откройте Claude Desktop, чтобы изменения вступили в силу.
Шаг 5: На рабочем столе Claude Desktop в области ввода чата должен появиться маленький значок инструментов (похожий на молоток 🔨).
Шаг 6: Нажав на нее, вы увидите список “Amazon Product Scraper” с его инструментами fetch_page
и extract_info
.
Шаг 7: Отправьте запрос, например: “Получите текущую цену, оригинальную цену и рейтинг для этого товара Amazon: https://www.amazon.com/dp/B09C13PZX7″.
Шаг 8: Claude обнаружит, что для этого требуются внешние инструменты, и запросит разрешение на запуск сначала fetch_page
, а затем extract_info
. Нажмите “Разрешить для этого чата” для каждого инструмента.
Шаг 9: После предоставления разрешений сервер MCP выполнит инструменты. Затем Клод получит структурированные данные и представит их в чате.
🔥 Отлично, вы успешно создали и интегрировали свой первый MCP-сервер!
Подключение к курсору
Процесс создания Cursor (IDE, ориентированной на искусственный интеллект) аналогичен.
Шаг 1: Откройте курсор.
Шаг 2: Перейдите на страницу Настройки
⚙️ и перейдите в раздел MCP
.
Шаг 3: Нажмите “+Добавить новый глобальный MCP-сервер”. Откроется файл конфигурации mcp.json
. Добавьте запись для вашего сервера, снова используя абсолютный путь к вашему скрипту.
Шаг 4: Сохраните файл mcp.json
, и вы должны увидеть в списке ваш “amazon_product_scraper”, надеюсь, с зеленой точкой, указывающей на то, что он запущен и подключен.
Шаг 5: Воспользуйтесь функцией чата в Cursor(Cmd+l
или Ctrl+l
).
Шаг 6: Отправьте запрос, например: “Извлеките все доступные данные о товарах из этого URL Amazon: https://www.amazon.com/dp/B09C13PZX7. Оформите результат в виде структурированного объекта JSON”.
Шаг 7: Как и в случае с Claude Desktop, курсор запросит разрешение на запуск инструментов fetch_page
и extract_info
. Одобрите эти запросы (“Run Tool”).
Шаг 8: Курсор будет отображать поток взаимодействия, показывая вызовы ваших инструментов MCP и, наконец, представляя структурированные данные JSON, возвращаемые вашим инструментом extract_info
.
Вот пример вывода JSON из Cursor:
{
"title": "Razer Basilisk V3 Customizable Ergonomic Gaming Mouse: Fastest Gaming Mouse Switch - Chroma RGB Lighting - 26K DPI Optical Sensor - 11 Programmable Buttons - HyperScroll Tilt Wheel - Classic Black",
"price": 39.99,
"original_price": 69.99,
"discount_percent": 43,
"rating_stars": 4.6,
"review_count": 7782,
"features": [
"ICONIC ERGONOMIC DESIGN WITH THUMB REST — PC gaming mouse favored by millions worldwide with a form factor that perfectly supports the hand while its buttons are optimally positioned for quick and easy access",
"11 PROGRAMMABLE BUTTONS — Assign macros and secondary functions across 11 programmable buttons to execute essential actions like push-to-talk, ping, and more",
"HYPERSCROLL TILT WHEEL — Speed through content with a scroll wheel that free-spins until its stopped or switch to tactile mode for more precision and satisfying feedback that's ideal for cycling through weapons or skills",
"11 RAZER CHROMA RGB LIGHTING ZONES — Customize each zone from over 16.8 million colors and countless lighting effects, all while it reacts dynamically with over 150 Chroma integrated games",
"OPTICAL MOUSE SWITCHES GEN 2 — With zero unintended misclicks these switches provide crisp, responsive execution at a blistering 0.2ms actuation speed for up to 70 million clicks",
"FOCUS+ 26K DPI OPTICAL SENSOR — Best-in-class mouse sensor with intelligent functions flawlessly tracks movement with zero smoothing, allowing for crisp response and pixel-precise accuracy",
// ... (other features)
],
"availability": "In Stock"
}
Это демонстрирует гибкость MCP – один и тот же сервер легко работает с различными клиентскими приложениями.
Интеграция MCP от Bright Data для извлечения веб-данных на основе искусственного интеллекта
Собственные MCP-серверы обеспечивают полный контроль, но сопряжены с такими проблемами, как управление прокси-инфраструктурой, работа со сложными механизмами защиты от ботов и обеспечение масштабируемости. Bright Data решает эти проблемы с помощью своего готового MCP-решения производственного класса, предназначенного для бесшовной интеграции с агентами искусственного интеллекта и LLM.
Интеграция Model Context Protocol (MCP) с Bright Data обеспечивает LLM и агентам ИИ беспрепятственный доступ в режиме реального времени к публичным веб-данным, специально разработанным для рабочих процессов ИИ. Подключившись к MCP Bright Data, ваши приложения и модели смогут получать результаты SERP из всех основных поисковых систем и без проблем открывать доступ к труднодоступным веб-сайтам.
Решение Model Context Protocol (MCP) от Bright Data соединяет ваше приложение с набором мощных инструментов для извлечения веб-данных, включая Web Unlocker, SERP API, Web Scraper API и Scraping Browser, обеспечиваякомплексную инфраструктуру, которая:
- Предоставляет данные, готовые для искусственного интеллекта: Автоматическое извлечение и форматирование веб-контента, сокращение дополнительных этапов предварительной обработки.
- Обеспечивает масштабируемость и надежность: Использование надежной инфраструктуры для обработки большого количества запросов без ущерба для производительности.
- Обходит блокировки и CAPTCHA: Использует передовые стратегии защиты от ботов для навигации и получения содержимого даже самых защищенных веб-сайтов.
- Предлагает глобальное IP-покрытие: Использует обширную сеть прокси-серверов, охватывающую 195 стран, для доступа к контенту с географическими ограничениями.
- Упрощенная интеграция: Минимизация усилий по настройке благодаря бесшовной работе с любыми клиентами MCP.
Необходимые условия для Bright Data MCP
Прежде чем приступить к интеграции Bright Data MCP, убедитесь, что у вас есть следующее:
- Учетная запись Bright Data: Зарегистрируйтесь на сайте brightdata.com. Новые пользователи получают бесплатные кредиты для тестирования.
- API-токен: Получите токен API из настроек учетной записи Bright Data(страница настроек пользователя).
- Зона Web Unlocker: Создайте прокси-зону Web Unlocker в панели управления Bright Data. Назовите ее каким-нибудь запоминающимся именем, например
mcp_unlocker
(при необходимости вы можете изменить его позже с помощью переменных окружения). - (Необязательно) Зона Scraping Browser: если вам нужны расширенные возможности автоматизации браузера (например, для сложных взаимодействий с JavaScript или создания скриншотов), создайте зону Scraping Browser. Обратите внимание на данные аутентификации (имя пользователя и пароль), указанные для этой зоны (на вкладке ” Обзор” ), обычно в формате
brd-customer-ACCOUNT_ID-zone-ZONE_NAME:PASSWORD
.
Быстрый старт: Настройка Bright Data MCP для Claude Desktop
Шаг 1: Сервер Bright Data MCP обычно запускается с помощью npx
, который поставляется с Node.js. Установите Node.js, если вы еще этого не сделали, с официального сайта.
Шаг 2: Откройте Claude Desktop -> Настройки
-> Разработчик
-> Редактировать конфигурацию
(claude_desktop_config.json
).
Шаг 3: Добавьте конфигурацию сервера Bright Data в раздел mcpServers
. Замените пропуски на реальные учетные данные.
{
"mcpServers": {
"Bright Data": { // Choose a name for the server
"command": "npx",
"args": ["@brightdata/mcp"],
"env": {
"API_TOKEN": "YOUR_BRIGHTDATA_API_TOKEN", // Paste your API token here
"WEB_UNLOCKER_ZONE": "mcp_unlocker", // Your Web Unlocker zone name
// Optional: Add if using Scraping Browser tools
"BROWSER_AUTH": "brd-customer-ACCOUNTID-zone-YOURZONE:PASSWORD"
}
}
}
}
Шаг 4: Сохраните файл конфигурации и перезапустите Claude Desktop.
Шаг 5: Наведите курсор на значок молотка (🔨) на рабочем столе Claude. Теперь вы должны увидеть несколько инструментов MCP.
Попробуем извлечь данные с сайта Zillow, который известен тем, что потенциально может блокировать скреперы. Отправьте запрос claude с текстом “Extract key property data in JSON format from this Zillow URL: https://www.zillow.com/apartments/arverne-ny/the-tides-at-arverne-by-the-sea/ChWHPZ/”.
Позвольте Клоду использовать необходимые инструменты Bright Data MCP. MCP-сервер Bright Data справится с основными сложностями (ротация прокси, рендеринг JavaScript через Scraping Browser, если необходимо).
Сервер Bright Data выполняет извлечение и возвращает структурированные данные, которые представляет Клод.
Вот фрагмент потенциального результата:
{
"propertyInfo": {
"name": "The Tides At Arverne By The Sea",
"address": "190 Beach 69th St, Arverne, NY 11692",
"propertyType": "Apartment building",
// ... more info
},
"rentPrices": {
"studio": { "startingPrice": "$2,750", /* ... */ },
"oneBed": { "startingPrice": "$2,900", /* ... */ },
"twoBed": { "startingPrice": "$3,350", /* ... */ }
},
// ... amenities, policies, etc.
}
🔥 Это потрясающе!
Еще один пример: Заголовки новостей хакеров
Более простой запрос:“Дайте мне названия 5 последних новостных статей из Hacker News“.
Здесь показано, как MCP-сервер Bright Data упрощает доступ даже к динамическому или сильно защищенному веб-контенту непосредственно в рамках рабочего процесса AI.
Заключение
Как мы уже рассказывали в этом руководстве, контекстно-модельный протокол Anthropic представляет собой фундаментальный сдвиг в том, как системы искусственного интеллекта взаимодействуют с внешним миром. Как мы уже видели, вы можете создавать собственные MCP-серверы для выполнения конкретных задач, как, например, наш скребок Amazon. Интеграция с MCP от Bright Data еще больше улучшает эту задачу, предлагая возможности веб-скреппинга корпоративного уровня, которые обходят защиту от ботов и предоставляют структурированные данные, готовые для ИИ.
Мы также отобрали несколько лучших ресурсов по ИИ и большим языковым моделям (LLM). Обязательно ознакомьтесь с ними, чтобы получить более подробную информацию:
- Лучшие источники для поиска учебных данных LLM
- Веб-скрепинг с LLaMA 3: превращаем любой сайт в структурированный JSON
- Веб-скрепинг с помощью LangChain и Bright Data
- Как создать RAG-чатбот с помощью GPT-4o на основе данных SERP
Кредитная карта не требуется