Task Node
БесплатноНе проверенA simple MCP server demonstrating resources, tools, and prompts using a local task list. It enables reading, creating, and analyzing tasks through MCP.
Описание
A simple MCP server demonstrating resources, tools, and prompts using a local task list. It enables reading, creating, and analyzing tasks through MCP.
README
Dette projekt er en lille MCP-server lavet i almindelig Node.js.
Formålet er at vise de tre vigtigste MCP-primitives:
- Resource: AI’en kan læse data.
- Tool: AI’en kan udføre en handling.
- Prompt: AI’en kan hente en genbrugelig arbejdsgang.
Projektet bruger en lokal tasks.json-fil som eksempel.
Hvad viser projektet?
Serveren kan tre ting:
- Læse alle tasks som en MCP resource.
- Oprette en ny task som et MCP tool.
- Levere en prompt til task-analyse.
Det centrale er ikke selve tasklisten. Det centrale er at forstå forskellen på:
- Resources: read-only kontekst
- Tools: handlinger med mulig side effect
- Prompts: genbrugelige arbejdsgange
Projektstruktur
mcp-node-tasks/
├── data/
│ └── tasks.json
├── node_modules/
├── package.json
├── package-lock.json
└── server.js
Installation
Åbn terminalen i projektmappen:
cd C:\Users\mikc\WebstormProjects\mcp-node-tasks
Installer dependencies:
npm install @modelcontextprotocol/sdk zod
package.json skal indeholde "type": "module", fordi projektet bruger moderne import-syntaks i Node.js.
Eksempel på package.json:
{
"name": "mcp-node-tasks",
"version": "1.0.0",
"type": "module",
"scripts": {
"start": "node server.js",
"inspector": "npx @modelcontextprotocol/inspector node server.js"
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.0",
"zod": "^4.0.0"
}
}
Datafil
Opret mappen data og filen tasks.json.
[
{
"id": 1,
"title": "Lav README til projektet",
"status": "open",
"priority": "high"
},
{
"id": 2,
"title": "Ryd op i routes",
"status": "open",
"priority": "medium"
},
{
"id": 3,
"title": "Skriv testdata",
"status": "done",
"priority": "low"
}
]
Serverkode
Opret filen server.js.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { mkdir, readFile, writeFile } from "node:fs/promises";
import path from "node:path";
const dataDir = path.join(process.cwd(), "data");
const tasksFile = path.join(dataDir, "tasks.json");
async function readTasks() {
try {
const raw = await readFile(tasksFile, "utf-8");
return JSON.parse(raw);
} catch {
return [];
}
}
async function writeTasks(tasks) {
await mkdir(dataDir, { recursive: true });
await writeFile(tasksFile, JSON.stringify(tasks, null, 2), "utf-8");
}
const server = new McpServer({
name: "task-mcp-node",
version: "1.0.0"
});
/*
Resource:
Giver read-only adgang til alle tasks.
Den ændrer ikke data.
*/
server.registerResource(
"all_tasks",
"tasks://all",
{
title: "Alle tasks",
description: "Returnerer alle tasks fra den lokale tasks.json-fil.",
mimeType: "application/json"
},
async (uri) => {
const tasks = await readTasks();
return {
contents: [
{
uri: uri.href,
mimeType: "application/json",
text: JSON.stringify(tasks, null, 2)
}
]
};
}
);
/*
Tool:
Opretter en ny task.
Dette er en handling med side effect,
fordi serveren ændrer tasks.json.
*/
server.registerTool(
"add_task",
{
title: "Opret task",
description: "Opretter en ny task i tasks.json.",
inputSchema: {
title: z.string().min(1),
priority: z.enum(["low", "medium", "high"]).default("medium")
},
outputSchema: {
id: z.number(),
title: z.string(),
status: z.string(),
priority: z.string()
}
},
async ({ title, priority }) => {
const tasks = await readTasks();
const nextId =
tasks.length === 0
? 1
: Math.max(...tasks.map((task) => task.id)) + 1;
const newTask = {
id: nextId,
title,
status: "open",
priority
};
tasks.push(newTask);
await writeTasks(tasks);
return {
content: [
{
type: "text",
text: `Task oprettet: ${newTask.title}`
}
],
structuredContent: newTask
};
}
);
/*
Prompt:
Giver en genbrugelig arbejdsgang.
Prompten ændrer ikke data.
Den beskriver kun, hvordan AI’en skal arbejde.
*/
server.registerPrompt(
"analyze_tasks",
{
title: "Analyser tasks",
description: "Hjælper med at prioritere tasks ud fra status og priority.",
argsSchema: {
focus: z.string().optional()
}
},
({ focus }) => ({
messages: [
{
role: "user",
content: {
type: "text",
text:
"Du skal analysere en taskliste fra en MCP resource. " +
"Fokuser på åbne tasks, prioritet og næste handling. " +
`Særligt fokus: ${focus ?? "ingen særligt fokus"}. ` +
"Svar kort og struktureret."
}
}
]
})
);
const transport = new StdioServerTransport();
/*
Vigtigt:
Ved stdio må man ikke bruge console.log(),
fordi stdout bruges til MCP/JSON-RPC beskeder.
Brug console.error() til logs.
*/
console.error("Starter task-mcp-node via stdio");
await server.connect(transport);
Kør serveren
Serveren kan startes med:
npm start
Det kan godt ligne, at serveren bare står stille. Det er normalt.
Ved stdio venter serveren på, at en MCP-client forbinder til den.
Stop serveren igen med:
Ctrl + C
Test med MCP Inspector
MCP Inspector bruges til at teste MCP-serveren i browseren.
Kør:
npm run inspector
Når browseren åbner, skal venstre side vise:
Transport Type: STDIO
Command: node
Arguments: server.js
Klik derefter på:
ResourcesList ResourcesPromptsList PromptsToolsList Tools
Du bør kunne se:
Resource:
all_tasks
Tool:
add_task
Prompt:
analyze_tasks
Test resource
Gå til fanen Resources.
Klik på List Resources.
Vælg all_tasks.
Resource skal returnere indholdet fra data/tasks.json.
Resource er read-only. Den læser data, men ændrer ikke filen.
Test tool
Gå til fanen Tools.
Klik på List Tools.
Vælg add_task.
Kald tool’et med for eksempel:
{
"title": "Skriv kort README",
"priority": "high"
}
Efter kaldet bør data/tasks.json være ændret.
Dette er et tool, fordi det udfører en handling og har side effect.
Test prompt
Gå til fanen Prompts.
Klik på List Prompts.
Vælg analyze_tasks.
Kald prompten med for eksempel:
{
"focus": "hvad skal laves først før aflevering"
}
Prompten ændrer ikke data.
Den giver en genbrugelig arbejdsinstruktion til AI’en.
Didaktisk forklaring
Dette projekt viser en vigtig MCP-pointe:
Resources giver AI’en noget at vide.
Tools får systemet til at gøre noget.
Prompts giver AI’en en arbejdsform.
I dette projekt betyder det:
tasks://all
= resource
= læser tasks.json
add_task
= tool
= skriver til tasks.json
analyze_tasks
= prompt
= giver en fast struktur til analyse
Det er vigtigt at skelne mellem læsning og handling.
En resource bør være read-only. Den giver AI’en kontekst, men ændrer ikke noget.
Et tool kan udføre en handling. Derfor skal tools designes mere forsigtigt, især hvis de kan skrive, slette, sende eller ændre data.
En prompt er ikke en handling i sig selv. Den er en genbrugelig skabelon, som hjælper AI’en med at arbejde på en bestemt måde.
Hvorfor er det smart?
Det smarte er, at funktionerne ikke bare ligger skjult i en almindelig Node.js-app.
De bliver udstillet som MCP capabilities.
Det betyder, at en MCP-host kan opdage dem:
- Hvilke resources findes?
- Hvilke tools findes?
- Hvilke prompts findes?
- Hvilke input kræver de?
- Hvad returnerer de?
Det gør integrationen mere standardiseret end en hardcoded specialløsning.
Typiske fejl
Cannot use import statement outside a module
Årsag:
package.json mangler:
"type": "module"
Løsning:
Tilføj "type": "module" i package.json.
npm kan ikke finde package.json
Årsag:
Du står i den forkerte mappe.
Løsning:
Gå til den mappe, hvor package.json ligger.
cd C:\Users\mikc\WebstormProjects\mcp-node-tasks
Serveren virker som om den hænger
Det er normalt ved stdio.
Serveren venter på, at en MCP-client taler med den.
Brug MCP Inspector til at teste serveren.
Console.log ødelægger kommunikationen
Ved stdio bruger MCP stdout til JSON-RPC-beskeder.
Brug derfor ikke:
console.log("Server startet");
Brug i stedet:
console.error("Server startet");
Forslag til udvidelse
Tilføj et nyt tool:
complete_task
Tool’et skal tage et id som input og ændre taskens status til done.
Eksempel på input:
{
"id": 1
}
Diskussion:
- Hvorfor er
complete_tasket tool? - Hvad skal der ske, hvis id ikke findes?
- Hvordan skal fejl returneres?
- Skal brugeren godkende handlingen først?
Kort opsamling
Dette projekt viser en simpel MCP-server i Node.js.
Serveren har:
- en resource til at læse tasks
- et tool til at oprette tasks
- en prompt til at analysere tasks
Det er et godt første MCP-eksempel, fordi det kobler MCP til noget kendt fra Node.js-undervisning:
- JSON
- fil-I/O
- npm
- asynkrone funktioner
- backendlogik
- inputvalidering
- separation mellem læsning og handling
Установка Task Node
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/krollchristensen/mcp-node-tasks-clientFAQ
Task Node MCP бесплатный?
Да, Task Node MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Task Node?
Нет, Task Node работает без API-ключей и переменных окружения.
Task Node — hosted или self-hosted?
Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.
Как установить Task Node в Claude Desktop, Claude Code или Cursor?
Открой Task Node на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
Notion
Read and write pages in your workspace
автор: NotionLinear
Issues, cycles, triage — from Claude
автор: LinearGoogle Drive
Search and read your Drive files
автор: Googlemindsdb/mindsdb
Connect and unify data across various platforms and databases with [MindsDB as a single MCP server](https://docs.mindsdb.com/mcp/overview).
автор: mindsdbCompare Task Node with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории productivity
