skills-example
Click on "Deploy 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., "@skills-exampleload the greet-user skill and say hello to Jerric"
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.
Minimal MCP server with a skill
One greet tool and one bundled skills/greet-user/SKILL.md, served over stdio.
Uses the MCP TypeScript SDK v2 and the Skills extension (SEP-2640).
Requires Node.js 22 or later:
npm install
node server.jsThe server waits for MCP messages on stdin. Add it to your MCP client's server configuration, replacing the absolute path:
{
"mcpServers": {
"skills-example": {
"command": "node",
"args": ["/absolute/path/to/mcp-skills/server.js"]
}
}
}The server declares capabilities.extensions["io.modelcontextprotocol/skills"]:
skills/listdiscovers the skill, frontmatter, file size, and SHA-256 digest.skills/gettakes{ "uri": "skill://greet-user/SKILL.md" }and returns that skill's metadata.resources/readtakes the same URI and returns the actualSKILL.md.tools/callwith{ "name": "greet", "arguments": { "name": "Jerric" } }returnsHello, Jerric!.
Automatic skill loading requires a client that supports the Skills extension. Other clients can access the Markdown as an ordinary MCP resource.
Run npm pack to create a distributable package containing both the server and its skill. Skill contents are loaded at startup; restart after editing them.
Available Tools
1 toolgreetC
Greet someone by name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only says 'Greet someone by name' without disclosing any behavioral traits—whether it returns a string, has side effects, requires permissions, or how it behaves. This is a minimal disclosure.
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?
A single, compact sentence with zero filler. Every word earns its place, and the structure is front-loaded with the action and object. It is concise without being under-specified to the point of confusion.
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?
For a tool with no output schema and no annotations, the description is incomplete. The agent doesn't know what the tool returns, what a 'greet' action entails, or any edge cases. More detail on the expected result or side effects is needed for proper invocation.
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?
The schema provides only the parameter name and type with 0% coverage. The description adds meaning by clarifying the parameter is the person's name ('by name'), which helps map the parameter to its purpose. However, it doesn't add format, examples, or constraints beyond that.
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 a specific verb ('greet') and a resource ('someone by name'). It distinguishes the action but doesn't specify what 'greet' produces or entails. For a simple tool this is adequate, but it lacks detail on the expected outcome (e.g., a greeting message).
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?
There are no siblings or alternatives to differentiate, but the description provides no guidance on when to use this tool, any prerequisites, or context. It is self-evident only because the tool is trivial; still, no explicit usage guidance is given.
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 tool update
v1.0.0- First observed
greet
TDQS
Scored across 1 tool
With only one tool, there is no possibility of confusion or overlap. The tool's purpose is singular and clear.
The single tool name 'greet' follows a simple verb pattern, consistent with itself. No inconsistencies can exist with only one tool.
One tool is at the lower boundary of acceptability. While it feels thin for a typical server, it is reasonable for a small example or demo server.
The domain is limited to greeting, and the single tool fully covers that purpose. There are no obvious gaps within the stated scope.
Maintenance
Related MCP Connectors
Remote MCP server exposing SMI Aware tools, resources, and skills over Streamable HTTP.
Host your MCP tool over streamable HTTP in one command.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA simple MCP server that exposes a 'greet' tool which returns a friendly greeting for a given name.6 npmISC
- AlicenseNot gradedqualityCmaintenanceTurns any folder of agent skills into a live MCP server, exposing skills_list, skills_get, and skills_search tools with zero-dependency stdio support.MIT
- FlicenseNot gradedqualityCmaintenanceEnables a simple greeting tool over MCP, demonstrating schema validation and transport communication.-
- FlicenseAqualityCmaintenanceEnables MCP clients to call a simple greeting tool that takes a name and returns personalized text and structured messages via stdio.1-