GoMCP
GoMCP
Go로 MCP 서버를 구축하는 빠르고 관용적인 방법입니다.
🚀 빠른 링크
MCP 프로토콜: https://modelcontextprotocol.io
Related MCP server: Filesystem MCP Server
🎯 GoMCP란 무엇인가요?
GoMCP는 단순한 SDK가 아닌, Model Context Protocol (MCP) 서버를 구축하기 위한 프레임워크입니다. **"MCP를 위한 Gin"**이라고 생각하시면 됩니다.
MCP는 AI 애플리케이션(Claude Desktop, Cursor, Kiro, VS Code Copilot)이 외부 도구를 호출하고, 데이터 소스를 읽고, 프롬프트 템플릿을 사용할 수 있게 해주는 개방형 프로토콜입니다. GoMCP를 사용하면 이러한 서버를 매우 쉽게 구축할 수 있습니다.
왜 GoMCP인가요?
mcp-go (mark3labs) | 공식 Go SDK | GoMCP | |
수준 | SDK | SDK | 프레임워크 |
스키마 생성 | 수동 |
|
|
미들웨어 | 기본 훅 | 없음 | 전체 체인 (로거, 인증, 속도 제한, OTel 등) |
도구 그룹 | 없음 | 없음 | 지원 ( |
Gin 라우트 가져오기 | 없음 | 없음 | ✅ 한 줄 |
OpenAPI/Swagger 가져오기 | 없음 | 없음 | ✅ 한 줄 |
gRPC 서비스 가져오기 | 없음 | 없음 | ✅ |
내장 인증 | 없음 | 없음 | Bearer, API Key, Basic + RBAC |
인스펙터 UI | 없음 | 없음 | ✅ |
테스트 유틸리티 | 기본 | 없음 | mcptest 패키지 |
🛠️ 기술 스택
환경 요구 사항
요구 사항 | 버전 |
Go | ≥ 1.25 |
MCP 프로토콜 | 2024-11-05 (2025-11-25와 하위 호환) |
핵심 의존성
기술 | 설명 |
Go 표준 라이브러리 | 핵심 프레임워크 — 외부 의존성 없음 |
Gin | 어댑터 전용 — 기존 Gin 라우트 가져오기 |
gRPC | 어댑터 전용 — gRPC 서비스 가져오기 |
OpenTelemetry | 선택 사항 — 분산 추적 |
YAML v3 | 공급자 전용 — 도구 정의 핫 리로드 |
🌟 핵심 기능
🔧 도구 개발
구조체 태그 자동 스키마 — Go 구조체와
mcp태그로 매개변수를 정의하면 JSON 스키마가 자동으로 생성됩니다.타입 지정 핸들러 —
func(*Context, Input) (Output, error)— 수동 매개변수 파싱이 필요 없습니다.매개변수 검증 — 필수, 최소/최대, 열거형, 패턴 — 핸들러 실행 전에 검증됩니다.
컴포넌트 버전 관리 — 여러 버전을 등록하고 클라이언트가
name@version으로 호출할 수 있습니다.비동기 작업 — 오래 걸리는 도구는 작업 ID를 반환하며, 폴링 및 취소를 지원합니다.
🔌 어댑터 (핵심 차별점)
Gin 어댑터 — 기존 Gin 라우트를 한 줄로 MCP 도구로 가져옵니다.
OpenAPI 어댑터 — Swagger/OpenAPI 3.x 문서에서 도구를 생성합니다.
gRPC 어댑터 — gRPC 서비스 메서드를 MCP 도구로 가져옵니다.
🔐 보안
BearerAuth — JWT 토큰 검증
APIKeyAuth — 헤더를 통한 API 키 검증
BasicAuth — HTTP 기본 인증
RequireRole / RequirePermission — 도구 그룹에 대한 RBAC 권한 부여
🧩 프레임워크 기능
미들웨어 체인 — 로거, 복구, 요청 ID, 타임아웃, 속도 제한, OpenTelemetry
도구 그룹 — 접두사와 그룹 수준 미들웨어로 도구 구성
리소스 및 프롬프트 — URI 템플릿 및 매개변수화된 프롬프트를 포함한 전체 MCP 지원
자동 완성 — 프롬프트/리소스 인수에 대한 값 제안
🚀 프로덕션 준비 완료
다중 전송 — stdio (Claude Desktop, Cursor, Kiro) 및 SSE를 사용하는 스트리밍 가능 HTTP
MCP 인스펙터 — 도구 탐색 및 테스트를 위한 내장 웹 디버그 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 스키마를 자동으로 생성합니다:
{
"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📖 사용 가이드
구조체 태그 참조
태그 | 타입 | 설명 | 예시 | |
| 플래그 | 필수 필드 |
| |
| 문자열 | 사람이 읽을 수 있는 설명 |
| |
| 임의 | 기본값 |
| |
| 숫자 | 최소값 (포함) |
| |
| 숫자 | 최대값 (포함) |
| |
| 문자열 | 파이프로 구분된 허용 값 | `mcp:"enum=asc | desc"` |
| 문자열 | 정규식 검증 |
|
조합: 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 인스펙터
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 serverAI 클라이언트와 함께 사용
{
"mcpServers": {
"my-server": {
"command": "/path/to/your/binary"
}
}
}Claude Desktop, Cursor, Kiro, Windsurf, VS Code Copilot 및 모든 MCP 호환 클라이언트와 작동합니다.
📋 로드맵
[x] 핵심: 전체 MCP 프로토콜 지원을 포함한 도구, 리소스, 프롬프트
[x] 구조체 태그 자동 스키마 생성 + 매개변수 검증
[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] 컴포넌트 버전 관리 + 지원 중단(deprecation)
[x] 폴링 및 취소를 지원하는 비동기 작업
[x] MCP 인스펙터 웹 디버그 UI
[x] YAML에서 로드하는 핫 리로드 공급자
[x] 프롬프트/리소스 인수에 대한 자동 완성
🤝 피드백 및 지원
버그 리포트: GitHub Issues
기능 요청: GitHub Issues
💡 권장 읽기: 질문하는 방법 (Smart Way)
🔒 보안
보안 취약점을 보고하려면 SECURITY.md를 참조하세요.
⚖️ 저작권 및 라이선스
Copyright © 2026 GoMCP Contributors
Apache License 2.0에 따라 라이선스가 부여됩니다.
중요 참고 사항
이 프로젝트는 Apache 2.0 라이선스에 따라 개인 및 상업적 용도로 오픈 소스이며 무료입니다.
소프트웨어의 모든 사본 또는 상당 부분에 저작권 고지, 라이선스 텍스트 및 모든 귀속 고지를 유지해야 합니다.
Apache 2.0 라이선스에는 기여자로부터 사용자에게 부여되는 명시적인 특허권 부여가 포함되어 있습니다.
이 프로젝트에 대한 기여는 동일한 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다.
저작권 고지를 무단으로 제거할 경우 법적 조치가 취해질 수 있습니다.
특허 고지
이 프레임워크의 특정 기능(구조체 태그 스키마 생성, HTTP-to-MCP 자동 어댑터, OpenAPI-to-MCP 자동 어댑터)은 현재 특허 출원 중입니다. Apache 2.0 라이선스는 귀하에게 이 소프트웨어의 일부로서 이러한 기능을 사용할 수 있는 영구적이고 전 세계적이며 로열티가 없는 특허 라이선스를 부여합니다.
⭐ Star History
GoMCP가 유용하다면 별표를 눌러주세요! 다른 사람들이 프로젝트를 발견하는 데 도움이 됩니다.
Available Tools
5 toolsgenerate_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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches. | |
| query | Yes | The search query string. Supports keywords and phrases to match against document titles and content. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches. | |
| query | Yes | The search query string. Supports keywords and phrases to match against document titles and content. |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.1.3- Added
generate_report - Added
get_config - Added
greet_user - Removed
hello - Removed
report - Added
search_documents - Added
search_semantic - Removed
search.docs - Removed
search@1.0 - Removed
search@2.0
3 tool updates
v0.1.2- Changed
search.docs2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches." - changed
Input schema / properties / query / descriptionPrevious value: -"Search keyword"New value: +"The search query string. Supports keywords and phrases to match against document titles and content."
- Changed
search@1.02 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches." - changed
Input schema / properties / query / descriptionPrevious value: -"Search keyword"New value: +"The search query string. Supports keywords and phrases to match against document titles and content."
- Changed
search@2.02 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of results to return. Use smaller values for quick lookups and larger values for comprehensive searches." - changed
Input schema / properties / query / descriptionPrevious value: -"Search keyword"New value: +"The search query string. Supports keywords and phrases to match against document titles and content."
5 tool updates
v0.1.0- First observed
hello - First observed
report - First observed
search.docs - First observed
search@1.0 - First observed
search@2.0
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
- ArcjetOAuthcom.arcjet
An MCP server for Arcjet - the runtime security platform that ships with your AI code.
- typeshipOAuthdev.typeship
Generate a typed SDK, CLI, and MCP server from any OpenAPI or GraphQL spec, and keep them current.
The official MCP Server for the Mux API
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThis project is intended as a both MCP server connecting to Kubernetes and a library to build more servers for any custom resources in Kubernetes.384MIT
- AlicenseNot gradedqualityFmaintenanceGo server implementing Model Context Protocol (MCP) for filesystem operations.685MIT
- AlicenseNot gradedqualityDmaintenancewhat 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.7MIT
- FlicenseBqualityNot gradedmaintenanceA 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.318,765-