Tutorial Stateless MCP Server dengan Python: Integrasi AI Tanpa Database
AP
Adrian Prat

Dipublikasikan 5 Agustus 2026

Tutorial Stateless MCP Server dengan Python: Integrasi AI Tanpa Database

Model Context Protocol (MCP) adalah protokol terbuka yang dirancang Anthropic untuk menghubungkan AI assistant seperti Claude dengan sumber data eksternal dan tools. Pada Juli 2026, Simon Willison mempopulerkan konsep stateless MCP: server yang tidak menyimpan state antar request, membuatnya lebih sederhana, lebih cepat, dan lebih mudah di-deploy. Dalam tutorial ini, kita akan membangun MCP server stateless dengan Python yang bisa diintegrasikan langsung ke Claude Code, Cursor, atau IDE lain yang mendukung protokol ini.

Keunggulan pendekatan stateless adalah eliminasi kompleksitas database dan session management. Server Anda hanyalah sebuah executable Python yang menerima request via stdio transport, menjalankan fungsi Python, lalu mengembalikan hasil. Tidak ada Redis, PostgreSQL, atau filesystem persistence yang diperlukan. Ini sangat cocok untuk internal tools: query data warehouse, generate laporan, atau mengelola deployment.

Persiapan Environment dan Instalasi SDK MCP

Pastikan Python 3.10 atau lebih baru sudah terinstal. Buat virtual environment dan instal mcp SDK beserta dependency yang mungkin Anda butuhkan untuk tool internal:

python3 -m venv venv
source venv/bin/activate
pip install mcp requests pandas

SDK mcp adalah package resmi dari Anthropic yang menyediakan decorator dan helper untuk membuat server. Library requests dan pandas bersifat opsional tergantung apa yang akan diakses oleh tool Anda. Dalam tutorial ini, kita akan membuat tool yang mengambil data cuaca dari API publik dan tool konversi CSV ke JSON.

Langkah 1: Struktur Dasar Server MCP dengan FastMCP

Buat file server.py di root proyek. Gunakan class FastMCP yang menyederhanakan setup:

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("demo-stateless-server")

@mcp.tool()
def get_weather(city: str) -> str:
    """Ambil data cuaca terkini untuk kota yang diberikan."""
    import requests
    url = f"https://wttr.in/{city}?format=3"
    resp = requests.get(url, timeout=10)
    return resp.text if resp.status_code == 200 else "Error fetching weather"

@mcp.tool()
def csv_to_json(csv_path: str) -> str:
    """Konversi file CSV ke string JSON."""
    import pandas as pd
    import json
    df = pd.read_csv(csv_path)
    return df.to_json(orient="records", force_ascii=False)

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

Perhatikan bahwa tidak ada inisialisasi database atau loading model besar di level global. Semua state bersifat ephemeral: request masuk, fungsi dieksekusi, response keluar, memory dibersihkan. Ini adalah inti dari filosofi stateless.

Langkah 2: Menambahkan Resource dan Prompt Template

Selain tools, MCP mendukung resources (data read-only) dan prompts (template interaksi). Tambahkan resource yang menyediakan dokumentasi singkat:

@mcp.resource("docs://internal-guide")
def internal_guide() -> str:
    return "Panduan internal: gunakan tool get_weather untuk forecasting harian."

@mcp.prompt()
def analyze_weather(city: str) -> str:
    return f"Analisis kondisi cuaca di {city} hari ini dan berikan rekomendasi aktivitas outdoor."

Resources dan prompts memberikan konteks tambahan ke AI assistant sebelum tool dipanggil. Prompt template membantu standardisasi cara AI berinteraksi dengan sistem Anda.

Langkah 3: Testing Server dengan MCP Inspector

Sebelum diintegrasikan ke Claude Code, uji server menggunakan MCP Inspector. Instal inspector secara global via npm:

npm install -g @anthropics/mcp-inspector
npx @anthropics/mcp-inspector python server.py

Inspector akan membuka antarmuka web di browser default. Di sana Anda bisa melihat daftar tools, resources, dan prompts yang terdaftar. Cobalah memanggil get_weather dengan argumen city: Jakarta. Jika hasil muncul tanpa error, server Anda sudah siap.

Periksa juga tab Server Configuration untuk memastikan transport stdio terdeteksi dengan benar. Stateless server menggunakan stdio karena tidak memerlukan port TCP atau HTTP server yang persisten.

Langkah 4: Integrasi ke Claude Code

Claude Code mendukung MCP server melalui file konfigurasi. Buat atau edit file ~/.claude/settings.json:

{
  "mcpServers": {
    "demo-stateless": {
      "command": "python3",
      "args": ["/absolute/path/to/server.py"]
    }
  }
}

Restart Claude Code atau jalankan perintah /mcp untuk melihat daftar server yang terhubung. Ajukan pertanyaan seperti Bagaimana cuaca di Surabaya hari ini? Claude akan secara otomatis memanggil tool get_weather dan menyajikan hasilnya dalam bahasa alami.

Langkah 5: Integrasi ke Cursor dan IDE Lain

Cursor mendukung MCP melalui fitur Custom MCP Servers di pengaturan. Navigasi ke Cursor Settings > MCP > Add Server. Pilih tipe stdio dan isi command:

python3 /absolute/path/to/server.py

Setelah ditambahkan, Anda bisa menggunakan tool dalam Composer atau AI Chat dengan menyebutkan nama tool. Contoh prompt: Konversi file /path/to/data.csv ke JSON dan analisis 5 baris pertama. Cursor akan memanggil csv_to_json dan menampilkan hasilnya.

Berbagai IDE dan CLI tools lain yang mengadopsi MCP akan mengenali server Anda secara otomatis selama transport dan schema sesuai standar. Dokumentasi protokol lengkap ada di modelcontextprotocol.io.

Langkah 6: Packaging dan Distribusi sebagai Binary

Untuk memudahkan distribusi ke tim, package server menggunakan pyinstaller atau uv agar tidak perlu menginstal Python dependencies di setiap mesin developer:

pip install pyinstaller
pyinstaller --onefile server.py

Hasil binary ada di dist/server. Tim cukup menjalankan executable tersebut tanpa khawatir tentang virtual environment. Pastikan binary tetap menggunakan stdio transport agar kompatibel dengan semua MCP client.

Kesimpulan dan Best Practices

Stateless MCP server mengurangi friction integrasi AI ke toolchain internal Anda secara dramatis. Tanpa database, tanpa deployment infrastruktur tambahan, hanya sebuah script Python yang bisa dijalankan lokal atau di CI/CD pipeline.

Beberapa best practices: selalu validasi input di setiap tool function untuk mencegah command injection. Hindari menyimpan secret di dalam kode source: gunakan environment variable. Dan terakhir, dokumentasikan setiap tool dengan docstring yang jelas karena deskripsi inilah yang dibaca AI assistant untuk memutuskan kapan harus memanggil tool tersebut.

Untuk inspirasi lebih lanjut, baca tulisan Simon Willison tentang stateless MCP dan eksplorasi repository contoh di GitHub. Selamat membangun bridge antara AI dan internal tools Anda.