Skip to main content
Glama
krollchristensen

mcp-node-tasks-02-primitives

MCP node tasks 02 - primitives

Dette projekt er anden del af vores praktiske introduktion til Model Context Protocol, forkortet MCP.

I del 1 havde vi en almindelig Node.js-applikation, der læste tasks fra en JSON-fil.

I denne del laver vi projektet om til en MCP-server.

Serveren udstiller:

Type

Navn

Funktion

Resource

tasks://all

Læser alle tasks

Tool

add_task

Opretter en ny task

Prompt

analyze_tasks

Giver en fast struktur til task-analyse

Formål

Efter denne del skal du kunne forklare:

  • Hvad resources, tools og prompts er

  • Hvorfor resources normalt er read-only

  • Hvorfor tools kræver mere omtanke

  • Hvordan en lokal MCP-server kan køre med stdio

  • Hvorfor console.log() kan give problemer i en stdio-baseret MCP-server

  • Hvordan serveren kan testes med MCP Inspector

  • Hvordan serveren kan kobles på Claude Desktop eller Cursor

Related MCP server: task-mcp-node

Projektstruktur

mcp-node-tasks-02-primitives/
├── data/
│   └── tasks.json
├── docs/
│   └── images/
│       ├── Screenshot-2025-05-28-182048-1.png
│       └── lifecyclemcp-1.svg
├── src/
│   ├── server.js
│   └── taskStore.js
├── package.json
└── README.md

Billeder

Kopier disse billeder fra zip-filen til projektet:

docs/images/Screenshot-2025-05-28-182048-1.png
docs/images/lifecyclemcp-1.svg

MCP primitives

En MCP-server kan udstille capabilities.

I dette projekt bruger vi tre centrale capabilities:

MCP primitives

Capability

Forklaring

Eksempel i projektet

Resource

Read-only data

tasks://all

Tool

En handling

add_task

Prompt

En arbejdsgang

analyze_tasks

Den vigtigste huskeregel er:

Resources giver AI'en noget at vide.
Tools får AI'en til at gøre noget.
Prompts giver AI'en en arbejdsform.

Resource: tasks://all

En resource er data, som kan læses uden at ændre noget.

I dette projekt er resource:

tasks://all

Den læser alle tasks fra:

data/tasks.json

Resource-koden ændrer ikke filen. Den giver kun AI’en kontekst.

Tool: add_task

Et tool er en funktion, der udfører en handling.

I dette projekt er tool:

add_task

Det opretter en ny task i:

data/tasks.json

Tool’et tager to input:

Parameter

Forklaring

title

Titlen på den nye task

priority

low, medium eller high

Eksempel på input:

{
  "title": "Lav demo til undervisning",
  "priority": "high"
}

Fordi tool’et ændrer data, er det mere følsomt end en resource.

Prompt: analyze_tasks

En prompt er en genbrugelig promptskabelon eller arbejdsgang.

I dette projekt er prompten:

analyze_tasks

Den beder AI’en om at læse tasklisten og analysere, hvilke opgaver der bør prioriteres først.

Prompten ændrer ikke data. Den giver modellen en arbejdsform.

Resource, tool og prompt i samme case

Behov

MCP-type

Hvorfor

AI’en skal kende tasklisten

Resource

Det er viden

AI’en skal oprette en ny task

Tool

Det er en handling

AI’en skal analysere opgaverne

Prompt

Det er en arbejdsgang

Hvordan hænger Claude, MCP og koden sammen?

flowchart TD
    A["Claude Desktop<br>MCP host"]
    B["claude_desktop_config.json<br>Starter serveren"]
    C["src/server.js<br>MCP-server"]
    D["Resource: tasks://all<br>Læs alle tasks"]
    E["Tool: add_task<br>Opret ny task"]
    F["Prompt: analyze_tasks<br>Fast analyse"]
    G["src/taskStore.js<br>Node.js fil-logik"]
    H["data/tasks.json<br>Projektets data"]

    A --> B
    B -->|"node src/server.js"| C
    C --> D
    C --> E
    C --> F
    D --> G
    E --> G
    G --> H
    F --> A

Diagrammet viser, at Claude ikke læser tasks.json direkte.

Claude starter først vores MCP-server ud fra claude_desktop_config.json.

src/server.js er MCP-laget. Her definerer vi, hvad Claude må bruge:

  • tasks://all som resource

  • add_task som tool

  • analyze_tasks som prompt

src/taskStore.js indeholder den almindelige Node.js-logik til at læse og skrive tasks.

data/tasks.json er kun datafilen.

Det vigtige er opdelingen af ansvar:

Del

Ansvar

Claude Desktop

Host, hvor brugeren arbejder

Claude config

Starter MCP-serveren

server.js

Udstiller MCP capabilities

taskStore.js

Håndterer fil-logik

tasks.json

Indeholder data

Claude taler altså med MCP-serveren. MCP-serveren bruger derefter vores Node.js-kode til at læse eller ændre data.

Lifecycle

Et typisk MCP-flow kan forklares i fire faser:

MCP lifecycle

Fase

Hvad sker der?

Initialization

Client og server etablerer forbindelse

Discovery

Clienten spørger serveren, hvilke capabilities der findes

Execution

Clienten kalder en resource, et tool eller en prompt

Termination

Forbindelsen lukkes pænt

Discovery er vigtig, fordi clienten kan spørge serveren, hvad den kan, i stedet for at alt er hardcoded.

Installation

Kør:

npm install

Vigtig pointe om npm start

Du kan godt køre:

npm start

Men serveren vil se ud som om, den ikke gør noget.

Det er normalt.

En MCP-server med stdio venter på, at en MCP-client taler med den. Derfor tester vi den med MCP Inspector, Claude Desktop eller Cursor.

Test med MCP Inspector

Kør:

npm run inspect

I Inspector kan du teste:

  1. Resource: tasks://all

  2. Tool: add_task

  3. Prompt: analyze_tasks

Denne server bruger stdio

Stdio betyder, at MCP-clienten og MCP-serveren kommunikerer via standard input og standard output.

Derfor må serveren ikke skrive almindelige logs med:

console.log("Server startet");

Det kan ødelægge MCP-kommunikationen, fordi stdout bruges til MCP-beskeder.

Brug i stedet:

console.error("Server startet");

console.error() skriver til stderr og forstyrrer ikke MCP-kommunikationen.

Claude eller Cursor konfiguration

Når projektet virker i MCP Inspector, kan det kobles på Claude Desktop eller Cursor.

Eksempel:

{
  "mcpServers": {
    "mcp-node-tasks-02": {
      "command": "node",
      "args": [
        "C:\\Users\\mikc\\IdeaProjects\\mcp-node-tasks-02-primitives\\src\\server.js"
      ]
    }
  }
}

Ret stien, så den passer til din egen computer.

På Windows skal du enten bruge dobbelt backslash:

C:\\Users\\mikc\\IdeaProjects\\mcp-node-tasks-02-primitives\\src\\server.js

eller forward slashes:

C:/Users/mikc/IdeaProjects/mcp-node-tasks-02-primitives/src/server.js

Miniøvelse

Åbn src/server.js.

Find:

  1. Resource-koden

  2. Tool-koden

  3. Prompt-koden

Svar derefter på:

  1. Hvad er resource i projektet?

  2. Hvad er tool i projektet?

  3. Hvad er prompt i projektet?

  4. Hvorfor er add_task mere risikabel end tasks://all?

  5. Hvorfor er det en god idé at starte med stdio?

Forslag til svar

tasks://all er en resource, fordi den kun læser data.

add_task er et tool, fordi det ændrer data.

analyze_tasks er en prompt, fordi den giver AI’en en fast arbejdsgang.

add_task er mere risikabel end tasks://all, fordi den skriver til data/tasks.json.

Stdio er godt til lokal undervisning, fordi det ikke kræver port, Express-server eller deployment.

Ekstra øvelse

Tilføj en ny task med MCP Inspector.

Kontroller bagefter, at filen er ændret:

data/tasks.json

Spørgsmål:

  • Hvor kan du se side effect?

  • Hvorfor er det vigtigt, at tool’et har tydelige input?

  • Hvad kunne gå galt, hvis priority ikke blev valideret?

Næste trin

I næste del bygger vi en custom MCP-client i Node.js.

Den skal kunne:

  1. Starte MCP-serveren via stdio

  2. Lave discovery

  3. Liste tools, resources og prompts

  4. Kalde tasks://all

  5. Kalde add_task

  6. Hente prompten analyze_tasks

Available Tools

1 tool
add_taskAdd taskA

Opretter en ny task i den lokale JSON-fil

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTitlen på den nye task
priorityYesPrioritet: low, medium eller high

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description must disclose behavior. It states it creates a task in a local JSON file, implying a write operation. However, it does not specify validation details, error handling, or whether the file is assumed to exist. Basic disclosure but incomplete.

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, concise sentence that communicates the core action efficiently. No extraneous words or repetition. Every word is necessary.

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?

Given no output schema, annotations, or sibling tools, the description is minimal. It covers the basic function but lacks details on return values, error states, or behavioral nuances. Adequate for a simple tool but not comprehensive.

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 coverage is 100%, with descriptions for both parameters already in the input schema. The tool description adds no extra meaning beyond what the schema provides. Baseline at 3 since the schema does the heavy lifting.

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 clearly states the tool creates a new task, specifying the resource as 'den lokale JSON-fil' (the local JSON file). The verb is specific and the resource is defined. There are no sibling tools, so no differentiation needed.

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

Usage Guidelines3/5

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

The description provides no guidance on when to use this tool versus alternatives, nor any prerequisites or limitations. While there are no sibling tools, usage context would still be helpful but is absent.

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. Dates show when Glama detected each change.

  1. 1 tool updatev1.0.0
    • First observedadd_task

TDQS

A3.6/5.0
Disambiguation5/5

Only one tool exists, so there is no risk of ambiguity.

Naming Consistency5/5

With a single tool, naming consistency is trivially perfect. The name 'add_task' follows a clear verb_noun pattern.

Tool Count2/5

A single tool for task management is too few for reasonable functionality, making the server feel underdeveloped.

Completeness1/5

Only a create operation is provided, with no tools for listing, updating, deleting, or reading tasks, severely limiting usability.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    A task manager MCP server that demonstrates all three MCP primitives (tools, resources, prompts). Enables users to manage tasks, read task summaries and details, and run structured planning/review prompts through natural language.
    -
  • F
    license
    A
    quality
    C
    maintenance
    A production-ready MCP server for task management, enabling LLMs to create, list, and manage tasks via tools and resources, with support for local stdio and cloud Streamable HTTP deployment.
    5
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/krollchristensen/mcp-node-tasks-02-primitives'

If you have feedback or need assistance with the MCP directory API, please join our Discord server