Cara Menghubungkan OpenAI Agent SDK ke Server MCP

💡Tertarik dengan tren terbaru dalam AI? Jika iya, Anda tidak boleh melewatkan Anakin AI! Anakin AI adalah platform all-in-one untuk semua otomasi alur kerja Anda, membuat aplikasi AI yang kuat dengan Pembuat Aplikasi Tanpa Kode yang mudah digunakan, dengan Deepseek, o3-mini-high dari OpenAI, Claude 3.7 Sonnet, FLUX, Minimax Video,

Build APIs Faster & Together in Apidog

Cara Menghubungkan OpenAI Agent SDK ke Server MCP

Start for free
Inhalte
💡
Tertarik dengan tren terbaru dalam AI?

Jika iya, Anda tidak boleh melewatkan Anakin AI!

Anakin AI adalah platform all-in-one untuk semua otomasi alur kerja Anda, membuat aplikasi AI yang kuat dengan Pembuat Aplikasi Tanpa Kode yang mudah digunakan, dengan Deepseek, o3-mini-high dari OpenAI, Claude 3.7 Sonnet, FLUX, Minimax Video, Hunyuan...

Buat Aplikasi AI Impian Anda dalam hitungan menit, bukan minggu dengan Anakin AI!
Anakin AI: Platform AI All-in-One Anda
Anakin AI: Platform AI All-in-One Anda

SDK Agen OpenAI menyediakan cara yang kuat untuk membangun aplikasi AI dengan kemampuan agen. Salah satu fitur kuncinya adalah dukungan untuk Protokol Konteks Model (MCP), yang menstandarisasi cara aplikasi memberikan konteks dan alat kepada Model Bahasa Besar (LLM). Artikel ini akan memandu Anda melalui cara menghubungkan OpenAI Agen SDK ke Server MCP, dengan langkah-langkah rinci dan contoh kode.

Memahami Protokol Konteks Model (MCP)

MCP adalah protokol terbuka yang menstandarisasi cara aplikasi memberikan konteks kepada LLM. Anggap MCP seperti "port USB-C" untuk aplikasi AI - ini menyediakan cara terstandarisasi untuk menghubungkan model AI ke berbagai sumber data dan alat. Seperti halnya USB-C menghubungkan perangkat Anda ke berbagai periferal, MCP menghubungkan model AI ke alat dan sumber data yang berbeda.

Jenis Server MCP

Spesifikasi MCP mendefinisikan dua jenis server berdasarkan mekanisme transportnya:

  1. Server Stdio: Ini berjalan sebagai subproses dari aplikasi Anda, pada dasarnya berjalan "secara lokal".
  2. Server SSE: Ini berjalan secara jarak jauh, dan Anda menghubungkannya melalui URL menggunakan HTTP melalui Event yang Dikirim oleh Server (SSE).

SDK Agen OpenAI menyediakan kelas yang sesuai untuk kedua jenis server ini:

  • MCPServerStdio untuk server stdio lokal
  • MCPServerSse untuk server SSE jarak jauh

Prasyarat

Sebelum Anda mulai, pastikan Anda telah:

Memasang Python 3.10 atau lebih tinggi

Memasang SDK Agen OpenAI:

pip install openai-agents

Untuk menggunakan server stdio lokal, Anda mungkin memerlukan alat tambahan seperti npx (untuk server MCP berbasis JavaScript)

Menghubungkan ke Server MCP Stdio

Ayo mulai dengan menghubungkan ke server MCP stdio lokal. Kita akan menggunakan server MCP sistem berkas sebagai contoh.

Langkah 1: Pasang Ketergantungan yang Diperlukan

Jika Anda berencana menggunakan server MCP sistem berkas, Anda akan memerlukan Node.js dan NPX:

# Pasang Node.js (jika belum terpasang)
# Untuk Ubuntu/Debian
sudo apt update
sudo apt install nodejs npm

# Untuk macOS
brew install node

# Verifikasi pemasangan
node --version
npx --version

Langkah 2: Siapkan Struktur Proyek Anda

Buat struktur proyek dasar:

my_agent_project/
├── sample_data/
│   ├── file1.txt
│   └── file2.md
├── main.py
└── README.md

Langkah 3: Hubungkan ke Server MCP Stdio

Berikut adalah contoh lengkap untuk menghubungkan ke server MCP sistem berkas menggunakan MCPServerStdio:

import asyncio
import os
import shutil
from agents import Agent, Runner, gen_trace_id, trace
from agents.mcp import MCPServerStdio

async def run_agent_with_mcp():
    # Dapatkan path direktori untuk data contoh
    current_dir = os.path.dirname(os.path.abspath(__file__))
    sample_data_dir = os.path.join(current_dir, "sample_data")

    # Buat dan konfigurasi server MCP
    async with MCPServerStdio(
        name="Server Sistem Berkas",
        params={
            "command": "npx",
            "args": ["-y", "@modelcontextprotocol/server-filesystem", sample_data_dir],
        },
    ) as mcp_server:
        # Buat agen yang menggunakan server MCP
        agent = Agent(
            name="AsistenBerita",
            instructions="Gunakan alat sistem berkas untuk membaca dan menganalisis berkas-berkas di direktori sample_data.",
            mcp_servers=[mcp_server]
        )

        # Jalankan agen dengan kueri pengguna
        message = "Daftar semua berkas di direktori dan ringkas isinya."
        print(f"Menjalankan kueri: {message}\\\\n")

        # Hasilkan ID jejak untuk debugging
        trace_id = gen_trace_id()
        with trace(workflow_name="Contoh Sistem Berkas MCP", trace_id=trace_id):
            print(f"Lihat jejak: <https://platform.openai.com/traces/{trace_id}\\\\n>")
            result = await Runner.run(starting_agent=agent, input=message)
            print(result.final_output)

if __name__ == "__main__":
    # Periksa apakah npx terpasang
    if not shutil.which("npx"):
        raise RuntimeError("npx tidak terpasang. Silakan pasang dengan `npm install -g npx`.")

    asyncio.run(run_agent_with_mcp())

Dalam contoh ini:

  1. Kita membuat instance MCPServerStdio yang menjalankan server MCP sistem berkas sebagai subproses.
  2. Kita mengoper server ini ke konstruktor Agent melalui parameter mcp_servers.
  3. Ketika agen dijalankan, agen secara otomatis memanggil list_tools() pada server MCP untuk membuat LLM mengetahui alat yang tersedia.
  4. Jika LLM memutuskan untuk menggunakan salah satu alat MCP, SDK memanggil call_tool() pada server.

Menghubungkan ke Server MCP SSE

Sekarang mari kita lihat bagaimana menghubungkan ke server MCP jarak jauh menggunakan SSE:

Langkah 1: Memahami Server MCP SSE

Server MCP SSE (Event yang Dikirim oleh Server) berjalan secara jarak jauh dan mengekspos fungsionalitas mereka melalui endpoint HTTP. Tidak seperti server stdio, mereka tidak berjalan sebagai subproses dari aplikasi Anda.

Langkah 2: Hubungkan ke Server MCP SSE

Berikut adalah kode contoh yang menghubungkan ke server MCP SSE:

import asyncio
from agents import Agent, Runner, gen_trace_id, trace
from agents.mcp import MCPServerSse
from agents.model_settings import ModelSettings

async def run_agent_with_remote_mcp():
    # Buat dan konfigurasi koneksi server MCP SSE
    async with MCPServerSse(
        name="Layanan Cuaca",
        params={
            "url": "<https://example.com/mcp/sse>",
            # Parameter otentikasi opsional
            "headers": {
                "Authorization": "Bearer your_api_key_here"
            }
        },
    ) as mcp_server:
        # Buat agen menggunakan server MCP jarak jauh
        agent = Agent(
            name="AsistenCuaca",
            instructions="Gunakan alat cuaca untuk menjawab pertanyaan tentang kondisi cuaca saat ini.",
            mcp_servers=[mcp_server],
            # Memaksa agen menggunakan alat ketika tersedia
            model_settings=ModelSettings(tool_choice="required")
        )

        # Jalankan agen dengan kueri pengguna
        message = "Bagaimana cuaca di Tokyo hari ini?"
        print(f"Menjalankan kueri: {message}\\\\n")

        trace_id = gen_trace_id()
        with trace(workflow_name="Contoh MCP Cuaca", trace_id=trace_id):
            print(f"Lihat jejak: <https://platform.openai.com/traces/{trace_id}\\\\n>")
            result = await Runner.run(starting_agent=agent, input=message)
            print(result.final_output)

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

Membuat Server MCP SSE Lokal yang Sederhana

Untuk benar-benar memahami cara kerja MCP, akan membantu untuk mengimplementasikan server MCP yang sederhana. Berikut contoh server MCP SSE minimal:

import asyncio
import json
from fastapi import FastAPI, Request
from fastapi.responses import StreamingResponse
from typing import Dict, Any, List, Optional

app = FastAPI()

# Definisikan alat yang akan disediakan oleh server MCP kita
TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "add",
            "description": "Menambahkan dua angka bersama",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {"type": "number", "description": "Angka pertama"},
                    "b": {"type": "number", "description": "Angka kedua"}
                },
                "required": ["a", "b"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Dapatkan cuaca untuk suatu lokasi",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {"type": "string", "description": "Nama kota"}
                },
                "required": ["location"]
            }
        }
    }
]

# Implementasikan fungsionalitas alat yang sebenarnya
async def call_tool(tool_name: str, parameters: Dict[str, Any]) -> Dict[str, Any]:
    if tool_name == "add":
        return {"result": parameters["a"] + parameters["b"]}

    elif tool_name == "get_weather":
        # Dalam implementasi nyata, Anda akan memanggil API cuaca yang sebenarnya
        weather_data = {
            "Tokyo": {"condition": "Cerah", "temperature": 25},
            "New York": {"condition": "Berawan", "temperature": 18},
            "London": {"condition": "Hujan", "temperature": 15}
        }
        location = parameters["location"]
        if location in weather_data:
            return {"weather": weather_data[location]}
        return {"error": f"Data cuaca tidak tersedia untuk {location}"}

    return {"error": f"Alat tidak dikenal: {tool_name}"}

async def sse_event_generator(request: Request):
    # Baca badan permintaan
    body_bytes = await request.body()
    body = json.loads(body_bytes)

    # Tangani berbagai operasi MCP
    if body["action"] == "list_tools":
        yield f"data: {json.dumps({'tools': TOOLS})}\\\\n\\\\n"

    elif body["action"] == "call_tool":
        tool_name = body["tool_name"]
        parameters = body["parameters"]
        result = await call_tool(tool_name, parameters)
        yield f"data: {json.dumps({'result': result})}\\\\n\\\\n"

@app.post("/sse")
async def sse_endpoint(request: Request):
    return StreamingResponse(
        sse_event_generator(request),
        media_type="text/event-stream"
    )

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

Fitur Lanjutan

Menyimpan Daftar Alat

Untuk meningkatkan kinerja, Anda dapat menyimpan daftar alat dari server MCP:

# Buat server MCP dengan penyimpanan alat
async with MCPServerSse(
    name="Layanan Cuaca",
    params={"url": "<https://example.com/mcp/sse>"},
    cache_tools_list=True  # Aktifkan penyimpanan
) as mcp_server:
    # Gunakan server seperti sebelumnya...

Ketika cache_tools_list=True diatur, SDK hanya akan memanggil list_tools() pada server MCP sekali dan menggunakan kembali hasilnya untuk jalannya agen berikutnya. Ini mengurangi latensi, terutama untuk server jarak jauh.

Untuk membatalkan penyimpanan jika diperlukan:

mcp_server.invalidate_tools_cache()

Melacak Operasi MCP

SDK Agen OpenAI menyertakan kemampuan pelacakan bawaan yang secara otomatis menangkap operasi MCP:

  1. Panggilan ke server MCP untuk mencantumkan alat
  2. Informasi terkait MCP pada panggilan fungsi

Anda dapat melihat jejak ini di https://platform.openai.com/traces/ ketika Anda menggunakan pengelola konteks trace seperti yang ditunjukkan dalam contoh di atas.

Menggunakan Beberapa Server MCP

Anda dapat menghubungkan agen Anda ke beberapa server MCP secara bersamaan, memberinya akses ke berbagai alat yang lebih luas:

async def run_with_multiple_servers():
    async with MCPServerStdio(
        name="Sistem Berkas",
        params={"command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "./data"]}
    ) as fs_server, MCPServerSse(
        name="API Cuaca",
        params={"url": "<https://example.com/weather/mcp/sse>"}
    ) as weather_server:
        # Buat agen dengan kedua server MCP
        agent = Agent(
            name="AsistenMultiAlat",
            instructions="Gunakan semua alat yang tersedia untuk membantu pengguna.",
            mcp_servers=[fs_server, weather_server]
        )

        # Jalankan agen
        result = await Runner.run(
            starting_agent=agent,
            input="Pertama, periksa cuaca di Tokyo, lalu baca isi dari berkas report.txt."
        )
        print(result.final_output)

Penanganan Kesalahan dan Debugging

Ketika bekerja dengan server MCP, Anda mungkin mengalami berbagai masalah. Berikut adalah beberapa masalah umum dan cara mengatasinya:

Masalah Koneksi

Jika server MCP Anda tidak merespons:

try:
    async with MCPServerSse(
        name="Layanan Cuaca",
        params={"url": "<https://example.com/mcp/sse>"}
    ) as mcp_server:
        # Gunakan server...
except Exception as e:
    print(f"Gagal terhubung ke server MCP: {e}")
    # Implementasikan strategi cadangan

Kesalahan Eksekusi Alat

Ketika eksekusi alat gagal, tangani dengan baik:

try:
    result = await Runner.run(starting_agent=agent, input=user_query)
    print(result.final_output)
except Exception as e:
    print(f"Kesalahan selama eksekusi agen: {e}")
    # Anda mungkin ingin memeriksa log jejak untuk informasi kesalahan yang lebih rinci

Kesimpulan

Dukungan SDK Agen OpenAI untuk MCP memungkinkan Anda memperluas agen Anda dengan berbagai alat dan kemampuan. Apakah Anda menggunakan server stdio lokal atau endpoint SSE jarak jauh, integrasinya sederhana dan kuat.

Dengan menghubungkan ke server MCP, agen Anda dapat mengakses sistem berkas, API cuaca, basis data, dan hampir semua alat eksternal atau sumber data yang mengekspos antarmuka MCP. Fleksibilitas ini menjadikan SDK Agen OpenAI dasar yang kuat untuk membangun aplikasi AI yang canggih.

Ingatlah untuk memanfaatkan fitur seperti penyimpanan alat untuk mengoptimalkan kinerja, dan gunakan kemampuan pelacakan bawaan untuk mendebug dan memantau interaksi agen Anda dengan server MCP.

Selamat coding dengan OpenAI Agents dan MCP!