Bỏ qua tới nội dung
Bài 8/11 · MCP cho người mới bắt đầu (Microsoft)

Kiểm thử và triển khai MCP server

Kiểm thử MCP server bằng Inspector (giao diện và CLI), curl và unit test với pytest; triển khai server ở máy local và lên cloud, ví dụ Azure Container Apps.

Cơ bản@shine19047 phút đọc

Bài này gộp hai bài ngắn của khoá gốc: chọn cách kiểm thử và công cụ kiểm thử hiệu quả cho MCP server, rồi các cách triển khai (deploy) server ở máy local, trong container và lên cloud.

Phần 1: kiểm thử và gỡ lỗi

Trước khi kiểm thử MCP server, cần hiểu các công cụ có sẵn và best practice để gỡ lỗi. Kiểm thử hiệu quả giúp server hoạt động như mong đợi và nhanh chóng tìm ra, sửa lỗi.

Mục tiêu học tập

Sau phần này, bạn sẽ có thể:

  • Mô tả các cách kiểm thử khác nhau.
  • Dùng nhiều công cụ để kiểm thử code hiệu quả.

Kiểm thử MCP server

MCP có các công cụ giúp kiểm thử và gỡ lỗi server:

  • MCP Inspector: công cụ chạy được cả dạng dòng lệnh (CLI) lẫn dạng giao diện trực quan.
  • Kiểm thử thủ công: dùng công cụ như curl để gửi web request; công cụ nào chạy được HTTP cũng được.
  • Unit test: dùng framework kiểm thử bạn thích để kiểm thử tính năng của cả server và client.

Dùng MCP Inspector

Công cụ này đã được giới thiệu ở các bài trước (xem Gỡ lỗi với MCP Inspector), ở đây ta nói tổng quan. Nó được viết bằng Node.js và bạn dùng bằng lệnh npx, lệnh này tải và cài tạm công cụ rồi tự dọn dẹp khi chạy xong yêu cầu của bạn.

MCP Inspector giúp bạn:

  • Khám phá khả năng (capability) của server: tự động phát hiện resource, tool và prompt có sẵn.
  • Thử chạy tool: thử các tham số khác nhau và xem phản hồi theo thời gian thực.
  • Xem metadata của server: xem thông tin server, schema và cấu hình.

Một lần chạy điển hình:

bash
npx @modelcontextprotocol/inspector node build/index.js

Lệnh trên khởi động MCP server cùng giao diện trực quan, mở giao diện web local trên trình duyệt. Bạn sẽ thấy bảng điều khiển hiển thị các MCP server đã đăng ký cùng tool, resource, prompt của chúng, và có thể thử chạy tool, xem metadata, xem phản hồi theo thời gian thực.

Giao diện MCP Inspector

Bạn cũng có thể chạy công cụ ở chế độ CLI bằng cách thêm thuộc tính --cli. Ví dụ chạy ở chế độ CLI để liệt kê mọi tool trên server:

sh
npx @modelcontextprotocol/inspector --cli node build/index.js --method tools/list

Kiểm thử thủ công

Ngoài Inspector, một cách tương tự là chạy một client dùng được HTTP, ví dụ curl. Với curl, bạn kiểm thử MCP server trực tiếp bằng request HTTP:

bash
# Example: Test server metadata
curl http://localhost:3000/v1/metadata

# Example: Execute a tool
curl -X POST http://localhost:3000/v1/tools/execute \
  -H "Content-Type: application/json" \
  -d '{"name": "calculator", "parameters": {"expression": "2+2"}}'

Như bạn thấy, ta dùng request POST để gọi tool với payload gồm tên tool và tham số. Hãy dùng cách hợp với bạn nhất. Nhìn chung, công cụ CLI dùng nhanh hơn và dễ viết script, hữu ích trong môi trường CI/CD.

Unit test

Tạo unit test cho tool và resource để đảm bảo chúng hoạt động như mong đợi. Đây là ví dụ code kiểm thử:

python
import pytest

from mcp.server.fastmcp import FastMCP
from mcp.shared.memory import (
    create_connected_server_and_client_session as create_session,
)

# Mark the whole module for async tests
pytestmark = pytest.mark.anyio


async def test_list_tools_cursor_parameter():
    """Test that the cursor parameter is accepted for list_tools.

    Note: FastMCP doesn't currently implement pagination, so this test
    only verifies that the cursor parameter is accepted by the client.
    """

 server = FastMCP("test")

    # Create a couple of test tools
    @server.tool(name="test_tool_1")
    async def test_tool_1() -> str:
        """First test tool"""
        return "Result 1"

    @server.tool(name="test_tool_2")
    async def test_tool_2() -> str:
        """Second test tool"""
        return "Result 2"

    async with create_session(server._mcp_server) as client_session:
        # Test without cursor parameter (omitted)
        result1 = await client_session.list_tools()
        assert len(result1.tools) == 2

        # Test with cursor=None
        result2 = await client_session.list_tools(cursor=None)
        assert len(result2.tools) == 2

        # Test with cursor as string
        result3 = await client_session.list_tools(cursor="some_cursor_value")
        assert len(result3.tools) == 2

        # Test with empty string cursor
        result4 = await client_session.list_tools(cursor="")
        assert len(result4.tools) == 2
    

Code trên:

  • Dùng framework pytest, cho phép viết test dưới dạng hàm và dùng câu lệnh assert.
  • Tạo một MCP server với hai tool khác nhau.
  • Dùng câu lệnh assert để kiểm tra các điều kiện được thoả.

Xem file đầy đủ tại đây. Dựa trên file này, bạn có thể kiểm thử server của mình để đảm bảo các capability được tạo đúng. Mọi SDK lớn đều có phần kiểm thử tương tự, nên bạn điều chỉnh theo runtime đã chọn.

Phần 2: triển khai MCP server

Triển khai MCP server cho phép người khác dùng tool và resource của nó ngoài môi trường local của bạn. Có nhiều chiến lược triển khai, tuỳ yêu cầu về khả năng mở rộng, độ tin cậy và sự dễ quản lý.

Mục tiêu học tập

Sau phần này, bạn sẽ có thể:

  • Đánh giá các cách triển khai khác nhau.
  • Triển khai ứng dụng của bạn.

Phát triển và triển khai ở máy local

Nếu server được dùng bằng cách chạy trên máy người dùng, làm theo các bước:

  1. Tải server. Nếu không phải bạn viết server, hãy tải nó về máy trước.
  2. Khởi động tiến trình server: chạy ứng dụng MCP server.

Với SSE (không cần cho server kiểu stdio):

  1. Cấu hình mạng: đảm bảo server truy cập được ở cổng mong muốn.
  2. Kết nối client: dùng URL local như http://localhost:3000.

Triển khai lên cloud

MCP server có thể được triển khai lên nhiều nền tảng cloud:

  • Serverless Functions: triển khai MCP server gọn nhẹ dưới dạng hàm serverless.
  • Dịch vụ container: dùng các dịch vụ như Azure Container Apps, AWS ECS hoặc Google Cloud Run.
  • Kubernetes: triển khai và quản lý MCP server trong cụm Kubernetes để có tính sẵn sàng cao.

Ví dụ: Azure Container Apps

Azure Container Apps hỗ trợ triển khai MCP server. Tính năng này vẫn đang được phát triển và hiện hỗ trợ server SSE.

Cách làm:

  1. Clone một repo:

    sh
    git clone https://github.com/anthonychu/azure-container-apps-mcp-sample.git
    
  2. Chạy local để thử:

    sh
    uv venv
    uv sync
    
    # linux/macOS
    export API_KEYS=<AN_API_KEY>
    # windows
    set API_KEYS=<AN_API_KEY>
    
    uv run fastapi dev main.py
    
  3. Để thử ở local, tạo file mcp.json trong thư mục .vscode với nội dung:

    json
    {
        "inputs": [
            {
                "type": "promptString",
                "id": "weather-api-key",
                "description": "Weather API Key",
                "password": true
            }
        ],
        "servers": {
            "weather-sse": {
                "type": "sse",
                "url": "http://localhost:8000/sse",
                "headers": {
                    "x-api-key": "${input:weather-api-key}"
                }
            }
        }
    }
    

    Khi server SSE đã chạy, bấm biểu tượng play trong file JSON; bạn sẽ thấy tool trên server được GitHub Copilot nhận, xem ở biểu tượng Tool.

  4. Để triển khai, chạy lệnh:

    sh
    az containerapp up -g <RESOURCE_GROUP_NAME> -n weather-mcp --environment mcp -l westus --env-vars API_KEYS=<AN_API_KEY> --source .
    

Vậy là xong: triển khai ở local, rồi triển khai lên Azure qua các bước trên.

Mẫu code

Tài liệu thêm

Bài tiếp theo: Sampling.

Nguồn