Abstraktní schéma MCP serveru propojující AI asistenta, aplikační služby a databázové nástroje

Vlastní MCP server: návrh, implementace a Laravel vrstva

Vlastní MCP server dává AI asistentovi řízený přístup k vašim datům, API a interním akcím. Projdeme návrh nástrojů, jednoduchou implementaci v TypeScriptu, napojení na Laravel MCP vrstvu a hlavně chyby, které v produkci bolí.

Kdy má Model Context Protocol reálný přínos

MCP má smysl tam, kde nechcete do promptu kopírovat exporty, dokumentaci nebo výsledky dotazů ručně. Asistent si přes protokol vyžádá konkrétní tool, předá mu argumenty a dostane strukturovanou odpověď.

Typický případ je interní CRM, stav objednávek, znalostní báze, Jira, fakturační systém nebo analytika. Vlastní MCP server zde funguje jako bezpečná integrační vrstva, ne jako další chatovací aplikace.

Pokud řešíte jen jednorázový export dat do LLM, MCP je zbytečně těžké. Pokud ale chcete opakované volání akcí, auditovatelnost a sdílení stejné integrace mezi více klienty, protokol začne dávat ekonomický i technický smysl.

Jak navrhnout nástroje pro AI asistenta

Nezačínejte transportem. Začněte seznamem operací, které má model umět bezpečně spustit. Dobrý tool má úzký účel, jasná vstupní schémata a návratovou hodnotu, kterou model nemusí složitě parsovat z volného textu.

Místo univerzálního nástroje query_database raději napište find_customer_by_email, get_order_status nebo create_refund_draft. Model pak méně hádá a vy máte lepší kontrolu nad oprávněními i logováním.

U každé akce si napište tři pravidla: kdo ji smí volat, jestli mění data a jaký je bezpečný limit. Read-only nástroje můžete povolit dřív. Mutace, platby nebo mazání dat vždy držte za potvrzením a serverovou autorizací.

Minimální MCP server v TypeScriptu přes stdio

Nejrychlejší cesta k funkčnímu prototypu je oficiální TypeScript SDK a transport přes stdio. Ten je vhodný pro lokální asistenty typu Claude Desktop, protože server běží jako proces spuštěný klientem.

Specifikaci protokolu doporučujeme číst přímo v oficiální dokumentaci Model Context Protocol. SDK vám ušetří ruční skládání JSON-RPC zpráv, ale návrh toolů za vás neudělá.

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const server = new McpServer({
  name: "company-crm",
  version: "1.0.0",
});

server.tool(
  "find_customer_by_email",
  {
    email: z.string().email(),
  },
  async ({ email }) => {
    const customer = await findCustomer(email);

    if (!customer) {
      return {
        content: [{ type: "text", text: "Customer not found" }],
      };
    }

    return {
      content: [
        {
          type: "text",
          text: JSON.stringify({
            id: customer.id,
            name: customer.name,
            plan: customer.plan,
            status: customer.status,
          }),
        },
      ],
    };
  }
);

async function findCustomer(email: string) {
  return {
    id: 42,
    name: "Acme s.r.o.",
    plan: "business",
    status: "active",
  };
}

const transport = new StdioServerTransport();
await server.connect(transport);

Ukázka je schválně malá. V produkci by findCustomer nešel přímo do databáze bez kontextu uživatele, tenant ID a oprávnění. MCP server musí být stejně přísný jako veřejné API, jen má jiného konzumenta.

Registrace serveru v klientovi a lokální ladění

Klient potřebuje vědět, jak proces spustit. U stdio transportu obvykle nastavujete příkaz, argumenty a proměnné prostředí. Nikdy nedávejte tokeny do repozitáře; používejte lokální konfiguraci nebo secret manager.

Při ladění logujte na stderr, ne na stdout. Standardní výstup používá transport pro zprávy protokolu a běžný debug výpis vám může rozbít komunikaci. To je častá chyba u prvního MCP prototypu.

{
  "mcpServers": {
    "company-crm": {
      "command": "node",
      "args": ["/absolute/path/to/dist/index.js"],
      "env": {
        "CRM_API_URL": "https://crm.example.com",
        "CRM_API_TOKEN": "use-local-secret-here"
      }
    }
  }
}

Pro TypeScript SDK sledujte i repozitář Model Context Protocol TypeScript SDK. API se vyvíjí a u produkční integrace je lepší pinovat verzi balíčku než slepě brát poslední release.

Laravel MCP: držte protokol mimo doménovou logiku

U Laravelu doporučujeme nepsat business logiku přímo do MCP handlerů. Udělejte běžné aplikační služby, policy a DTO. MCP vrstva pak jen mapuje vstupy z protokolu na volání existujícího kódu.

Balíčky označované jako Laravel MCP mohou pomoct s registrací toolů, anotacemi a transportem. Berte je ale jako adaptér. Jádro aplikace má zůstat testovatelné i bez AI klienta a bez běžícího MCP serveru.

<?php

namespace App\Mcp\Tools;

use App\Services\Orders\OrderLookup;
use Illuminate\Support\Facades\Gate;

final class GetOrderStatusTool
{
    public function __construct(
        private readonly OrderLookup $orders,
    ) {}

    public function __invoke(string $orderNumber): array
    {
        Gate::authorize('viewMcpOrderStatus');

        $order = $this->orders->findByNumber($orderNumber);

        if ($order === null) {
            return ['found' => false];
        }

        return [
            'found' => true,
            'number' => $order->number,
            'status' => $order->status,
            'paid' => $order->paid_at !== null,
            'updated_at' => $order->updated_at->toISOString(),
        ];
    }
}

Tahle třída není závislá na konkrétním MCP frameworku. Můžete ji volat z HTTP controlleru, fronty, testu i MCP adaptéru. Přesně tak má vypadat vrstva, která přežije změnu knihovny nebo klienta.

Bezpečnost MCP integrace: oprávnění, audit a limity

Největší riziko není protokol, ale příliš silný tool. Pokud modelu dáte akci run_sql nebo send_email_to_all_users, dáváte mu schopnost napáchat škodu i při dobrém úmyslu uživatele.

Každý vlastní MCP server by měl logovat název toolu, vstupní argumenty, identitu uživatele, výsledek a korelační ID. U citlivých dat logujte hash nebo zkrácenou hodnotu, ne celé osobní údaje.

Doporučujeme zavést rate limiting, allowlist nástrojů podle role a oddělené tokeny pro vývoj, staging a produkci. MCP není zkratka kolem bezpečnosti. Je to nové rozhraní k systému, takže patří do threat modelu.

Testování toolů bez závislosti na konkrétním LLM

MCP integraci netestujte jen ruční konverzací s asistentem. Model může jeden den zvolit jiný wording a vy si spletete problém v promptu s problémem v serveru. Tooly testujte deterministicky přes vstupy a očekávané výstupy.

Pro každou akci si připravte testy validace vstupů, oprávnění, chybových stavů a limitů. Užitečné jsou i kontraktační testy nad JSON schématem, aby změna názvu pole nerozbila klienty a uložené workflow.

import { describe, expect, it } from "vitest";
import { customerSchema } from "../src/schemas/customer.js";

describe("find_customer_by_email output", () => {
  it("returns a stable shape for the assistant", () => {
    const payload = {
      id: 42,
      name: "Acme s.r.o.",
      plan: "business",
      status: "active",
    };

    expect(customerSchema.parse(payload)).toEqual(payload);
  });
});

LLM je dobrý konzument, ale špatný testovací oracle. Stabilitu serveru ověřujte mimo model. Teprve potom ladíte popisy toolů, aby je asistent vybíral ve správném kontextu.

Co nasadit jako první a kde se vyplatí pomoc

Začněte read-only scénářem: vyhledání zákazníka, stav objednávky, přehled faktur nebo dotaz do znalostní báze. Teprve po auditních lozích a oprávněních přidávejte akce, které mění data.

Pokud MCP napojujete na firemní aplikaci, berte ho jako součást produktu, ne experiment bokem. Návrh oprávnění, API kontraktu a provozu můžeme spojit s AI automatizací, aby integrace vydržela i mimo první demo.

Dobře napsaný vlastní MCP server zmenší ruční práci, ale nezhorší kontrolu nad systémem. Největší výhra je v tom, že AI asistent používá stejné bezpečné služby jako zbytek aplikace a každé volání je dohledatelné.

KATEGORIE:

SDÍLET:

Časté otázky

Vyplatí se psát vlastní MCP server pro menší firmu?
Ano, pokud máte interní systém, který už má jasná oprávnění, API nebo aplikační služby. MCP server je vhodný hlavně pro opakované dotazy a akce, které má AI asistent volat bezpečně a auditovatelně. Pokud potřebujete jen jednorázově zpracovat export dat, jednodušší bude skript nebo nahrání dokumentů do znalostní báze.
Jaký je rozdíl mezi MCP serverem a REST API?
MCP server definuje, jaké nástroje může AI klient volat, jaké mají vstupy a jak server vrací výsledky. Běžné REST API je obecnější rozhraní pro aplikace. V praxi MCP často funguje jako adaptér nad existujícím REST API nebo aplikačními službami, aby model nemusel znát interní endpointy a jejich detaily.
Může MCP server pracovat přímo s databází?
Ano, ale nedoporučuje se dávat databázové dotazy přímo modelu. Bezpečnější je vytvořit úzké nástroje typu vyhledání objednávky nebo přehled faktur a uvnitř serveru použít běžnou aplikační vrstvu. Tím udržíte oprávnění, validaci, logování a limity na stejném místě jako ve zbytku systému.
Je Laravel MCP dobrá volba pro produkční integraci?
Laravel je vhodný, pokud už v něm běží vaše doménová logika, autorizace a integrace. MCP vrstva by ale měla být jen adaptér nad existujícími službami, ne místo, kde vzniká nová business logika. Balíčky typu Laravel MCP mohou urychlit registraci toolů, ale pořád je potřeba řešit bezpečnost, testy a provoz.
Jak zabezpečit MCP server před nechtěnou akcí modelu?
Nejdřív omezte rozsah nástrojů a oddělte read-only operace od akcí, které mění data. Každé volání logujte, validujte vstupy, kontrolujte oprávnění a používejte samostatné tokeny pro prostředí. U citlivých operací přidejte potvrzení uživatele nebo schvalovací krok mimo model, protože LLM není bezpečnostní hranice.

Komentáře (0)

Načítám komentáře...

Přidat komentář

Váš email nebude zveřejněn. Všechny komentáře procházejí schválením administrátorem.

Tento web je chráněn službou reCAPTCHA a platí Zásady ochrany osobních údajů a Smluvní podmínky společnosti Google.