task-mcp-node
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@task-mcp-nodelist all tasks"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Node Tasks
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
Related MCP server: task-manager-mcp
Projektstruktur
mcp-node-tasks/
├── data/
│ └── tasks.json
├── node_modules/
├── package.json
├── package-lock.json
└── server.jsInstallation
Åbn terminalen i projektmappen:
cd C:\Users\mikc\WebstormProjects\mcp-node-tasksInstaller dependencies:
npm install @modelcontextprotocol/sdk zodpackage.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 startDet 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 + CTest med MCP Inspector
MCP Inspector bruges til at teste MCP-serveren i browseren.
Kør:
npm run inspectorNår browseren åbner, skal venstre side vise:
Transport Type: STDIO
Command: node
Arguments: server.jsKlik derefter på:
ResourcesList ResourcesPromptsList PromptsToolsList Tools
Du bør kunne se:
Resource:
all_tasks
Tool:
add_task
Prompt:
analyze_tasksTest 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 analyseDet 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-tasksServeren 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_taskTool’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
Available Tools
1 tooladd_taskOpret taskC
Opretter en ny task i tasks.json.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| priority | No | medium |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| status | Yes | |
| priority | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description does not disclose behavioral traits such as side effects, permissions, or error handling. For a mutation tool, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise (one sentence), but it lacks structure and essential information. It is front-loaded but too brief.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and the presence of an output schema, the description fails to provide context about return values, side effects, or environment. It is incomplete for a tool with two parameters and no sibling differentiation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the parameters' meaning or usage beyond what the schema already provides. The description adds no value for parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates a new task, specifying the file 'tasks.json'. However, it lacks differentiation from potential sibling tools and could be more specific about the context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool, prerequisites, or alternatives. The description is purely functional without usage context.
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 tool update
v1.0.0- First observed
add_task
TDQS
With only one tool, there is no possibility of confusion between tools. The single tool's purpose is clear.
The single tool uses a consistent verb_noun pattern (add_task), which is clear and predictable.
The server has only 1 tool, which is too few for the apparent scope of task management. Typically, such a server would need at least read, list, update, and delete operations.
The tool set is severely incomplete for task management, missing essential operations like reading, listing, updating, and deleting tasks. This will cause agent failures.
Maintenance
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
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for generating rough-draft project plans from natural-language prompts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA minimal demonstration server showcasing MCP protocol capabilities including tools, resources, and prompts with basic examples like hello world functionality.2MIT
- FlicenseNot gradedqualityCmaintenanceA 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.-
- FlicenseCqualityCmaintenanceA simple MCP server for managing tasks via a local JSON file, demonstrating resources, tools, and prompts for task reading, creation, and analysis.1-
- FlicenseAqualityCmaintenanceA minimal MCP server that demonstrates the entire protocol using a simple in-memory todo list, including tools, resources, prompts, and elicitation.31-
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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-client'
If you have feedback or need assistance with the MCP directory API, please join our Discord server