Ř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
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
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:
{
"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
Zobrazte vsechny nastroje
Inspektor ukazuje vsechny registrovane nastroje a jejich schemata ve webovem rozhrani.
Rucni volani
Testujte nastroje s vlastnimi parametry pro overeni funkcnosti pred pripojenim ke Claude.
Prohlizeni resources
Prochazejte resources a kontrolujte, ze jejich obsah je spravne formatovany.
Kontrola chyb
Zachytte problemy ve vasem serveru driv, nez zpusobi zmatky v konverzaci.
Pridani do existujiciho 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.jsonBezesva 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.
Momentálně nejsou žádné komentáře.