Skip to main content
Glama
junna-legal
by junna-legal

Production-Ready MCP Server Boilerplate

Ship reliable MCP servers in minutes, not days. A production-ready foundation for building Model Context Protocol servers with built-in security, authentication, and observability.

NOTE

This is a starter template β€” not a finished product. You are responsible for reviewing and securing any code before production use.

TypeScript License: MIT MCP Compliant

Don't build from scratch. This kit solves the "boring" parts of MCP server developmentβ€”transport management, error handling, and security boundariesβ€”so you can focus on your tool's logic.

Works with Claude Code, Cursor, Windsurf, and any MCP-compatible client.


πŸš€ Why this boilerplate?

Most MCP tutorials show you a "toy" server. This repo gives you a production-grade foundation.

πŸ›‘οΈ Secure by Design

  • SSRF Protection: Blocks requests to private/internal networks (IPv4 + IPv6), including cloud metadata endpoints (169.254.169.254). DNS resolution is checked to prevent rebinding.

  • JWT Security: Algorithm validation rejects alg:none, HS384, and RS256 downgrade attacks. Expiry and tampering are verified with constant-time comparison.

  • HMAC-SHA256 Webhook Signatures: Outbound webhooks are signed with X-Webhook-Signature when a secret is configured.

  • DNS Rebinding Protection: HTTP transport validates Host header against an allowlist.

  • Sandboxed File Access: Prevents AI from reading/writing outside allowed directories, with symlink escape detection.

  • Strict Input Validation: All tool inputs are validated with Zod schemas.

  • Injection Protection: SQLite queries use strict parameter binding.

  • Security tested: 30+ security-focused test cases covering OWASP top threats (SSRF, injection, path traversal, auth bypass).

πŸ”Œ Built for Real Projects

  • Authentication: Built-in strategies for API Key and JWT (configurable per env).

  • Rate Limiting: Token bucket algorithm to prevent abuse.

  • Observability: Structured JSON logging (via pino) ready for CloudWatch/Datadog.

⚑ Developer Experience (DX)

  • Type-Safe: strict: true TypeScript configuration, ESM, fully typed.

  • Testing: 228 tests (unit, integration, and E2E) with Vitest, including 30+ security-focused cases.

  • Dockerized: Multi-stage Dockerfile for immediate deployment.


Related MCP server: mcp-server-toolkit

πŸ“¦ What's Included

Feature

This Boilerplate

Basic Tutorials

Transport

HTTP (SSE) + Stdio

Stdio only

Validation

Zod Schemas

Manual / None

Logging

Structured JSON

console.log

Error Handling

Graceful + MCP Codes

Process crash

CI/CD

GitHub Actions

None

Reference Implementations

Includes 6 fully-typed tools to copy-paste patterns from:

  1. database-query: Secure SQLite operations.

  2. api-connector: Fetch data from external REST APIs.

  3. file-manager: Safe file system operations (5 sub-tools).

  4. cache-store: TTL-based key-value cache with namespaces (5 sub-tools).

  5. semantic-search: Local RAG with embeddings (3 tools + 2 resources + 1 prompt).

  6. webhook-notifier: Async webhook delivery with task tracking (4 tools + 2 resources + 1 prompt).


🏁 Quick Start

Prerequisites

  • Node.js 22+

    WSL2 users: Use Node.js installed inside WSL, not Windows. See Troubleshooting.

  • npm 9+

1. Setup

git clone <your-repo-url> my-mcp-server
cd my-mcp-server
npm install

2. Configure Environment

cp .env.example .env
# Edit .env if needed β€” defaults work out of the box

3. Seed Sample Database

npm run db:seed  # Populates local SQLite for testing

Note: If the server is already running, restart it after seeding to pick up the new database.

4. Build

npm run build  # Compiles TypeScript to dist/

5. Run Development Server

npm run dev
# Starts server in hot-reload mode

6. Verify with Inspector

npm run inspector
# Opens interactive debugger in your browser (uses dist/index.js)

πŸ”§ Connecting to Clients

Claude Code

Copy the example config to your project root:

cp .mcp.json.example .mcp.json
# Edit paths in .mcp.json to match your setup

Or add manually to your .mcp.json:

{
  "mcpServers": {
    "mcp-starter-kit": {
      "command": "node",
      "args": ["dist/index.js"],
      "env": {
        "LOG_LEVEL": "info",
        "DB_PATH": "./data/sample.db",
        "SANDBOX_ROOT": "./data/sandbox"
      }
    }
  }
}

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "my-production-server": {
      "command": "node",
      "args": ["/absolute/path/to/my-mcp-server/dist/index.js"]
    }
  }
}

Cursor, Windsurf, & Others

See docs/SETUP.md for detailed connection guides.


πŸ“‚ Project Architecture

Designed for scalability:

mcp-starter-kit/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ index.ts              # Entry point
β”‚   β”œβ”€β”€ server.ts             # Central MCP registry
β”‚   β”œβ”€β”€ config/env.ts         # Environment variable validation (Zod)
β”‚   β”œβ”€β”€ tools/
β”‚   β”‚   β”œβ”€β”€ database-query/   # SQLite CRUD tool
β”‚   β”‚   β”œβ”€β”€ api-connector/    # REST API tool
β”‚   β”‚   β”œβ”€β”€ file-manager/     # Sandboxed file operations tool
β”‚   β”‚   β”œβ”€β”€ cache-store/      # TTL-based key-value cache
β”‚   β”‚   β”œβ”€β”€ semantic-search/  # Local RAG with embeddings
β”‚   β”‚   └── webhook-notifier/ # Async webhook delivery
β”‚   β”œβ”€β”€ lib/                  # Shared utilities (Logger, Guardrails)
β”‚   β”œβ”€β”€ middleware/            # Auth & rate limiting
β”‚   └── transport/            # stdio and HTTP transports
β”œβ”€β”€ tests/                    # Integration tests & helpers
β”œβ”€β”€ scripts/                  # CLI tools (db:seed, create-tool)
β”œβ”€β”€ docs/                     # Detailed documentation
β”œβ”€β”€ docker/                   # Dockerfile & docker-compose
└── data/                     # Sample DB & sandbox directory

πŸ“œ Documentation

Document

Description

SETUP.md

Detailed setup, environment variables, client configuration

CUSTOMIZATION.md

Step-by-step guide to creating new tools

DEPLOYMENT.md

Deploy via npm, Docker, or cloud services

ARCHITECTURE.md

Design decisions, security model, and data flow

TROUBLESHOOTING.md

Common errors and solutions

TESTING.md

Test suite organization, writing tests, security checklist

SECURITY.md

Security policy, vulnerability reporting, feature inventory


πŸ› οΈ Scripts

Command

Description

npm run dev

Start with hot-reload (tsx watch)

npm run build

Build to dist/ (tsup)

npm start

Run built server (stdio)

npm run start:http

Run built server (HTTP)

npm test

Run all tests

npm run lint

Lint with ESLint

npm run typecheck

Type-check with tsc

npm run inspector

Open MCP Inspector

npm run db:seed

Seed sample SQLite database

npm run create-tool

Scaffold a new tool

npm run test:coverage

Run tests with coverage report


License

MIT Β© 2026 Edge Craft Studio

Not affiliated with, endorsed by, or certified by Anthropic or the Agentic AI Foundation.

Available Tools

15 tools
api-connectorA

Make HTTP requests to any REST API with custom headers, JSON body, retry, and configurable timeout. Returns the response status, headers, and body.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe full URL to send the request to
bodyNoRequest body (JSON). Ignored for GET and HEAD requests.
methodNoHTTP method to useGET
headersNoCustom request headers as key-value pairs (e.g. { "Authorization": "Bearer token123" })
format_jsonNoPretty-print JSON responses with indentation (default: true)
max_retriesNoMaximum number of retry attempts on transient errors (0-5, default: 3)
timeout_secondsNoRequest timeout in seconds (1-120, default: 30)

TDQS

A3.8/5.0
Behavior3/5

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 discloses that the tool makes HTTP requests, returns status/headers/body, and supports retries and configurable timeouts. However, it does not specify error handling, redirect behavior, response size limits, or security implications, which are significant for a generic HTTP client.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the primary action, and includes only relevant details about features and return values. Every clause conveys necessary information without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters and no output schema, the description adequately explains the return value as status, headers, and body, and mentions the core features. However, it does not specify the response object structure or error behaviors, leaving some context gaps that the schema does not cover.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with detailed descriptions, so the baseline is 3. The description does not add meaning beyond the schemaβ€”it merely references 'custom headers, JSON body, retry, and configurable timeout' which already exist in the schema. No additional parameter semantics are provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Make HTTP requests to any REST API' with a clear verb and resource, and lists key capabilities (custom headers, JSON body, retry, timeout) that differentiate it from sibling tools like database-query and file_read. It leaves no ambiguity about the tool's primary function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for making HTTP requests to external REST APIs, but does not explicitly state when to choose this over sibling tools like webhook_send or database-query. There are no exclusion criteria or alternative recommendations, so it only provides an implicit usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cacheC

Key-value cache with TTL and namespaces. Operations: set, get, delete, list, clear.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoThe cache key (required for set/get/delete)
valueNoThe value to cache (for 'set' operation)
namespaceNoCache namespace for grouping keys (default: 'default')
operationYesThe cache operation to perform
ttl_secondsNoTime-to-live in seconds (default: 3600, for 'set' operation)

TDQS

C2.9/5.0
Behavior2/5

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 only mentions TTL and namespaces, but fails to describe important behaviors such as how TTL expiration works, whether delete and clear are destructive and irreversible, whether clear operates per namespace or globally, or what happens to expired keys. These are significant gaps for a tool with mutation operations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that establishes the core resource and lists all operations without any filler. It is front-loaded and every element contributes to understanding the tool's scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-operation tool with no output schema, the description is too minimal. It does not explain what each operation returns (e.g., get returns a value, list returns keys), nor does it clarify important side effects like the destructive nature of delete/clear or TTL enforcement with the default namespace. This undercuts the agent's ability to predict behavior correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% parameter description coverage, including descriptions for operation, key, value, namespace, and ttl_seconds. The description adds no additional parameter semantics; it merely repeats TTL and namespaces and lists operations that are already defined in the enum. Baseline of 3 is appropriate because the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as a key-value cache with TTL and namespaces, and enumerates the supported operations (set, get, delete, list, clear). It is specific enough to distinguish from sibling tools like database-query or file_read, though it lacks a single verb+resource construction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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. It does not mention that it is for temporary data, that database-query might be preferred for persistent structured data, or any exclusions. There is no 'when to use' or 'prefer X instead' statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

database-queryA

Execute SQL queries against a SQLite database (SELECT, INSERT, UPDATE, DELETE). Use operation 'list-tables' to discover available tables. Mutation queries require 'allow_mutation: true' for safety.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlNoSQL statement to execute (required for 'query' operation)
paramsNoBind parameters for the SQL statement
operationYesThe operation to perform
allow_mutationNoMust be true to execute INSERT, UPDATE, DELETE, or other mutating statements
use_transactionNoWrap the statement in an explicit transaction

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses a key safety trait: mutations are allowed only if 'allow_mutation: true' is set, and it explicitly lists SQL statement types (SELECT, INSERT, UPDATE, DELETE). While it does not mention return formats or side effects, the mutation guard and operation scope provide meaningful behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place. The first sentence states the core function, the second provides a discovery workflow step, and the third adds a safety condition. There is no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 5 parameters and no output schema, but the description covers the essential operational aspects: allowed SQL types, the 'list-tables' operation, and the mutation guard. It does not explain the return value format, but for a SQL query tool this is often implicit. The description is complete enough for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by clarifying when to use certain parameters: the 'list-tables' operation for discovery and the 'allow_mutation' requirement for mutating statements. This goes slightly beyond the schema's own descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's verb and resource: "Execute SQL queries against a SQLite database (SELECT, INSERT, UPDATE, DELETE)." It immediately distinguishes this from sibling tools (e.g., api-connector, file_read) by specifying the database context. It also mentions the two operation modes, 'query' and 'list-tables', giving a precise scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on how to use the tool: "Use operation 'list-tables' to discover available tables" and "Mutation queries require 'allow_mutation: true' for safety." It does not explicitly name alternatives or exclusions, but the SQL-focused purpose implies when it is appropriate, earning a 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

file_infoA

Get metadata about a file or directory including size, modification date, and permissions.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path to the file or directory

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden of transparency. It clarifies that it works for both files and directories and lists the types of metadata returned. However, it does not disclose potential error behavior (e.g., nonexistent path) or whether it returns anything beyond those fields. This is adequate but not richly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word contributes meaning, listing the verb, resource, and key metadata fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one required parameter and no output schema. The description provides sufficient context for what the tool does and what metadata it returns. It lacks explicit return-structure details, but this is acceptable given the low complexity and the clear list of metadata fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has only one parameter ('path') with a description that largely mirrors the tool description ('Relative path to the file or directory'). Since schema coverage is 100%, the description adds little beyond the schema. It confirms the path can target a file or directory, but this is already in the schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and resource ('metadata about a file or directory'), and explicitly lists the metadata fields (size, modification date, permissions). This clearly distinguishes it from sibling tools like file_read (content), file_write (writing), and file_list (listing).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context: when you need metadata rather than content or operations. It does not explicitly mention alternatives or exclusions, but the purpose is clear enough for a simple read-only tool. No explicit when-not guidance, but the scope is self-evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

file_listA

List entries in a directory. Returns files and subdirectories sorted with directories first.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoRelative path to the directory to list (default: root).

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a meaningful behavioral trait: output is sorted with directories first. However, with no annotations provided, the description carries the full burden and does not specify the exact return format (e.g., names vs. full paths, hidden files, or error handling).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the action and adds only the key behavioral detail about sorting, earning every word.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with one parameter and no output schema, the description covers the primary purpose and the notable sorting behavior. It could be slightly more complete by detailing the return structure (e.g., names only), but it is sufficient for straightforward listing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes the only parameter 'path', including its default value. The description adds no additional parameter semantics beyond what the schema already provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'List entries in a directory.' It uses a specific verb and resource, and distinguishes itself from sibling tools like file_read or file_search by focusing on directory enumeration rather than file content or search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through the description (use to list directory contents), but there is no explicit guidance on when to prefer this over siblings like file_info or file_search. No alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

file_readA

Read the contents of a text file. The path must be relative to the sandbox base directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path to the file to read
encodingNoFile encoding (default: utf-8)utf-8

TDQS

A3.7/5.0
Behavior2/5

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 mentions the file type and path constraint but does not disclose behavior on missing files, return format, or whether the operation is strictly read-only. For a read tool, this is minimal but expected; however, it lacks explicit non-destructive assurance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence with no filler. It front-loads the core action and adds the critical path constraint efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple file read tool with two parameters and no output schema, the description covers the basics but omits details like return value semantics and potential errors. It is adequate for typical use but not exhaustive; more context could be given on encoding behavior or binary file handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for both parameters. The description adds meaningful clarification that the path is relative to the sandbox base directory, which is a constraint not fully captured in the schema's brief description. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads the contents of a text file, with a specific verb and resource. It distinguishes itself from sibling tools like file_write, file_list, and file_info through the name and the explicit 'read' action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a key usage constraintβ€”path must be relative to the sandbox base directoryβ€”but offers no explicit guidance on when to use this tool versus alternatives like file_info or file_search. Usage context is largely implied by the tool's name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

file_writeA

Write content to a text file. Creates parent directories if needed. Set overwrite to true to replace existing files.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path to the file to write
contentYesContent to write to the file
overwriteNoWhether to overwrite an existing file (default: false)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses key behaviors: creating parent directories and the overwrite flag semantics. However, it does not state what happens when overwrite is false and the file already exists, nor does it mention return values or potential errors. This is partial disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, each providing necessary information: the core action and the two behavioral modifiers (parent dir creation, overwrite). No redundant wording or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description covers the main functionality, it lacks information on return values and error behavior when overwrite=false and the file exists. Since no output schema exists, the description should have explained these aspects to be fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description doesn't need to repeat parameter details. It mentions 'content' implicitly and 'overwrite' explicitly, but adds no syntax or format details beyond the schema. Baseline 3 applies because schema handles the details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Write content to a text file' with a specific verb and resource, clearly distinguishing it from sibling tools like file_read, file_list, file_info, and file_search. It also mentions creating parent directories and overwrite behavior, further clarifying its unique role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: write text content, create parent directories as needed, and set overwrite to true to replace existing files. It does not explicitly mention alternatives or when-not-to-use conditions, but the use case is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

semantic_clearA

Clear all indexed documents from a collection. This action is irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
collectionYesName of the collection to clear

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly warns 'This action is irreversible,' disclosing a critical destructive trait. Since no annotations are provided, this disclosure carries the full behavioral burden, and while it doesn't detail all potential side effects, it covers the most important safety aspect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two short sentences: the action and a warning. Every word earns its place, with no redundant details or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description conveys the core operation and its irreversibility clearly. It doesn't describe return values or error handling, but for a destructive clear operation, this level of detail is generally sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides a complete description for the sole parameter 'collection' (100% coverage). The tool description adds no parameter-specific meaning beyond what the schema states, so it provides no bonus over the structured data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Clear'), the object ('all indexed documents'), and the scope ('from a collection'), making it distinct from sibling tools like semantic_index and semantic_search. The purpose is unambiguous and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to permanently remove all indexed documents from a collection, but it does not explicitly state when to use it versus alternatives, nor does it mention any prerequisites or exclusions. Usage context is implied rather than explicitly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

semantic_indexA

Index a document into a collection for semantic search. Text is automatically chunked and embedded using a local ML model (no API calls). Use document_id to replace an existing document.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentYesThe text content to index
metadataNoOptional metadata to associate with the document (e.g. source, title)
collectionYesName of the collection to index into
document_idNoOptional unique ID for the document. If provided and already exists, the document is replaced.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden and does well by disclosing automatic chunking, local ML embedding, no API calls, and document_id-based replacement. It omits some edge-case behavior such as what happens if a collection doesn't exist or expected return values, but the core traits are clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, with the primary action front-loaded and the replacement behavior placed second. No filler or repetition of the input schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The input schema fully documents parameters and the description covers purpose, local processing, and replacement. However, with no output schema and no annotations, it leaves a few gaps like return value, synchronization behavior, and error conditions, preventing a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful parameter semantics by explaining that text is automatically chunked/embedded and by clarifying that providing document_id replaces an existing document, going beyond the schema's bare field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Index a document into a collection for semantic search', using a specific verb ('Index'), a clear direct object ('document'), and a destination ('collection'). This fully distinguishes the tool from siblings like semantic_search and semantic_clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the use case (semantic search indexing) and adds context that text will be processed locally with no API calls, which helps an agent decide if this is appropriate. It does not explicitly exclude alternatives or name sibling tools, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_createB

Create an async task for tracking long-running operations. Tasks have a TTL and can optionally trigger webhook notifications on status changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the task
metadataNoArbitrary metadata to attach to the task
descriptionNoDetailed description of what the task does
ttl_secondsNoTime-to-live in seconds before the task is auto-deleted (60-86400, default: 3600)
webhook_eventNoEvent type to fire when task status changes (e.g. 'task.completed')

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It mentions key behaviors: tasks are asynchronous, have a TTL, and can optionally trigger webhook notifications on status changes. However, it does not disclose authentication requirements, return values, or side effects beyond the TTL and webhook behavior. Some transparency is provided, but significant gaps remain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of two sentences that front-load the primary purpose and then summarize key features. Every sentence contributes useful information without redundancy or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool creates a task but there is no output schema, so the description should explain what the response contains (e.g., task ID, status URL). It also lacks guidance on permissions, error conditions, or lifecycle behavior beyond the TTL. For a creation tool with moderate parameter complexity, the description is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all five parameters. The description adds marginal value by highlighting TTL and webhook features, which map to existing parameters, but it does not provide additional semantic context beyond what the schema already offers. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Create an async task for tracking long-running operations.' It uses a specific verb and resource, making the core action unambiguous. It does not explicitly differentiate from sibling tools like task_status, but the wording is specific enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a usage context: 'for tracking long-running operations,' indicating when the tool is appropriate. However, it lacks explicit guidance on when not to use it or how it compares to sibling tools like task_status or webhook_register. The guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_statusA

Get the current status of an async task, or update its status. Supports status transitions: pending->running, running->completed/failed. When a task reaches a terminal state, its configured webhook event is fired.

ParametersJSON Schema
NameRequiredDescriptionDefault
resultNoTask result data (set when completing or failing a task)
task_idYesThe ID of the task to check
update_statusNoOptionally update the task status

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It goes beyond basic get/update by explicitly stating supported transitions ('pending->running, running->completed/failed') and the side effect of firing a webhook when reaching a terminal state. This is valuable context about mutating behavior and timing of side effects, though it doesn't cover permissions or reversibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, both front-loaded with the core purpose. The first sentence states the action, and the second adds behavioral constraints. No fluff or redundancy; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three parameters and no output schema, the description covers the key aspects: purpose, transitions, and webhook side effect. It doesn't explicitly describe the return shape, but the get/update nature implies a return of status. Given the moderate complexity and existing schema coverage, it is reasonably complete, though it could mention pagination or response details for full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the allowed transition sequence (pending->running, running->completed/failed) and linking the 'result' parameter to terminal states. This clarifies the semantics of 'update_status' and 'result' better than the raw schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's dual purpose: 'Get the current status of an async task, or update its status.' This is a specific verb+resource pairing that distinguishes it from sibling tools like task_create, which creates tasks. The name 'task_status' aligns perfectly with the described functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage in the context of async task management by defining status transitions and the webhook side effect. While it doesn't explicitly name alternatives, the sibling list includes task_create, making it clear this tool is for checking/updating existing tasks. The context is sufficiently clear, though it lacks explicit when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webhook_registerA

Register a webhook callback URL to receive event notifications. Specify the URL, event types to subscribe to, and an optional HMAC secret for signature verification.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe callback URL to receive webhook notifications
activeNoWhether the webhook is active (default: true)
secretNoOptional shared secret for HMAC-SHA256 signature verification
descriptionNoHuman-readable description of this webhook
event_typesYesEvent types this webhook should receive

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It mentions the optional HMAC secret for signature verification, but it does not disclose side effects, permissions, reversibility, or what response to expect. This is a significant gap for a mutation tool that registers a webhook.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that front-loads the primary purpose and then lists key inputs. Every clause earns its place, with no redundant or fluffy wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 5 parameters and no output schema, the description provides a basic understanding but lacks detail on return values, registration persistence, or how to use the secret in practice. It is adequate but leaves gaps that the schema does not fully fill (e.g., what happens after registration).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds no extra meaning beyond echoing parameter names (URL, event types, secret). It does not explain parameter formats or relationships beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Register a webhook callback URL to receive event notifications.' It uses a specific verb ('Register') and resource ('webhook callback URL'), and the purpose is explicit. It distinguishes from sibling tools like webhook_send by focusing on receiving notifications via a registered URL.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool: 'to receive event notifications.' It implies use cases like subscribing to events and setting up a callback. However, it does not explicitly mention alternatives or when not to use it, which prevents a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webhook_sendA

Send a notification to all registered webhooks matching the event type. Supports idempotency keys to prevent duplicate deliveries and HMAC-SHA256 signatures.

ParametersJSON Schema
NameRequiredDescriptionDefault
payloadNoThe event payload to send to registered webhooks
event_typeYesThe event type to trigger (e.g. 'task.completed')
idempotency_keyNoOptional idempotency key to prevent duplicate deliveries

TDQS

A3.9/5.0
Behavior3/5

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 adds useful context about idempotency keys and HMAC-SHA256 signatures, but it does not disclose the return value, error behavior, or side-effect nature beyond 'send', nor does it mention requirements like authentication or rate limits. This is a moderate level of transparency, not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the primary action and scope, followed by two supporting capabilities. Every word earns its place, with no redundant or vague phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema and no annotations, the description should explain what the tool returns or what happens after invocation. It does neither. It also does not mention behavior when no webhooks match the event type or the possibility of asynchronous delivery. While the tool is relatively simple, this missing return/error context makes it partially incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description repeats the idempotency key purpose already in the schema and adds mention of HMAC-SHA256 signatures, but this does not add meaning to the individual parameters beyond what the schema already provides. The added signing context is more about behavior than parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Send') and clearly states the resource ('all registered webhooks matching the event type'). It effectively distinguishes itself from the sibling tool webhook_register, which is about registration rather than sending.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: use this tool when you need to trigger a notification to webhooks based on an event type. It implies the alternative of registering webhooks via webhook_register but does not explicitly name it or provide exclusions. Still, the guidance is clear enough for an agent to select it appropriately.

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. 15 tool updatesv1.1.0
    • First observedapi-connector
    • First observedcache
    • First observeddatabase-query
    • First observedfile_info
    • First observedfile_list
    • First observedfile_read
    • First observedfile_search
    • First observedfile_write
    • First observedsemantic_clear
    • First observedsemantic_index
    • First observedsemantic_search
    • First observedtask_create
    • First observedtask_status
    • First observedwebhook_register
    • First observedwebhook_send

TDQS

A3.5/5.0

Scored across 15 tools

Disambiguation5/5

Each tool targets a distinct resource and action, with clear boundaries between file, database, cache, semantic, webhook, and task operations. The only minor overlap is task_status handling both get and update, but the description clearly separates these behaviors, so no two tools appear to do the same thing.

Naming Consistency2/5

Naming conventions are mixed: some tools use hyphens (database-query, api-connector), others use underscores (file_read, task_status), and one is a single word (cache). The word order is also inconsistent, with most tools using noun_verb (file_read) but api-connector using a noun-noun pattern, and no uniform separator across the set.

Tool Count4/5

With 15 tools, the server sits at the upper boundary of a reasonable scope for a starter kit. Each tool covers a distinct capability, but the sheer variety (files, database, cache, semantic search, webhooks, tasks) makes it feel slightly broad, yet still justifiable for its purpose.

Completeness3/5

The tool surface covers core operations for each domain, but there are notable gaps: no file_delete or file_rename, no webhook_unregister, and no task_cancel or task_delete. These are common lifecycle operations that agents would likely need, making the set somewhat incomplete.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A production-grade MCP server and client implementation with comprehensive features including structured logging, health checks, metrics, authentication, and RAG capabilities with PostgreSQL vector search. Supports both stdio and SSE transports with containerization and security features for enterprise deployment.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Production-ready MCP server starter with authentication, observability, and a plugin system for building and deploying MCP servers quickly.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A production-ready MCP server template that connects LLMs and AI agents to external data, tools, and services with built-in OAuth 2.1 authentication, Redis-backed session management, and a modular tools engine.
    1
    MIT