mcp-node-tasks-02-primitives
MCP server for managing tasks with a resource to read all tasks, a tool to add tasks, and a prompt to analyze tasks, using stdio transport.
README
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
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:

| 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://allsom resourceadd_tasksom toolanalyze_taskssom 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:
| 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:
- Resource:
tasks://all - Tool:
add_task - 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:
- Resource-koden
- Tool-koden
- Prompt-koden
Svar derefter på:
- Hvad er resource i projektet?
- Hvad er tool i projektet?
- Hvad er prompt i projektet?
- Hvorfor er
add_taskmere risikabel endtasks://all? - 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
priorityikke blev valideret?
Næste trin
I næste del bygger vi en custom MCP-client i Node.js.
Den skal kunne:
- Starte MCP-serveren via stdio
- Lave discovery
- Liste tools, resources og prompts
- Kalde
tasks://all - Kalde
add_task - Hente prompten
analyze_tasks
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。