Skip to main content
Glama
toy-mcp-server

toy-mcp-server

toy-mcp-server

Ein minimaler Model Context Protocol (MCP)-Server, der von Grund auf neu gebaut wurde, um zu lernen, wie MCP wirklich funktioniert – keine Boilerplate-Generatoren, keine Templates, nur das SDK.

Gebaut als erstes praktisches MCP-Projekt: zwei Tools und eine Resource, über stdio mit Claude Desktop verbunden.

Was es tut

MCP ermöglicht einem LLM-Client (wie Claude Desktop), Funktionen aufzurufen, die auf deinem eigenen Rechner laufen, anstatt nur Text aus seinen Trainingsdaten zu generieren. Dieser Server stellt bereit:

Tools (Funktionen, die Claude aufrufen kann):

  • roll_dice – würfelt N Würfel mit einer konfigurierbaren Seitenanzahl

  • flip_coin – wirft eine Münze N-mal

Ressourcen (schreibgeschützte Daten, die Claude abrufen kann):

  • server-info – grundlegende Metadaten über den Server (Name, Zweck, Startzeit)

Related MCP server: Random-Generator

Warum das existiert

LLMs können nicht auf etwas außerhalb ihrer Trainingsdaten zugreifen und standardmäßig nichts tun – sie generieren nur Text. MCP ist eine Standardmethode, um einem Modell Folgendes zu geben:

  • Fähigkeiten, die es von sich aus nicht hat (z. B. echte Zufälligkeit – LLMs sind dafür berüchtigt, dass sie selbst keine wirklich zufälligen Zahlen auswählen können)

  • Zugriff auf Live- oder private Daten, von denen es auf keine andere Weise erfahren kann

Dieses Projekt ist eine kleine, sichere Sandbox für diese Idee, bevor man einen MCP-Server an etwas Echtes anbindet (eine Datenbank, eine API mit Authentifizierung usw.).

Technologie-Stack

  • TypeScript

  • @modelcontextprotocol/sdk – das offizielle MCP-SDK

  • zod – Laufzeit-Schema-Validierung für Tool-Argumente

  • stdio-Transport (lokale Subprozess-Kommunikation mit Claude Desktop)

Projektstruktur

toy-mcp-server/
├── src/
│   └── index.ts       # server setup, tools, and resource
├── build/              # compiled output (git-ignored)
├── package.json
├── tsconfig.json
└── README.md

Einrichtung

1. Abhängigkeiten installieren

npm install

2. Kompilieren

npm run build

3. Mit Claude Desktop verbinden

Finde deine Claude-Desktop-Konfigurationsdatei:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: normalerweise unter %LOCALAPPDATA%\Packages\<Claude package folder>\LocalCache\Roaming\Claude\claude_desktop_config.json – der genaue Pfad kann je nach Installationsmethode variieren (Microsoft Store vs. direkter Installer). Der zuverlässigste Weg, ihn zu finden: Öffne Claude Desktop → Einstellungen → Entwickler → Lokale MCP-Server → Konfiguration bearbeiten, wodurch die genaue Datei geöffnet wird, die die App liest.

Füge diesen Server unter mcpServers hinzu (füge ihn also in die vorhandene Datei ein, statt sie zu überschreiben):

{
  "mcpServers": {
    "toy-mcp-server": {
      "command": "node",
      "args": ["/absolute/path/to/toy-mcp-server/build/index.js"]
    }
  }
}

Ersetze den Pfad durch den tatsächlichen absoluten Pfad zu build/index.js auf deinem Rechner. Auf Windows musst du die Backslashes (\\) im JSON-String escapen.

4. Claude Desktop neu starten

Beende Claude Desktop vollständig (nicht nur das Fenster schließen) und öffne es wieder. Bestätige, dass toy-mcp-server als verbunden angezeigt wird.

5. Probiere es aus

Stelle in einem Chat eine folgende Frage:

  • „Wurf 3 sechsseitige Würfel"

  • „Wirf eine Münze 10-mal."

Über der Antwort solltest du einen kleinen Indikator für einen Tool-Aufruf sehen (z. B. „Roll Dice"), der bestätigt, dass Claude die Funktion tatsächlich aufgerufen hat und nicht geraten hat.

So funktioniert es, kurz

  • McpClient – das Objekt, das die Fähigkeiten des Servers gegenüber jedem verbundenen Client deklariert

  • registerTool(name, config, handler) – registriert eine aufrufbare Funktion. config.inputSchema nutzt Zod, um jede Argumentationsargumente zu validieren, die das Modell sendet, bevor der Handler läuft

  • registerResource(name, uri, config, handler) – erlaubt schreibgeschützte Daten, die über eine URI adressierbar sind und ohne Argument abgerufen werden

  • StdioServerTransport – das Wire-Modell: Claude Desktop startet diese Datei als Subprozess und kommuniziert über stdin/stdout mittels JSON-RPC. console.log wird hier nie zum Loggen verwendet, da stdout der eigentliche Protokollkanal ist – stattdessen wird console.error (stderr) eingesetzt

Nächste Schritte

*the Tools durch echte heraus ersetzen, die auf eine echte Datenbank zugreifen (z. B. Postgres via Prisma)

  • Ein GitHub-gestütztes Tool hinzufügen (z. B. list_open_prs), um dienzusübung der tokenbasierte Authentifizierung zu üben

  • Den Streamable HTTP-Transport erkunden, um den Server remote zu hosten (lokal von einer Anwendung zu fern)

Lizenz

MIT

Available Tools

2 tools
flip_coinFlip CoinB

Flip a coin one or more times

NameRequiredDescriptionDefault
timesNoNumber of flips

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of disclosing behavior. It merely says 'Flip a coin one or more times' without mentioning that the outcome is random, what the return format is (e.g., 'heads'/'tails'), or any side effects. The agent is left to guess the result structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that states the action and the parameter scope. There is zero wasted text, and the core information is front-loaded. It is appropriately concise for a trivial tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description should explain what the tool returns (e.g., results of each flip). It omits any mention of return values or randomness, leaving the agent with incomplete information to use the tool correctly. For a tool this simple, more context is still needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'times' is fully described in the schema ('Number of flips'), covering 100% of parameters. The tool description repeats the concept ('one or more times') but adds no extra meaning beyond what the schema already provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Flip a coin') and adds the scope 'one or more times', which distinguishes it from the sibling roll_dice by naming the object of the action. An agent can clearly identify what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus roll_dice. The description only states the action, leaving the agent to infer from the name that this is for coins rather than dice. No exclusions, prerequisites, or alternative-routing hints are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

roll_diceRoll DiceB

Roll one or more dice with a given number of sides

NameRequiredDescriptionDefault
countNoNumber of dice to roll
sidesNoNumber of sides per die

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility for behavioral disclosure. It does not mention that the result is random, that it is a safe non-mutating operation, or any other behavioral trait beyond the literal act of rolling. This is a significant gap for a tool whose entire purpose is random generation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no waste. The core action is front-loaded. It is appropriately sized for a tool with only two parameters, though it could have been slightly more informative without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two parameters fully documented in the schema, the description is reasonably complete. However, the lack of any mention of randomness or return behavior (even though no output schema is provided) leaves a small but notable gap. An agent might not know the outcome is random without prior knowledge.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters (count and sides) with defaults, minimums, and maximums. The description adds no semantic meaning beyond what the schema provides, which meets the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool does: 'Roll one or more dice with a given number of sides'. It uses a specific verb (roll) and resource (dice), and clearly distinguishes from the sibling flip_coin, since dice and coins are different objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus the sibling flip_coin. The context implies dice vs coin, but the description does not explicitly state that this is for dice and flip_coin is for coins, nor does it mention any exclusions or alternative conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv1.0.0
    • First observedflip_coin
    • First observedroll_dice

TDQS

A3.6/5.0

Scored across 2 tools

Disambiguation5/5

The two tools, roll_dice and flip_coin, are completely distinct in their purpose and behavior. There is no overlap or ambiguity, making it trivial for an agent to select the correct tool.

Naming Consistency5/5

Both tool names follow the same verb_noun pattern (roll_dice, flip_coin), using snake_case and clear action-object structure. This is perfectly consistent and predictable.

Tool Count4/5

With only 2 tools, the server is minimal, but given its explicit 'toy' purpose and narrow domain (random chance events), this count is appropriate and focused. It is slightly thin by general standards but well-scoped for a toy.

Completeness4/5

The tool surface covers the two most common random generators (dice and coin flips). While a generic random number generator or card draw might be expected in a broader utilities server, for a toy server focused on simple chance, these tools are sufficient and leave no obvious dead ends.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Production-ready MCP server that provides LLMs with essential random generation abilities, including random integers, floats, choices, shuffling, and cryptographically secure tokens.
    7
    54 PyPI
    50
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An encrypted and secure random number generation server that complies with the MCP protocol, suitable for AI applications, LLMS, and other systems that require high-quality random numbers.
    7
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    A general-purpose MCP server with utility tools including datetime information, safe math calculations, text statistics, JSON extraction, knowledge base search, and HTTP GET requests. It demonstrates server-side MCP implementation and can be connected to Claude Desktop or LangGraph agents.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server providing true randomness capabilities to Claude, enabling cryptographically secure random number generation for games, decision-making, sampling, simulations, and any operation requiring genuine randomness.
    13
    2
    MIT