Skip to Content

Řešení: Postavte server krok za krokem

Postavte skutecny MCP server

CSV Data Reader — od hello world k praktickym nastrojum

Hello world greet nastroj z predchozi lekce overil, ze vas setup funguje. Ale pojdme postavit neco skutecne uzitecneho — MCP server, ktery umozni Claude cist, vyhledavat a analyzovat data z CSV/JSON souboru. To je bezna firemni potreba: mate tabulky s daty zakazniku, prodejni reporty nebo seznamy zasob a chcete, aby s nimi Claude pracoval.

Plan

Nastroj search_data

Vyhledavani zaznamu podle libovolneho pole. Claude muze hledat zakazniky v Praze nebo objednavky nad urcitou castkou.

Nastroj get_stats

Souhrnne statistiky — pocet, prumery, min, max. Claude vam da rychle datove prehled.

Resource data://schema

Zpristupneni struktury dat, aby Claude vedel, jaka pole existuji, nez zacne dotazovat.

TypeScript implementace

data-reader/src/index.ts (ukazka)
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { readFileSync } from "fs";

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

const DATA_PATH = process.env.DATA_PATH || "./data.json";
let records: Record<string, any>[] = [];
try {
  records = JSON.parse(readFileSync(DATA_PATH, "utf-8"));
} catch (e) {
  console.error(`Could not load ${DATA_PATH}`);
}

server.tool(
  "search_data",
  "Search records by field name and value",
  {
    field: z.string().describe("Field name to search"),
    value: z.string().describe("Value to search for"),
    limit: z.number().optional().describe("Max results"),
  },
  async ({ field, value, limit = 10 }) => ({
    content: [{
      type: "text",
      text: JSON.stringify(
        records.filter(r =>
          String(r[field] || "").toLowerCase()
            .includes(value.toLowerCase())
        ).slice(0, limit), null, 2),
    }],
  })
);

Python ekvivalent

data-reader/server.py
import json, os
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("data-reader")

DATA_PATH = os.environ.get("DATA_PATH", "./data.json")
try:
    with open(DATA_PATH) as f:
        records = json.load(f)
except Exception:
    records = []

@mcp.tool()
def search_data(field: str, value: str,
                limit: int = 10) -> str:
    """Search records by field name and value."""
    results = [
        r for r in records
        if value.lower() in str(r.get(field, "")).lower()
    ][:limit]
    return json.dumps(results, indent=2,
                      ensure_ascii=False)

@mcp.tool()
def get_stats(numeric_field: str = "") -> str:
    """Get summary statistics about the data."""
    stats = {"total_records": len(records),
             "fields": list(records[0].keys())
                       if records else []}
    if numeric_field and records:
        values = [float(r[numeric_field])
                  for r in records
                  if numeric_field in r]
        if values:
            stats.update({"sum": sum(values),
                          "avg": sum(values)/len(values),
                          "min": min(values),
                          "max": max(values)})
    return json.dumps(stats, indent=2)

Pochopeni Zod schematu

Proc schemata zalezi

V TypeScriptu Zod definuje vstupni schema pro kazdy nastroj. Rika Claude, jake parametry nastroj prijima, poskytuje popisy, ktere pomahaji Claude rozhodnout jak nastroj pouzit, a automaticky validuje vstup. V Pythonu dosahuje FastMCP stejneho vysledku pres type hints a docstringy.

Propojeni s Claude Code

Klicovy krok — rict Claude Code o vasem serveru. Vytvorte nebo upravte .mcp.json v korenu projektu:

.mcp.json
{
  "mcpServers": {
    "data-reader": {
      "command": "node",
      "args": ["dist/index.js"],
      "env": {
        "DATA_PATH": "./customers.json"
      }
    }
  }
}

Kdyz se Claude Code spusti, precte tento soubor, spusti vas serverovy proces a zpristupni jeho nastroje. Pak se muzete zeptat Claude: "Prohledej moje zakaznicka data a najdi kohokoli z Prahy" — a Claude automaticky zavola vas nastroj search_data.

Testovani inspektorem

1

Zobrazte vsechny nastroje

Inspektor ukazuje vsechny registrovane nastroje a jejich schemata ve webovem rozhrani.

2

Rucni volani

Testujte nastroje s vlastnimi parametry pro overeni funkcnosti pred pripojenim ke Claude.

3

Prohlizeni resources

Prochazejte resources a kontrolujte, ze jejich obsah je spravne formatovany.

4

Kontrola chyb

Zachytte problemy ve vasem serveru driv, nez zpusobi zmatky v konverzaci.

Pridani do existujiciho pluginu

Struktura pluginu
my-plugin/
├── plugin.json
├── skills/
│   └── my-skill/
│       └── SKILL.md
├── commands/
│   └── my-command.md
├── .mcp.json              # Konfigurace MCP serveru
└── mcp-servers/
    └── data-reader/       # Kod MCP serveru
        ├── src/index.ts
        ├── package.json
        └── tsconfig.json

Bezesva integrace

Kdyz uzivatele nainstaluji vas plugin, .mcp.json automaticky nakonfiguruje Claude ke spusteni vaseho MCP serveru. Skill muze ve svych instrukcich odkazovat na MCP nastroje a vytvorit tak bezesvy zazitek.

Klicove shrnuti

Mate funkcni MCP server se skutecnymi nastroji, ktere Claude muze pouzivat. Vzorec je vzdy stejny: definujte nastroj s nazvem, popisem a schematem — implementujte handler — zaregistrujte ho na serveru. V dalsi sekci se pripojime ke skutecnym firemnim systemum.

Hodnocení
0 0

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

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