Skip to Content

Problém: Váš systém nemá AI přístup

Vas firemni system je odpojeny od AI

Preklenuti mezery mezi Claude a vasimi zivymi systemy

Mate Odoo instanci s tisici zakaznickych zaznamu. Nebo Shopify obchod s produktovymi katalogy. Nebo interni PostgreSQL databazi s reporty prodeju. Claude nevidi nic z toho — pokud nepostavite MCP server, ktery preklenuje tuto mezeru.

Priklad 1: MCP server pro REST API (Odoo)

Pokud jste sledovali kurz Claude Plugins, vite, ze VaryShop pouziva Odoo jako CRM. CRM Toolkit plugin pouziVal Python skripty pro volani Odoo XML-RPC API. Ted to premenime na MCP server.

Odoo MCP Server (Python)
import os, json, xmlrpc.client
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("odoo-connector")

ODOO_URL = os.environ.get("ODOO_URL")
ODOO_DB = os.environ.get("ODOO_DB")
ODOO_KEY = os.environ.get("ODOO_API_KEY")

common = xmlrpc.client.ServerProxy(
    f"{ODOO_URL}/xmlrpc/2/common")
models = xmlrpc.client.ServerProxy(
    f"{ODOO_URL}/xmlrpc/2/object")
UID = common.authenticate(ODOO_DB, "", ODOO_KEY, {})

def call(model, method, args, kw=None):
    return models.execute_kw(
        ODOO_DB, UID, ODOO_KEY,
        model, method, args, kw or {})

@mcp.tool()
def search_contacts(query: str,
                    limit: int = 10) -> str:
    """Search contacts in Odoo CRM."""
    results = call("res.partner", "search_read", [
        ["|", ["name", "ilike", query],
              ["email", "ilike", query]]
    ], {"fields": ["name", "email", "phone",
                   "city"], "limit": limit})
    return json.dumps(results, indent=2,
                      ensure_ascii=False)

@mcp.tool()
def create_contact(name: str, email: str,
                   phone: str = "",
                   city: str = "") -> str:
    """Create a new contact in Odoo CRM."""
    pid = call("res.partner", "create",
               [{"name": name, "email": email,
                 "phone": phone, "city": city}])
    return json.dumps({"id": pid, "status": "created"})

Interaktivni pristup

Ted se Claude muze primo zeptat: "Vyhledej kontakty jmenem Jan" nebo "Ukaz mi objednavky z posledniho tydne" — zadne skripty potreba.

Priklad 2: Pristup k databazi

Databazovy MCP Server (ukazka)
@mcp.tool()
def query_data(sql: str) -> str:
    """Execute a read-only SQL query.
    Only SELECT statements are allowed."""
    if not sql.strip().upper().startswith("SELECT"):
        return json.dumps(
            {"error": "Only SELECT queries allowed"})
    conn = psycopg2.connect(DB_URL)
    try:
        cur = conn.cursor()
        cur.execute(sql)
        columns = [d[0] for d in cur.description]
        rows = [dict(zip(columns, row))
                for row in cur.fetchall()]
        return json.dumps(rows[:100], indent=2,
                          default=str)
    finally:
        conn.close()

Bezpecnostni upozorneni

Vzdy omezte databazove MCP servery na read-only dotazy. Pouzijte databazoveho uzivatele pouze s opravnenim SELECT. Nikdy nezpristupnujte write pristup, pokud to neni absolutne nutne.

Autentizace a bezpecnostni best practices

Environment variables

Nikdy neukladejte API klice nebo hesla primo v kodu serveru. Vzdy pouzijte env v .mcp.json pro bezpecne predavani tajnych klicu.

Nejmensi opravneni

Vytvorte API klice s minimalnimi potrebnymi opravnenimi. Pouzivejte read-only databazove uzivatele kde je to mozne. Omezte pristupne endpointy.

Validace vstupu

Vzdy validujte a sanitizujte vstupy od Claude. Pouzivejte parametrizovane dotazy pro SQL. Nastavte rozumne limity na velikost vysledku.

Error handling

Vzdy vracejte strukturovane chybove zpravy. Claude pak muze problem vysvetlit uzivateli a navrhnout reseni.

Vzor pro error handling

Error handling
@mcp.tool()
def safe_search(query: str) -> str:
    """Search with proper error handling."""
    try:
        results = call_external_api(query)
        return json.dumps(results)
    except ConnectionError:
        return json.dumps(
            {"error": "Cannot connect to the API."})
    except TimeoutError:
        return json.dumps(
            {"error": "API request timed out."})
    except Exception as e:
        return json.dumps(
            {"error": f"Unexpected error: {str(e)}"})

Klicove shrnuti

Propojeni se skutecnymi firemnimi systemy sleduje stejny vzorec jako nas JSON reader — definujte nastroje, implementujte handlery, nakonfigurujte server. Rozdil je v pridani autentizace, error handlingu a bezpecnosti. Vzdy zacnete s read-only pristupem a write operace pridavejte pouze kdyz je potreba.

Hodnocení
0 0

Momentálně nejsou žádné komentáře.

být první, kdo zanechá komentář.