Skip to main content
Glama

GoMCP

Go Version License Release gomcp MCP server

在 Go 中构建 MCP 服务器的快速、惯用方式。

中文文档


🚀 快速链接


Related MCP server: Filesystem MCP Server

🎯 什么是 GoMCP?

GoMCP 是一个用于构建 Model Context Protocol (MCP) 服务器的框架,而不仅仅是一个 SDK。可以将其视为 “MCP 版的 Gin”

MCP 是一种开放协议,允许 AI 应用程序(如 Claude Desktop、Cursor、Kiro、VS Code Copilot)调用外部工具、读取数据源并使用提示词模板。GoMCP 让构建这些服务器变得非常简单。

为什么选择 GoMCP?

mcp-go (mark3labs)

官方 Go SDK

GoMCP

级别

SDK

SDK

框架

Schema 生成

手动

jsonschema 标签

mcp 标签 + 自动校验

中间件

基础钩子

全链路 (日志、认证、限流、OTel 等)

工具分组

支持 (user.get, admin.delete)

导入 Gin 路由

✅ 一行代码

导入 OpenAPI/Swagger

✅ 一行代码

导入 gRPC 服务

内置认证

Bearer, API Key, Basic + RBAC

Inspector UI

测试工具

基础

mcptest 包


🛠️ 技术栈

环境要求

要求

版本

Go

≥ 1.25

MCP 协议

2024-11-05 (向下兼容 2025-11-25)

核心依赖

技术

描述

Go 标准库

核心框架 — 零外部依赖

Gin

仅适配器 — 导入现有的 Gin 路由

gRPC

仅适配器 — 导入 gRPC 服务

OpenTelemetry

可选 — 分布式追踪

YAML v3

仅提供程序 — 热重载工具定义


🌟 核心特性

🔧 工具开发

  • 结构体标签自动生成 Schema — 使用 Go 结构体和 mcp 标签定义参数,自动生成 JSON Schema

  • 类型化处理器func(*Context, Input) (Output, error) — 无需手动解析参数

  • 参数校验 — 必填、最小/最大值、枚举、正则 — 在处理器运行前自动校验

  • 组件版本控制 — 注册多个版本,客户端通过 name@version 调用

  • 异步任务 — 长时间运行的工具返回任务 ID,支持轮询和取消

🔌 适配器(核心差异点)

  • Gin 适配器 — 一行代码将现有的 Gin 路由导入为 MCP 工具

  • OpenAPI 适配器 — 从 Swagger/OpenAPI 3.x 文档生成工具

  • gRPC 适配器 — 将 gRPC 服务方法导入为 MCP 工具

🔐 安全性

  • BearerAuth — JWT 令牌校验

  • APIKeyAuth — 通过 Header 进行 API Key 校验

  • BasicAuth — HTTP Basic 认证

  • RequireRole / RequirePermission — 工具组的 RBAC 授权

🧩 框架特性

  • 中间件链 — 日志、恢复、请求 ID、超时、限流、OpenTelemetry

  • 工具分组 — 使用前缀和组级中间件组织工具

  • 资源与提示词 — 全面支持 MCP,包括 URI 模板和参数化提示词

  • 自动补全 — 为提示词/资源参数提供建议值

🚀 生产就绪

  • 多种传输方式 — stdio (Claude Desktop, Cursor, Kiro) 和带 SSE 的流式 HTTP

  • MCP Inspector — 内置 Web 调试 UI,用于浏览和测试工具

  • 热重载 — 通过文件监控从 YAML 文件加载工具定义

  • mcptest 包 — 用于单元测试的内存客户端,支持快照测试


🏗️ 架构

┌──────────────────────────────────────────────────────────────┐
│                        User Code                             │
│   s.Tool() / s.ToolFunc() / s.Resource() / s.Prompt()        │
├──────────────────────────────────────────────────────────────┤
│                     Framework Core                           │
│   Router → Middleware Chain → Validation → Handler → Result   │
├────────────┬─────────────┬───────────────┬───────────────────┤
│   Schema   │  Validator  │   Adapters    │  Observability    │
│  Generator │   Engine    │ Gin/OpenAPI/  │  OTel / Logger    │
│ (mcp tags) │ (auto)      │ gRPC          │  / Inspector      │
├────────────┴─────────────┴───────────────┴───────────────────┤
│                     Protocol Layer                           │
│          JSON-RPC 2.0 / MCP / Capability Negotiation         │
├──────────────────────────────────────────────────────────────┤
│                     Transport Layer                          │
│              stdio  /  Streamable HTTP + SSE                 │
└──────────────────────────────────────────────────────────────┘

项目结构

gomcp/
├── server.go              # Server core, tool/resource/prompt registration
├── context.go             # Request context with typed accessors
├── group.go               # Tool groups with prefix naming
├── middleware.go           # Middleware interface and chain execution
├── middleware_builtin.go   # Logger, Recovery, RequestID, Timeout, RateLimit
├── middleware_auth.go      # BearerAuth, APIKeyAuth, BasicAuth, RBAC
├── middleware_otel.go      # OpenTelemetry tracing
├── schema/                # struct tag → JSON Schema generator + validator
├── transport/             # stdio + Streamable HTTP
├── adapter/               # Gin, OpenAPI, gRPC adapters
├── mcptest/               # Testing utilities
├── task.go                # Async task support
├── completion.go          # Auto-completions
├── inspector.go           # Web debug UI
├── provider.go            # Hot-reload from YAML
└── examples/              # Working examples

📦 安装

go get github.com/zhangpanda/gomcp

⚡ 快速开始

5 行代码构建一个可用的 MCP 服务器

package main

import (
    "fmt"
    "github.com/zhangpanda/gomcp"
)

type SearchInput struct {
    Query string `json:"query" mcp:"required,desc=Search keyword"`
    Limit int    `json:"limit" mcp:"default=10,min=1,max=100"`
}

type SearchResult struct {
    Items []string `json:"items"`
    Total int      `json:"total"`
}

func main() {
    s := gomcp.New("my-server", "1.0.0")

    s.ToolFunc("search", "Search documents by keyword", func(ctx *gomcp.Context, in SearchInput) (SearchResult, error) {
        items := []string{fmt.Sprintf("Result for %q", in.Query)}
        return SearchResult{Items: items, Total: len(items)}, nil
    })

    s.Stdio()
}

SearchInput 结构体自动生成以下 JSON Schema:

{
  "type": "object",
  "properties": {
    "query": { "type": "string", "description": "Search keyword" },
    "limit": { "type": "integer", "default": 10, "minimum": 1, "maximum": 100 }
  },
  "required": ["query"]
}

无效参数在处理器运行前即被拒绝

validation failed: query: required; limit: must be <= 100

📖 使用指南

结构体标签参考

标签

类型

描述

示例

required

标志

字段必须提供

mcp:"required"

desc

字符串

人类可读的描述

mcp:"desc=搜索关键词"

default

任意

默认值

mcp:"default=10"

min

数字

最小值(包含)

mcp:"min=0"

max

数字

最大值(包含)

mcp:"max=100"

enum

字符串

竖线分隔的允许值

`mcp:"enum=asc

desc"`

pattern

字符串

正则校验

mcp:"pattern=^[a-z]+$"

组合使用:mcp:"required,desc=用户邮箱,pattern=^[^@]+@[^@]+$"

支持的类型:string, int, float64, bool, []T, 嵌套结构体。

工具

简单处理器:

s.Tool("hello", "Say hello", func(ctx *gomcp.Context) (*gomcp.CallToolResult, error) {
    return ctx.Text("Hello, " + ctx.String("name")), nil
})

类型化处理器(推荐):

type Input struct {
    Name  string `json:"name"  mcp:"required,desc=User name"`
    Email string `json:"email" mcp:"required,pattern=^[^@]+@[^@]+$"`
}

s.ToolFunc("create_user", "Create user", func(ctx *gomcp.Context, in Input) (User, error) {
    return db.CreateUser(in.Name, in.Email)
})

资源

// Static
s.Resource("config://app", "App config", func(ctx *gomcp.Context) (any, error) {
    return map[string]any{"version": "1.0"}, nil
})

// Dynamic URI template
s.ResourceTemplate("db://{table}/{id}", "DB record", func(ctx *gomcp.Context) (any, error) {
    return db.Find(ctx.String("table"), ctx.String("id")), nil
})

提示词

s.Prompt("code_review", "Code review",
    []gomcp.PromptArgument{gomcp.PromptArg("language", "Language", true)},
    func(ctx *gomcp.Context) ([]gomcp.PromptMessage, error) {
        return []gomcp.PromptMessage{
            gomcp.UserMsg(fmt.Sprintf("Review this %s code for bugs.", ctx.String("language"))),
        }, nil
    },
)

中间件

s.Use(gomcp.Logger())                              // Log tool name + duration
s.Use(gomcp.Recovery())                            // Recover from panics
s.Use(gomcp.RequestID())                           // Unique request ID
s.Use(gomcp.Timeout(10 * time.Second))             // Deadline enforcement
s.Use(gomcp.RateLimit(100))                        // 100 calls/minute
s.Use(gomcp.OpenTelemetry())                       // Distributed tracing
s.Use(gomcp.BearerAuth(tokenValidator))            // JWT auth
s.Use(gomcp.APIKeyAuth("X-API-Key", keyValidator)) // API key auth

自定义中间件:

func AuditLog() gomcp.Middleware {
    return func(ctx *gomcp.Context, next func() error) error {
        start := time.Now()
        err := next()
        log.Printf("tool=%s duration=%s err=%v", ctx.String("_tool_name"), time.Since(start), err)
        return err
    }
}

工具分组

user := s.Group("user", authMiddleware)
user.Tool("get", "Get user", getUser)              // → user.get
user.Tool("update", "Update user", updateUser)      // → user.update

admin := user.Group("admin", gomcp.RequireRole("admin"))
admin.Tool("delete", "Delete user", deleteUser)     // → user.admin.delete

适配器

Gin — 一行代码导入现有 API:

adapter.ImportGin(s, ginRouter, adapter.ImportOptions{
    IncludePaths: []string{"/api/v1/"},
})
// GET /api/v1/users/:id → Tool get_api_v1_users_by_id (id = required param)

OpenAPI — 从 Swagger 文档生成:

adapter.ImportOpenAPI(s, "./swagger.yaml", adapter.OpenAPIOptions{
    TagFilter: []string{"pets"},
    ServerURL: "https://api.example.com",
})

gRPC:

adapter.ImportGRPC(s, grpcConn, adapter.GRPCOptions{
    Services: []string{"user.UserService"},
})

组件版本控制

s.ToolFunc("search", "v1", searchV1, gomcp.Version("1.0"))
s.ToolFunc("search", "v2 with embeddings", searchV2, gomcp.Version("2.0"))
// "search" → latest, "search@1.0" → exact version

异步任务

s.AsyncTool("report", "Generate report", func(ctx *gomcp.Context) (*gomcp.CallToolResult, error) {
    // long-running work
    return ctx.Text("done"), nil
})
// Client gets taskId immediately, polls tasks/get, can tasks/cancel

热重载

s.LoadDir("./tools/", gomcp.DirOptions{Watch: true})

MCP Inspector

s.Dev(":9090") // http://localhost:9090 — browse and test all tools

测试

func TestSearch(t *testing.T) {
    c := mcptest.NewClient(t, setupServer())
    c.Initialize()

    result := c.CallTool("search", map[string]any{"query": "golang"})
    result.AssertNoError(t)
    result.AssertContains(t, "golang")

    mcptest.MatchSnapshot(t, "search_result", result)
}

传输方式

s.Stdio()          // Claude Desktop, Cursor, Kiro
s.HTTP(":8080")    // Remote deployment with SSE
s.Handler()        // Embed in existing HTTP server

与 AI 客户端配合使用

{
  "mcpServers": {
    "my-server": {
      "command": "/path/to/your/binary"
    }
  }
}

适用于 Claude Desktop、Cursor、Kiro、Windsurf、VS Code Copilot 以及任何兼容 MCP 的客户端。


📋 路线图

  • [x] 核心:工具、资源、提示词,全面支持 MCP 协议

  • [x] 结构体标签自动生成 Schema + 参数校验

  • [x] 中间件链(日志、恢复、限流、超时、请求 ID)

  • [x] 认证中间件(Bearer / API Key / Basic)+ RBAC 授权

  • [x] 工具分组(支持前缀命名和嵌套分组)

  • [x] stdio + 带 SSE 通知的流式 HTTP 传输

  • [x] Gin 适配器 — 将现有 Gin 路由导入为 MCP 工具

  • [x] OpenAPI 适配器 — 从 Swagger/OpenAPI 文档生成工具

  • [x] gRPC 适配器 — 将 gRPC 服务导入为 MCP 工具

  • [x] OpenTelemetry 集成

  • [x] mcptest 包(支持快照测试)

  • [x] 组件版本控制 + 弃用机制

  • [x] 异步任务(支持轮询和取消)

  • [x] MCP Inspector Web 调试 UI

  • [x] 从 YAML 热重载提供程序

  • [x] 提示词/资源参数的自动补全


🤝 反馈与支持

💡 推荐阅读:提问的智慧


🔒 安全性

如需报告安全漏洞,请参阅 SECURITY.md


⚖️ 版权与许可

版权所有 © 2026 GoMCP 贡献者

基于 Apache License 2.0 许可。

重要说明

  1. 本项目是开源且免费的,在 Apache 2.0 许可下可用于个人和商业用途。

  2. 必须保留所有副本或软件重要部分中的版权声明、许可文本及任何归属声明。

  3. Apache 2.0 许可包含贡献者向用户提供的明确专利授权

  4. 对本项目的贡献均在相同的 Apache 2.0 许可下授权。

  5. 未经授权移除版权声明可能会导致法律诉讼。

专利声明

本框架的某些功能(结构体标签 Schema 生成、HTTP 转 MCP 自动适配器、OpenAPI 转 MCP 自动适配器)属于正在申请的专利主题。Apache 2.0 许可授予您永久、全球、免版税的专利许可,以使用这些功能作为本软件的一部分。


⭐ Star 历史

如果您觉得 GoMCP 有用,请考虑给它一个 Star!这有助于其他人发现该项目。

Available Tools

5 tools
generate_reportC

Generate an analytics report for a given topic. This is a long-running operation that executes asynchronously and may take several minutes. Returns a task ID immediately; poll tasks/get for the result, or call tasks/cancel to abort. Use this for comprehensive data analysis tasks. Demo: short simulated delay (~2s), not multi-minute workload. No persistence of reports in this sample; cancel via tasks/cancel stops the tracked task.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior4/5

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

Even without annotations, the description clearly discloses async behavior, immediate task ID return, no persistence, cancellation options, and demo simulation details.

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

Conciseness4/5

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

Three sentences covering purpose, async nature, and demo caveat. Efficient but could be slightly more concise.

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?

Covers async behavior and task management, but fails to explain what data the report uses (topic parameter missing) and does not describe return value shape or error scenarios.

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

Parameters2/5

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

The description mentions a 'given topic' but the schema has no parameters. This misalignment reduces the added value; with 100% schema coverage (zero parameters), the description should not imply nonexistent parameters.

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

Purpose2/5

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

The description states 'Generate an analytics report for a given topic' but the input schema has no parameters, making it unclear how to specify the topic. This contradiction reduces clarity.

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 indicates this is a long-running async operation and mentions polling and cancellation. However, it does not explicitly compare to sibling tools or specify when not to use it.

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

get_configA

Retrieve the current server configuration including version, environment, and feature flags. Use this to inspect server state or verify deployment settings. This is a read-only operation with no side effects. Demo: static JSON only; does not expose real secrets or live infrastructure. Subject to rate limit and timeout; no authentication in this binary.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, description fully discloses read-only nature, no side effects, rate limit, timeout, lack of authentication, and demo limitation (static JSON, no real secrets).

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?

Four sentences, each essential: purpose, usage, read-only statement, and constraints. Front-loaded and efficient.

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

Completeness5/5

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

Given zero parameters and no output schema, description covers purpose, use cases, behavior, and constraints fully, leaving no ambiguity.

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?

Zero parameters with 100% schema coverage, baseline 4 per guidelines. No additional parameter info needed.

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?

Clearly states 'Retrieve the current server configuration including version, environment, and feature flags' with specific verb and resource. Differentiates from siblings like generate_report, greet_user, search_documents, and search_semantic.

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?

Provides explicit use cases: 'inspect server state or verify deployment settings.' Does not explicitly mention when not to use or name alternatives, but context implies appropriate usage.

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

greet_userA

Greet a user by name. Returns a personalized greeting message. If no name is provided, defaults to 'World'. Use this tool to verify server connectivity or welcome a user. Demo server: no authentication; requests are subject to global rate limiting (600 calls/minute) and request timeout (30s). Read-only greeting text output; no writes or external side effects.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/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 that the tool is read-only, has no side effects, and is subject to rate limiting (600 calls/minute) and timeout (30s). However, it contradicts the input schema by mentioning a 'name' parameter that does not exist, which undermines reliability.

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 concise sentences, front-loading the main purpose and usage. Every sentence adds relevant information without redundancy 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?

For a tool with zero parameters and no output schema, the description covers purpose, usage, safety, and constraints. However, the misleading claim about a 'name' parameter reduces completeness and trustworthiness.

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

Parameters1/5

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

The input schema has zero parameters, but the description claims a 'name' parameter defaults to 'World'. This is misleading and adds no value beyond the schema; it introduces confusion about the tool's actual interface.

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 greets a user by name and returns a personalized greeting, which is a specific verb-resource combination. It also mentions verifying server connectivity and welcoming, further clarifying the purpose. The sibling tools (generate_report, get_config, etc.) are unrelated, so differentiation is 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?

The description explicitly states 'Use this tool to verify server connectivity or welcome a user,' providing clear context for when to use it. It also mentions demo server constraints, but does not explicitly state when not to use it or offer alternatives, though the sibling tools are clearly different.

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

search_documentsA

Search documents by keyword using full-text matching. Returns matching documents ranked by relevance with titles and content snippets. Use this when you need to find documents containing specific words or phrases. For semantic meaning-based search, use search_semantic instead. Demo: mock in-memory results only (no real document store). No auth in this sample; rate limit and timeout apply. On failure, returns an error or empty result set—no destructive operations.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches.
queryYesThe search query string. Supports keywords and phrases to match against document titles and content.

TDQS

A4.6/5.0
Behavior5/5

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

Discloses mock nature, no auth, rate limits, timeout, and non-destructive behavior despite no annotations.

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

Conciseness4/5

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

Concise but informative; key information front-loaded; no redundant sentences.

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

Completeness5/5

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

Explains return values (ranked results with snippets) and failure modes; sufficient for tool's complexity.

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 covers 100% parameter semantics; description adds no extra detail beyond 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?

Clearly states 'Search documents by keyword using full-text matching' with specific verb and resource. Distinguishes from sibling 'search_semantic'.

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

Usage Guidelines5/5

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

Explicitly says 'Use this when you need to find documents containing specific words or phrases' and directs to alternative for semantic search.

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

search_semanticA

Search documents using semantic embedding-based matching. Returns results ranked by meaning similarity rather than exact keyword match. Use this when the user's intent matters more than exact wording. For exact keyword matching, use search_documents instead. Demo: simplified mock (no real embeddings API); no auth; same rate limit/timeout as other tools. Read-only; does not modify documents.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches.
queryYesThe search query string. Supports keywords and phrases to match against document titles and content.

TDQS

A4.8/5.0
Behavior5/5

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

No annotations provided, but the description fully covers behavioral traits: read-only, mock embeddings (demo), no auth, same rate limit/timeout, and does not modify documents.

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?

Well-structured and concise. First sentence states core purpose, then usage guidance, then demo caveats. Every sentence adds value with no redundancy.

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?

Covers purpose, usage, behavioral aspects, and schema. However, without an output schema, the description does not explain return values or result format, which could be helpful for a search tool.

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 covers both parameters with descriptions (100% coverage). The description adds value by explaining the semantic nature, but does not add new parameter-level details beyond 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?

Clearly states semantic embedding-based matching, ranking by meaning similarity, and explicitly distinguishes from exact keyword search, naming the sibling tool search_documents.

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

Usage Guidelines5/5

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

Explicitly says when to use (user intent matters more than exact wording) and when not (use search_documents instead). Also includes demo context and limitations.

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. 10 tool updatesv0.1.3
    • Addedgenerate_report
    • Addedget_config
    • Addedgreet_user
    • Removedhello
    • Removedreport
    • Addedsearch_documents
    • Addedsearch_semantic
    • Removedsearch.docs
    • Removedsearch@1.0
    • Removedsearch@2.0
  2. 3 tool updatesv0.1.2
    • Changedsearch.docs2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches."
      • changedInput schema / properties / query / description
        Previous value: -"Search keyword"New value: +"The search query string. Supports keywords and phrases to match against document titles and content."
    • Changedsearch@1.02 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches."
      • changedInput schema / properties / query / description
        Previous value: -"Search keyword"New value: +"The search query string. Supports keywords and phrases to match against document titles and content."
    • Changedsearch@2.02 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches."
      • changedInput schema / properties / query / description
        Previous value: -"Search keyword"New value: +"The search query string. Supports keywords and phrases to match against document titles and content."
  3. 5 tool updatesv0.1.0
    • First observedhello
    • First observedreport
    • First observedsearch.docs
    • First observedsearch@1.0
    • First observedsearch@2.0

TDQS

A3.8/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: report generation, config retrieval, greeting, keyword search, and semantic search. The two search tools explicitly differentiate themselves via descriptions and cross-references, eliminating ambiguity.

Naming Consistency5/5

All tools use a consistent verb_noun pattern in snake_case (generate_report, get_config, greet_user, search_documents, search_semantic). The naming is predictable and uniform.

Tool Count5/5

With 5 tools, the server is well-scoped for a lightweight demo/utility server. Each tool serves a distinct function without unnecessary bloat, fitting its apparent purpose.

Completeness2/5

The tool set is a mix of unrelated utilities with notable gaps: generate_report mentions async tasks and task management endpoints (tasks/get, tasks/cancel) but those are not provided as tools. There is no CRUD coverage or coherent domain lifecycle, making the surface incomplete.

Maintenance

ActivitySlowing
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    what is go-mcp-postgres? go-mcp-postgres is a Model Context Protocol (MCP) server designed for interacting with Postgres databases, allowing for easy CRUD operations and automation without the need for a Node.js or Python environment.
    7
    MIT
  • F
    license
    B
    quality
    Not graded
    maintenance
    A minimal reference implementation of an MCP server that responds with "Hello, World" via Streamable HTTP. Serves as a baseline for integration testing and MCP client development with production-ready features including health checks, metrics, and containerized deployment.
    3
    18,765
    -