Přeskočit na hlavní obsah
PraktickAI
KurzyPro týmySlužbyDokumentaceBlog
KurzyPro týmySlužbyDokumentaceBlog
DomůKurzyVlastní MCP serverStavíme první MCP server
Předchozí lekceDalší lekce
Lekce 2 z 730 min

Stavíme první MCP server

Přejít na sekci
  • Dvě SDK možnosti: TypeScript nebo Python
  • Struktura projektu: TypeScript
  • Minimální TypeScript server
  • Struktura projektu: Python
  • Minimální Python server
  • Testování lokálně s Claude Code
  • Testování s MCP Inspector
  • Konfigurace pro Cursor
  • Přidání environment proměnných

Dvě SDK možnosti: TypeScript nebo Python

MCP má oficiální SDK v TypeScript a Pythonu. Obě jsou plnohodnotné — vyberte si podle svého stacku. TypeScript SDK používá @modelcontextprotocol/sdk. Python SDK se jmenuje jednoduše mcp. Obě SDK nabízí stejné abstrakce a možnosti.

# TypeScript — scaffold nového serveru
npx @modelcontextprotocol/create-server my-app-server
cd my-app-server
npm install
npm run build

# Python — scaffold nového serveru
uvx create-mcp-server
# Následujte výzvy: název, popis atd.
cd my-app-server
uv sync

Struktura projektu: TypeScript

Vygenerovaný TypeScript projekt je minimální. Tady je, co dostanete a co každý soubor dělá.

my-app-server/
  package.json          # Závislosti a skripty
  tsconfig.json         # TypeScript konfigurace
  src/
    index.ts            # Váš MCP server — tady píšete kód
// package.json
{
  "name": "my-app-server",
  "version": "1.0.0",
  "type": "module",
  "bin": {
    "my-app-server": "./build/index.js"
  },
  "scripts": {
    "build": "tsc && chmod +x build/index.js",
    "dev": "tsc --watch",
    "start": "node build/index.js"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.12.0",
    "zod": "^3.24.0"
  },
  "devDependencies": {
    "typescript": "^5.8.0",
    "@types/node": "^22.0.0"
  }
}

Minimální TypeScript server

Postavíme nejjednodušší možný MCP server — jeden resource, který vrátí pozdrav. Toto je váš Hello World.

#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// Vytvoření serveru
const server = new McpServer({
  name: "my-app-server",
  version: "1.0.0",
});

// Přidání resource — data ke čtení
server.resource(
  "greeting",
  "myapp://greeting",
  async (uri) => ({
    contents: [{
      uri: uri.href,
      mimeType: "text/plain",
      text: "Ahoj z mého prvního MCP serveru!"
    }]
  })
);

// Přidání toolu — akce, kterou AI může provést
server.tool(
  "greet",
  "Vygeneruje personalizovaný pozdrav",
  { name: z.string().describe("Jméno osoby k pozdravu") },
  async ({ name }) => ({
    content: [{ type: "text", text: `Ahoj, ${name}! Vítej v MCP.` }]
  })
);

// Spuštění serveru se stdio transportem
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Server běží na stdio");

Všimněte si console.error pro logování, ne console.log. Se stdio transportem je stdout rezervován pro zprávy MCP protokolu. Veškerý váš debug výstup musí jít na stderr.

Struktura projektu: Python

my-app-server/
  pyproject.toml        # Závislosti a konfigurace projektu
  src/
    my_app_server/
      __init__.py
      server.py          # Váš MCP server
# pyproject.toml
[project]
name = "my-app-server"
version = "1.0.0"
requires-python = ">=3.10"
dependencies = [
    "mcp[cli]>=1.6.0",
]

[project.scripts]
my-app-server = "my_app_server.server:main"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

Minimální Python server

# src/my_app_server/server.py
from mcp.server.fastmcp import FastMCP

# Vytvoření serveru
mcp = FastMCP("my-app-server")


# Přidání resource — data ke čtení
@mcp.resource("myapp://greeting")
def get_greeting() -> str:
    """Jednoduchý pozdrav ze serveru."""
    return "Ahoj z mého prvního MCP serveru!"


# Přidání toolu — akce, kterou AI může provést
@mcp.tool()
def greet(name: str) -> str:
    """Vygeneruje personalizovaný pozdrav.

    Args:
        name: Jméno osoby k pozdravu
    """
    return f"Ahoj, {name}! Vítej v MCP."


def main():
    mcp.run(transport="stdio")


if __name__ == "__main__":
    main()

Python SDK používá dekorátory a type hinty — cítí se jako psaní FastAPI aplikace. TypeScript SDK používá řetězení metod se Zod schématy. Obě produkují identické MCP servery.

Testování lokálně s Claude Code

Nejrychlejší způsob testování serveru je s Claude Code. Přidejte server do MCP konfigurace a Claude Code se k němu automaticky připojí.

# Nejdřív build TypeScript serveru
cd my-app-server
npm run build

# Přidání do Claude Code (spusťte z adresáře vašeho projektu)
claude mcp add my-app -- node /absolutni/cesta/k/my-app-server/build/index.js

# Nebo pro Python
claude mcp add my-app -- uv run --directory /absolutni/cesta/k/my-app-server my-app-server

Tím se vytvoří soubor .mcp.json v adresáři vašeho projektu. Můžete ho také editovat ručně.

// .mcp.json (kořen projektu)
{
  "mcpServers": {
    "my-app": {
      "command": "node",
      "args": ["/absolutni/cesta/k/my-app-server/build/index.js"],
      "env": {
        "DATABASE_URL": "postgresql://localhost:5432/mydb"
      }
    }
  }
}

Testování s MCP Inspector

MCP Inspector je webový nástroj pro testování serveru bez potřeby plného AI clienta. Zobrazí všechny vaše resources, tools a prompts a umožní je interaktivně volat.

# Spuštění MCP Inspectoru (TypeScript server)
npx @modelcontextprotocol/inspector node build/index.js

# Spuštění MCP Inspectoru (Python server)
npx @modelcontextprotocol/inspector uv run my-app-server

# Otevře webové UI na http://localhost:6274
# Můžete procházet resources, volat tools a testovat prompts

Konfigurace pro Cursor

Cursor používá stejný formát MCP konfigurace. Přidejte soubor .cursor/mcp.json do vašeho projektu.

// .cursor/mcp.json
{
  "mcpServers": {
    "my-app": {
      "command": "node",
      "args": ["./my-app-server/build/index.js"],
      "env": {
        "DATABASE_URL": "postgresql://localhost:5432/mydb"
      }
    }
  }
}

Přidání environment proměnných

MCP servery téměř vždy potřebují environment proměnné — URL databáze, API klíče, konfigurační hodnoty. Můžete je předat přes MCP konfiguraci nebo je číst přímo v kódu.

// TypeScript — čtení environment proměnných
const DATABASE_URL = process.env.DATABASE_URL;
if (!DATABASE_URL) {
  console.error("DATABASE_URL je povinný");
  process.exit(1);
}

server.tool(
  "query-users",
  "Spočítá uživatele v databázi",
  {},
  async () => {
    const pool = new Pool({ connectionString: DATABASE_URL });
    const result = await pool.query("SELECT COUNT(*) FROM users");
    return {
      content: [{ type: "text", text: `Celkem uživatelů: ${result.rows[0].count}` }]
    };
  }
);
# Python — čtení environment proměnných
import os

DATABASE_URL = os.environ.get("DATABASE_URL")
if not DATABASE_URL:
    raise RuntimeError("DATABASE_URL je povinný")


@mcp.tool()
def query_users() -> str:
    """Spočítá uživatele v databázi."""
    import psycopg
    with psycopg.connect(DATABASE_URL) as conn:
        count = conn.execute("SELECT COUNT(*) FROM users").fetchone()[0]
    return f"Celkem uživatelů: {count}"
Postavte svůj Hello World MCP server

Vytvořte MCP server (TypeScript nebo Python), který vystaví README vašeho projektu jako resource: 1. Scaffoldujte nový projekt pomocí create-server nástroje 2. Přidejte resource s URI myapp://readme, který přečte a vrátí soubor README.md vašeho projektu 3. Přidejte tool nazvaný summarize-readme, který přečte README a vrátí prvních 500 znaků 4. Buildněte server a otestujte ho s MCP Inspectorem 5. Přidejte ho do konfigurace Claude Code a ověřte, že se zobrazí Bonus: přidejte environment proměnnou PROJECT_DIR, aby server věděl, kde hledat README.

Nápověda

V TypeScriptu použijte fs.readFileSync ke čtení souboru. V Pythonu použijte pathlib.Path. Nezapomeňte ošetřit případ, kdy soubor neexistuje — vraťte jasnou chybovou zprávu místo pádu serveru.

Klíčové poznatky
  • TypeScript SDK: @modelcontextprotocol/sdk se Zod schématy
  • Python SDK: mcp s FastMCP dekorátory a type hinty
  • stdio transport: client spustí server jako subprocess, komunikuje přes stdin/stdout
  • Používejte console.error (ne console.log) pro logování se stdio transportem
  • MCP Inspector umožňuje testovat servery bez AI clienta
  • Servery se konfigurují v .mcp.json (Claude Code) nebo .cursor/mcp.json (Cursor)

V příští lekci se ponoříme do resources a vystavení vašich dat. Odemkněte celý kurz a pokračujte hned.

Předchozí lekce
LinkedInX / Twitter

2/7 hotovo — pokračujte!

  • Dvě SDK možnosti: TypeScript nebo Python
  • Struktura projektu: TypeScript
  • Minimální TypeScript server
  • Struktura projektu: Python
  • Minimální Python server
  • Testování lokálně s Claude Code
  • Testování s MCP Inspector
  • Konfigurace pro Cursor
  • Přidání environment proměnných

PraktickAI

AI školení a konzultace pro technické týmy

KurzyPro týmySlužbyDokumentaceBlog
karel@praktickai.appLinkedIn

© 2026 PraktickAI — SkyVisual s.r.o. Všechna práva vyhrazena. Ochrana soukromí · Obchodní podmínky · Reklamační řád