Cách xây dựng một MCP server đơn giản

MCP (Model Context Protocol) là một framework mang tính đột phá, đang nhanh chóng thu hút sự quan tâm trong cộng đồng AI và các mô hình ngôn ngữ lớn (LLM). Nó đóng vai trò như một cầu nối vạn năng cho các hệ thống AI, cho phép tích hợp liền mạch với những tài nguyên, API và dịch vụ bên ngoài. Hãy hình dung MCP như một giao thức chuẩn hóa giúp các LLM tương tác với những công cụ và nguồn dữ liệu một cách nhất quán và hiệu quả, tương tự như cách cổng USB-C hoạt động với các thiết bị.

Trong hướng dẫn này, chúng ta sẽ tự xây dựng một MCP server sử dụng Yahoo Finance Python API để lấy dữ liệu giá cổ phiếu theo thời gian thực, so sánh chúng và cung cấp các phân tích dữ liệu lịch sử. Dự án này rất phù hợp cho người mới bắt đầu; bạn chỉ cần có kiến ​​thức cơ bản về Python là có thể hoàn thành nó.

1. Thiết lập môi trường để sử dụng MCP server

Trước tiên, hãy truy cập trang web claude.ai để tải xuống và cài đặt ứng dụng Claude Desktop. Sau đó, cài đặt các gói Python MCP và yfinance bằng lệnh PIP.

$ pip install "mcp[cli]" yfinance

2. Xây dựng MCP server

Tạo thư mục dự án với tên gọi tùy ý, sau đó tạo file Python có tên stock_price_server.py và thêm code sau đây.

  • Khởi tạo MCP server: Tạo một MCP server có thể tùy chỉnh với tên gọi "Stock Price Server" bằng cách sử dụng lớp FastMCP.
  • Lấy giá cổ phiếu: Hàm get_stock_price sẽ lấy giá cổ phiếu mới nhất cho mã chứng khoán được chỉ định, đồng thời có các tùy chọn xử lý dự phòng khi thị trường đóng cửa.
  • Công khai tài nguyên: Hàm stock_resource định dạng và công khai dữ liệu giá cổ phiếu dưới dạng tài nguyên, mang lại kết quả hiển thị thân thiện với người dùng.
  • Lấy dữ liệu lịch sử: Hàm get_stock_history truy xuất và trả về dữ liệu lịch sử cổ phiếu dưới dạng chuỗi định dạng CSV cho một khoảng thời gian cụ thể.
  • So sánh cổ phiếu: Hàm compare_stocks so sánh giá của hai mã chứng khoán và trả về thông báo đã được định dạng cho biết giá trị tương đối giữa chúng.
  • Xử lý lỗi: Mỗi hàm đều bao gồm cơ chế xử lý lỗi chặt chẽ để trả về các thông báo hữu ích khi quá trình truy xuất dữ liệu gặp sự cố.
from mcp.server.fastmcp import FastMCP
import yfinance as yf

# Create an MCP server with a custom name
mcp = FastMCP("Stock Price Server")

@mcp.tool()
def get_stock_price(symbol: str) -> float:
    """
    Retrieve the current stock price for the given ticker symbol.
    Returns the latest closing price as a float.
    """
    try:
        ticker = yf.Ticker(symbol)
        # Get today's historical data; may return empty if market is closed or symbol is invalid.
        data = ticker.history(period="1d")
        if not data.empty:
            # Use the last closing price from today's data
            price = data['Close'].iloc[-1]
            return float(price)
        else:
            # As a fallback, try using the regular market price from the ticker info
            info = ticker.info
            price = info.get("regularMarketPrice", None)
            if price is not None:
                return float(price)
            else:
                return -1.0  # Indicate failure
    except Exception:
        # Return -1.0 to indicate an error occurred when fetching the stock price
        return -1.0

@mcp.resource("stock://{symbol}")
def stock_resource(symbol: str) -> str:
    """
    Expose stock price data as a resource.
    Returns a formatted string with the current stock price for the given symbol.
    """
    price = get_stock_price(symbol)
    if price < 0:
        return f"Error: Could not retrieve price for symbol '{symbol}'."
    return f"The current price of '{symbol}' is ${price:.2f}."

@mcp.tool()
def get_stock_history(symbol: str, period: str = "1mo") -> str:
    """
    Retrieve historical data for a stock given a ticker symbol and a period.
    Returns the historical data as a CSV formatted string.
    
    Parameters:
        symbol: The stock ticker symbol.
        period: The period over which to retrieve historical data (e.g., '1mo', '3mo', '1y').
    """
    try:
        ticker = yf.Ticker(symbol)
        data = ticker.history(period=period)
        if data.empty:
            return f"No historical data found for symbol '{symbol}' with period '{period}'."
        # Convert the DataFrame to a CSV formatted string
        csv_data = data.to_csv()
        return csv_data
    except Exception as e:
        return f"Error fetching historical data: {str(e)}"

@mcp.tool()
def compare_stocks(symbol1: str, symbol2: str) -> str:
    """
    Compare the current stock prices of two ticker symbols.
    Returns a formatted message comparing the two stock prices.
    
    Parameters:
        symbol1: The first stock ticker symbol.
        symbol2: The second stock ticker symbol.
    """
    price1 = get_stock_price(symbol1)
    price2 = get_stock_price(symbol2)
    if price1 < 0 or price2 < 0:
        return f"Error: Could not retrieve data for comparison of '{symbol1}' and '{symbol2}'."
    if price1 > price2:
        result = f"{symbol1} (${price1:.2f}) is higher than {symbol2} (${price2:.2f})."
    elif price1 < price2:
        result = f"{symbol1} (${price1:.2f}) is lower than {symbol2} (${price2:.2f})."
    else:
        result = f"Both {symbol1} and {symbol2} have the same price (${price1:.2f})."
    return result

if __name__ == "__main__":
    mcp.run()

3. Kiểm tra MCP Server

Bây giờ, hãy kiểm thử server bằng công cụ MCP Server Inspector thông qua lệnh sau:

$ mcp dev stock_price_server.py

Lệnh này sẽ chuyển hướng bạn đến URL nơi MCP Inspector đang hoạt động. Thông qua giao diện người dùng, bạn có thể thử nghiệm các công cụ khác nhau và đảm bảo mọi thứ hoạt động đúng như dự kiến.

Server này hiện cung cấp các tính năng sau:

  • get_stock_price: Công cụ lấy giá mới nhất
  • stock_resource: Tài nguyên trả về thông báo giá ở định dạng dễ đọc
  • get_stock_history: Công cụ trả về dữ liệu lịch sử dưới dạng CSV
  • compare_stocks: Công cụ so sánh giá hiện tại của hai mã cổ phiếu

4. Thiết lập MCP server cho Claude Desktop

Sau khi hài lòng với MCP server của mình, chúng ta sẽ tích hợp nó vào Claude Desktop bằng cách chạy lệnh sau trong terminal:

$ mcp install stock_price_server.py --name "Stock Price Server"

Khi khởi động lại Claude Desktop, bạn sẽ thấy các biểu tượng mới xuất hiện bên dưới tùy chọn trò chuyện. Điều này cho thấy MCP đã được cấu hình thành công. Bạn có thể nhấp vào các biểu tượng này để xem những công cụ nào hiện có sẵn cho Claude Desktop.

5. Kiểm thử MCP server với Claude Desktop

Bắt đầu bằng việc yêu cầu Claude Desktop so sánh giá của hai mã cổ phiếu.

Could you please compare the prices of Microsoft and Tesla stocks?
Bạn có thể so sánh giá cổ phiếu của Microsoft và Tesla không?

Sau khi nhập câu lệnh, hệ thống sẽ yêu cầu cấp quyền sử dụng công cụ tương ứng. Bạn chỉ cần nhấp vào nút "Allow for This Chat" (Cho phép trong cuộc trò chuyện này).

Đã có kết quả so sánh đơn giản về giá cổ phiếu của Microsoft và Tesla.

Tiếp theo, hãy yêu cầu phân tích dữ liệu lịch sử của cổ phiếu Tesla trong tháng qua.

Could you please provide the historical data for Tesla over the past month?
Bạn có thể cung cấp dữ liệu lịch sử của Tesla trong tháng qua không?

Một lần nữa, kết quả phân tích rất tuyệt vời, thậm chí còn tốt hơn so với việc tự upload file CSV lên theo cách thủ công.

MCP là một khái niệm mới được phát triển dựa trên các ý tưởng truyền thống như gọi hàm và AI agent. Trong tương lai, chúng ta hướng tới việc hoàn thiện các công nghệ này để đạt được sự tích hợp liền mạch giữa những nguồn tài nguyên bên ngoài và hệ thống AI của bạn. Nhờ đó, khi nhận được yêu cầu từ bạn, hệ thống sẽ có thể thực hiện nhiều tác vụ đa dạng như đặt mua thực phẩm, gửi email, tạo danh sách phát trên Spotify và chia sẻ chúng với bạn bè.

Thứ Ba, 06/10/2026 17:04
5 ★ 1 👨 3
Xác thực tài khoản!

Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

Số điện thoại chưa đúng định dạng!
Số điện thoại này đã được xác thực!
Bạn có thể dùng Sđt này đăng nhập tại đây!
Lỗi gửi SMS, liên hệ Admin
0 Bình luận
Sắp xếp theo
❖ AI cho Lập trình