MCP Server Starter
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., "@MCP Server Startergenerate a new tool that fetches user data from an API"
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 Server Starter (TypeScript)
A minimal, production-ready TypeScript starter template for building Model Context Protocol (MCP) servers.
๐ฏ Motivation
The Model Context Protocol (MCP) is an open protocol that standardizes how AI applications connect to data sources and tools. Think of it as "USB-C for AI" - a universal standard that allows any AI model to connect with any data source or tool through a consistent interface.
graph LR
A[AI] <-->|MCP| B[Server]
B <--> C[Tools]
B <--> D[Resources]This starter template provides:
โ Minimal boilerplate to get you started quickly
โ Auto-loading architecture for tools, resources, and prompts
โ TypeScript best practices with strict typing
โ Production-ready structure that scales with your project
โ Working example (echo tool) to demonstrate the pattern
Whether you're building integrations for databases, APIs, file systems, or custom business tools, this template helps you create MCP servers that can be used by any MCP-compatible client (like Claude Desktop, IDEs, or custom applications).
Related MCP server: MCP Server Foundation Template
๐ Table of Contents
โจ Features
๐ Auto-loading Module System - Drop new tools, resources, or prompts into their directories and they're automatically registered
๐ ๏ธ TypeScript First - Full type safety with strict TypeScript configuration
๐ฆ Minimal Dependencies - Only essential packages included
๐งช Built-in Testing - Uses Node.js native test runner
๐ MCP Inspector Support - Test your server with the official MCP Inspector
๐ Extensible Architecture - Clear patterns for adding new capabilities
๐ฏ Example Implementation - Working echo tool demonstrates the pattern
โก Code Generators - Hygen scaffolding for rapid module creation
๐ Dual Transport Support - Both stdio and HTTP (SSE + JSON-RPC) transports
๐ณ Docker Ready - Containerized deployment with multi-stage builds
๐ Prerequisites
Ensure you have Node.js version 20.11.0 or higher installed before proceeding.
Node.js >= 20.11.0
npm or yarn
Basic understanding of TypeScript
Familiarity with the Model Context Protocol concepts
๐ฆ Installation
Clone and Setup
# Clone the repository
git clone https://github.com/alexanderop/mcp-server-starter-ts.git
cd mcp-server-starter-ts
# Install dependencies
npm install
# Build the project
npm run buildUsing as a Template
You can also use this as a GitHub template:
Click "Use this template" on GitHub
Create your new repository
Clone and start building your MCP server
๐ Quick Start
Use the MCP Inspector to test your server interactively during development!
Build the server:
npm run buildTest with MCP Inspector:
npm run inspectThis opens the MCP Inspector where you can interact with your server's tools, resources, and prompts.
Run tests:
npm test
๐ Transport Modes
This server supports two transport modes: stdio (default) and HTTP (Streamable SSE + JSON-RPC).
Stdio Mode (Default)
Traditional stdio transport for local development and desktop clients:
# Run with stdio transport
npm run serve:stdio
# Or simply (defaults to stdio)
npm run build && node build/index.jsHTTP Mode (SSE + JSON-RPC)
Streamable HTTP transport for web deployments and remote access:
# Run with HTTP transport on port 3000
npm run serve:http
# Test with MCP Inspector
npm run inspect:httpThe HTTP transport exposes:
SSE endpoint (GET):
http://localhost:3000/mcp- For server-sent eventsJSON-RPC endpoint (POST):
http://localhost:3000/mcp- For requests
Environment Variables
Configure the server behavior using environment variables:
Variable | Description | Default |
| Transport mode: |
|
| HTTP server port (HTTP mode only) |
|
| CORS allowed origins (HTTP mode only) |
|
Configuration Examples
VS Code (mcp.json or .vscode/mcp.json)
{
"servers": {
"starter-stdio": {
"type": "stdio",
"command": "node",
"args": ["./build/index.js"]
},
"starter-http": {
"type": "http",
"url": "http://localhost:3000/mcp"
}
}
}Claude Desktop
Add to your Claude Desktop configuration:
{
"mcpServers": {
"mcp-server-starter": {
"command": "node",
"args": ["/path/to/mcp-server-starter/build/index.js"]
}
}
}๐ณ Docker Support
The server includes Docker support for easy deployment:
Quick Start with Docker
# Build and run with Docker Compose
docker compose up --build
# Or run the pre-built image
docker run -p 3000:3000 ghcr.io/alexanderopalic/mcp-server-starter-ts:latestDocker Configuration
The Docker container runs in HTTP mode by default. Override settings with environment variables:
docker run -p 3000:3000 \
-e CORS_ORIGIN="https://example.com" \
-e PORT=3000 \
ghcr.io/alexanderopalic/mcp-server-starter-ts:latestDevelopment with Docker
Use the development profile for hot reload:
docker compose --profile dev up mcp-server-starter-devThis mounts your source code and enables live reloading on port 3001.
๐ Project Structure
mcp-server-starter-ts/
โโโ src/
โ โโโ index.ts # Main entry point
โ โโโ registry/ # Auto-loading system
โ โ โโโ auto-loader.ts # Module auto-discovery
โ โ โโโ types.ts # TypeScript interfaces
โ โโโ tools/ # Tool implementations
โ โ โโโ echo.ts # Example echo tool
โ โโโ resources/ # Resource implementations (empty by default)
โ โโโ prompts/ # Prompt implementations (empty by default)
โโโ tests/ # Test files
โโโ _templates/ # Hygen generator templates
โ โโโ tool/new/ # Tool generator
โ โโโ prompt/new/ # Prompt generator
โ โโโ resource/new/ # Resource generator
โโโ build/ # Compiled JavaScript (generated)
โโโ mcp.json # MCP server configuration
โโโ package.json # Node.js dependencies
โโโ tsconfig.json # TypeScript configuration
โโโ eslint.config.js # ESLint configuration
โโโ README.mdHow Auto-Loading Works
flowchart TB
A[Start] --> B[Scan]
B --> C[Register]
C --> D[Ready]Simply drop your module files into the appropriate directory (tools/, resources/, or prompts/) and they'll be automatically loaded when the server starts!
๐ ๏ธ Development Guide
Using Code Generators
The fastest way to create new modules is using the built-in Hygen generators!
This project includes Hygen scaffolding for rapid module creation. Each generator creates both the implementation file and a corresponding test file.
Generate a New Tool
npm run gen:toolYou'll be prompted for:
Name: Enter in kebab-case (e.g.,
text-transform)Description: Brief description of what the tool does
Generate a New Prompt
npm run gen:promptYou'll be prompted for:
Name: Enter in kebab-case (e.g.,
code-review)Description: Brief description of the prompt template
Generate a New Resource
npm run gen:resourceYou'll be prompted for:
Name: Enter in kebab-case (e.g.,
app-status)Description: Brief description of the resource
Command Line Usage
You can also provide parameters directly:
npx hygen tool new --name my-tool --description "Does something useful"
npx hygen prompt new --name my-prompt --description "Generates helpful text"
npx hygen resource new --name my-resource --description "Provides data"Generated files:
Implementation:
src/{tools|prompts|resources}/[name].tsTest:
tests/[name].test.ts
The auto-loader automatically discovers and registers all generated modules - no additional configuration needed!
Module Types Overview
graph TD
A[MCP] --> B[Tools]
A --> C[Resources]
A --> D[Prompts]Adding a New Tool
Tools are functions that can be called by the AI to perform specific actions or computations.
Tools allow your MCP server to perform actions. Create a new file in src/tools/:
// src/tools/calculate.ts
import { z } from "zod";
import type { RegisterableModule } from "../registry/types.js";
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
const calculateModule: RegisterableModule = {
type: "tool",
name: "calculate",
description: "Perform basic arithmetic calculations",
register(server: McpServer) {
server.tool(
"calculate",
"Perform basic arithmetic calculations",
{
operation: z.enum(["add", "subtract", "multiply", "divide"])
.describe("The arithmetic operation to perform"),
a: z.number().describe("First number"),
b: z.number().describe("Second number"),
},
(args) => {
let result: number;
switch (args.operation) {
case "add": result = args.a + args.b; break;
case "subtract": result = args.a - args.b; break;
case "multiply": result = args.a * args.b; break;
case "divide":
if (args.b === 0) throw new Error("Division by zero");
result = args.a / args.b;
break;
}
return {
content: [
{
type: "text",
text: `Result: ${result}`,
},
],
};
}
);
}
};
export default calculateModule;Adding a Resource
Resources provide read-only access to data that can be consumed by AI clients.
Resources provide data that can be read by clients. Create a new file in src/resources/:
// src/resources/config.ts
import type { RegisterableModule } from "../registry/types.js";
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
const configResource: RegisterableModule = {
type: "resource",
name: "config",
description: "Application configuration",
register(server: McpServer) {
server.resource(
"config://app/settings",
"Application settings",
"application/json",
async () => {
const settings = {
version: "1.0.0",
environment: process.env.NODE_ENV || "development",
features: {
autoSave: true,
darkMode: false,
}
};
return {
contents: [
{
uri: "config://app/settings",
mimeType: "application/json",
text: JSON.stringify(settings, null, 2),
}
]
};
}
);
}
};
export default configResource;Adding a Prompt
Prompts are reusable templates that help structure interactions with the AI model.
Prompts are reusable prompt templates. Create a new file in src/prompts/:
// src/prompts/code-review.ts
import { z } from "zod";
import type { RegisterableModule } from "../registry/types.js";
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
const codeReviewPrompt: RegisterableModule = {
type: "prompt",
name: "code-review",
description: "Generate a code review prompt",
register(server: McpServer) {
server.prompt(
"code-review",
"Generate a comprehensive code review",
{
language: z.string().describe("Programming language"),
code: z.string().describe("Code to review"),
focus: z.string().optional().describe("Specific areas to focus on"),
},
(args) => {
return {
messages: [
{
role: "user",
content: {
type: "text",
text: `Please review the following ${args.language} code:
\`\`\`${args.language}
${args.code}
\`\`\`
${args.focus ? `Focus areas: ${args.focus}` : ""}
Please provide:
1. Code quality assessment
2. Potential bugs or issues
3. Performance considerations
4. Security concerns
5. Suggestions for improvement`,
},
},
],
};
}
);
}
};
export default codeReviewPrompt;๐ Testing with MCP Inspector
The MCP Inspector is a powerful tool for testing your server:
npm run inspectThis command:
Builds your TypeScript code
Launches the MCP Inspector
Connects to your server
Provides an interactive UI to test tools, resources, and prompts
Interactive Development Mode
For rapid testing and development, use the interactive dev mode:
npm run devThis starts an interactive REPL where you can paste JSON-RPC messages directly and see responses in real-time. Perfect for testing your MCP server during development!
JSON-RPC Examples for Dev Mode
Once you run npm run dev, you can paste these JSON-RPC messages directly.
MCP Protocol Handshake Required
The MCP protocol requires a specific initialization sequence before you can use tools, resources, or prompts:
Initialize Request - Client sends capabilities and receives server capabilities
Initialized Notification - Client confirms it's ready (no response expected)
Why is the initialized notification needed?
It confirms the client has processed the initialization response and is ready
It enables bidirectional communication - after this, the server can send requests to the client
Without it, the server won't send notifications (like
tools/list_changed) or make requests (likesampling/createMessage)This follows a pattern similar to TCP's handshake, ensuring both parties are ready before actual communication begins
The dev server does NOT automatically perform this handshake. You must send these messages manually first.
1. Initialize Connection (Required First!)
Step 1 - Send initialize request:
{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"1.0.0","capabilities":{},"clientInfo":{"name":"dev-client","version":"1.0.0"}},"id":1}Step 2 - After receiving the response, send initialized notification:
{"jsonrpc":"2.0","method":"notifications/initialized"}Now the server is ready to handle requests!
2. List Available Tools
{"jsonrpc":"2.0","method":"tools/list","params":{},"id":2}3. Call the Echo Tool
{"jsonrpc":"2.0","method":"tools/call","params":{"name":"echo","arguments":{"text":"Hello, MCP!"}},"id":3}4. List Resources
{"jsonrpc":"2.0","method":"resources/list","params":{},"id":4}5. Read a Resource
{"jsonrpc":"2.0","method":"resources/read","params":{"uri":"timestamp://current/iso"},"id":5}6. List Prompts
{"jsonrpc":"2.0","method":"prompts/list","params":{},"id":6}7. Get a Prompt
{"jsonrpc":"2.0","method":"prompts/get","params":{"name":"generate-readme","arguments":{"projectName":"My Project","description":"A cool project"}},"id":7}Using Dev Mode:
Run
npm run devto start the interactive serverCopy any JSON-RPC message above and paste it into the terminal
The server will show the response with syntax highlighting
Type
helpfor available commands orexitto quit
Important: Always send the initialize message first to establish the connection!
โ๏ธ Configuration
TypeScript Configuration
The project uses strict TypeScript settings for maximum type safety. Key configurations in tsconfig.json:
Target: ES2022
Module: ES2022 with Node module resolution
Strict mode enabled
Source maps for debugging
Available Scripts
Command | Description |
| Compile TypeScript to JavaScript |
| Run ESLint checks |
| Auto-fix ESLint issues |
| Type-check without building |
| Run tests |
| Run tests in watch mode |
| Launch MCP Inspector |
| Interactive development mode |
| Generate a new tool with test |
| Generate a new prompt with test |
| Generate a new resource with test |
๐ Integration
How MCP Integration Works
sequenceDiagram
IDE->>MCP: Connect
MCP-->>IDE: Ready
IDE->>MCP: Call
MCP-->>IDE: ResponseWith VS Code (Recommended)
The easiest way to use your MCP server is through VS Code with MCP support extensions.
Build your server:
npm run buildOpen the project in VS Code:
code .Use the included
mcp.jsonconfiguration:The project includes an
mcp.jsonfile that VS Code MCP extensions can use to automatically start your server:{ "servers": { "starter": { "type": "stdio", "command": "node", "args": [ "./build/index.js" ] } } }Install a VS Code MCP extension:
Open VS Code Extensions (โงโX on macOS, Ctrl+Shift+X on Windows/Linux)
Search for "MCP" or "Model Context Protocol"
Install an MCP-compatible extension
The extension will automatically detect and use your
mcp.jsonconfiguration
Themcp.json file tells VS Code how to start your MCP server. When you open a project with this file, compatible extensions will automatically recognize it as an MCP server project.
With Claude Desktop
Make sure to build your server before configuring Claude Desktop. The server must be compiled to JavaScript.
Build your server:
npm run buildAdd to Claude Desktop configuration:
WARNINGConfiguration file location varies by operating system:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{ "mcpServers": { "my-server": { "command": "node", "args": ["/path/to/your/server/build/index.js"] } } }Restart Claude Desktop
Always use absolute paths in your configuration. Relative paths may not work correctly.
With Custom Clients
Use the MCP SDK to connect to your server:
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "node",
args: ["/path/to/your/server/build/index.js"],
});
const client = new Client({
name: "my-client",
version: "1.0.0",
}, { capabilities: {} });
await client.connect(transport);๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
Fork the repository
Create your feature branch (
git checkout -b feature/AmazingFeature)Commit your changes (
git commit -m 'Add some AmazingFeature')Push to the branch (
git push origin feature/AmazingFeature)Open a Pull Request
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Resources
๐ Troubleshooting
Common issues and their solutions:
Issue | Solution |
| Ensure you've run |
Server not connecting | Check that you're using absolute paths in configuration |
Tools not loading | Verify your module exports match the |
TypeScript errors | Run |
Auto-loading fails | Check file names and ensure modules are in correct directories |
Development
โ Type Safety: Use TypeScript's strict mode for catching errors early
โ Modular Design: Keep tools, resources, and prompts focused on single responsibilities
โ Error Handling: Always handle errors gracefully and provide meaningful messages
โ Validation: Use Zod schemas to validate all inputs
โ Testing: Write tests for critical functionality
Built with โค๏ธ for the MCP community
Available Tools
3 toolsechoC
Echo back the provided text
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to echo back |
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 of behavioral disclosure. It states the basic action ('echo back') but does not disclose any behavioral traits such as side effects, error handling, performance characteristics, or output format. For a tool with no annotation coverage, this is a significant gap in transparency.
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 a single, efficient sentence with zero waste, front-loading the core functionality. It is appropriately sized for a simple tool, making it easy to parse and understand without unnecessary details.
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 the tool's simplicity, no annotations, and no output schema, the description is incomplete. It lacks information on behavioral aspects, usage context, and output details, which are necessary for the agent to fully understand how to invoke and interpret the tool effectively.
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 input schema has 100% description coverage, with the parameter 'text' fully documented in the schema. The description adds no additional meaning beyond what the schema provides, as it only repeats the concept of echoing text without elaborating on parameter usage or constraints. Baseline 3 is appropriate when the schema does the heavy lifting.
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 'Echo back the provided text' clearly states the tool's purpose with a specific verb ('echo back') and resource ('the provided text'), making it easy to understand. However, it does not explicitly differentiate from sibling tools like 'fetch' or 'search', which might have overlapping or distinct functionalities, so it lacks sibling differentiation.
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?
The description provides no guidance on when to use this tool versus alternatives like 'fetch' or 'search'. It does not mention any context, prerequisites, or exclusions for usage, leaving the agent without direction on appropriate scenarios or comparisons with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchC
Fetch a stub document by id and return full text
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Unique identifier of a search result document |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions fetching and returning full text but doesn't disclose behavioral traits such as error handling, permissions needed, rate limits, or whether it's idempotent. This leaves significant gaps for a tool with no annotation coverage.
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 a single, efficient sentence with zero waste. It's appropriately sized and front-loaded, clearly stating the tool's purpose without unnecessary elaboration.
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, no output schema, and a simple input schema, the description is incomplete. It lacks details on return values, error conditions, and behavioral context, making it inadequate for a tool that performs data retrieval.
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 100%, so the schema already documents the 'id' parameter. The description adds minimal value by implying the ID is for a 'search result document', but doesn't provide additional syntax or format details beyond what the schema specifies.
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 the action ('fetch') and resource ('stub document'), specifying it returns full text. However, it doesn't differentiate from sibling tools like 'search' or 'echo', which could have overlapping functionality.
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 is provided on when to use this tool versus alternatives like 'search' or 'echo'. The description implies usage for retrieving documents by ID but lacks explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchB
Search stub documents and return minimal results (id, title, url)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query string |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool searches and returns minimal results, but doesn't cover aspects like whether it's read-only, has rate limits, requires authentication, or how results are paginated/sorted. This leaves significant gaps for a search tool.
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 a single, efficient sentence that front-loads the key action ('search stub documents') and outcome ('return minimal results'), with no wasted words. It's appropriately sized for a simple tool.
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 the tool's simplicity (1 parameter, no output schema, no annotations), the description is adequate but incomplete. It covers the purpose and result format, but lacks behavioral details (e.g., error handling, performance) that would help an agent use it effectively, especially without annotations.
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 input schema has 100% description coverage, with the 'query' parameter fully documented. The description adds context by specifying it searches 'stub documents', but doesn't provide additional syntax, format, or examples beyond what the schema offers. This meets the baseline for high schema coverage.
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 the tool searches for 'stub documents' and returns minimal results (id, title, url), providing a specific verb ('search') and resource ('stub documents'). It distinguishes from the 'echo' and 'fetch' siblings by specifying its search functionality, though it doesn't explicitly contrast with them.
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?
The description provides no guidance on when to use this tool versus alternatives like 'echo' or 'fetch'. It mentions returning 'minimal results', which implies a use case for quick searches, but lacks explicit when/when-not instructions or prerequisites.
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.
3 tool updates
- First observed
echo - First observed
fetch - First observed
search
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: echo handles text reflection, fetch retrieves specific documents by ID, and search performs document queries with minimal results. There is no overlap in functionality, making tool selection straightforward.
All tool names follow a consistent, simple verb pattern (echo, fetch, search) without any deviations in style or convention. This uniformity enhances predictability and usability.
With only 3 tools, the server feels minimal for a 'starter' purpose, potentially lacking depth for more complex tasks. While not extreme, it borders on being too thin for broader utility.
The tool set is severely incomplete for a document management domain, missing essential CRUD operations like create, update, or delete. Agents will face dead ends when trying to modify or manage documents.
Maintenance
Related MCP Connectors
A simple Typescript MCP server built using the official MCP Typescript SDK and smithery/cli. Thisโฆ
Kickstart development with a customizable TypeScript template featuring sample tools for greeting,โฆ
A TypeScript MCP server for Home Assistant, enabling programmatic management of entities, automatiโฆ
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yoโฆ
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA minimal, production-ready TypeScript starter template for building Model Context Protocol (MCP) servers with auto-loading architecture for tools, resources, and prompts. Provides boilerplate code, generators, and examples to quickly create MCP servers that can connect AI applications to any data source or tool.-
- FlicenseNot gradedqualityDmaintenanceA customizable, production-ready template for building Model Context Protocol servers with dual transport support (stdio and HTTP), TypeScript, Docker support, and extensible architecture for tools, resources, and prompts.-
- FlicenseNot gradedqualityNot gradedmaintenanceA minimal, production-ready TypeScript template for building Model Context Protocol servers with auto-loading architecture for tools, resources, and prompts, supporting both stdio and HTTP transports.-
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server template designed for building structured tools, prompts, and resources with built-in support for HTTP and STDIO transports. It provides a standardized framework for developers to create and deploy AI-driven services using TypeScript and Zod schema validation.3 npm-