Apidog

Nền tảng phát triển API hợp tác tất cả trong một

Thiết kế API

Tài liệu API

Gỡ lỗi API

Giả lập API

Kiểm thử API tự động

Cách sử dụng máy chủ MCP với OpenRouter

中村 拓也

中村 拓也

Updated on tháng 3 14, 2025

Phát triển AI đang tiến triển nhanh chóng, và việc tích hợp các công cụ bên ngoài với các mô hình ngôn ngữ là một bước quan trọng phía trước. OpenRouter cung cấp một API thống nhất để truy cập nhiều mô hình ngôn ngữ, trong khi MCP Servers (Máy chủ Giao thức Ngữ cảnh Mô hình) cho phép những mô hình này thực hiện các công cụ bên ngoài và truy cập dữ liệu trực tiếp. Kết hợp chúng tạo ra một hệ thống mạnh mẽ để xây dựng các ứng dụng AI tiên tiến.

Trong bài viết này, tôi sẽ hướng dẫn bạn cách tích hợp MCP Servers với OpenRouter. Bạn sẽ tìm hiểu các chức năng chính của chúng, quy trình tích hợp và các ví dụ thực tế.

💡
Trước khi bắt đầu, hãy tải xuống Apidog miễn phí tại đây, đây là một công cụ tuyệt vời để thử nghiệm các API và gỡ lỗi thiết lập của bạn.
button

Hiểu về MCP Servers và OpenRouter

Để tích hợp MCP Servers với OpenRouter, bạn trước tiên cần nắm rõ những gì mà mỗi thành phần thực hiện.

OpenRouter: Truy cập thống nhất vào các mô hình ngôn ngữ

OpenRouter là một nền tảng giúp đơn giản hóa việc tương tác với các mô hình ngôn ngữ lớn (LLMs) từ các nhà cung cấp như OpenAI, Anthropic, và xAI. Nó cung cấp một điểm cuối API duy nhất https://openrouter.ai/api/v1/chat/completions tương thích với cấu trúc API của OpenAI. Các tính năng chính bao gồm:

  • Tổng hợp mô hình: Truy cập hàng trăm LLMs thông qua một giao diện duy nhất.
  • Tối ưu hóa chi phí: Chuyển hướng các yêu cầu đến các mô hình tiết kiệm chi phí dựa trên khả năng và giá cả.
  • Cân bằng tải: Phân phối yêu cầu để ngăn ngừa quá tải ở bất kỳ nhà cung cấp nào.
  • Fallbacks: Chuyển sang các mô hình thay thế nếu một mô hình gặp sự cố.

Bạn sẽ cần một tài khoản OpenRouter và một khóa API để tiếp tục. Lấy của bạn tại openrouter.ai.

MCP Servers: Mở rộng khả năng mô hình

MCP Servers thực hiện Giao thức Ngữ cảnh Mô hình, cho phép LLMs gọi các công cụ bên ngoài. Không giống như các mô hình độc lập bị giới hạn bởi dữ liệu đào tạo của chúng, MCP Servers cho phép tương tác theo thời gian thực với các hệ thống như thư mục tệp, cơ sở dữ liệu, hoặc các API bên thứ ba. Một định nghĩa công cụ MCP điển hình bao gồm:

  • Tên: Xác định công cụ (ví dụ: list_files).
  • Mô tả: Giải thích mục đích của nó.
  • Tham số: Xác định đầu vào theo định dạng JSON Schema.

Ví dụ, một công cụ MCP để liệt kê các tệp trong thư mục có thể trông như thế này:

{
  "name": "list_files",
  "description": "Liệt kê các tệp trong một thư mục được chỉ định",
  "parameters": {
    "type": "object",
    "properties": {
      "path": {"type": "string", "description": "Đường dẫn thư mục"}
    },
    "required": ["path"]
  }
}

Cùng nhau, OpenRouter cung cấp mô hình, và MCP Servers cung cấp công cụ, tạo thành một hệ sinh thái AI vững mạnh.

Tại sao tích hợp MCP Servers với OpenRouter?

Kết hợp những công nghệ này mang lại một số lợi thế kỹ thuật:

  • Độ linh hoạt của mô hình: Sử dụng bất kỳ LLM nào được OpenRouter hỗ trợ với khả năng gọi công cụ.
  • Giảm chi phí: Kết hợp các mô hình rẻ hơn với các công cụ bên ngoài để giải phóng các tác vụ phức tạp.
  • Tăng cường khả năng: Cho phép các mô hình truy xuất dữ liệu trực tiếp hoặc thực hiện các hành động (ví dụ: thao tác tệp).
  • Khả năng mở rộng: Chuyển đổi mô hình hoặc công cụ mà không cần viết lại logic cốt lõi của bạn.
  • Bảo vệ tương lai: Thích ứng với các LLM và công cụ mới khi chúng xuất hiện.

Việc tích hợp này là lý tưởng cho các nhà phát triển xây dựng các hệ thống AI cần sự tương tác với thế giới thực.

Quy trình tích hợp từng bước

Bây giờ, hãy đi vào chi tiết kỹ thuật. Đây là cách tích hợp MCP Servers với OpenRouter.

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

Đảm bảo bạn có:

  • Tài khoản OpenRouter và Khóa API: Từ openrouter.ai.
  • MCP Server: Chạy cục bộ (ví dụ: tại http://localhost:8000) hoặc từ xa. Đối với hướng dẫn này, tôi sẽ sử dụng một máy chủ thư mục tệp của MCP.
  • Python 3.8+: Với thư viện requests (pip install requests).
  • Apidog: Tùy chọn nhưng được khuyến nghị cho việc thử nghiệm API. Tải xuống miễn phí.
button

Bước 1: Định nghĩa và chuyển đổi các công cụ MCP

OpenRouter sử dụng định dạng gọi công cụ của OpenAI, vì vậy bạn phải chuyển đổi các định nghĩa công cụ MCP. Bắt đầu với định nghĩa MCP:

{
  "name": "list_files",
  "description": "Liệt kê các tệp trong một thư mục được chỉ định",
  "parameters": {
    "type": "object",
    "properties": {
      "path": {"type": "string", "description": "Đường dẫn thư mục"}
    },
    "required": ["path"]
  }
}

Chuyển đổi nó sang định dạng OpenAI bằng cách thêm một trường type và lồng các chi tiết chức năng:

{
  "type": "function",
  "function": {
    "name": "list_files",
    "description": "Liệt kê các tệp trong một thư mục được chỉ định",
    "parameters": {
      "type": "object",
      "properties": {
        "path": {"type": "string", "description": "Đường dẫn thư mục"}
      },
      "required": ["path"]
    }
  }
}

Cấu trúc JSON này là những gì OpenRouter mong đợi trong payload API của nó.

Bước 2: Cấu hình yêu cầu API

Chuẩn bị một yêu cầu API đến OpenRouter. Định nghĩa các tiêu đề với khóa API của bạn và một payload với mô hình, tin nhắn, và công cụ. Dưới đây là một ví dụ bằng Python:

import requests
import json

# Headers
headers = {
    "Authorization": "Bearer your_openrouter_api_key",
    "Content-Type": "application/json"
}

# Payload
payload = {
    "model": "openai/gpt-4",  # Thay thế bằng mô hình bạn chọn
    "messages": [
        {"role": "user", "content": "Liệt kê các tệp trong thư mục hiện tại."}
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "list_files",
                "description": "Liệt kê các tệp trong một thư mục được chỉ định",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "path": {"type": "string", "description": "Đường dẫn thư mục"}
                    },
                    "required": ["path"]
                }
            }
        }
    ]
}

Thay thế your_openrouter_api_key bằng khóa thực tế của bạn.

Bước 3: Gửi yêu cầu API ban đầu

Thực hiện một yêu cầu POST đến điểm cuối của OpenRouter:

response = requests.post(
    "https://openrouter.ai/api/v1/chat/completions",
    headers=headers,
    json=payload
)

response_data = response.json()

Bước 4: Xử lý các cuộc gọi công cụ

Kiểm tra xem phản hồi có bao gồm một cuộc gọi công cụ hay không:

{
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": null,
        "tool_calls": [
          {
            "id": "call_123",
            "type": "function",
            "function": {
              "name": "list_files",
              "arguments": "{\"path\": \".\"}"
            }
          }
        ]
      }
    }
  ]
}

Trích xuất chi tiết cuộc gọi công cụ:

message = response_data["choices"][0]["message"]
if "tool_calls" in message:
    tool_call = message["tool_calls"][0]
    function_name = tool_call["function"]["name"]
    arguments = json.loads(tool_call["function"]["arguments"])

Bước 5: Gọi đến MCP Server

Gửi yêu cầu công cụ đến MCP Server của bạn:

mcp_response = requests.post(
    "http://localhost:8000/call",
    json={
        "name": function_name,
        "arguments": arguments
    }
)

tool_result = mcp_response.json()["result"]  # ví dụ: ["file1.txt", "file2.txt"]

Bước 6: Trả về kết quả công cụ cho OpenRouter

Thêm cuộc gọi công cụ của trợ lý và kết quả vào lịch sử tin nhắn:

messages = payload["messages"] + [
    {
        "role": "assistant",
        "content": null,
        "tool_calls": [tool_call]
    },
    {
        "role": "tool",
        "tool_call_id": tool_call["id"],
        "content": json.dumps(tool_result)
    }
]

# Cập nhật payload
payload["messages"] = messages

# Gửi yêu cầu tiếp theo
final_response = requests.post(
    "https://openrouter.ai/api/v1/chat/completions",
    headers=headers,
    json=payload
)

final_output = final_response.json()["choices"][0]["message"]["content"]
print(final_output)  # ví dụ: "Tệp: file1.txt, file2.txt"

Bước 7: Xử lý nhiều cuộc gọi công cụ

Nếu mô hình yêu cầu nhiều cuộc gọi công cụ, hãy lặp qua quá trình:

messages = payload["messages"]

while True:
    response = requests.post(
        "https://openrouter.ai/api/v1/chat/completions",
        headers=headers,
        json={"model": "openai/gpt-4", "messages": messages}
    )
    message = response.json()["choices"][0]["message"]
    
    if "tool_calls" not in message:
        print(message["content"])
        break
    
    for tool_call in message["tool_calls"]:
        function_name = tool_call["function"]["name"]
        arguments = json.loads(tool_call["function"]["arguments"])
        
        mcp_response = requests.post(
            "http://localhost:8000/call",
            json={"name": function_name, "arguments": arguments}
        )
        tool_result = mcp_response.json()["result"]
        
        messages.extend([
            {"role": "assistant", "content": null, "tool_calls": [tool_call]},
            {"role": "tool", "tool_call_id": tool_call["id"], "content": json.dumps(tool_result)}
        ])

Điều này đảm bảo rằng tất cả các cuộc gọi công cụ đều được xử lý.

Ví dụ thực tế: Tương tác hệ thống tệp

Hãy áp dụng điều này vào một kịch bản thực tế liệt kê các tệp với một MCP Server.

  1. Định nghĩa công cụ: Sử dụng công cụ list_files từ trước.
  2. MCP Server: Giả sử nó đang chạy tại http://localhost:8000.
  3. Cuộc gọi API: Gửi “Liệt kê các tệp trong thư mục hiện tại” đến OpenRouter.
  4. Xử lý phản hồi: Mô hình gọi list_files với {"path": "."}.
  5. Thực thi MCP: Máy chủ trả về ["file1.txt", "file2.txt"].
  6. Kết quả cuối cùng: Mô hình phản hồi, “Tệp tìm thấy: file1.txt, file2.txt.”

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

import requests
import json

headers = {"Authorization": "Bearer your_openrouter_api_key", "Content-Type": "application/json"}
payload = {
    "model": "openai/gpt-4",
    "messages": [{"role": "user", "content": "Liệt kê các tệp trong thư mục hiện tại."}],
    "tools": [{
        "type": "function",
        "function": {
            "name": "list_files",
            "description": "Liệt kê các tệp trong một thư mục được chỉ định",
            "parameters": {
                "type": "object",
                "properties": {"path": {"type": "string", "description": "Đường dẫn thư mục"}},
                "required": ["path"]
            }
        }
    }]
}

response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=payload)
message = response.json()["choices"][0]["message"]

if "tool_calls" in message:
    tool_call = message["tool_calls"][0]
    function_name = tool_call["function"]["name"]
    arguments = json.loads(tool_call["function"]["arguments"])
    
    mcp_response = requests.post("http://localhost:8000/call", json={"name": function_name, "arguments": arguments})
    tool_result = mcp_response.json()["result"]
    
    messages = payload["messages"] + [
        {"role": "assistant", "content": null, "tool_calls": [tool_call]},
        {"role": "tool", "tool_call_id": tool_call["id"], "content": json.dumps(tool_result)}
    ]
    
    final_response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json={"model": "openai/gpt-4", "messages": messages})
    print(final_response.json()["choices"][0]["message"]["content"])

Khắc phục sự cố thường gặp

Dưới đây là các giải pháp cho những vấn đề thường gặp:

  • Công cụ không được gọi: Xác minh cú pháp định nghĩa công cụ và độ rõ ràng của lời nhắc.
  • Tham số không hợp lệ: Đảm bảo các tham số khớp với JSON Schema.
  • MCP Server gặp sự cố: Kiểm tra nhật ký máy chủ và điểm cuối (http://localhost:8000/call).
  • Xác thực API: Xác nhận rằng khóa OpenRouter của bạn là chính xác.

Sử dụng Apidog để gỡ lỗi các yêu cầu và phản hồi API một cách hiệu quả.

Mở rộng tích hợp

Để vượt quá 2000 từ và thêm chiều sâu, hãy xem xét những mở rộng này:

Ví dụ về truy vấn cơ sở dữ liệu

Định nghĩa một công cụ MCP để truy vấn một cơ sở dữ liệu:

{
  "type": "function",
  "function": {
    "name": "query_db",
    "description": "Truy vấn một cơ sở dữ liệu với SQL",
    "parameters": {
      "type": "object",
      "properties": {"sql": {"type": "string", "description": "Truy vấn SQL"}},
      "required": ["sql"]
    }
  }
}

Gửi “Lấy tất cả người dùng từ cơ sở dữ liệu” đến OpenRouter, xử lý cuộc gọi query_db, và trả về kết quả như [{"id": 1, "name": "Alice"}].

Xử lý lỗi

Thêm xử lý lỗi mạnh mẽ:

try:
    mcp_response = requests.post("http://localhost:8000/call", json={"name": function_name, "arguments": arguments})
    mcp_response.raise_for_status()
except requests.RequestException as e:
    tool_result = f"Lỗi: {str(e)}"

Điều này đảm bảo rằng ứng dụng của bạn vẫn ổn định.

Kết luận

Tích hợp MCP Servers với OpenRouter cho phép AI của bạn tận dụng các công cụ bên ngoài thông qua một API duy nhất. Hướng dẫn này đã đề cập đến việc thiết lập, chuyển đổi công cụ, các cuộc gọi API, và các ví dụ thực tế như tương tác hệ thống tệp. Với những lợi ích như tiết kiệm chi phí và tăng cường chức năng, phương pháp này là điều bắt buộc phải thử cho các nhà phát triển kỹ thuật.

Bắt đầu thử nghiệm ngay bây giờ, hãy tải Apidog miễn phí tại đây để thử nghiệm các API của bạn. Hãy cho tôi biết kết quả!

button