🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Kết nối AI Agent với Dữ liệu Web Trực tiếp: Hướng dẫn Tích hợp AWS Strands + Máy chủ MCP Không Scrapeless

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

18-May-2026

Những điểm chính:

  • AWS Strands SDK + Scrapeless MCP cung cấp cho các đại lý AI một bề mặt công cụ dữ liệu web kiểu. Đại lý gọi google_search, scrape_html, scrape_markdown, và các công cụ phiên duyệt web đầy đủ (browser_createbrowser_gotobrowser_wait_forbrowser_get_htmlbrowser_close) trực tiếp thông qua vòng lặp đại lý, mà không cần mã trung gian xung quanh một REST API.
  • 21 công cụ MCP trên điểm cuối được lưu trữ (https://api.scrapeless.com/mcp). Kiểm soát phiên duyệt (16 công cụ), tìm kiếm (google_search, google_trends), và thu thập không trạng thái (scrape_html, scrape_markdown, scrape_screenshot) — được cung cấp bởi scrapeless-mcp-server trên HTTP có thể phát trực tuyến. Điểm cuối lưu trữ báo cáo serverInfo.name: "scrapeless-mcp-server", phiên bản 0.2.0 tại thời điểm xuất bản.
  • Trình duyệt đám mây với đầu ra proxy dân cư. Các trang được hiển thị trong Scrapeless Scraping Browser trước khi đại lý đọc DOM, vì vậy các mục tiêu nặng JavaScript có thể hoạt động mà không cần hạ tầng trình duyệt cục bộ. Tỷ lệ vượt qua thay đổi theo trang: các trang thử thách đơn giản có thể thoát sau một thời gian browser_wait ngắn, trong khi các trang với các lớp phát hiện bot nghiêm ngặt hơn vẫn có thể chặn phiên MCP mặc định — đối với các mục tiêu này, quay lại bề mặt SDK với một hồ sơ trình duyệt được cấu hình sẵn.
  • Vòng lặp đại lý không phụ thuộc vào mô hình. Chu kỳ nhận thức → lý luận → hành động của Strands cho phép Claude (hoặc bất kỳ mô hình hỗ trợ nào) tự quyết định các cuộc gọi công cụ. Hướng dẫn này sử dụng Anthropic Claude thông qua nhà cung cấp Strands Anthropic.
  • Bắt đầu miễn phí. Các tài khoản Scrapeless mới bao gồm môi trường thực thi Scraping Browser miễn phí — đăng ký tại trang web scrapeless và xem trang giá cả khi bạn vượt quá giới hạn.

Các đại lý AI được hỗ trợ bởi các mô hình ngôn ngữ lớn (LLMs) có thể lý luận và ra quyết định, nhưng chúng bị giới hạn bởi dữ liệu đào tạo của chúng. Để xây dựng các đại lý thực sự hữu ích, bạn kết nối chúng với dữ liệu web theo thời gian thực. Hướng dẫn này cho bạn biết cách kết hợp AWS Strands SDK với máy chủ MCP của Scrapeless để tạo ra các đại lý AI tự động có thể truy cập và phân tích dữ liệu web trực tiếp.

Trong hướng dẫn này, bạn sẽ học:

  • AWS Strands SDK là gì và điều gì khiến nó trở thành một framework hữu ích cho việc xây dựng các đại lý AI.
  • Tại sao AWS Strands SDK kết hợp tốt với máy chủ MCP của Scrapeless cho các đại lý nhận biết web.
  • Cách tích hợp AWS Strands với máy chủ MCP của Scrapeless để tạo ra một đại lý thông minh cạnh tranh tự động.
  • Cách xây dựng các đại lý tự động quyết định sử dụng công cụ thu thập dữ liệu web nào dựa trên mục tiêu của chúng.

Hãy bắt đầu.


Bạn có thể làm gì với nó

  • Vòng lặp thông tin cạnh tranh. Quét google_search cho một tên đối thủ, sau đó gọi scrape_markdown trên các kết quả hàng đầu để tóm tắt vị trí và các sản phẩm ra mắt gần đây.
  • Tăng cường trang đơn. Điều khiển browser_createbrowser_gotobrowser_wait_forbrowser_get_htmlbrowser_close đối với một ASIN hoặc trang sản phẩm và để mô hình kéo tiêu đề, giá, đánh giá và tình trạng sẵn có vào một định dạng JSON mà bạn định nghĩa trong prompt.
  • Kiểm tra giá nhiều vùng. Chạy hai phiên browser_create đối với cùng một SKU trên các cửa hàng ở các quốc gia khác nhau và so sánh giá trong một phản hồi.
  • Nghiên cứu dựa trên công cụ tìm kiếm. Kết hợp google_search + google_trends cho những hiểu biết về động lực của một chủ đề, sau đó đi sâu vào các bài viết riêng lẻ với scrape_markdown.
  • Chụp màn hình để tuân thủ. Sử dụng scrape_screenshot (URL vào, PNG ra) hoặc browser_screenshot trong phiên sau một tương tác UI để giữ lại bằng chứng về vẻ ngoài của một trang tại một thời điểm.
  • Quy trình UI nhiều bước. browser_click, browser_type, browser_press_key, và browser_scroll cho phép đại lý điều khiển các biểu mẫu, cổng đăng nhập, và các lưới tải chậm bên trong một phiên liên tục.

Tại Scrapeless, chúng tôi chỉ truy cập dữ liệu công khai có sẵn trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách quyền riêng tư của trang web. Nội dung trong bài viết này chỉ nhằm mục đích trình diễn.


AWS Strands SDK là gì?

AWS Strands SDK là một framework Python để xây dựng các đại lý AI, được công bố trên PyPI bởi AWS (strands-agents, tác giả opensource@amazon.com). Nó cung cấp một lớp Agent nhận một mô hình và một danh sách công cụ, và chạy một vòng lặp nhận thức → lý luận → hành động cho đến khi nhiệm vụ hoàn thành.

Hướng dẫn này sử dụng ba phần của SDK đã được xác minh là tồn tại trong gói đã phát hành:

  • from strands import Agent — lớp đại lý chính nó.
  • from strands.models.anthropic import AnthropicModel — nhà cung cấp Anthropic; chữ ký khởi tạo là AnthropicModel(*, client_args: dict | None = None, **model_config) và chấp nhận model_id, max_tokens, params={"temperature": ...}.
  • from strands.tools.mcp import MCPClient — bao bọc một giao thức MCP để bất kỳ công cụ nào của máy chủ MCP cũng có thể được truyền vào Agent(tools=...).
    Loại kết quả của tác nhân là strands.agent.agent_result.AgentResult, một dataclass với các trường stop_reason, message, metrics, state (cùng với interrupts, structured_output tùy chọn).

Cách vòng lặp chạy

  1. Người dùng truyền một prompt cho agent.invoke_async(prompt).
  2. Mô hình nhận prompt cùng với danh sách các công cụ có sẵn.
  3. Nó sẽ trả về một thông điệp cuối cùng hoặc phát ra một cuộc gọi đến công cụ.
  4. Nếu một công cụ được gọi, Strands sẽ chạy nó và đưa kết quả trở lại mô hình.
  5. Các bước 3–4 lặp lại cho đến khi mô hình trả về một thông điệp cuối cùng.

Tại sao kết hợp AWS Strands SDK với máy chủ MCP của Scrapeless để lấy dữ liệu web

LLM không tự động truy xuất dữ liệu web trực tiếp. Để cung cấp cho một tác nhân Strands khả năng đó, bạn kết nối nó với một máy chủ MCP cung cấp các công cụ web. scrapeless-mcp-server là một trong những máy chủ MCP như vậy - được hỗ trợ bởi Scrapeless Scraping Browser, một trình duyệt được lưu trữ trên đám mây qua các proxy dân cư.

Đã xác minh trực tiếp (tools/list chống lại https://api.scrapeless.com/mcp, hôm nay): 21 công cụ, trong ba nhóm:

  • Scraping không trạng thái — scrape_html, scrape_markdown, scrape_screenshot.
  • Tìm kiếm — google_search, google_trends.
  • Phiên trình duyệt bền vững — browser_create, browser_goto, browser_go_back, browser_go_forward, browser_wait, browser_wait_for, browser_get_html, browser_get_text, browser_snapshot, browser_click, browser_type, browser_press_key, browser_scroll, browser_scroll_to, browser_screenshot, browser_close.

Nhận khóa API gói miễn phí của bạn từ trang web scrapeless. Mã nguồn của máy chủ MCP ở github.com/scrapeless-ai/scrapeless-mcp-server.


Cách tích hợp AWS Strands SDK với máy chủ Scrapeless MCP trong Python

Trong phần này, bạn sẽ sử dụng AWS Strands SDK để xây dựng một tác nhân AI được trang bị khả năng scraping và truy xuất dữ liệu trực tiếp từ máy chủ Scrapeless MCP.

Là ví dụ, hướng dẫn này xây dựng một tác nhân trí tuệ cạnh tranh có khả năng tự động phân tích thị trường và đối thủ. Tác nhân quyết định công cụ nào để sử dụng dựa trên các mục tiêu của nó, cho thấy sức mạnh của vòng lặp tác nhân.

Hãy làm theo hướng dẫn từng bước dưới đây để xây dựng tác nhân AI được hỗ trợ bởi Claude + Scrapeless MCP với AWS Strands SDK.

Điều kiện tiên quyết

Để sao chép ví dụ mã, đảm bảo rằng bạn có:

Yêu cầu phần mềm:

  • Python 3.10 hoặc cao hơn.
  • Node.js (phiên bản LTS mới nhất được khuyến nghị).
  • Một IDE Python như VS Code với phần mở rộng Python hoặc PyCharm.

Yêu cầu tài khoản:

  • Một tài khoản Scrapeless và khóa API - đăng ký tại scrapeless.
  • Một tài khoản Anthropic với quyền truy cập API Claude và tín dụng.

Kiến thức nền tảng (hữu ích nhưng không bắt buộc):

  • Hiểu biết cơ bản về cách hoạt động của MCP.
  • Quen thuộc với các tác nhân AI và khả năng của chúng.
  • Kiến thức cơ bản về lập trình bất đồng bộ trong Python.

Bước #1: Tạo dự án Python của bạn

Mở terminal của bạn và tạo một thư mục mới cho dự án của bạn:

bash Copy
mkdir strands-scrapeless-agent
cd strands-scrapeless-agent

Thiết lập một môi trường ảo Python:

bash Copy
python -m venv venv

Kích hoạt môi trường ảo:

bash Copy
# Trên Linux/macOS:
source venv/bin/activate

# Trên Windows:
venv\Scripts\activate

Tạo tệp Python chính:

bash Copy
touch agent.py

Cấu trúc thư mục của bạn sẽ như sau:

Copy
strands-scrapeless-agent/
├── venv/
└── agent.py

Bạn đã có một môi trường Python sẵn sàng để xây dựng một tác nhân AI với quyền truy cập dữ liệu web.


Bước #2: Cài đặt AWS Strands SDK

Trong môi trường ảo đã được kích hoạt, cài đặt các gói cần thiết:

bash Copy
pip install "strands-agents>=1.0" anthropic "mcp>=1.0" python-dotenv

Điều này cài đặt:

  • strands-agents: AWS Strands SDK để xây dựng các tác nhân AI.
  • anthropic: phụ thuộc cần thiết cho strands.models.anthropic.AnthropicModel.
  • mcp: SDK Python MCP chính thức, cần thiết cho giao thức mcp.client.streamable_http.
  • python-dotenv: để quản lý biến môi trường.

Tiếp theo, thêm các import này vào tệp agent.py của bạn:

python Copy
from strands import Agent
from strands.models.anthropic import AnthropicModel
from strands.tools.mcp import MCPClient
from mcp.client.streamable_http import streamablehttp_client

Bây giờ bạn có thể sử dụng AWS Strands SDK để xây dựng tác nhân.


Bước #3: Thiết lập biến môi trường

Tạo một tệp .env trong thư mục dự án của bạn để quản lý an toàn khóa API:

bash Copy
touch .env

Thêm các khóa API của bạn vào tệp .env:

ini Copy
# API Anthropic cho các mô hình Claude
ANTHROPIC_API_KEY=your_anthropic_key_here

# Thông tin xác thực Scrapeless cho việc scraping web qua MCP
SCRAPELESS_KEY=your_scrapeless_key_here

Trong tệp agent.py của bạn, thiết lập việc tải biến môi trường:

python Copy
import os
```python
from dotenv import load_dotenv

load_dotenv()

# Đọc khóa API
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")
SCRAPELESS_KEY = os.getenv("SCRAPELESS_KEY")

Bạn đã được thiết lập để tải an toàn các khóa API từ tệp .env.


Bước #4: Xác minh Điểm cuối Scrapeless MCP

Hướng dẫn này sử dụng điểm cuối HTTP có thể phát trực tuyến tại https://api.scrapeless.com/mcp. Không cần cài đặt cục bộ.

Kiểm tra điểm cuối được lưu trữ bằng curl:

bash Copy
curl -X POST "https://api.scrapeless.com/mcp" \
  -H "x-api-token: $SCRAPELESS_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"1.0"}}}'

Phản hồi thành công trả về:

  • HTTP 200 OK với Content-Type: text/event-stream
  • Một tiêu đề mcp-session-id — sử dụng lại trong các yêu cầu tiếp theo tools/listtools/call
  • Một sự kiện cơ thể data: {"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{"listChanged":true}},"serverInfo":{"name":"scrapeless-mcp-server","version":"0.2.0",...}},...}

Được thử nghiệm với điểm cuối trực tiếp tại thời điểm xuất bản: trả về 21 công cụ MCP và thông tin serverInfo như đã hiển thị ở trên.

Nhận khóa API của bạn trên gói miễn phí: app.scrapeless.com

Tham khảo SDK và CLI đầy đủ: trang web scrapeless.


Bước #5: Khởi tạo Mô hình Strands

Cấu hình mô hình Anthropic Claude trong agent.py của bạn:

python Copy
# Khởi tạo mô hình Anthropic (Claude thông qua nhà cung cấp Strands Anthropic)
model = AnthropicModel(
    client_args={"api_key": ANTHROPIC_API_KEY},
    model_id="claude-sonnet-4-6",
    max_tokens=4096,
    params={"temperature": 0.3}
)

Điều này cấu hình Claude làm mô hình LLM cho đại lý của bạn với các tham số được điều chỉnh cho các phản hồi nhất quán, tập trung. Từ điển client_args là cách chính thức để truyền thông tin cấu hình khách hàng Anthropic (xem tài liệu của nhà cung cấp Anthropic AWS Strands).


Bước #6: Kết nối với Máy chủ Scrapeless MCP

Tạo cấu hình khách hàng MCP để kết nối với điểm cuối HTTP có thể phát trực tuyến:

python Copy
import asyncio
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def http_transport():
    """Giao thức Streamable-HTTP tới điểm cuối Scrapeless MCP được lưu trữ."""
    return streamablehttp_client(
        url="https://api.scrapeless.com/mcp",
        headers={"x-api-token": SCRAPELESS_KEY},
    )

async def connect_mcp_tools():
    """Kết nối với máy chủ Scrapeless MCP và khám phá các công cụ."""

    logger.info("Đang kết nối với máy chủ Scrapeless MCP (HTTP)...")
    mcp_client = MCPClient(http_transport)

    with mcp_client:
        tools = mcp_client.list_tools_sync()
        logger.info(f"Đã khám phá {len(tools)} công cụ MCP")
        for tool in tools:
            logger.info(f"  - {tool.tool_name}")

    return mcp_client, tools

Đã được thử nghiệm với điểm cuối trực tiếp: chuỗi lệnh gọi ở trên ghi lại Đã khám phá 21 công cụ MCP tiếp theo là tất cả 21 tên công cụ được liệt kê trong bảng dưới đây.

Các công cụ Scrapeless MCP có sẵn

Danh sách dưới đây tóm tắt các công cụ mà máy chủ Scrapeless MCP cung cấp trên giao thức HTTP có thể phát trực tuyến. list_tools_sync() trả về cùng một tập hợp tại thời gian chạy.

Công cụ Mục đích
browser_create Cấp phát một phiên duyệt web trên đám mây Scrapeless
browser_close Giải phóng phiên làm việc
browser_goto Điều hướng đến một URL
browser_go_back / browser_go_forward Di chuyển qua lịch sử phiên làm việc
browser_wait_for Chờ cho một bộ chọn CSS xuất hiện
browser_wait Chờ một khoảng thời gian cố định bằng mili giây
browser_get_html Đọc toàn bộ DOM đã được render
browser_get_text Đọc văn bản hiển thị trên trang hiện tại
browser_snapshot Chụp ảnh chụp nhanh khả năng truy cập của trang
browser_click Nhấp vào một phần tử theo bộ chọn
browser_type Nhập văn bản vào một trường đầu vào
browser_press_key Gửi các phím bấm như PageDown hoặc Enter
browser_scroll Cuộn trang hiện tại
browser_scroll_to Cuộn một phần tử cụ thể vào tầm nhìn
browser_screenshot Chụp màn hình dưới dạng PNG
google_search Thực hiện một truy vấn tìm kiếm Google và trả về kết quả
google_trends Lấy dữ liệu Xu hướng Google cho các từ khóa
scrape_html Lấy HTML đã được render của bất kỳ URL nào
scrape_markdown Lấy một URL và trả về Markdown có thể đọc được
scrape_screenshot Chụp màn hình của bất kỳ URL nào

Bước #7: Định nghĩa Đại lý Tình báo Cạnh tranh

Tạo một đại lý với một lời nhắc chuyên biệt cho tình báo cạnh tranh:

python Copy
def create_agent(model, tools):
vi Copy
"""Tạo một đại lý tình báo cạnh tranh với quyền truy cập dữ liệu web"""
    
    system_prompt = """Bạn là một nhà phân tích tình báo cạnh tranh chuyên nghiệp với quyền truy cập vào các công cụ dữ liệu web thông qua máy chủ Scrapeless MCP.

## Nhiệm vụ
Tiến hành phân tích thị trường và cạnh tranh toàn diện bằng cách sử dụng dữ liệu web theo thời gian thực.

## Các công cụ MCP có sẵn (Scrapeless)
- google_search: thực hiện các truy vấn trên Google Search và trả về kết quả
- google_trends: lấy dữ liệu Google Trends cho các từ khóa
- scrape_html: lấy HTML đã render của một URL thông qua trình duyệt đám mây Scrapeless
- scrape_markdown: lấy một URL và trả về nội dung Markdown có thể đọc được
- scrape_screenshot: chụp màn hình của một URL mục tiêu
- browser_create / browser_close: phân phối và giải phóng một phiên trình duyệt đám mây Scrapeless
- browser_goto / browser_go_back / browser_go_forward: điều hướng phiên làm việc
- browser_wait_for / browser_wait: chờ một bộ chọn hoặc thời gian chờ cố định
- browser_get_html / browser_get_text / browser_snapshot: đọc DOM đã render, văn bản hiển thị, hoặc snapshot toàn bộ DOM
- browser_click / browser_type / browser_press_key: điều khiển tương tác UI
- browser_scroll / browser_scroll_to: kích hoạt nội dung tải lười hoặc cuộn một phần tử vào khung nhìn
- browser_screenshot: ghi lại bằng chứng phiên làm việc cho QA và tuân thủ

## Quy trình phân tích tự động
Khi được giao nhiệm vụ phân tích, tự động:
1. Quyết định công cụ nào để sử dụng dựa trên mục tiêu.
2. Thu thập dữ liệu toàn diện từ nhiều nguồn khác nhau.
3. Tổng hợp các phát hiện thành những hiểu biết có thể hành động.
4. Cung cấp các khuyến nghị chiến lược cụ thể.

Hãy chủ động trong việc chọn công cụ. Bạn có toàn quyền tự chủ để sử dụng bất kỳ sự kết hợp công cụ nào."""

    return Agent(
        model=model,
        tools=tools,
        system_prompt=system_prompt
    )

Điều này tạo ra một đại lý chuyên biệt về tình báo cạnh tranh với khả năng ra quyết định tự động. Đại lý có thể kết hợp các công cụ nhẹ một lần (scrape_markdown, google_search) với các công cụ phiên duyệt đầy đủ (browser_createbrowser_gotobrowser_wait_forbrowser_get_htmlbrowser_close) tùy thuộc vào việc trang cần rendering JavaScript hay tính bền vững của phiên.


Bước #8: Khởi động đại lý của bạn

Tạo hàm thực thi chính để chạy đại lý của bạn:

python Copy
async def main():
    """Chạy đại lý tình báo cạnh tranh"""

    print("AWS Strands + Scrapeless MCP Đại lý Tình báo Cạnh tranh")
    print("=" * 70)

    try:
        # Kết nối với các công cụ MCP
        mcp_client, tools = await connect_mcp_tools()

        # Tạo đại lý
        agent = create_agent(model, tools)

        print("\nĐại lý đã sẵn sàng với quyền truy cập dữ liệu web.")
        print("\nBắt đầu phân tích...")
        print("-" * 40)

        # Ví dụ: Phân tích vị thế cạnh tranh của Tesla
        prompt = """
        Phân tích vị thế cạnh tranh của Tesla trong thị trường xe điện.

        Nghiên cứu:
        - Dòng sản phẩm hiện tại và chiến lược định giá.
        - Các đối thủ chính và sản phẩm của họ.
        - Các thông báo chiến lược gần đây.
        - Thị phần và vị trí.

        Sử dụng các công cụ Scrapeless để thu thập dữ liệu theo thời gian thực từ tesla.com và các kết quả tìm kiếm.
        """

        # Chạy phân tích với ngữ cảnh MCP
        with mcp_client:
            result = await agent.invoke_async(prompt)

        print("\nKết quả phân tích:")
        print("=" * 50)
        print(result)

        print("\nPhân tích hoàn tất.")

    except Exception as e:
        logger.error(f"Lỗi: {e}")
        print(f"\nLỗi: {e}")

if __name__ == "__main__":
    asyncio.run(main())

invoke_async trả về một đối tượng AgentResult có các thuộc tính là message, stop_reason, metrics, và state. print(result) gọi __str__ trên bộ bọc; để lấy văn bản chỉ của trợ lý, sử dụng print(result.message) (toàn bộ dict Message) hoặc trích xuất các khối văn bản bằng for block in result.message.get("content", []): print(block.get("text", "")).

Đại lý của bạn đã sẵn sàng thực hiện phân tích cạnh tranh tự động.


Bước #9: Gom tất cả lại với nhau

Dưới đây là mã hoàn chỉnh trong agent.py:

python Copy
import asyncio
import os
import logging
from dotenv import load_dotenv

from strands import Agent
from strands.models.anthropic import AnthropicModel
from strands.tools.mcp import MCPClient
from mcp.client.streamable_http import streamablehttp_client

# Tải biến môi trường
load_dotenv()
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Đọc khóa API
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")
SCRAPELESS_KEY = os.getenv("SCRAPELESS_KEY")

# Khởi tạo mô hình Anthropic
model = AnthropicModel(
    client_args={"api_key": ANTHROPIC_API_KEY},
    model_id="claude-sonnet-4-6",
    max_tokens=4096,
    params={"temperature": 0.3}
)

def http_transport():
    """Giao thức Streamable-HTTP tới điểm cuối Scrapeless MCP đã được lưu trữ."""
    return streamablehttp_client(
        url="https://api.scrapeless.com/mcp",
        headers={"x-api-token": SCRAPELESS_KEY},
    )
python Copy
async def connect_mcp_tools():
    """Kết nối với máy chủ Scrapeless MCP và phát hiện công cụ."""

    logger.info("Đang kết nối với máy chủ Scrapeless MCP (HTTP)...")
    mcp_client = MCPClient(http_transport)

    with mcp_client:
        tools = mcp_client.list_tools_sync()
        logger.info(f"Đã phát hiện {len(tools)} công cụ MCP")
        for tool in tools:
            logger.info(f"  - {tool.tool_name}")

    return mcp_client, tools


def create_agent(model, tools):
    """Tạo một đại lý thông tin cạnh tranh với quyền truy cập vào dữ liệu web"""

    system_prompt = """Bạn là một nhà phân tích thông tin cạnh tranh hàng đầu với quyền truy cập vào các công cụ dữ liệu web thông qua máy chủ Scrapeless MCP.

## Nhiệm vụ
Thực hiện phân tích thị trường và cạnh tranh toàn diện bằng cách sử dụng dữ liệu web theo thời gian thực.

## Các Công Cụ MCP Có Sẵn (Scrapeless)
- google_search, google_trends
- scrape_html, scrape_markdown, scrape_screenshot
- browser_create, browser_close
- browser_goto, browser_go_back, browser_go_forward
- browser_wait_for, browser_wait
- browser_get_html, browser_get_text, browser_snapshot
- browser_click, browser_type, browser_press_key
- browser_scroll, browser_scroll_to
- browser_screenshot

## Quy Trình Phân Tích Tự Động
Khi được giao nhiệm vụ phân tích, một cách tự động:
1. Quyết định công cụ nào sẽ sử dụng dựa trên mục tiêu.
2. Thu thập dữ liệu toàn diện từ nhiều nguồn.
3. Tổng hợp phát hiện thành những hiểu biết có thể hành động.
4. Cung cấp các khuyến nghị chiến lược cụ thể.

Hãy chủ động trong việc chọn công cụ. Bạn có toàn quyền sử dụng bất kỳ sự kết hợp nào của các công cụ."""

    return Agent(
        model=model,
        tools=tools,
        system_prompt=system_prompt
    )


async def main():
    """Chạy đại lý thông tin cạnh tranh"""

    print("AWS Strands + Scrapeless MCP Đại lý Thông tin Cạnh tranh")
    print("=" * 70)

    try:
        mcp_client, tools = await connect_mcp_tools()
        agent = create_agent(model, tools)

        print("\nĐại lý đã sẵn sàng với quyền truy cập vào dữ liệu web.")
        print("\nBắt đầu phân tích...")
        print("-" * 40)

        prompt = """
        Phân tích vị thế cạnh tranh của Tesla trên thị trường xe điện.

        Nghiên cứu:
        - Danh sách sản phẩm hiện tại và chiến lược định giá.
        - Đối thủ chính và các sản phẩm của họ.
        - Các thông báo chiến lược gần đây.
        - Thị phần và vị trí.

        Sử dụng các công cụ Scrapeless để thu thập dữ liệu theo thời gian thực từ tesla.com và các kết quả tìm kiếm.
        """

        with mcp_client:
            result = await agent.invoke_async(prompt)

        print("\nKết quả phân tích:")
        print("=" * 50)
        print(result)

        print("\nPhân tích hoàn tất.")

    except Exception as e:
        logger.error(f"Lỗi: {e}")
        print(f"\nLỗi: {e}")


if __name__ == "__main__":
    asyncio.run(main())

Như đã lưu ý trong Bước #8, invoke_async trả về một AgentResult có các thuộc tính là message, stop_reason, metrics, và state. Sử dụng print(result.message) nếu bạn chỉ muốn văn bản trợ giúp thay vì chuỗi bọc.

Thực thi đại lý AI với:

bash Copy
python agent.py

Kịch bản sẽ kết nối với máy chủ Scrapeless MCP, chạy list_tools_sync() (trả về 21 công cụ — đã xác minh trực tiếp với điểm cuối được lưu trữ vào thời điểm viết), khởi tạo đại lý, và gọi agent.invoke_async(prompt). Mô hình quyết định công cụ nào được gọi. Những gì đại lý thực sự làm trong bất kỳ lần chạy nào phụ thuộc vào những gì mô hình chọn — Strands không ràng buộc trình tự công cụ.


Kết luận

Hướng dẫn này đã kết nối AWS Strands SDK với máy chủ MCP của Scrapeless: ~100 dòng Python, 21 công cụ MCP đã được xác minh có sẵn cho mô hình, và một đường dẫn dữ liệu được xác minh thông qua Trình duyệt Thu thập dữ liệu Scrapeless với lối ra proxy dân cư.

Nhận một khóa API tại app.scrapeless.com.


Sẵn Sàng Xây Dựng Dòng Dữ Liệu AI Sử Dụng?

Tham gia cộng đồng của chúng tôi để nhận gói miễn phí và kết nối với các nhà phát triển đang xây dựng các đại lý AWS Strands + Scrapeless MCP: Discord · Telegram.

Đăng ký tại app.scrapeless.com để có thời gian chạy Trình duyệt Thu thập dữ liệu miễn phí và điều chỉnh tích hợp AWS Strands ở trên theo các quy trình làm việc mà đội của bạn cần. Tham khảo đầy đủ tại docs.scrapeless.com. Để có nền tảng sâu hơn về thời gian chạy Trình duyệt Thu thập dữ liệu cung cấp sức mạnh cho các công cụ này, hãy xem trang sản phẩm Trình duyệt Thu thập dữ liệu Scrapeless và hướng dẫn anh em của chúng tôi về tích hợp Scrapeless với các đại lý LangChain.

Câu Hỏi Thường Gặp

Q1: MCP là gì và tại sao nó lại quan trọng đối với các đại lý AI?

Copy
MCP (Mô hình Giao tiếp Ngữ cảnh) là một chuẩn mở để kết nối các tác nhân AI với các công cụ và nguồn dữ liệu. Một máy chủ MCP phơi bày danh sách công cụ có kiểu mà bất kỳ khách hàng nào nhận thức MCP - bao gồm SDK AWS Strands - có thể gọi. Với MCP không có Scrapeless, tác nhân nhận được quyền truy cập có kiểu vào một trình duyệt đám mây thực sự, các truy vấn công cụ tìm kiếm, và các bộ thu thập Markdown/HTML mà không cần viết mã gắn kết theo từng API. Tác nhân quyết định công cụ nào để gọi bên trong vòng lặp tác nhân; MCP chuyển giao các lược đồ có kiểu và kết quả.

**Q2: Điểm cuối MCP được lưu trữ mang lại cho tôi điều gì?**

`https://api.scrapeless.com/mcp` (với tiêu đề `x-api-token`) trả về đầy đủ 21 công cụ và đã được xác thực từ đầu đến cuối với `MCPClient` của Strands trong hướng dẫn này. Không cần môi trường Node cục bộ hoặc quá trình nền - `streamablehttp_client(...)` chỉ cần một import và một URL.

**Q3: Vòng lặp tác nhân xử lý một công cụ bị lỗi hoặc thách thức chống bot như thế nào?**

Strands cung cấp kết quả công cụ - bao gồm cả lỗi - trở lại mô hình, mô hình sẽ quyết định có nên thử lại, chuyển đổi công cụ hoặc phơi bày lỗi không. Cụ thể đối với Scrapeless, cách phục hồi thông thường là `browser_close` + một `browser_create` mới, hoặc quay lại từ một phiên duyệt web đầy đủ đến `scrape_markdown` / `scrape_html`. Vùng proxy theo cuộc gọi không phải là một tham số mà công cụ `browser_create` của MCP phơi bày - `scrapeless-mcp-server/src/session-manager.ts` chỉ chuyển tiếp `session_ttl`, `profile_id`, và `profile_persist`. Để gán một vùng cụ thể, hãy tạo một hồ sơ Scrapeless trong bảng điều khiển với quốc gia được tích hợp và tham chiếu nó qua biến môi trường `BROWSER_PROFILE_ID` trên máy chủ MCP.

**Q4: Liệu điều này có chạy mà không có một tác nhân AI không?**

Có. Mỗi công cụ Scrapeless MCP đều có thể được gọi từ một kịch bản Python thông thường hoặc một `curl` chống lại điểm cuối HTTP có thể stream (cái `curl` từ Bước #4 trả về `serverInfo.name: "scrapeless-mcp-server"` và tiêu đề `mcp-session-id` mà bạn sử dụng lại trong các yêu cầu `tools/list` và `tools/call` tiếp theo). SDK AWS Strands bổ sung vòng lặp tác nhân ở trên cùng.

**Q5: Mô hình nào khác hoạt động ngoài Claude Sonnet?**

Mô hình `AnthropicModel` của Strands chấp nhận bất kỳ ID mô hình nào mà API Anthropic cung cấp - `claude-haiku-*` cho các vòng lặp trích xuất và tóm tắt rẻ hơn, `claude-opus-*` cho lý luận nhiều bước nặng nề hơn. Strands cũng cung cấp `OpenAIModel`, `BedrockModel`, `GeminiModel`, và các nhà cung cấp cho Mistral, Ollama, LiteLLM, llamacpp, và SageMaker. Chỉ cần thay đổi dòng mô hình; phần còn lại của `agent.py` vẫn giữ nguyên.

Bất kỳ điểm cuối tương thích với OpenAI API nào cũng hoạt động thông qua `OpenAIModel` với một thay thế `base_url`. Đã được xác thực từ đầu đến cuối cho hướng dẫn này chống lại OpenRouter:

```python
from strands.models.openai import OpenAIModel
model = OpenAIModel(
    client_args={
        "api_key": OPENROUTER_API_KEY,
        "base_url": "https://openrouter.ai/api/v1",
    },
    model_id="openai/gpt-4o-mini",  # hoặc anthropic/claude-3.5-sonnet, google/gemini-flash-1.5, v.v.
    params={"temperature": 0.3},
)

Với sự thay đổi đó, cùng một Agent(model=..., tools=tools, system_prompt=...) chạy chống lại danh mục OpenRouter. Đã được thử nghiệm cho hướng dẫn này với openai/gpt-4o-mini: tác nhân tự động gọi google_search ba lần và scrape_markdown một lần, trả về một câu trả lời sạch sẽ với stop_reason: end_turn, với khoảng $0.001 cho mỗi lần chạy.

Q6: Tôi xử lý các lỗi tạm thời như ERR_TUNNEL_CONNECTION_FAILED hoặc 503 như thế nào?

Cả hai đến từ hồ bơi thoát Scrapeless và thường là tạm thời. Vòng lặp của Strands đã cung cấp lỗi trở lại mô hình, sẽ thử lại trong lượt tiếp theo. Để phục hồi định dạng trong lời nhắc, hãy hướng dẫn tác nhân: "Nếu công cụ trình duyệt trả về lỗi hầm hoặc 503, hãy gọi browser_close và khởi động một browser_create mới trước khi thử lại." Cách diễn đạt đó tạo ra một lần thử lại sạch hơn so với việc dựa vào mô hình để quyết định.

Q7: Có thể nhiều tác nhân chia sẻ kết nối MCP không?

MCPClient mở một phiên cho mỗi ngữ cảnh with mcp_client:. Đối với các tác nhân song song, hãy cung cấp mỗi tác nhân một phiên bản MCPClient riêng (và do đó là ID phiên riêng của nó trên điểm cuối được lưu trữ) thay vì sử dụng lại một cái. Điểm cuối được lưu trữ có khả năng mở rộng với các phiên đồng thời; giới hạn độ đồng thời theo tài khoản sống trong giá Scrapeless.

Q8: Tôi cắm các công cụ không phải Scrapeless của mình ở đâu bên cạnh điều này?

Agent(tools=...) chấp nhận một danh sách. Truyền tools + my_extra_tools nơi my_extra_tools là bất kỳ công cụ tương thích Strands nào (các hàm được trang trí với @tool, hoặc công cụ từ một máy chủ MCP khác). Mô hình thấy sự hợp nhất của các lược đồ và quyết định cái nào để gọi.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục