Skip to main content
Glama

GoMCP

Go Version License Release gomcp MCP server

The fast, idiomatic way to build MCP servers in Go.

中文文档



Related MCP server: Filesystem MCP Server

🎯 What is GoMCP?

GoMCP is a framework for building Model Context Protocol (MCP) servers — not just an SDK. Think of it as "Gin for MCP".

MCP is the open protocol that lets AI applications (Claude Desktop, Cursor, Kiro, VS Code Copilot) call external tools, read data sources, and use prompt templates. GoMCP makes building those servers trivial.

Why GoMCP?

mcp-go (mark3labs)

Official Go SDK

GoMCP

Level

SDK

SDK

Framework

Schema generation

Manual

jsonschema tag

mcp tag + auto validation

Middleware

Basic hooks

None

Full chain (Logger, Auth, RateLimit, OTel…)

Tool groups

No

No

Yes (user.get, admin.delete)

Import Gin routes

No

No

✅ One line

Import OpenAPI/Swagger

No

No

✅ One line

Import gRPC services

No

No

Built-in auth

No

No

Bearer / API Key / Basic + RBAC (Bearer = your token/JWT validator)

Inspector UI

No

No

Test utilities

Basic

No

mcptest package


🛠️ Tech Stack

Environment Requirements

Requirement

Version

Go

≥ 1.25

MCP Protocol

2024-11-05 (backward compatible with 2025-11-25)

Note on the Go 1.25 requirement. GoMCP's go.mod declares go 1.25.0 so the project always builds with the toolchain that ships current security and runtime fixes. If you are running Go 1.21+ locally with the default GOTOOLCHAIN=auto, Go will automatically download and use the matching toolchain for you — no manual upgrade is needed. If you have pinned GOTOOLCHAIN=local, install Go 1.25+ or unset the pin.

Core Dependencies

Technology

Description

Go standard library

Framework routing, JSON-RPC, transports — no forced DB/ORM deps

Gin

Adapter only — import existing Gin routes

gRPC

Adapter only — import gRPC services

OpenTelemetry

Optional — distributed tracing

YAML v3

Provider only — hot-reload tool definitions


🌟 Core Features

🔧 Tool Development

  • Struct-tag auto schema — define parameters with Go structs and mcp tags, JSON Schema generated automatically

  • Typed handlersfunc(*Context, Input) (Output, error) — no manual parameter parsing

  • Parameter validation — required, min/max, enum, pattern — checked before your handler runs

  • Component versioning — register multiple versions, clients call name@version

  • Async tasks — long-running tools return task ID, with polling and cancellation

🔌 Adapters (Core Differentiator)

  • Gin adapter — import existing Gin routes as MCP tools with one line

  • OpenAPI adapter — generate tools from Swagger/OpenAPI 3.x docs

  • gRPC adapter — import gRPC service methods as MCP tools

🔐 Security

  • BearerAuth — Bearer token check via your validator (JWT parsing is up to you; this library does not decode JWTs)

  • APIKeyAuth — API key validation via header

  • BasicAuth — HTTP Basic authentication

  • RequireRole / RequirePermission — RBAC authorization on tool groups

🧩 Framework Features

  • Middleware chain — Logger, Recovery, RequestID, Timeout, RateLimit, OpenTelemetry

  • Tool groups — organize tools with prefixes and group-level middleware

  • Resource & Prompt — full MCP support including URI templates and parameterized prompts

  • Auto-completions — suggest values for prompt/resource arguments

🚀 Production Ready

  • Multiple transports — stdio (Claude Desktop, Cursor, Kiro) and Streamable HTTP with SSE

  • MCP Inspector — built-in web debug UI for browsing and testing tools

  • Hot-reload — load tool definitions from YAML files with file watching

  • mcptest package — in-memory client for unit testing with snapshot support

  • LifecycleClose(), session idle eviction, async concurrency — see Server lifecycle, sessions & async tasks.


🏗️ Architecture

┌──────────────────────────────────────────────────────────────┐
│                        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                 │
└──────────────────────────────────────────────────────────────┘

Project Structure

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 chain helpers (SkipAuthForMCPMethods, handshake skips)
├── middleware_builtin.go   # Logger, Recovery, RequestID, Timeout, RateLimit
├── middleware_auth.go      # Bearer/API key/Basic auth, RBAC, SSE auth helpers
├── middleware_otel.go      # OpenTelemetry tracing
├── schema/                # struct tag → JSON Schema generator + validator
├── transport/             # stdio + Streamable HTTP + optional CORS helper
├── 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
    ├── basic/             # Minimal stdio server
    ├── filesystem/        # Real-world file ops
    ├── gin-adapter/       # Import Gin routes
    ├── openapi-adapter/   # Import Swagger/OpenAPI
    └── grpc-adapter/      # Import gRPC services

📖 Cookbook

Step-by-step guides for common tasks (5 minutes each):


📦 Installation

go get github.com/zhangpanda/gomcp

⚡ Quick Start

5 lines to a working MCP server

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()
}

The SearchInput struct automatically generates this JSON Schema:

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

Invalid parameters are rejected before your handler runs:

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

📖 Usage Guide

Struct Tag Reference

Tag

Type

Description

Example

required

flag

Field must be provided

mcp:"required"

desc

string

Human-readable description

mcp:"desc=Search keyword"

default

any

Default value

mcp:"default=10"

min

number

Minimum value (inclusive)

mcp:"min=0"

max

number

Maximum value (inclusive)

mcp:"max=100"

enum

string

Pipe-separated allowed values

mcp:"enum=asc|desc"

pattern

string

Regex validation

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

Combine: mcp:"required,desc=User email,pattern=^[^@]+@[^@]+$"

Supported types: string, int, float64, bool, []T, nested structs.

Tools

Simple handler:

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

Typed handler (recommended):

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)
})

Resources

// 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
})

Prompts

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
    },
)

Middleware

s.Use(gomcp.Logger())                              // Log MCP method + 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
// Pick one: BearerAuth (token required on initialize too) or BearerAuthSkipHandshake (initialize/ping anonymous).
s.Use(gomcp.BearerAuthSkipHandshake(tokenValidator))
s.Use(gomcp.APIKeyAuthSkipHandshake("X-API-Key", keyValidator))

Auth error shape. When a BearerAuth / APIKeyAuth / BasicAuth / RequireRole / RequirePermission middleware rejects a call, the framework returns a regular JSON-RPC result with isError = true and the reason in content[0].textnot a JSON-RPC error object, and not an HTTP 401/403. Clients must inspect the tool-call result's isError to detect auth failures.

Custom middleware:

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
    }
}

Tool Groups

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

Adapters

Gin — one line to import your existing 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 — generate from Swagger docs:

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"},
})

Component Versioning

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

Async Tasks

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

Hot-Reload

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

YAML tool file shape:

name: search
description: Full-text document search
version: "1.0"            # OPTIONAL — non-empty renames the tool to "search@1.0"
method: GET
handler: https://example.com/search
params:
  - {name: query, type: string, required: true, description: Query text}

Heads up — version renames the tool. A non-empty version field makes the Provider register the tool as name@version (e.g. search@1.0), following the same convention as gomcp.Version(). That is the name clients must pass to tools/call, and the name that shows up in tools/list. Drop the version field entirely if you want an unversioned tool called plain search.

Server lifecycle, sessions & async tasks

  • Server.Close() — When your process or test tears down a server that uses LoadDir(..., Watch: true) or long-lived HTTP, call Close() once. It stops the YAML watch loop, the session eviction background goroutine, and the async task manager eviction loop. The call is idempotent.

  • Sessions — Session state is in-memory only. Identifiers come from the client Mcp-Session-Id header (see Streamable HTTP). Sessions idle for 30 minutes (no access via that ID) are removed; the next request with the same ID gets a new empty session. Do not rely on Session storage across long idle periods unless the client keeps traffic or you refresh state yourself.

  • SetMaxConcurrentTasks(n) — Set this before the first AsyncTool / AsyncToolFunc. After the internal task manager is created, later calls are a no-op (avoids races with in-flight work).

  • Shutdown vs async workClose() does not wait for async tool handlers that are still running; add your own timeout / wait if you need hard guarantees before exit.

MCP Inspector

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

Testing

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)
}

Transports

s.Stdio()          // Claude Desktop, Cursor, Kiro
s.HTTP(":8080")    // Remote deployment with SSE
s.Handler()        // Embed in existing HTTP server
// Browser clients: wrap the handler with transport.WrapCORS(h, []string{"https://your.app"}) when needed

Use with AI Clients

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

Works with Claude Desktop, Cursor, Kiro, Windsurf, VS Code Copilot, and any MCP-compatible client.


📋 Roadmap

  • Core: Tool, Resource, Prompt with full MCP protocol support

  • Struct-tag auto schema generation + parameter validation

  • Middleware chain (Logger, Recovery, RateLimit, Timeout, RequestID)

  • Auth middleware (Bearer / API Key / Basic) + RBAC authorization

  • Tool groups with prefix naming and nested groups

  • stdio + Streamable HTTP transports with SSE notifications

  • Gin adapter — import existing Gin routes as MCP tools

  • OpenAPI adapter — generate tools from Swagger/OpenAPI docs

  • gRPC adapter — import gRPC services as MCP tools

  • OpenTelemetry integration

  • mcptest package with snapshot testing

  • Component versioning + deprecation

  • Async tasks with polling and cancellation

  • MCP Inspector web debug UI

  • Hot-reload provider from YAML

  • Auto-completions for prompt/resource arguments


🤝 Feedback & Support

💡 Recommended reading: How To Ask Questions The Smart Way


🔒 Security

HTTP transport and authentication

  • Use middleware runs for every JSON-RPC method (except the notification notifications/initialized, which has no response): initialize, tools/list, tools/call, resources/read, prompts/get, tasks/*, completion/complete, etc. Use BearerAuth / APIKeyAuth / BasicAuth when exposing POST /mcp. For APIKeyAuth, api_key (and other merged params) come from tools/call arguments, prompts/get arguments, or resources/read params JSON when no header is sent—prefer headers for production.

  • BearerAuthSkipHandshake / APIKeyAuthSkipHandshake / BasicAuthSkipHandshake (or SkipAuthForMCPMethods) let initialize and ping run without credentials while keeping other methods protected—typical for MCP HTTP clients that negotiate before sending tokens.

  • Request context propagates into tool, resource, and prompt handlers (deadlines, Authorization, and injected headers from Streamable HTTP).

  • SSE (GET /mcp) does not execute MCP middleware. Use WithSSEAuth with SSEBearerAuth, SSEAPIKeyAuth, SSEBasicAuth, or your own gate. Without WithSSEAuth, any client that can open GET receives broadcast notifications.

  • Browser fetch: wrap your /mcp handler with transport.WrapCORS(h, allowedOrigins) from github.com/zhangpanda/gomcp/transport; never use * with credentials—only list trusted origins.

When deploying Streamable HTTP in production, combine TLS, authentication middleware on POST, and WithSSEAuth when notifications must not be public.

To report security vulnerabilities, see SECURITY.md.


Copyright © 2026 GoMCP Contributors

Licensed under the Apache License 2.0.

Important Notes

  1. This project is open source and free for both personal and commercial use under the Apache 2.0 license.

  2. You must retain the copyright notice, license text, and any attribution notices in all copies or substantial portions of the software.

  3. The Apache 2.0 license includes an express grant of patent rights from contributors to users.

  4. Contributions to this project are licensed under the same Apache 2.0 license.

  5. Unauthorized removal of copyright notices may result in legal action.

Patent Notice

Certain features of this framework (struct-tag schema generation, HTTP-to-MCP automatic adapter, OpenAPI-to-MCP automatic adapter) are the subject of pending patent applications. The Apache 2.0 license grants you a perpetual, worldwide, royalty-free patent license to use these features as part of this software.


⭐ Star History

If you find GoMCP useful, please consider giving it a star! It helps others discover the project.

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. Dates show when Glama detected each change.

  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
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

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

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
    44,289
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/zhangpanda/gomcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server