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.
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
@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
@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.
Momentálně nejsou žádné komentáře.