[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-mark3labs--mcp-go":3,"tool-mark3labs--mcp-go":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",140436,2,"2026-04-05T23:32:43",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":78,"owner_location":78,"owner_email":78,"owner_twitter":78,"owner_website":79,"owner_url":80,"languages":81,"stars":101,"forks":102,"last_commit_at":103,"license":104,"difficulty_score":23,"env_os":105,"env_gpu":106,"env_ram":106,"env_deps":107,"category_tags":112,"github_topics":78,"view_count":23,"oss_zip_url":78,"oss_zip_packed_at":78,"status":16,"created_at":113,"updated_at":114,"faqs":115,"releases":144},3916,"mark3labs\u002Fmcp-go","mcp-go","A Go implementation of the Model Context Protocol (MCP), enabling seamless integration between LLM applications and external data sources and tools.","mcp-go 是模型上下文协议（MCP）的 Go 语言实现，旨在帮助开发者轻松构建能够连接大语言模型（LLM）与外部数据源及工具的服务端应用。它解决了大模型应用难以安全、标准化地调用本地资源或第三方服务的痛点，让 AI 不仅能“对话”，还能真正“做事”，如执行计算、查询数据库或操作文件。\n\n这款工具特别适合熟悉 Go 语言的后端开发者及 AI 应用工程师使用。通过提供高层级的抽象接口，mcp-go 屏蔽了底层复杂的协议交互细节，用户只需关注业务逻辑即可快速定义工具、资源和提示词。其代码简洁优雅，无需大量样板代码就能启动一个标准的 MCP 服务器，显著提升了开发效率。\n\n技术亮点方面，mcp-go 不仅完整覆盖了 MCP 核心规范，还支持灵活的会话管理、工具过滤及中间件机制，允许开发者针对不同会话动态调整可用工具。尽管项目仍处于活跃开发阶段，但其稳定的核心功能已能胜任大多数集成场景。如果你希望用 Go 语言为大模型赋予强大的外部扩展能力，mcp-go 是一个值得尝试的开源选择。","\u003C!-- omit in toc -->\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmark3labs_mcp-go_readme_4a7bc608f1fe.png\" alt=\"MCP Go Logo\">\n\n[![Build](https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg?branch=main)](https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Factions\u002Fworkflows\u002Fci.yml)\n[![Go Report Card](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmark3labs_mcp-go_readme_2b4a70945b89.png)](https:\u002F\u002Fgoreportcard.com\u002Freport\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go)\n[![GoDoc](https:\u002F\u002Fpkg.go.dev\u002Fbadge\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go.svg)](https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go)\n\n[![AgentRank](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmark3labs_mcp-go_readme_c3baf0cf250d.png)](https:\u002F\u002Fagentrank-ai.com\u002Ftool\u002Fmark3labs--mcp-go\u002F)\n\u003Cstrong>A Go implementation of the Model Context Protocol (MCP), enabling seamless integration between LLM applications and external data sources and tools.\u003C\u002Fstrong>\n\n\u003Cbr>\n\n[![Tutorial](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmark3labs_mcp-go_readme_bd2b3bda54db.jpg)](http:\u002F\u002Fwww.youtube.com\u002Fwatch?v=qoaeYMrXJH0 \"Tutorial\")\n\n\u003Cbr>\n\nDiscuss the SDK on [Discord](https:\u002F\u002Fdiscord.gg\u002FRqSS2NQVsY)\n\n\u003C\u002Fdiv>\n\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fmcp\"\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fserver\"\n)\n\nfunc main() {\n    \u002F\u002F Create a new MCP server\n    s := server.NewMCPServer(\n        \"Demo 🚀\",\n        \"1.0.0\",\n        server.WithToolCapabilities(false),\n    )\n\n    \u002F\u002F Add tool\n    tool := mcp.NewTool(\"hello_world\",\n        mcp.WithDescription(\"Say hello to someone\"),\n        mcp.WithString(\"name\",\n            mcp.Required(),\n            mcp.Description(\"Name of the person to greet\"),\n        ),\n    )\n\n    \u002F\u002F Add tool handler\n    s.AddTool(tool, helloHandler)\n\n    \u002F\u002F Start the stdio server\n    if err := server.ServeStdio(s); err != nil {\n        fmt.Printf(\"Server error: %v\\n\", err)\n    }\n}\n\nfunc helloHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    name, err := request.RequireString(\"name\")\n    if err != nil {\n        return mcp.NewToolResultError(err.Error()), nil\n    }\n\n    return mcp.NewToolResultText(fmt.Sprintf(\"Hello, %s!\", name)), nil\n}\n```\n\nThat's it!\n\nMCP Go handles all the complex protocol details and server management, so you can focus on building great tools. It aims to be high-level and easy to use.\n\n### Key features:\n* **Fast**: High-level interface means less code and faster development\n* **Simple**: Build MCP servers with minimal boilerplate\n* **Complete***: MCP Go aims to provide a full implementation of the core MCP specification\n\n(\\*emphasis on *aims*)\n\n🚨 🚧 🏗️ *MCP Go is under active development, as is the MCP specification itself. Core features are working but some advanced capabilities are still in progress.* \n\n\n\u003C!-- omit in toc -->\n## Table of Contents\n\n- [Installation](#installation)\n- [Quickstart](#quickstart)\n- [What is MCP?](#what-is-mcp)\n- [Core Concepts](#core-concepts)\n  - [Server](#server)\n  - [Resources](#resources)\n  - [Tools](#tools)\n  - [Prompts](#prompts)\n- [Examples](#examples)\n- [Extras](#extras)\n  - [Transports](#transports)\n  - [Session Management](#session-management)\n    - [Basic Session Handling](#basic-session-handling)\n    - [Per-Session Tools](#per-session-tools)\n    - [Tool Filtering](#tool-filtering)\n    - [Working with Context](#working-with-context)\n  - [Request Hooks](#request-hooks)\n  - [Tool Handler Middleware](#tool-handler-middleware)\n  - [Regenerating Server Code](#regenerating-server-code)\n\n## Installation\n\n```bash\ngo get github.com\u002Fmark3labs\u002Fmcp-go\n```\n\n## Quickstart\n\nLet's create a simple MCP server that exposes a calculator tool and some data:\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fmcp\"\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fserver\"\n)\n\nfunc main() {\n    \u002F\u002F Create a new MCP server\n    s := server.NewMCPServer(\n        \"Calculator Demo\",\n        \"1.0.0\",\n        server.WithToolCapabilities(false),\n        server.WithRecovery(),\n    )\n\n    \u002F\u002F Add a calculator tool\n    calculatorTool := mcp.NewTool(\"calculate\",\n        mcp.WithDescription(\"Perform basic arithmetic operations\"),\n        mcp.WithString(\"operation\",\n            mcp.Required(),\n            mcp.Description(\"The operation to perform (add, subtract, multiply, divide)\"),\n            mcp.Enum(\"add\", \"subtract\", \"multiply\", \"divide\"),\n        ),\n        mcp.WithNumber(\"x\",\n            mcp.Required(),\n            mcp.Description(\"First number\"),\n        ),\n        mcp.WithNumber(\"y\",\n            mcp.Required(),\n            mcp.Description(\"Second number\"),\n        ),\n    )\n\n    \u002F\u002F Add the calculator handler\n    s.AddTool(calculatorTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n        \u002F\u002F Using helper functions for type-safe argument access\n        op, err := request.RequireString(\"operation\")\n        if err != nil {\n            return mcp.NewToolResultError(err.Error()), nil\n        }\n        \n        x, err := request.RequireFloat(\"x\")\n        if err != nil {\n            return mcp.NewToolResultError(err.Error()), nil\n        }\n        \n        y, err := request.RequireFloat(\"y\")\n        if err != nil {\n            return mcp.NewToolResultError(err.Error()), nil\n        }\n\n        var result float64\n        switch op {\n        case \"add\":\n            result = x + y\n        case \"subtract\":\n            result = x - y\n        case \"multiply\":\n            result = x * y\n        case \"divide\":\n            if y == 0 {\n                return mcp.NewToolResultError(\"cannot divide by zero\"), nil\n            }\n            result = x \u002F y\n        }\n\n        return mcp.NewToolResultText(fmt.Sprintf(\"%.2f\", result)), nil\n    })\n\n    \u002F\u002F Start the server\n    if err := server.ServeStdio(s); err != nil {\n        fmt.Printf(\"Server error: %v\\n\", err)\n    }\n}\n```\n\n## What is MCP?\n\nThe [Model Context Protocol (MCP)](https:\u002F\u002Fmodelcontextprotocol.io) lets you build servers that expose data and functionality to LLM applications in a secure, standardized way. Think of it like a web API, but specifically designed for LLM interactions.\n\nMCP servers can:\n- Expose data through **Resources** (think of these sort of like GET endpoints; they are used to load information into the LLM's context)\n- Provide functionality through **Tools** (sort of like POST endpoints; they are used to execute code or otherwise produce a side effect)\n- Define interaction patterns through **Prompts** (reusable templates for LLM interactions)\n- And more!\n\nmcp-go implements the Model Context Protocol specification version 2025-11-25, with backward compatibility for versions 2025-06-18, 2025-03-26, and 2024-11-05.\n\n## Core Concepts\n\n\n### Server\n\n\u003Cdetails>\n\u003Csummary>Show Server Examples\u003C\u002Fsummary>\n\nThe server is your core interface to the MCP protocol. It handles connection management, protocol compliance, and message routing:\n\n```go\n\u002F\u002F Create a basic server\ns := server.NewMCPServer(\n    \"My Server\",  \u002F\u002F Server name\n    \"1.0.0\",     \u002F\u002F Version\n)\n\n\u002F\u002F Start the server using stdio\nif err := server.ServeStdio(s); err != nil {\n    log.Fatalf(\"Server error: %v\", err)\n}\n```\n\n\u003C\u002Fdetails>\n\n### Resources\n\n\u003Cdetails>\n\u003Csummary>Show Resource Examples\u003C\u002Fsummary>\nResources are how you expose data to LLMs. They can be anything - files, API responses, database queries, system information, etc. Resources can be:\n\n- Static (fixed URI)\n- Dynamic (using URI templates)\n\nHere's a simple example of a static resource:\n\n```go\n\u002F\u002F Static resource example - exposing a README file\nresource := mcp.NewResource(\n    \"docs:\u002F\u002Freadme\",\n    \"Project README\",\n    mcp.WithResourceDescription(\"The project's README file\"), \n    mcp.WithMIMEType(\"text\u002Fmarkdown\"),\n)\n\n\u002F\u002F Add resource with its handler\ns.AddResource(resource, func(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {\n    content, err := os.ReadFile(\"README.md\")\n    if err != nil {\n        return nil, err\n    }\n    \n    return []mcp.ResourceContents{\n        mcp.TextResourceContents{\n            URI:      \"docs:\u002F\u002Freadme\",\n            MIMEType: \"text\u002Fmarkdown\",\n            Text:     string(content),\n        },\n    }, nil\n})\n```\n\nAnd here's an example of a dynamic resource using a template:\n\n```go\n\u002F\u002F Dynamic resource example - user profiles by ID\ntemplate := mcp.NewResourceTemplate(\n    \"users:\u002F\u002F{id}\u002Fprofile\",\n    \"User Profile\",\n    mcp.WithTemplateDescription(\"Returns user profile information\"),\n    mcp.WithTemplateMIMEType(\"application\u002Fjson\"),\n)\n\n\u002F\u002F Add template with its handler\ns.AddResourceTemplate(template, func(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {\n    \u002F\u002F Extract ID from the URI using regex matching\n    \u002F\u002F The server automatically matches URIs to templates\n    userID := extractIDFromURI(request.Params.URI)\n    \n    profile, err := getUserProfile(userID)  \u002F\u002F Your DB\u002FAPI call here\n    if err != nil {\n        return nil, err\n    }\n    \n    return []mcp.ResourceContents{\n        mcp.TextResourceContents{\n            URI:      request.Params.URI,\n            MIMEType: \"application\u002Fjson\",\n            Text:     profile,\n        },\n    }, nil\n})\n```\n\nThe examples are simple but demonstrate the core concepts. Resources can be much more sophisticated - serving multiple contents, integrating with databases or external APIs, etc.\n\u003C\u002Fdetails>\n\n### Tools\n\n\u003Cdetails>\n\u003Csummary>Show Tool Examples\u003C\u002Fsummary>\n\nTools let LLMs take actions through your server. Unlike resources, tools are expected to perform computation and have side effects. They're similar to POST endpoints in a REST API.\n\n#### Task-Augmented Tools\n\nTask-augmented tools execute asynchronously and return results via polling. This is useful for long-running operations that would otherwise block or time out. Task tools support three modes:\n\n- **TaskSupportForbidden** (default): The tool cannot be invoked as a task\n- **TaskSupportOptional**: The tool can be invoked as a task or synchronously\n- **TaskSupportRequired**: The tool must be invoked as a task\n\n```go\n\u002F\u002F Example: A tool that requires task execution\nprocessBatchTool := mcp.NewTool(\"process_batch\",\n    mcp.WithDescription(\"Process a batch of items asynchronously\"),\n    mcp.WithTaskSupport(mcp.TaskSupportRequired),\n    mcp.WithArray(\"items\",\n        mcp.Description(\"Array of items to process\"),\n        mcp.WithStringItems(),\n        mcp.Required(),\n    ),\n)\n\n\u002F\u002F Task tool handler returns CreateTaskResult instead of CallToolResult\ns.AddTaskTool(processBatchTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CreateTaskResult, error) {\n    items := request.GetStringSlice(\"items\", []string{})\n    \n    \u002F\u002F Long-running work here\n    for i, item := range items {\n        select {\n        case \u003C-ctx.Done():\n            \u002F\u002F Task was cancelled\n            return nil, ctx.Err()\n        default:\n            \u002F\u002F Process item...\n            processItem(item)\n        }\n    }\n    \n    \u002F\u002F Return result - task ID and metadata are managed by the server\n    return &mcp.CreateTaskResult{\n        Task: mcp.Task{\n            \u002F\u002F Task fields (ID, status, etc.) are populated by the server\n        },\n    }, nil\n})\n\n\u002F\u002F Enable task capabilities when creating the server\ns := server.NewMCPServer(\n    \"Task Server\",\n    \"1.0.0\",\n    server.WithTaskCapabilities(\n        true, \u002F\u002F listTasks: allows clients to list all tasks\n        true, \u002F\u002F cancel: allows clients to cancel running tasks\n        true, \u002F\u002F toolCallTasks: enables task augmentation for tools\n    ),\n    server.WithMaxConcurrentTasks(10), \u002F\u002F Optional: limit concurrent running tasks\n)\n```\n\nTask execution flow:\n1. Client calls tool with task parameter\n2. Server immediately returns task ID\n3. Tool executes asynchronously in the background\n4. Client polls `tasks\u002Fresult` to retrieve the result\n5. Server sends task status notifications on completion\n\nFor optional task tools, the same tool can be called synchronously (without task parameter) or asynchronously (with task parameter):\n\n```go\n\u002F\u002F Tool with optional task support\nanalyzeTool := mcp.NewTool(\"analyze_data\",\n    mcp.WithDescription(\"Analyze data - can run sync or async\"),\n    mcp.WithTaskSupport(mcp.TaskSupportOptional),\n    mcp.WithString(\"data\", mcp.Required()),\n)\n\n\u002F\u002F Use AddTaskTool for hybrid tools that support both modes\ns.AddTaskTool(analyzeTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CreateTaskResult, error) {\n    \u002F\u002F This handler runs when called as a task\n    data := request.GetString(\"data\", \"\")\n    result := analyzeData(data)\n    \n    return &mcp.CreateTaskResult{\n        Task: mcp.Task{},\n    }, nil\n})\n\n\u002F\u002F The server automatically handles both sync and async invocations\n\u002F\u002F When called without task param: executes handler and returns immediately\n\u002F\u002F When called with task param: executes handler asynchronously\n```\n\n##### Limiting Concurrent Tasks\n\nTo prevent resource exhaustion, you can limit the number of concurrent running tasks:\n\n```go\ns := server.NewMCPServer(\n    \"Task Server\",\n    \"1.0.0\",\n    server.WithTaskCapabilities(true, true, true),\n    server.WithMaxConcurrentTasks(10), \u002F\u002F Allow up to 10 concurrent running tasks\n)\n```\n\nWhen the limit is reached, new task creation requests will fail with an error. Completed, failed, or cancelled tasks don't count toward the limit - only tasks in \"working\" status. If `WithMaxConcurrentTasks` is not specified or set to 0, there is no limit on concurrent tasks.\n\nFor traditional synchronous tools that execute and return results immediately:\n\nSimple calculation example:\n```go\ncalculatorTool := mcp.NewTool(\"calculate\",\n    mcp.WithDescription(\"Perform basic arithmetic calculations\"),\n    mcp.WithString(\"operation\",\n        mcp.Required(),\n        mcp.Description(\"The arithmetic operation to perform\"),\n        mcp.Enum(\"add\", \"subtract\", \"multiply\", \"divide\"),\n    ),\n    mcp.WithNumber(\"x\",\n        mcp.Required(),\n        mcp.Description(\"First number\"),\n    ),\n    mcp.WithNumber(\"y\",\n        mcp.Required(),\n        mcp.Description(\"Second number\"),\n    ),\n)\n\ns.AddTool(calculatorTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    args := request.GetArguments()\n    op := args[\"operation\"].(string)\n    x := args[\"x\"].(float64)\n    y := args[\"y\"].(float64)\n\n    var result float64\n    switch op {\n    case \"add\":\n        result = x + y\n    case \"subtract\":\n        result = x - y\n    case \"multiply\":\n        result = x * y\n    case \"divide\":\n        if y == 0 {\n            return mcp.NewToolResultError(\"cannot divide by zero\"), nil\n        }\n        result = x \u002F y\n    }\n    \n    return mcp.FormatNumberResult(result), nil\n})\n```\n\nHTTP request example:\n```go\nhttpTool := mcp.NewTool(\"http_request\",\n    mcp.WithDescription(\"Make HTTP requests to external APIs\"),\n    mcp.WithString(\"method\",\n        mcp.Required(),\n        mcp.Description(\"HTTP method to use\"),\n        mcp.Enum(\"GET\", \"POST\", \"PUT\", \"DELETE\"),\n    ),\n    mcp.WithString(\"url\",\n        mcp.Required(),\n        mcp.Description(\"URL to send the request to\"),\n        mcp.Pattern(\"^https?:\u002F\u002F.*\"),\n    ),\n    mcp.WithString(\"body\",\n        mcp.Description(\"Request body (for POST\u002FPUT)\"),\n    ),\n)\n\ns.AddTool(httpTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    args := request.GetArguments()\n    method := args[\"method\"].(string)\n    url := args[\"url\"].(string)\n    body := \"\"\n    if b, ok := args[\"body\"].(string); ok {\n        body = b\n    }\n\n    \u002F\u002F Create and send request\n    var req *http.Request\n    var err error\n    if body != \"\" {\n        req, err = http.NewRequest(method, url, strings.NewReader(body))\n    } else {\n        req, err = http.NewRequest(method, url, nil)\n    }\n    if err != nil {\n        return mcp.NewToolResultErrorFromErr(\"unable to create request\", err), nil\n    }\n\n    client := &http.Client{}\n    resp, err := client.Do(req)\n    if err != nil {\n        return mcp.NewToolResultErrorFromErr(\"unable to execute request\", err), nil\n    }\n    defer resp.Body.Close()\n\n    \u002F\u002F Return response\n    respBody, err := io.ReadAll(resp.Body)\n    if err != nil {\n        return mcp.NewToolResultErrorFromErr(\"unable to read request response\", err), nil\n    }\n\n    return mcp.NewToolResultText(fmt.Sprintf(\"Status: %d\\nBody: %s\", resp.StatusCode, string(respBody))), nil\n})\n```\n\nTools can be used for any kind of computation or side effect:\n- Database queries\n- File operations  \n- External API calls\n- Calculations\n- System operations\n\nEach tool should:\n- Have a clear description\n- Validate inputs\n- Handle errors gracefully \n- Return structured responses\n- Use appropriate result types\n\n\u003C\u002Fdetails>\n\n### Prompts\n\n\u003Cdetails>\n\u003Csummary>Show Prompt Examples\u003C\u002Fsummary>\n\nPrompts are reusable templates that help LLMs interact with your server effectively. They're like \"best practices\" encoded into your server. Here are some examples:\n\n```go\n\u002F\u002F Simple greeting prompt\ns.AddPrompt(mcp.NewPrompt(\"greeting\",\n    mcp.WithPromptDescription(\"A friendly greeting prompt\"),\n    mcp.WithArgument(\"name\",\n        mcp.ArgumentDescription(\"Name of the person to greet\"),\n    ),\n), func(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {\n    name := request.Params.Arguments[\"name\"]\n    if name == \"\" {\n        name = \"friend\"\n    }\n    \n    return mcp.NewGetPromptResult(\n        \"A friendly greeting\",\n        []mcp.PromptMessage{\n            mcp.NewPromptMessage(\n                mcp.RoleAssistant,\n                mcp.NewTextContent(fmt.Sprintf(\"Hello, %s! How can I help you today?\", name)),\n            ),\n        },\n    ), nil\n})\n\n\u002F\u002F Code review prompt with embedded resource\ns.AddPrompt(mcp.NewPrompt(\"code_review\",\n    mcp.WithPromptDescription(\"Code review assistance\"),\n    mcp.WithArgument(\"pr_number\",\n        mcp.ArgumentDescription(\"Pull request number to review\"),\n        mcp.RequiredArgument(),\n    ),\n), func(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {\n    prNumber := request.Params.Arguments[\"pr_number\"]\n    if prNumber == \"\" {\n        return nil, fmt.Errorf(\"pr_number is required\")\n    }\n    \n    return mcp.NewGetPromptResult(\n        \"Code review assistance\",\n        []mcp.PromptMessage{\n            mcp.NewPromptMessage(\n                mcp.RoleUser,\n                mcp.NewTextContent(\"Review the changes and provide constructive feedback.\"),\n            ),\n            mcp.NewPromptMessage(\n                mcp.RoleAssistant,\n                mcp.NewEmbeddedResource(mcp.ResourceContents{\n                    URI: fmt.Sprintf(\"git:\u002F\u002Fpulls\u002F%s\u002Fdiff\", prNumber),\n                    MIMEType: \"text\u002Fx-diff\",\n                }),\n            ),\n        },\n    ), nil\n})\n\n\u002F\u002F Database query builder prompt\ns.AddPrompt(mcp.NewPrompt(\"query_builder\",\n    mcp.WithPromptDescription(\"SQL query builder assistance\"),\n    mcp.WithArgument(\"table\",\n        mcp.ArgumentDescription(\"Name of the table to query\"),\n        mcp.RequiredArgument(),\n    ),\n), func(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {\n    tableName := request.Params.Arguments[\"table\"]\n    if tableName == \"\" {\n        return nil, fmt.Errorf(\"table name is required\")\n    }\n    \n    return mcp.NewGetPromptResult(\n        \"SQL query builder assistance\",\n        []mcp.PromptMessage{\n            mcp.NewPromptMessage(\n                mcp.RoleUser,\n                mcp.NewTextContent(\"Help construct efficient and safe queries for the provided schema.\"),\n            ),\n            mcp.NewPromptMessage(\n                mcp.RoleUser,\n                mcp.NewEmbeddedResource(mcp.ResourceContents{\n                    URI: fmt.Sprintf(\"db:\u002F\u002Fschema\u002F%s\", tableName),\n                    MIMEType: \"application\u002Fjson\",\n                }),\n            ),\n        },\n    ), nil\n})\n```\n\nPrompts can include:\n- System instructions\n- Required arguments\n- Embedded resources\n- Multiple messages\n- Different content types (text, images, etc.)\n- Custom URI schemes\n\n\u003C\u002Fdetails>\n\n## Examples\n\nFor examples, see the [`examples\u002F`](examples\u002F) directory.\n\nKey examples include:\n- [`examples\u002Ftask_tool\u002F`](examples\u002Ftask_tool\u002F) - Demonstrates task-augmented tools with TaskSupportRequired and TaskSupportOptional modes\n- [`examples\u002Fstructured_input_and_output\u002F`](examples\u002Fstructured_input_and_output\u002F) - Shows how to use struct-based input\u002Foutput schemas with type-safe tool handlers\n- [`examples\u002Ftyped_tools\u002F`](examples\u002Ftyped_tools\u002F) - Demonstrates type-safe tool handlers with strongly-typed arguments\n- [`examples\u002Fcustom_context\u002F`](examples\u002Fcustom_context\u002F) - Shows how to use custom contexts in tool handlers\n- Additional examples covering resources, prompts, and more in the examples directory\n\n## Extras\n\n### Transports\n\nMCP-Go supports stdio, SSE and streamable-HTTP transport layers. For SSE transport, you can use `SetConnectionLostHandler()` to detect and handle disconnections for implementing reconnection logic.\n\n### Session Management\n\nMCP-Go provides a robust session management system that allows you to:\n- Maintain separate state for each connected client\n- Register and track client sessions\n- Send notifications to specific clients\n- Provide per-session tool customization\n\n\u003Cdetails>\n\u003Csummary>Show Session Management Examples\u003C\u002Fsummary>\n\n#### Basic Session Handling\n\n```go\n\u002F\u002F Create a server with session capabilities\ns := server.NewMCPServer(\n    \"Session Demo\",\n    \"1.0.0\",\n    server.WithToolCapabilities(true),\n)\n\n\u002F\u002F Implement your own ClientSession\ntype MySession struct {\n    id           string\n    notifChannel chan mcp.JSONRPCNotification\n    isInitialized bool\n    \u002F\u002F Add custom fields for your application\n}\n\n\u002F\u002F Implement the ClientSession interface\nfunc (s *MySession) SessionID() string {\n    return s.id\n}\n\nfunc (s *MySession) NotificationChannel() chan\u003C- mcp.JSONRPCNotification {\n    return s.notifChannel\n}\n\nfunc (s *MySession) Initialize() {\n    s.isInitialized = true\n}\n\nfunc (s *MySession) Initialized() bool {\n    return s.isInitialized\n}\n\n\u002F\u002F Register a session\nsession := &MySession{\n    id:           \"user-123\",\n    notifChannel: make(chan mcp.JSONRPCNotification, 10),\n}\nif err := s.RegisterSession(context.Background(), session); err != nil {\n    log.Printf(\"Failed to register session: %v\", err)\n}\n\n\u002F\u002F Send notification to a specific client\nerr := s.SendNotificationToSpecificClient(\n    session.SessionID(),\n    \"notification\u002Fupdate\",\n    map[string]any{\"message\": \"New data available!\"},\n)\nif err != nil {\n    log.Printf(\"Failed to send notification: %v\", err)\n}\n\n\u002F\u002F Unregister session when done\ns.UnregisterSession(context.Background(), session.SessionID())\n```\n\n#### Per-Session Tools\n\nFor more advanced use cases, you can implement the `SessionWithTools` interface to support per-session tool customization:\n\n```go\n\u002F\u002F Implement SessionWithTools interface for per-session tools\ntype MyAdvancedSession struct {\n    MySession  \u002F\u002F Embed the basic session\n    sessionTools map[string]server.ServerTool\n}\n\n\u002F\u002F Implement additional methods for SessionWithTools\nfunc (s *MyAdvancedSession) GetSessionTools() map[string]server.ServerTool {\n    return s.sessionTools\n}\n\nfunc (s *MyAdvancedSession) SetSessionTools(tools map[string]server.ServerTool) {\n    s.sessionTools = tools\n}\n\n\u002F\u002F Create and register a session with tools support\nadvSession := &MyAdvancedSession{\n    MySession: MySession{\n        id:           \"user-456\",\n        notifChannel: make(chan mcp.JSONRPCNotification, 10),\n    },\n    sessionTools: make(map[string]server.ServerTool),\n}\nif err := s.RegisterSession(context.Background(), advSession); err != nil {\n    log.Printf(\"Failed to register session: %v\", err)\n}\n\n\u002F\u002F Add session-specific tools\nuserSpecificTool := mcp.NewTool(\n    \"user_data\",\n    mcp.WithDescription(\"Access user-specific data\"),\n)\n\u002F\u002F You can use AddSessionTool (similar to AddTool)\nerr := s.AddSessionTool(\n    advSession.SessionID(),\n    userSpecificTool,\n    func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n        \u002F\u002F This handler is only available to this specific session\n        return mcp.NewToolResultText(\"User-specific data for \" + advSession.SessionID()), nil\n    },\n)\nif err != nil {\n    log.Printf(\"Failed to add session tool: %v\", err)\n}\n\n\u002F\u002F Or use AddSessionTools directly with ServerTool\n\u002F*\nerr := s.AddSessionTools(\n    advSession.SessionID(),\n    server.ServerTool{\n        Tool: userSpecificTool,\n        Handler: func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n            \u002F\u002F This handler is only available to this specific session\n            return mcp.NewToolResultText(\"User-specific data for \" + advSession.SessionID()), nil\n        },\n    },\n)\nif err != nil {\n    log.Printf(\"Failed to add session tool: %v\", err)\n}\n*\u002F\n\n\u002F\u002F Delete session-specific tools when no longer needed\nerr = s.DeleteSessionTools(advSession.SessionID(), \"user_data\")\nif err != nil {\n    log.Printf(\"Failed to delete session tool: %v\", err)\n}\n```\n\n#### Tool Filtering\n\nYou can also apply filters to control which tools are available to certain sessions:\n\n```go\n\u002F\u002F Add a tool filter that only shows tools with certain prefixes\ns := server.NewMCPServer(\n    \"Tool Filtering Demo\",\n    \"1.0.0\",\n    server.WithToolCapabilities(true),\n    server.WithToolFilter(func(ctx context.Context, tools []mcp.Tool) []mcp.Tool {\n        \u002F\u002F Get session from context\n        session := server.ClientSessionFromContext(ctx)\n        if session == nil {\n            return tools \u002F\u002F Return all tools if no session\n        }\n        \n        \u002F\u002F Example: filter tools based on session ID prefix\n        if strings.HasPrefix(session.SessionID(), \"admin-\") {\n            \u002F\u002F Admin users get all tools\n            return tools\n        } else {\n            \u002F\u002F Regular users only get tools with \"public-\" prefix\n            var filteredTools []mcp.Tool\n            for _, tool := range tools {\n                if strings.HasPrefix(tool.Name, \"public-\") {\n                    filteredTools = append(filteredTools, tool)\n                }\n            }\n            return filteredTools\n        }\n    }),\n)\n```\n\n#### Working with Context\n\nThe session context is automatically passed to tool and resource handlers:\n\n```go\ns.AddTool(mcp.NewTool(\"session_aware\"), func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    \u002F\u002F Get the current session from context\n    session := server.ClientSessionFromContext(ctx)\n    if session == nil {\n        return mcp.NewToolResultError(\"No active session\"), nil\n    }\n    \n    return mcp.NewToolResultText(\"Hello, session \" + session.SessionID()), nil\n})\n\n\u002F\u002F When using handlers in HTTP\u002FSSE servers, you need to pass the context with the session\nhttpHandler := func(w http.ResponseWriter, r *http.Request) {\n    \u002F\u002F Get session from somewhere (like a cookie or header)\n    session := getSessionFromRequest(r)\n    \n    \u002F\u002F Add session to context\n    ctx := s.WithContext(r.Context(), session)\n    \n    \u002F\u002F Use this context when handling requests\n    \u002F\u002F ...\n}\n```\n\n\u003C\u002Fdetails>\n\n### Request Hooks\n\nHook into the request lifecycle by creating a `Hooks` object with your\nselection among the possible callbacks.  This enables telemetry across all\nfunctionality, and observability of various facts, for example the ability\nto count improperly-formatted requests, or to log the agent identity during\ninitialization.\n\nAdd the `Hooks` to the server at the time of creation using the\n`server.WithHooks` option.\n\n### Tool Handler Middleware\n\nAdd middleware to tool call handlers using the `server.WithToolHandlerMiddleware` option. Middlewares can be registered on server creation and are applied on every tool call.\n\nA recovery middleware option is available to recover from panics in a tool call and can be added to the server with the `server.WithRecovery` option.\n\n### Prompt Handler Middleware\n\nAdd middleware to prompt handlers using the `server.WithPromptHandlerMiddleware` option. Middlewares can be registered on server creation and are applied on every `prompts\u002Fget` call.\n\n### Prompt Filtering\n\nFilter prompts based on context using the `server.WithPromptFilter` option. This works the same way as tool filtering but applies to `prompts\u002Flist` results.\n\n### Regenerating Server Code\n\nServer hooks and request handlers are generated. Regenerate them by running:\n\n```bash\ngo generate .\u002F...\n```\n\nYou need `go` installed and the `goimports` tool available. The generator runs\n`goimports` automatically to format and fix imports.\n\n### Auto-completions\n\nWhen users are filling in argument values for a specific prompt (identified by name) or resource template (identified by URI), servers can provide contextual suggestions.\nTo enable completion support, use the `server.WithCompletions()` option when creating your server.\n\n#### Completion Providers\n\nYou can provide completion logic for both prompt arguments and resource template arguments by implementing the respective interfaces and passing them to the server as options.\n\n\u003Cdetails>\n\u003Csummary>Show Completion Provider Examples\u003C\u002Fsummary>\n\n```go\ntype MyPromptCompletionProvider struct{}\n\nfunc (p *MyPromptCompletionProvider) CompletePromptArgument(\n    ctx context.Context,\n    promptName string,\n    argument mcp.CompleteArgument,\n    context mcp.CompleteContext,\n) (*mcp.Completion, error) {\n    \u002F\u002F Example: provide style suggestions for a \"code_review\" prompt\n    if promptName == \"code_review\" && argument.Name == \"style\" {\n        styles := []string{\"formal\", \"casual\", \"technical\", \"creative\"}\n        var suggestions []string\n        \n        \u002F\u002F Filter based on current input\n        for _, style := range styles {\n            if strings.HasPrefix(style, argument.Value) {\n                suggestions = append(suggestions, style)\n            }\n        }\n        \n        return &mcp.Completion{\n            Values: suggestions,\n        }, nil\n    }\n    \n    \u002F\u002F Return empty suggestions for unhandled cases\n    return &mcp.Completion{Values: []string{}}, nil\n}\n\ntype MyResourceCompletionProvider struct{}\n\nfunc (p *MyResourceCompletionProvider) CompleteResourceArgument(\n    ctx context.Context,\n    uri string,\n    argument mcp.CompleteArgument,\n    context mcp.CompleteContext,\n) (*mcp.Completion, error) {\n    \u002F\u002F Example: provide file path completions\n    if uri == \"file:\u002F\u002F\u002F{path}\" && argument.Name == \"path\" {\n        \u002F\u002F You can access previously completed arguments from context.Arguments\n        \u002F\u002F context.Arguments is a map[string]string of already-resolved arguments\n        \n        paths := getMatchingPaths(argument.Value) \u002F\u002F Your custom logic\n        \n        return &mcp.Completion{\n            Values:  paths[:min(len(paths), 100)], \u002F\u002F Max 100 items\n            Total:   len(paths),                    \u002F\u002F Total available matches\n            HasMore: len(paths) > 100,              \u002F\u002F More results available\n        }, nil\n    }\n    \n    return &mcp.Completion{Values: []string{}}, nil\n}\n\n\u002F\u002F Register the provider\nmcpServer := server.NewMCPServer(\n    \"my-server\",\n    \"1.0.0\",\n    server.WithCompletions(),\n    server.WithPromptCompletionProvider(&MyPromptCompletionProvider{}),\n    server.WithResourceCompletionProvider(&MyResourceCompletionProvider{}),\n)\n```\n\n\u003C\u002Fdetails>\n\n#### Completion Context\n\nFor prompts or resource templates with multiple arguments, the `CompleteContext` parameter provides access to previously completed arguments. This allows you to provide contextual suggestions based on earlier choices.\n\n\u003Cdetails>\n\u003Csummary>Show Completion Context Example\u003C\u002Fsummary>\n\n```go\nfunc (p *MyProvider) CompleteResourceArgument(\n    ctx context.Context,\n    uri string,\n    argument mcp.CompleteArgument,\n    context mcp.CompleteContext,\n) (*mcp.Completion, error) {\n    \u002F\u002F Access previously completed arguments\n    if previousValue, ok := context.Arguments[\"previous_arg\"]; ok {\n        \u002F\u002F Provide suggestions based on previous_arg value\n        return getSuggestionsFor(argument.Value, previousValue), nil\n    }\n    \n    return &mcp.Completion{Values: []string{}}, nil\n}\n```\n\n\u003C\u002Fdetails>\n\n#### Response Constraints\n\nWhen returning completion results:\n- Maximum 100 items per response\n- Use `Total` to indicate the total number of available matches\n- Use `HasMore` to signal if additional results exist beyond the returned values\n","\u003C!-- 在目录中省略 -->\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmark3labs_mcp-go_readme_4a7bc608f1fe.png\" alt=\"MCP Go Logo\">\n\n[![构建](https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg?branch=main)](https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Factions\u002Fworkflows\u002Fci.yml)\n[![Go Report Card](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmark3labs_mcp-go_readme_2b4a70945b89.png)](https:\u002F\u002Fgoreportcard.com\u002Freport\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go)\n[![GoDoc](https:\u002F\u002Fpkg.go.dev\u002Fbadge\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go.svg)](https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go)\n\n[![AgentRank](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmark3labs_mcp-go_readme_c3baf0cf250d.png)](https:\u002F\u002Fagentrank-ai.com\u002Ftool\u002Fmark3labs--mcp-go\u002F)\n\u003Cstrong>Model Context Protocol (MCP) 的 Go 语言实现，可实现 LLM 应用程序与外部数据源和工具之间的无缝集成。\u003C\u002Fstrong>\n\n\u003Cbr>\n\n[![教程](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmark3labs_mcp-go_readme_bd2b3bda54db.jpg)](http:\u002F\u002Fwww.youtube.com\u002Fwatch?v=qoaeYMrXJH0 \"教程\")\n\n\u003Cbr>\n\n在 [Discord](https:\u002F\u002Fdiscord.gg\u002FRqSS2NQVsY) 上讨论该 SDK\n\n\u003C\u002Fdiv>\n\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fmcp\"\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fserver\"\n)\n\nfunc main() {\n    \u002F\u002F 创建一个新的 MCP 服务器\n    s := server.NewMCPServer(\n        \"演示 🚀\",\n        \"1.0.0\",\n        server.WithToolCapabilities(false),\n    )\n\n    \u002F\u002F 添加工具\n    tool := mcp.NewTool(\"hello_world\",\n        mcp.WithDescription(\"向某人问好\"),\n        mcp.WithString(\"name\",\n            mcp.Required(),\n            mcp.Description(\"要问候的人的名字\"),\n        ),\n    )\n\n    \u002F\u002F 添加工具处理程序\n    s.AddTool(tool, helloHandler)\n\n    \u002F\u002F 启动标准输入输出服务器\n    if err := server.ServeStdio(s); err != nil {\n        fmt.Printf(\"服务器错误: %v\\n\", err)\n    }\n}\n\nfunc helloHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    name, err := request.RequireString(\"name\")\n    if err != nil {\n        return mcp.NewToolResultError(err.Error()), nil\n    }\n\n    return mcp.NewToolResultText(fmt.Sprintf(\"你好，%s！\", name)), nil\n}\n```\n\n就是这样！\n\nMCP Go 负责处理所有复杂的协议细节和服务器管理，因此您可以专注于构建优秀的工具。它的目标是提供高层次且易于使用的接口。\n\n### 主要特性：\n* **快速**：高层次接口意味着更少的代码和更快的开发速度\n* **简单**：只需最少的样板代码即可构建 MCP 服务器\n* **完整***：MCP Go 致力于提供对核心 MCP 规范的完整实现\n\n(\\*强调“致力于”)\n\n🚨 🚧 🏗️ *MCP Go 和 MCP 规范本身目前仍在积极开发中。核心功能已经可用，但一些高级功能仍在开发中。*\n\n\n\u003C!-- 在目录中省略 -->\n## 目录\n\n- [安装](#installation)\n- [快速入门](#quickstart)\n- [什么是 MCP？](#what-is-mcp)\n- [核心概念](#core-concepts)\n  - [服务器](#server)\n  - [资源](#resources)\n  - [工具](#tools)\n  - [提示](#prompts)\n- [示例](#examples)\n- [附加功能](#extras)\n  - [传输方式](#transports)\n  - [会话管理](#session-management)\n    - [基本会话处理](#basic-session-handling)\n    - [按会话的工具](#per-session-tools)\n    - [工具过滤](#tool-filtering)\n    - [使用上下文](#working-with-context)\n  - [请求钩子](#request-hooks)\n  - [工具处理程序中间件](#tool-handler-middleware)\n  - [重新生成服务器代码](#regenerating-server-code)\n\n## 安装\n\n```bash\ngo get github.com\u002Fmark3labs\u002Fmcp-go\n```\n\n## 快速入门\n\n让我们创建一个简单的 MCP 服务器，公开一个计算器工具和一些数据：\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fmcp\"\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fserver\"\n)\n\nfunc main() {\n    \u002F\u002F 创建一个新的 MCP 服务器\n    s := server.NewMCPServer(\n        \"计算器演示\",\n        \"1.0.0\",\n        server.WithToolCapabilities(false),\n        server.WithRecovery(),\n    )\n\n    \u002F\u002F 添加一个计算器工具\n    calculatorTool := mcp.NewTool(\"calculate\",\n        mcp.WithDescription(\"执行基本的算术运算\"),\n        mcp.WithString(\"operation\",\n            mcp.Required(),\n            mcp.Description(\"要执行的操作（加、减、乘、除）\"),\n            mcp.Enum(\"add\", \"subtract\", \"multiply\", \"divide\"),\n        ),\n        mcp.WithNumber(\"x\",\n            mcp.Required(),\n            mcp.Description(\"第一个数字\"),\n        ),\n        mcp.WithNumber(\"y\",\n            mcp.Required(),\n            mcp.Description(\"第二个数字\"),\n        ),\n    )\n\n    \u002F\u002F 添加计算器处理程序\n    s.AddTool(calculatorTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n        \u002F\u002F 使用辅助函数进行类型安全的参数访问\n        op, err := request RequireString(\"operation\")\n        if err != nil {\n            return mcp.NewToolResultError(err.Error()), nil\n        }\n        \n        x, err := request RequireFloat(\"x\")\n        if err != nil {\n            return mcp.NewToolResultError(err.Error()), nil\n        }\n        \n        y, err := request RequireFloat(\"y\")\n        if err != nil {\n            return mcp.NewToolResultError(err.Error()), nil\n        }\n\n        var result float64\n        switch op {\n        case \"add\":\n            result = x + y\n        case \"subtract\":\n            result = x - y\n        case \"multiply\":\n            result = x * y\n        case \"divide\":\n            if y == 0 {\n                return mcp.NewToolResultError(\"不能除以零\"), nil\n            }\n            result = x \u002F y\n        }\n\n        return mcp.NewToolResultText(fmt.Sprintf(\"%.2f\", result)), nil\n    })\n\n    \u002F\u002F 启动服务器\n    if err := server.ServeStdio(s); err != nil {\n        fmt.Printf(\"服务器错误: %v\\n\", err)\n    }\n}\n```\n\n## 什么是 MCP？\n\n[Model Context Protocol (MCP)](https:\u002F\u002Fmodelcontextprotocol.io) 允许您构建以安全、标准化的方式向 LLM 应用程序公开数据和功能的服务器。可以把它想象成一个 Web API，但它专为 LLM 交互而设计。\n\nMCP 服务器可以：\n- 通过 **资源** 公开数据（可以将其视为 GET 端点；用于将信息加载到 LLM 的上下文中）\n- 通过 **工具** 提供功能（类似于 POST 端点；用于执行代码或产生其他副作用）\n- 通过 **提示** 定义交互模式（LLM 交互的可重用模板）\n- 以及更多！\n\nmcp-go 实现了 Model Context Protocol 规范版本 2025-11-25，并向后兼容 2025-06-18、2025-03-26 和 2024-11-05 版本。\n\n## 核心概念\n\n### 服务器\n\n\u003Cdetails>\n\u003Csummary>显示服务器示例\u003C\u002Fsummary>\n\n服务器是您与 MCP 协议的核心接口。它负责连接管理、协议合规性和消息路由：\n\n```go\n\u002F\u002F 创建一个基础服务器\ns := server.NewMCPServer(\n    \"我的服务器\",  \u002F\u002F 服务器名称\n    \"1.0.0\",     \u002F\u002F 版本\n)\n\n\u002F\u002F 使用标准输入输出启动服务器\nif err := server.ServeStdio(s); err != nil {\n    log.Fatalf(\"服务器错误: %v\", err)\n}\n```\n\n\u003C\u002Fdetails>\n\n### 资源\n\n\u003Cdetails>\n\u003Csummary>显示资源示例\u003C\u002Fsummary>\n资源是您向 LLM 公开数据的方式。它们可以是任何内容——文件、API 响应、数据库查询、系统信息等。资源可以分为：\n\n- 静态（固定 URI）\n- 动态（使用 URI 模板）\n\n以下是一个静态资源的简单示例：\n\n```go\n\u002F\u002F 静态资源示例 - 公开 README 文件\nresource := mcp.NewResource(\n    \"docs:\u002F\u002Freadme\",\n    \"项目 README\",\n    mcp.WithResourceDescription(\"项目的 README 文件\"), \n    mcp.WithMIMEType(\"text\u002Fmarkdown\"),\n)\n\n\u002F\u002F 添加资源及其处理器\ns.AddResource(resource, func(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {\n    content, err := os.ReadFile(\"README.md\")\n    if err != nil {\n        return nil, err\n    }\n    \n    return []mcp.ResourceContents{\n        mcp.TextResourceContents{\n            URI:      \"docs:\u002F\u002Freadme\",\n            MIMEType: \"text\u002Fmarkdown\",\n            Text:     string(content),\n        },\n    }, nil\n})\n```\n\n下面是一个使用模板的动态资源示例：\n\n```go\n\u002F\u002F 动态资源示例 - 根据 ID 获取用户资料\ntemplate := mcp.NewResourceTemplate(\n    \"users:\u002F\u002F{id}\u002Fprofile\",\n    \"用户资料\",\n    mcp.WithTemplateDescription(\"返回用户个人资料信息\"),\n    mcp.WithTemplateMIMEType(\"application\u002Fjson\"),\n)\n\n\u002F\u002F 添加模板及其处理器\ns.AddResourceTemplate(template, func(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {\n    \u002F\u002F 使用正则匹配从 URI 中提取 ID\n    \u002F\u002F 服务器会自动将 URI 匹配到模板\n    userID := extractIDFromURI(request.Params.URI)\n    \n    profile, err := getUserProfile(userID)  \u002F\u002F 您的数据库\u002FAPI 调用在此处\n    if err != nil {\n        return nil, err\n    }\n    \n    return []mcp.ResourceContents{\n        mcp.TextResourceContents{\n            URI:      request.Params.URI,\n            MIMEType: \"application\u002Fjson\",\n            Text:     profile,\n        },\n    }, nil\n})\n```\n\n这些示例虽然简单，但展示了核心概念。资源可以更加复杂——提供多种内容、集成数据库或外部 API 等。\n\u003C\u002Fdetails>\n\n### 工具\n\n\u003Cdetails>\n\u003Csummary>显示工具示例\u003C\u002Fsummary>\n\n工具允许 LLM 通过您的服务器执行操作。与资源不同，工具通常用于执行计算并产生副作用。它们类似于 REST API 中的 POST 端点。\n\n#### 任务增强型工具\n\n任务增强型工具以异步方式执行，并通过轮询获取结果。这对于长时间运行的操作非常有用，否则可能会导致阻塞或超时。任务工具支持三种模式：\n\n- **TaskSupportForbidden**（默认）：该工具不能作为任务调用\n- **TaskSupportOptional**：该工具既可以作为任务调用，也可以同步调用\n- **TaskSupportRequired**：该工具必须作为任务调用\n\n```go\n\u002F\u002F 示例：需要任务执行的工具\nprocessBatchTool := mcp.NewTool(\"process_batch\",\n    mcp.WithDescription(\"异步处理一批项目\"),\n    mcp.WithTaskSupport(mcp.TaskSupportRequired),\n    mcp.WithArray(\"items\",\n        mcp.Description(\"待处理的项目列表\"),\n        mcp.WithStringItems(),\n        mcp.Required(),\n    ),\n)\n\n\u002F\u002F 任务工具处理器返回 CreateTaskResult 而不是 CallToolResult\ns.AddTaskTool(processBatchTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CreateTaskResult, error) {\n    items := request.GetStringSlice(\"items\", []string{})\n    \n    \u002F\u002F 长时间运行的工作在此处\n    for i, item := range items {\n        select {\n        case \u003C-ctx.Done():\n            \u002F\u002F 任务被取消\n            return nil, ctx.Err()\n        default:\n            \u002F\u002F 处理项目...\n            processItem(item)\n        }\n    }\n    \n    \u002F\u002F 返回结果——任务 ID 和元数据由服务器管理\n    return &mcp.CreateTaskResult{\n        Task: mcp.Task{\n            \u002F\u002F 任务字段（ID、状态等）由服务器填充\n        },\n    }, nil\n})\n\n\u002F\u002F 在创建服务器时启用任务功能\ns := server.NewMCPServer(\n    \"任务服务器\",\n    \"1.0.0\",\n    server.WithTaskCapabilities(\n        true, \u002F\u002F listTasks：允许客户端列出所有任务\n        true, \u002F\u002F cancel：允许客户端取消正在运行的任务\n        true, \u002F\u002F toolCallTasks：为工具启用任务增强功能\n    ),\n    server.WithMaxConcurrentTasks(10), \u002F\u002F 可选：限制同时运行的任务数量\n)\n```\n\n任务执行流程：\n1. 客户端调用工具并指定任务参数\n2. 服务器立即返回任务 ID\n3. 工具在后台异步执行\n4. 客户端轮询 `tasks\u002Fresult` 来获取结果\n5. 服务器在任务完成时发送状态通知\n\n对于可选任务工具，同一工具既可以同步调用（不带任务参数），也可以异步调用（带任务参数）：\n\n```go\n\u002F\u002F 具有可选任务支持的工具\nanalyzeTool := mcp.NewTool(\"analyze_data\",\n    mcp.WithDescription(\"分析数据——可同步或异步执行\"),\n    mcp.WithTaskSupport(mcp.TaskSupportOptional),\n    mcp.WithString(\"data\", mcp.Required()),\n)\n\n\u002F\u002F 对于支持两种模式的混合工具，使用 AddTaskTool\ns.AddTaskTool(analyzeTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CreateTaskResult, error) {\n    \u002F\u002F 当作为任务调用时，此处理器运行\n    data := request.GetString(\"data\", \"\")\n    result := analyzeData(data)\n    \n    return &mcp.CreateTaskResult{\n        Task: mcp.Task{},\n    }, nil\n})\n\n\u002F\u002F 服务器会自动处理同步和异步调用\n\u002F\u002F 不带任务参数时：直接执行处理器并立即返回结果\n\u002F\u002F 带任务参数时：异步执行处理器\n```\n\n##### 限制并发任务数\n\n为防止资源耗尽，您可以限制同时运行的任务数量：\n\n```go\ns := server.NewMCPServer(\n    \"任务服务器\",\n    \"1.0.0\",\n    server.WithTaskCapabilities(true, true, true),\n    server.WithMaxConcurrentTasks(10), \u002F\u002F 允许最多 10 个并发任务\n)\n```\n\n当达到限制时，新的任务创建请求将失败并返回错误。已完成、失败或已取消的任务不计入限制——只有处于“进行中”状态的任务才会被计算在内。如果未指定 `WithMaxConcurrentTasks` 或将其设置为 0，则没有并发任务限制。\n\n对于传统的同步工具，它们会立即执行并返回结果：\n\n简单的计算示例：\n```go\ncalculatorTool := mcp.NewTool(\"calculate\",\n    mcp.WithDescription(\"执行基本的算术计算\"),\n    mcp.WithString(\"operation\",\n        mcp.Required(),\n        mcp.Description(\"要执行的算术运算\"),\n        mcp.Enum(\"add\", \"subtract\", \"multiply\", \"divide\"),\n    ),\n    mcp.WithNumber(\"x\",\n        mcp.Required(),\n        mcp.Description(\"第一个数字\"),\n    ),\n    mcp.WithNumber(\"y\",\n        mcp.Required(),\n        mcp.Description(\"第二个数字\"),\n    ),\n)\n\ns.AddTool(calculatorTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    args := request.GetArguments()\n    op := args[\"operation\"].(string)\n    x := args[\"x\"].(float64)\n    y := args[\"y\"].(float64)\n\n    var result float64\n    switch op {\n    case \"add\":\n        result = x + y\n    case \"subtract\":\n        result = x - y\n    case \"multiply\":\n        result = x * y\n    case \"divide\":\n        if y == 0 {\n            return mcp.NewToolResultError(\"不能除以零\"), nil\n        }\n        result = x \u002F y\n    }\n    \n    return mcp.FormatNumberResult(result), nil\n})\n```\n\nHTTP 请求示例：\n```go\nhttpTool := mcp.NewTool(\"http_request\",\n    mcp.WithDescription(\"向外部 API 发送 HTTP 请求\"),\n    mcp.WithString(\"method\",\n        mcp.Required(),\n        mcp.Description(\"要使用的 HTTP 方法\"),\n        mcp.Enum(\"GET\", \"POST\", \"PUT\", \"DELETE\"),\n    ),\n    mcp.WithString(\"url\",\n        mcp.Required(),\n        mcp.Description(\"发送请求的 URL\"),\n        mcp.Pattern(\"^https?:\u002F\u002F.*\"),\n    ),\n    mcp.WithString(\"body\",\n        mcp.Description(\"请求体（用于 POST\u002FPUT）\"),\n    ),\n)\n\ns.AddTool(httpTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    args := request.GetArguments()\n    method := args[\"method\"].(string)\n    url := args[\"url\"].(string)\n    body := \"\"\n    if b, ok := args[\"body\"].(string); ok {\n        body = b\n    }\n\n    \u002F\u002F 创建并发送请求\n    var req *http.Request\n    var err error\n    if body != \"\" {\n        req, err = http.NewRequest(method, url, strings.NewReader(body))\n    } else {\n        req, err = http.NewRequest(method, url, nil)\n    }\n    if err != nil {\n        return mcp.NewToolResultErrorFromErr(\"无法创建请求\", err), nil\n    }\n\n    client := &http.Client{}\n    resp, err := client.Do(req)\n    if err != nil {\n        return mcp.NewToolResultErrorFromErr(\"无法执行请求\", err), nil\n    }\n    defer resp.Body.Close()\n\n    \u002F\u002F 返回响应\n    respBody, err := io.ReadAll(resp.Body)\n    if err != nil {\n        return mcp.NewToolResultErrorFromErr(\"无法读取请求响应\", err), nil\n    }\n\n    return mcp.NewToolResultText(fmt.Sprintf(\"状态: %d\\n正文: %s\", resp.StatusCode, string(respBody))), nil\n})\n```\n\n工具可用于任何类型的计算或副作用：\n- 数据库查询\n- 文件操作\n- 外部 API 调用\n- 计算\n- 系统操作\n\n每个工具应：\n- 具有清晰的描述\n- 验证输入\n- 妥善处理错误\n- 返回结构化响应\n- 使用适当的结果类型\n\n\u003C\u002Fdetails>\n\n\n\n### 提示词\n\n\u003Cdetails>\n\u003Csummary>显示提示词示例\u003C\u002Fsummary>\n\n提示词是可重用的模板，可帮助大模型有效地与您的服务器交互。它们就像是编码到您服务器中的“最佳实践”。以下是一些示例：\n\n```go\n\u002F\u002F 简单的问候提示词\ns.AddPrompt(mcp.NewPrompt(\"greeting\",\n    mcp.WithPromptDescription(\"友好的问候提示词\"),\n    mcp.WithArgument(\"name\",\n        mcp.ArgumentDescription(\"要问候的人的名字\"),\n    ),\n), func(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {\n    name := request.Params.Arguments[\"name\"]\n    if name == \"\" {\n        name = \"朋友\"\n    }\n    \n    return mcp.NewGetPromptResult(\n        \"友好的问候\",\n        []mcp.PromptMessage{\n            mcp.NewPromptMessage(\n                mcp.RoleAssistant,\n                mcp.NewTextContent(fmt.Sprintf(\"你好，%s！今天有什么可以帮你的吗？\", name)),\n            ),\n        },\n    ), nil\n})\n\n\u002F\u002F 带嵌入资源的代码审查提示词\ns.AddPrompt(mcp.NewPrompt(\"code_review\",\n    mcp.WithPromptDescription(\"代码审查协助\"),\n    mcp.WithArgument(\"pr_number\",\n        mcp.ArgumentDescription(\"要审查的拉取请求编号\"),\n        mcp.RequiredArgument(),\n    ),\n), func(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {\n    prNumber := request.Params.Arguments[\"pr_number\"]\n    if prNumber == \"\" {\n        return nil, fmt.Errorf(\"需要提供拉取请求编号\")\n    }\n    \n    return mcp.NewGetPromptResult(\n        \"代码审查协助\",\n        []mcp.PromptMessage{\n            mcp.NewPromptMessage(\n                mcp.RoleUser,\n                mcp.NewTextContent(\"请审查这些更改，并提供建设性的反馈。\"),\n            ),\n            mcp.NewPromptMessage(\n                mcp.RoleAssistant,\n                mcp.NewEmbeddedResource(mcp.ResourceContents{\n                    URI: fmt.Sprintf(\"git:\u002F\u002Fpulls\u002F%s\u002Fdiff\", prNumber),\n                    MIMEType: \"text\u002Fx-diff\",\n                }),\n            ),\n        },\n    ), nil\n})\n\n\u002F\u002F 数据库查询构建器提示词\ns.AddPrompt(mcp.NewPrompt(\"query_builder\",\n    mcp.WithPromptDescription(\"SQL 查询构建助手\"),\n    mcp.WithArgument(\"table\",\n        mcp.ArgumentDescription(\"要查询的表名\"),\n        mcp.RequiredArgument(),\n    ),\n), func(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {\n    tableName := request.Params.Arguments[\"table\"]\n    if tableName == \"\" {\n        return nil, fmt.Errorf(\"需要提供表名\")\n    }\n    \n    return mcp.NewGetPromptResult(\n        \"SQL 查询构建助手\",\n        []mcp.PromptMessage{\n            mcp.NewPromptMessage(\n                mcp.RoleUser,\n                mcp.NewTextContent(\"请为提供的模式构建高效且安全的查询。\"),\n            ),\n            mcp.NewPromptMessage(\n                mcp.RoleUser,\n                mcp.NewEmbeddedResource(mcp.ResourceContents{\n                    URI: fmt.Sprintf(\"db:\u002F\u002Fschema\u002F%s\", tableName),\n                    MIMEType: \"application\u002Fjson\",\n                }),\n            ),\n        },\n    ), nil\n})\n```\n\n提示词可以包含：\n- 系统指令\n- 必需参数\n- 嵌入式资源\n- 多条消息\n- 不同的内容类型（文本、图片等）\n- 自定义 URI 方案\n\n\u003C\u002Fdetails>\n\n## 示例\n\n有关示例，请参阅 [`examples\u002F`](examples\u002F) 目录。\n\n主要示例包括：\n- [`examples\u002Ftask_tool\u002F`](examples\u002Ftask_tool\u002F) - 展示了带有 TaskSupportRequired 和 TaskSupportOptional 模式的任务增强型工具\n- [`examples\u002Fstructured_input_and_output\u002F`](examples\u002Fstructured_input_and_output\u002F) - 展示如何在类型安全的工具处理器中使用基于结构的输入\u002F输出模式\n- [`examples\u002Ftyped_tools\u002F`](examples\u002Ftyped_tools\u002F) - 展示带有强类型参数的类型安全工具处理器\n- [`examples\u002Fcustom_context\u002F`](examples\u002Fcustom_context\u002F) - 展示如何在工具处理器中使用自定义上下文\n- 该示例目录中还包含更多关于资源、提示等内容的示例\n\n## 附加内容\n\n### 传输层\n\nMCP-Go 支持标准输入输出、SSE 以及可流式传输的 HTTP 传输层。对于 SSE 传输，您可以使用 `SetConnectionLostHandler()` 来检测并处理连接断开情况，从而实现重连逻辑。\n\n### 会话管理\n\nMCP-Go 提供了一个强大的会话管理系统，使您能够：\n- 为每个连接的客户端维护独立的状态\n- 注册并跟踪客户端会话\n- 向特定客户端发送通知\n- 提供基于会话的工具自定义功能\n\n\u003Cdetails>\n\u003Csummary>显示会话管理示例\u003C\u002Fsummary>\n\n#### 基本会话处理\n\n```go\n\u002F\u002F 创建一个支持会话功能的服务器\ns := server.NewMCPServer(\n    \"会话演示\",\n    \"1.0.0\",\n    server.WithToolCapabilities(true),\n)\n\n\u002F\u002F 实现自定义的 ClientSession\ntype MySession struct {\n    id           string\n    notifChannel chan mcp.JSONRPCNotification\n    isInitialized bool\n    \u002F\u002F 根据应用需求添加自定义字段\n}\n\n\u002F\u002F 实现 ClientSession 接口\nfunc (s *MySession) SessionID() string {\n    return s.id\n}\n\nfunc (s *MySession) NotificationChannel() chan\u003C- mcp.JSONRPCNotification {\n    return s.notifChannel\n}\n\nfunc (s *MySession) Initialize() {\n    s.isInitialized = true\n}\n\nfunc (s *MySession) Initialized() bool {\n    return s.isInitialized\n}\n\n\u002F\u002F 注册一个会话\nsession := &MySession{\n    id:           \"user-123\",\n    notifChannel: make(chan mcp.JSONRPCNotification, 10),\n}\nif err := s.RegisterSession(context.Background(), session); err != nil {\n    log.Printf(\"注册会话失败： %v\", err)\n}\n\n\u002F\u002F 向特定客户端发送通知\nerr := s.SendNotificationToSpecificClient(\n    session.SessionID(),\n    \"notification\u002Fupdate\",\n    map[string]any{\"message\": \"有新数据可用！\"},\n)\nif err != nil {\n    log.Printf(\"发送通知失败： %v\", err)\n}\n\n\u002F\u002F 使用完毕后注销会话\ns.UnregisterSession(context.Background(), session.SessionID())\n```\n\n#### 基于会话的工具\n\n对于更高级的用例，您可以实现 `SessionWithTools` 接口，以支持基于会话的工具自定义：\n\n```go\n\u002F\u002F 实现 SessionWithTools 接口，用于支持基于会话的工具\ntype MyAdvancedSession struct {\n    MySession  \u002F\u002F 嵌入基础会话\n    sessionTools map[string]server.ServerTool\n}\n\n\u002F\u002F 实现 SessionWithTools 的额外方法\nfunc (s *MyAdvancedSession) GetSessionTools() map[string]server.ServerTool {\n    return s.sessionTools\n}\n\nfunc (s *MyAdvancedSession) SetSessionTools(tools map[string]server.ServerTool) {\n    s.sessionTools = tools\n}\n\n\u002F\u002F 创建并注册一个支持工具的会话\nadvSession := &MyAdvancedSession{\n    MySession: MySession{\n        id:           \"user-456\",\n        notifChannel: make(chan mcp.JSONRPCNotification, 10),\n    },\n    sessionTools: make(map[string]server.ServerTool),\n}\nif err := s.RegisterSession(context.Background(), advSession); err != nil {\n    log.Printf(\"注册会话失败： %v\", err)\n}\n\n\u002F\u002F 添加会话专属工具\nuserSpecificTool := mcp.NewTool(\n    \"user_data\",\n    mcp.WithDescription(\"访问用户专属数据\"),\n)\n\u002F\u002F 可以使用 AddSessionTool（类似于 AddTool）\nerr := s.AddSessionTool(\n    advSession.SessionID(),\n    userSpecificTool,\n    func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n        \u002F\u002F 此处理器仅对该特定会话可用\n        return mcp.NewToolResultText(\"针对 \" + advSession.SessionID() 的用户专属数据\"), nil\n    },\n)\nif err != nil {\n    log.Printf(\"添加会话工具失败： %v\", err)\n}\n\n\u002F\u002F 或者直接使用 AddSessionTools 并传入 ServerTool\n\u002F*\nerr := s.AddSessionTools(\n    advSession.SessionID(),\n    server.ServerTool{\n        Tool: userSpecificTool,\n        Handler: func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n            \u002F\u002F 此处理器仅对该特定会话可用\n            return mcp.NewToolResultText(\"针对 \" + advSession.SessionID() 的用户专属数据\"), nil\n        },\n    },\n)\nif err != nil {\n    log.Printf(\"添加会话工具失败： %v\", err)\n}\n*\u002F\n\n\u002F\u002F 当不再需要时，删除会话专属工具\nerr = s.DeleteSessionTools(advSession.SessionID(), \"user_data\")\nif err != nil {\n    log.Printf(\"删除会话工具失败： %v\", err)\n}\n```\n\n#### 工具过滤\n\n您还可以应用过滤器来控制哪些工具对特定会话可见：\n\n```go\n\u002F\u002F 添加一个工具过滤器，只显示具有特定前缀的工具\ns := server.NewMCPServer(\n    \"工具过滤演示\",\n    \"1.0.0\",\n    server.WithToolCapabilities(true),\n    server.WithToolFilter(func(ctx context.Context, tools []mcp.Tool) []mcp.Tool {\n        \u002F\u002F 从上下文中获取会话\n        session := server.ClientSessionFromContext(ctx)\n        if session == null {\n            return tools \u002F\u002F 如果没有会话，则返回所有工具\n        }\n        \n        \u002F\u002F 示例：根据会话 ID 前缀过滤工具\n        if strings.HasPrefix(session.SessionID(), \"admin-\") {\n            \u002F\u002F 管理员用户可使用所有工具\n            return tools\n        } else {\n            \u002F\u002F 普通用户仅能使用带有 \"public-\" 前缀的工具\n            var filteredTools []mcp.Tool\n            for _, tool := range tools {\n                if strings.HasPrefix(tool.Name, \"public-\") {\n                    filteredTools = append(filteredTools, tool)\n                }\n            }\n            return filteredTools\n        }\n    }),\n)\n```\n\n#### 使用上下文\n\n会话上下文会自动传递给工具和资源处理器：\n\n```go\ns.AddTool(mcp.NewTool(\"session_aware\"), func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    \u002F\u002F 从上下文中获取当前会话\n    session := server.ClientSessionFromContext(ctx)\n    if session == null {\n        return mcp.NewToolResultError(\"无活动会话\"), nil\n    }\n    \n    return mcp.NewToolResultText(\"你好，会话 \" + session.SessionID()), nil\n})\n\n\u002F\u002F 在使用 HTTP\u002FSSE 服务器的处理器时，需要将包含会话的上下文传递过去\nhttpHandler := func(w http.ResponseWriter, r *http.Request) {\n    \u002F\u002F 从某个地方（如 Cookie 或 Header）获取会话\n    session := getSessionFromRequest(r)\n    \n    \u002F\u002F 将会话添加到上下文中\n    ctx := s.WithContext(r.Context(), session)\n    \n    \u002F\u002F 处理请求时使用此上下文\n    \u002F\u002F ...\n}\n```\n\n\u003C\u002Fdetails>\n\n### 请求钩子\n\n通过创建一个包含您所选回调函数的 `Hooks` 对象，可以钩入请求生命周期。这使得在整个功能范围内进行遥测成为可能，并能够观察各种情况，例如统计格式不正确的请求数量，或在初始化过程中记录代理身份。\n\n在创建服务器时，使用 `server.WithHooks` 选项将 `Hooks` 添加到服务器中。\n\n### 工具处理器中间件\n\n使用 `server.WithToolHandlerMiddleware` 选项为工具调用处理器添加中间件。中间件可以在服务器创建时注册，并应用于每次工具调用。\n\n此外，还提供了一个恢复中间件选项，用于在工具调用发生 panic 时进行恢复，可以通过 `server.WithRecovery` 选项将其添加到服务器中。\n\n### 提示处理器中间件\n\n使用 `server.WithPromptHandlerMiddleware` 选项为提示处理器添加中间件。中间件可以在创建服务器时注册，并应用于每次 `prompts\u002Fget` 调用。\n\n### 提示过滤\n\n使用 `server.WithPromptFilter` 选项根据上下文过滤提示。其工作方式与工具过滤相同，但适用于 `prompts\u002Flist` 的结果。\n\n### 重新生成服务器代码\n\n服务器钩子和请求处理器是自动生成的。通过运行以下命令可以重新生成它们：\n\n```bash\ngo generate .\u002F...\n```\n\n您需要安装 `go` 并确保 `goimports` 工具可用。生成器会自动运行 `goimports` 来格式化并修复导入语句。\n\n### 自动补全\n\n当用户正在填写特定提示（按名称标识）或资源模板（按 URI 标识）的参数值时，服务器可以提供上下文相关的建议。要启用补全支持，请在创建服务器时使用 `server.WithCompletions()` 选项。\n\n#### 补全提供者\n\n您可以通过实现相应的接口并将它们作为选项传递给服务器，为提示参数和资源模板参数提供补全逻辑。\n\n\u003Cdetails>\n\u003Csummary>显示补全提供者示例\u003C\u002Fsummary>\n\n```go\ntype MyPromptCompletionProvider struct{}\n\nfunc (p *MyPromptCompletionProvider) CompletePromptArgument(\n    ctx context.Context,\n    promptName string,\n    argument mcp.CompleteArgument,\n    context mcp.CompleteContext,\n) (*mcp.Completion, error) {\n    \u002F\u002F 示例：为 \"code_review\" 提供样式建议\n    if promptName == \"code_review\" && argument.Name == \"style\" {\n        styles := []string{\"正式\", \"随意\", \"技术性\", \"创意\"}\n        var suggestions []string\n        \n        \u002F\u002F 根据当前输入进行筛选\n        for _, style := range styles {\n            if strings.HasPrefix(style, argument.Value) {\n                suggestions = append(suggestions, style)\n            }\n        }\n        \n        return &mcp.Completion{\n            Values: suggestions,\n        }, nil\n    }\n    \n    \u002F\u002F 对于未处理的情况返回空建议\n    return &mcp.Completion{Values: []string{}}, nil\n}\n\ntype MyResourceCompletionProvider struct{}\n\nfunc (p *MyResourceCompletionProvider) CompleteResourceArgument(\n    ctx context.Context,\n    uri string,\n    argument mcp.CompleteArgument,\n    context mcp.CompleteContext,\n) (*mcp.Completion, error) {\n    \u002F\u002F 示例：提供文件路径补全\n    if uri == \"file:\u002F\u002F\u002F{path}\" && argument.Name == \"path\" {\n        \u002F\u002F 您可以从 context.Arguments 中访问之前已完成的参数\n        \u002F\u002F context.Arguments 是一个已解析参数的 map[string]string\n        \n        paths := getMatchingPaths(argument.Value) \u002F\u002F 您的自定义逻辑\n        \n        return &mcp.Completion{\n            Values:  paths[:min(len(paths), 100)], \u002F\u002F 最多 100 项\n            Total:   len(paths),                    \u002F\u002F 总共有多少匹配项\n            HasMore: len(paths) > 100,              \u002F\u002F 是否还有更多结果\n        }, nil\n    }\n    \n    return &mcp.Completion{Values: []string{}}, nil\n}\n\n\u002F\u002F 注册提供者\nmcpServer := server.NewMCPServer(\n    \"my-server\",\n    \"1.0.0\",\n    server.WithCompletions(),\n    server.WithPromptCompletionProvider(&MyPromptCompletionProvider{}),\n    server.WithResourceCompletionProvider(&MyResourceCompletionProvider{}),\n)\n```\n\n\u003C\u002Fdetails>\n\n#### 补全上下文\n\n对于具有多个参数的提示或资源模板，`CompleteContext` 参数提供了对先前已完成参数的访问权限。这使您可以根据之前的选项提供上下文相关的建议。\n\n\u003Cdetails>\n\u003Csummary>显示补全上下文示例\u003C\u002Fsummary>\n\n```go\nfunc (p *MyProvider) CompleteResourceArgument(\n    ctx context.Context,\n    uri string,\n    argument mcp.CompleteArgument,\n    context mcp.CompleteContext,\n) (*mcp.Completion, error) {\n    \u002F\u002F 访问之前完成的参数\n    if previousValue, ok := context.Arguments[\"previous_arg\"]; ok {\n        \u002F\u002F 根据 previous_arg 的值提供建议\n        return getSuggestionsFor(argument.Value, previousValue), nil\n    }\n    \n    return &mcp.Completion{Values: []string{}}, nil\n}\n```\n\n\u003C\u002Fdetails>\n\n#### 响应约束\n\n在返回补全结果时：\n- 每次响应最多包含 100 项\n- 使用 `Total` 表示总共有多少个匹配项\n- 使用 `HasMore` 标记是否还有超出返回结果之外的其他匹配项","# mcp-go 快速上手指南\n\nmcp-go 是 Model Context Protocol (MCP) 的 Go 语言实现，旨在帮助开发者轻松构建服务器，将外部数据源和工具无缝集成到大语言模型（LLM）应用中。\n\n## 环境准备\n\n在开始之前，请确保您的开发环境满足以下要求：\n\n*   **操作系统**: Linux, macOS 或 Windows\n*   **Go 版本**: 建议安装 Go 1.21 或更高版本\n*   **依赖管理**: 熟悉 Go Modules (`go mod`)\n\n无需其他特殊的前置依赖，mcp-go 是一个纯 Go 库。\n\n## 安装步骤\n\n使用 `go get` 命令将 mcp-go 添加到您的项目中：\n\n```bash\ngo get github.com\u002Fmark3labs\u002Fmcp-go\n```\n\n如果您使用的是国内网络环境，建议配置 Go 代理以加速下载：\n\n```bash\nexport GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\ngo get github.com\u002Fmark3labs\u002Fmcp-go\n```\n\n## 基本使用\n\n下面是一个最简单的示例，展示如何创建一个 MCP 服务器，定义一个名为 `hello_world` 的工具，并通过标准输入输出（stdio）启动服务。\n\n### 1. 创建主程序\n\n新建一个 `main.go` 文件，填入以下代码：\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fmcp\"\n    \"github.com\u002Fmark3labs\u002Fmcp-go\u002Fserver\"\n)\n\nfunc main() {\n    \u002F\u002F 创建一个新的 MCP 服务器\n    \u002F\u002F 参数：服务器名称、版本号、可选配置\n    s := server.NewMCPServer(\n        \"Demo 🚀\",\n        \"1.0.0\",\n        server.WithToolCapabilities(false),\n    )\n\n    \u002F\u002F 定义一个工具\n    tool := mcp.NewTool(\"hello_world\",\n        mcp.WithDescription(\"Say hello to someone\"),\n        mcp.WithString(\"name\",\n            mcp.Required(),\n            mcp.Description(\"Name of the person to greet\"),\n        ),\n    )\n\n    \u002F\u002F 将工具与处理函数绑定\n    s.AddTool(tool, helloHandler)\n\n    \u002F\u002F 启动 stdio 服务器\n    if err := server.ServeStdio(s); err != nil {\n        fmt.Printf(\"Server error: %v\\n\", err)\n    }\n}\n\n\u002F\u002F 工具处理函数\nfunc helloHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    \u002F\u002F 安全地获取字符串参数\n    name, err := request.RequireString(\"name\")\n    if err != nil {\n        return mcp.NewToolResultError(err.Error()), nil\n    }\n\n    \u002F\u002F 返回文本结果\n    return mcp.NewToolResultText(fmt.Sprintf(\"Hello, %s!\", name)), nil\n}\n```\n\n### 2. 运行服务器\n\n在项目根目录下运行以下命令启动服务器：\n\n```bash\ngo run main.go\n```\n\n此时，程序将等待通过 stdin 接收 MCP 协议格式的请求。通常，这个二进制文件会被 LLM 应用（如 Claude Desktop 或其他支持 MCP 的客户端）作为子进程调用，而不是直接在终端交互式运行。\n\n### 核心概念简述\n\n*   **Server**: 核心接口，负责连接管理、协议合规和消息路由。\n*   **Tools**: 类似于 API 中的 POST 端点，用于执行代码或产生副作用（如上面的 `hello_world`）。\n*   **Resources**: 类似于 API 中的 GET 端点，用于向 LLM 上下文加载信息（如文件内容、数据库记录）。\n*   **Prompts**: 定义可重用的 LLM 交互模板。\n\nmcp-go 封装了复杂的协议细节，您只需关注业务逻辑的实现即可。","某金融科技公司后端团队正在构建一个智能运维助手，需要让大模型实时读取内部监控数据库并执行重启服务等高危操作。\n\n### 没有 mcp-go 时\n- **协议实现繁琐**：开发人员需手动解析复杂的 JSON-RPC 消息格式，编写大量样板代码来处理握手、心跳和错误重试，分散了业务逻辑精力。\n- **上下文割裂严重**：大模型无法直接调用现有的 Go 语言监控库，必须额外开发中间 HTTP 服务进行数据转发，增加了架构复杂度和延迟。\n- **类型安全缺失**：在传递工具参数时缺乏编译期检查，经常因字段名拼写错误或类型不匹配导致运行时崩溃，排查困难。\n- **会话管理混乱**：难以追踪不同用户会话的工具调用状态，无法灵活控制特定会话的权限或过滤敏感工具，存在安全隐患。\n\n### 使用 mcp-go 后\n- **开发极速聚焦**：利用 mcp-go 的高级接口，仅需几行代码即可定义“查询库存”或“重启服务”工具，自动处理底层协议细节，开发效率提升数倍。\n- **原生无缝集成**：直接在 Go 项目中引入内部监控 SDK 作为工具处理器，大模型通过标准 MCP 协议即可安全调用本地函数，无需额外网关。\n- **强类型保障**：借助 Go 的静态类型系统和 mcp-go 的参数校验机制（如 `RequireString`），在编译阶段即可发现参数定义错误，运行更稳定。\n- **精细会话控制**：内置的会话管理和中间件功能，轻松实现基于用户角色的工具过滤和上下文隔离，确保高危操作仅限授权会话执行。\n\nmcp-go 将复杂的协议交互转化为简单的 Go 函数调用，让开发者能专注于构建强大的 AI 业务能力而非通信基础设施。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmark3labs_mcp-go_4a7bc608.png","mark3labs","Mark III Labs","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fmark3labs_eee8e60e.png",null,"https:\u002F\u002Fmark3labs.com","https:\u002F\u002Fgithub.com\u002Fmark3labs",[82,86,90,93,97],{"name":83,"color":84,"percentage":85},"Go","#00ADD8",80.1,{"name":87,"color":88,"percentage":89},"MDX","#fcb32c",19.1,{"name":91,"color":84,"percentage":92},"Go Template",0.6,{"name":94,"color":95,"percentage":96},"TypeScript","#3178c6",0.2,{"name":98,"color":99,"percentage":100},"CSS","#663399",0,8537,806,"2026-04-05T15:05:30","MIT","","未说明",{"notes":108,"python":109,"dependencies":110},"该工具是基于 Go 语言开发的 Model Context Protocol (MCP) 实现，非 Python 项目。运行环境需安装 Go 语言开发套件（README 未指定具体 Go 版本，通常建议使用最新稳定版）。通过 'go get' 命令安装依赖。支持 stdio 传输方式，用于构建 LLM 应用与外部数据源之间的集成服务。","不适用",[111],"github.com\u002Fmark3labs\u002Fmcp-go",[26,13,15],"2026-03-27T02:49:30.150509","2026-04-06T08:42:04.097783",[116,121,126,131,136,140],{"id":117,"question_zh":118,"answer_zh":119,"source_url":120},17887,"如果使用 SSE 启动 MCP 服务器，客户端连接后自动断开怎么办？","这是因为默认未启用保持连接（KeepAlive）。需要在创建 SSE 服务器时添加 `WithKeepAlive(true)` 选项。注意：该功能在 v0.20.0 版本中才合并，v0.17.0 及更早版本不支持。\n\n配置代码示例：\n```go\nsseServer := server.NewSSEServer(mcpServer, server.WithBaseURL(\"http:\u002F\u002Flocalhost:8080\"), server.WithKeepAlive(true))\n```","https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fissues\u002F126",{"id":122,"question_zh":123,"answer_zh":124,"source_url":125},17888,"如何在 Go MCP 服务器中实现 OAuth2 认证以配合 Claude.ai 使用？","目前库本身尚未内置完整的 OAuth2 提供商实现（如 Google 或 GitHub），因为认证配置变量太多。推荐的解决方案是使用反向代理处理认证。\n\n可以参考社区实现的 OAuth2 代理项目：\n- 代码示例：https:\u002F\u002Fgithub.com\u002Fmatheuscscp\u002Fmcp-oauth2-proxy\u002Fblob\u002Fmain\u002Fmain.go\n- Helm Chart 和镜像：https:\u002F\u002Fgithub.com\u002Fmatheuscscp?tab=packages&repo_name=mcp-oauth2-proxy\n\n原理是通过代理拦截请求，若未携带 Token 则返回 HTTP 401 Unauthorized 及 WWW-Authenticate 头，从而触发客户端的认证流程。","https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fissues\u002F540",{"id":127,"question_zh":128,"answer_zh":129,"source_url":130},17889,"为什么在使用 StreamableHTTPServer 时 SendNotificationToClient 发送通知失败，而 Stdio 模式正常？","这是一个已知问题（Bug #334），在 StreamableHTTPServer 模式下通知机制存在缺陷，而在 ServeStdio 模式下工作正常。官方 Go SDK 和官方服务器实现中该功能是正常的。\n\n目前的临时状态是相关修复（#473）已合并，建议升级到包含该修复的最新版本。如果问题依旧，请检查是否使用了正确的会话上下文，或者暂时回退到 Stdio 模式进行调试。","https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fissues\u002F334",{"id":132,"question_zh":133,"answer_zh":134,"source_url":135},17890,"如何为不同用户动态提供不同的工具列表（支持多用户场景）？","可以通过会话（Session）管理来实现针对单个用户的工具定制，而不是全局修改。\n\n解决方案包括：\n1. 使用中间件在返回工具列表前根据用户权限（如 OAuth Token 能力）进行过滤。\n2. 利用 SSEServer 的会话自定义功能（参考 PR #232），允许为特定会话设置可用的工具。\n3. 确保工具更新只针对个体会话生效，避免一个用户的行为影响全局状态。\n\n相关功能已在后续版本（结合 #179 和 #232）中得到支持。","https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fissues\u002F160",{"id":137,"question_zh":138,"answer_zh":139,"source_url":125},17891,"MCP 服务器在认证失败时应该返回什么状态码？","根据 Anthropic MCP 规范，当客户端请求未携带 Token 时，服务器（或前置代理）应返回 HTTP 401 Unauthorized 状态码，并在响应头中包含 `WWW-Authenticate` 字段。\n\n虽然理想情况下应由 MCP 服务器直接返回，但在实际部署中，通常由反向代理（Proxy）处理此逻辑并返回 401，这对调用者（如 claude.ai）来说是透明的，效果等同于服务器直接响应。",{"id":141,"question_zh":142,"answer_zh":143,"source_url":130},17892,"SendNotificationToClient 没有报错但客户端收不到通知，可能是什么原因？","如果服务端日志显示发送成功（err 为 nil）但客户端 `OnNotification` 回调未触发，常见原因包括：\n1. 使用了 StreamableHTTPServer 且版本过低（存在已知 Bug，需升级或等待修复）。\n2. 客户端未正确初始化或会话未建立完成就尝试发送通知。\n3. 通知类型（Method）不匹配，确保客户端监听的方法名与服务端发送的一致（例如 \"notifications\u002Fprogress\"）。\n\n建议先尝试切换到 Stdio 模式验证逻辑是否正确，若 Stdio 正常则确认为 HTTP 传输层的兼容性问题。",[145,149,153,157,161,166,170,175,180,185,190,195,200,205,210,215,220,225,230,235],{"id":146,"version":147,"summary_zh":78,"released_at":148},108179,"v0.47.0","2026-04-04T15:06:37",{"id":150,"version":151,"summary_zh":78,"released_at":152},108180,"v0.46.0","2026-03-26T07:57:35",{"id":154,"version":155,"summary_zh":78,"released_at":156},108181,"v0.45.0","2026-03-06T17:18:01",{"id":158,"version":159,"summary_zh":78,"released_at":160},108182,"v0.44.1","2026-02-27T06:46:59",{"id":162,"version":163,"summary_zh":164,"released_at":165},108183,"v0.44.0","## 变更内容\n* 功能：延迟加载工具，以支持 Anthropic 的“工具搜索”模式，由 @wolfeidau 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F644 中实现。\n* 修复：如果 responseWriter 不支持 Flush，则返回错误，由 @JoelPfaffDD 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F652 中实现。\n* 增加图标支持，以符合 MCP 规范 2025-11-25，由 @dask-58 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F660 中实现。\n* 修复：为静态令牌的 401 响应添加 ErrUnauthorized 标记，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F661 中实现。\n* 为 Annotations 添加 lastModified 字段，以符合 MCP 规范 2025-11-25，由 @dask-58 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F663 中实现。\n* 增加对 MCP 任务的服务器端支持，由 @JAORMX 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F635 中实现。\n* 修复：在写入响应之前清空所有待处理的通知，以避免遗漏通知，由 @archit-harness 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F670 中实现。\n* 修复 nil 资源切片问题，由 @furysama 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F665 中实现。\n* 为注解相关函数添加文档字符串，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F673 中实现。\n* 修复：为 SSE 响应增加超时机制，以防止无限阻塞，由 @everfid-ever 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F668 中实现。\n* 首先尝试 OAuth 授权服务器元数据，由 @staugaard 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F669 中实现。\n* 修复（OAuth）：即使状态码为 200，也要检查 OAuth 错误响应，由 @sd2k 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F646 中实现。\n* 修复：为 StreamableHTTPServer 的 DELETE 处理程序添加缺失的会话清理，由 @cnnrznn 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F667 中实现。\n* 实现 Elicitation URL 模式，以符合 MCP 规范 2025-11-25，由 @dask-58 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F666 中实现。\n* 功能：为手动 DNS 解析添加 Host 头覆盖支持，由 @ComingCL 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F674 中实现。\n* 修复：由于 MCP 服务器选择了较低版本，可能会抛出“不支持 2025-11-25 协议版本”的错误，由 @yuehaii 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F687 中实现。\n* 为 ToolInputSchema 添加 AdditionalProperties，由 @mohit-gupta-glean 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F678 中实现。\n* 修复：修复 TestSSE_SendRequest_Timeout 测试中的不稳定问题，由 @everfid-ever 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F683 中实现。\n* 功能：添加 2025-11-25 版本及该版本的单元测试，由 @CocaineCong 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F684 中实现。\n* 修复：在 StreamableHTTP 中使用 sync.Once 确保 Close 方法的线程安全，由 @semihbkgr 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F685 中实现。\n* 文档：修复 ListTools 的用法，使其包含 ListToolsRequest 参数，由 @everfid-ever 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F681 中实现。\n* 修复：对于无效的会话 ID，返回 404 而不是 400，由 @burugo 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F689 中实现。\n* 修复：将 NewToolResultAudio 的第二个参数从 imageData 重命名为 aud…，由 @mosesyu95 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F691 中实现。\n* 自动补全的服务器处理器实现，由 @e","2026-02-15T12:23:37",{"id":167,"version":168,"summary_zh":78,"released_at":169},108184,"v0.44.0-beta.3","2026-02-04T09:08:19",{"id":171,"version":172,"summary_zh":173,"released_at":174},108185,"v0.44.0-beta.2","## 变更内容\n* 实现 MCP 规范 2025-11-25 的 Elicitation URL 模式，由 @dask-58 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F666 中完成\n* 功能：添加对手动 DNS 解析的 Host 头部覆盖支持，由 @ComingCL 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F674 中完成\n* 修复：当 MCP 服务器选择较低版本时，可能会抛出“不支持的协议版本 2025-11-25”错误，由 @yuehaii 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F687 中修复\n* 向 ToolInputSchema 添加 AdditionalProperties，由 @mohit-gupta-glean 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F678 中完成\n* 修复：修复 TestSSE_SendRequest_Timeout 不稳定的测试用例，由 @everfid-ever 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F683 中完成\n* 功能：添加 2025-11-25 版本及该版本的单元测试，由 @CocaineCong 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F684 中完成\n* 修复：在 StreamableHTTP 中使用 sync.Once 确保 Close 方法线程安全，由 @semihbkgr 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F685 中完成\n* 文档：修正 ListTools 的使用说明，使其包含 ListToolsRequest 参数，由 @everfid-ever 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F681 中完成\n* 修复：对于无效的会话 ID，返回 404 而不是 400 错误，由 @burugo 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F689 中完成\n* 修复：将 NewToolResultAudio 的第二个参数从 imageData 重命名为 aud…，由 @mosesyu95 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F691 中完成\n* 实现自动补全的服务器处理器，由 @ezraisw 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F679 中完成\n* 修复：客户端设置的头部信息丢失的问题，由 @button-chen 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F686 中完成\n\n## 新贡献者\n* @ComingCL 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F674 中完成了首次贡献\n* @mohit-gupta-glean 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F678 中完成了首次贡献\n* @semihbkgr 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F685 中完成了首次贡献\n* @burugo 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F689 中完成了首次贡献\n* @mosesyu95 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F691 中完成了首次贡献\n* @ezraisw 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F679 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.44.0-beta.1...v0.44.0-beta.2","2026-01-09T13:33:53",{"id":176,"version":177,"summary_zh":178,"released_at":179},108186,"v0.44.0-beta.1","## 变更内容\n* 功能：延迟加载工具，以支持 Anthropic 的“工具搜索”模式，由 @wolfeidau 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F644 中实现。\n* 修复：如果 responseWriter 不支持 Flush，则返回错误，由 @JoelPfaffDD 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F652 中实现。\n* 增加图标支持，以符合 MCP 规范 2025-11-25 版本，由 @dask-58 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F660 中实现。\n* 修复：为静态令牌的 401 响应添加 ErrUnauthorized 标记，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F661 中实现。\n* 为注解添加 lastModified 字段，以符合 MCP 规范 2025-11-25 版本，由 @dask-58 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F663 中实现。\n* 添加服务器端对 MCP 任务的支持，由 @JAORMX 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F635 中实现。\n* 修复：在写入响应之前清空所有待处理的通知，以避免遗漏通知，由 @archit-harness 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F670 中实现。\n* 修复资源切片为 nil 的问题，由 @furysama 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F665 中实现。\n* 为注解相关函数添加文档字符串，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F673 中实现。\n* 修复：为 SSE 响应增加超时机制，以防止无限期阻塞，由 @everfid-ever 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F668 中实现。\n* 首先尝试使用 OAuth 授权服务器元数据，由 @staugaard 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F669 中实现。\n* 修复（OAuth）：即使状态码为 200，也要检查 OAuth 错误响应，由 @sd2k 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F646 中实现。\n* 修复：为 StreamableHTTPServer 的 DELETE 处理程序添加缺失的会话清理功能，由 @cnnrznn 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F667 中实现。\n\n## 新贡献者\n* @wolfeidau 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F644 中完成了首次贡献。\n* @JoelPfaffDD 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F652 中完成了首次贡献。\n* @dask-58 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F660 中完成了首次贡献。\n* @JAORMX 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F635 中完成了首次贡献。\n* @archit-harness 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F670 中完成了首次贡献。\n* @furysama 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F665 中完成了首次贡献。\n* @everfid-ever 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F668 中完成了首次贡献。\n* @staugaard 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F669 中完成了首次贡献。\n* @cnnrznn 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F667 中完成了首次贡献。\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.43.2...v0.44.0-beta.1","2025-12-19T19:05:05",{"id":181,"version":182,"summary_zh":183,"released_at":184},108187,"v0.43.2","## 变更内容\n* 修复：通知导致客户端工具调用中断，由 @yuehaii 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F642 中完成\n* 修复：在反序列化 ToolArgumentsSchema 时，处理 $defs 或 definitions 字段，由 @sd2k 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F645 中完成\n\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.43.1...v0.43.2","2025-12-04T09:26:42",{"id":186,"version":187,"summary_zh":188,"released_at":189},108188,"v0.43.1","## 变更内容\n* 修复：由 ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F641 中创建 StatelessGeneratingSessionIdManager，以解决多实例部署问题。\n* 修复：由 Anko59 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F640 中实现适用于可流式传输的 HttpSession 的 SessionWithClientInfo。\n\n## 新贡献者\n* Anko59 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F640 中完成了首次贡献。\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.43.0...v0.43.1","2025-11-23T16:26:46",{"id":191,"version":192,"summary_zh":193,"released_at":194},108189,"v0.43.0","## 变更内容\n* 功能：新增对客户端请求中自定义 HTTP 头的支持，由 @matthisholleville 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F546 中实现。\n* 功能：新增 SessionWithResourceTemplates，用于会话级别的资源模板，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F624 中实现。\n* 功能（mcp）：添加 SessionIdManagerResolver 接口，用于基于请求的会话管理，由 @aradyaron 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F626 中实现。\n* 功能（mcp）：为 HTTP 和 Stdio 客户端新增 `Roots` 功能，由 @yuehaii 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F620 中实现。\n* 功能（mcp）：根据 MCP 规范，在 Implementation 结构体中新增 Title 字段，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F633 中实现。\n* 修复（toocall）：正确设置自定义头，以确保请求被正确处理，由 @cx215133873 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F632 中实现。\n\n## 新贡献者\n* @aradyaron 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F626 中完成了首次贡献。\n* @yuehaii 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F620 中完成了首次贡献。\n* @cx215133873 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F632 中完成了首次贡献。\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.42.0...v0.43.0","2025-11-02T14:48:47",{"id":196,"version":197,"summary_zh":198,"released_at":199},108190,"v0.43.0-beta.3","## 变更内容\n* 功能(mcp)：添加 `SessionIdManagerResolver` 接口，用于基于请求的会话管理，由 @aradyaron 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F626 中实现。\n* 功能(mcp)：为 HTTP 和 Stdio 客户端添加 `Roots` 功能，由 @yuehaii 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F620 中实现。\n\n## 新贡献者\n* @aradyaron 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F626 中完成了首次贡献。\n* @yuehaii 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F620 中完成了首次贡献。\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.43.0-beta.2...v0.43.0-beta.3","2025-10-30T11:22:46",{"id":201,"version":202,"summary_zh":203,"released_at":204},108191,"v0.43.0-beta.2","## 变更内容\n* 功能新增：添加 `SessionWithResourceTemplates`，用于会话专属的资源模板，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F624 中实现。\n\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.43.0-beta.1...v0.43.0-beta.2","2025-10-25T07:37:01",{"id":206,"version":207,"summary_zh":208,"released_at":209},108192,"v0.43.0-beta.1","## 变更内容\n* 功能新增：支持在客户端请求中自定义 HTTP 头，由 @matthisholleville 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F546 中实现。\n\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.42.0...v0.43.0-beta.1","2025-10-21T17:18:48",{"id":211,"version":212,"summary_zh":213,"released_at":214},108193,"v0.42.0","## 变更内容\n* HTTP 采样改进，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F601 中完成\n* 功能：更新 _meta 字段的类型定义，使其适用于文本\u002F二进制资源。由 @rabbah 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F591 中完成\n* 修复：文档中的拼写错误，由 @Artmorse 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F608 中完成\n* 修复：防止在未进行有效会话初始化的情况下调用工具，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F607 中完成\n* 修复：使 transport 的 Start() 方法具有幂等性，以解决 #583 问题，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F606 中完成\n* 功能：将资源中间件扩展至资源模板，由 @tjhop 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F582 中完成\n* 在序列化为 JSON 时保留 Tool 的 _meta 字段，由 @jaredly 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F609 中完成\n* 修复：在可流式传输的 HTTP 传输中正确重用会话，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F615 中完成\n* 添加对会话特定资源的支持，由 @jaredly 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F610 中完成\n* 功能：添加会话资源辅助函数，由 @ezynda3 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F617 中完成\n* [disable-stream] 向 StreamableHTTP 服务器添加 WithDisableStreaming 选项，以允许禁用流式传输，由 @jaredly 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F613 中完成\n* 功能：向 OAuthConfig 添加 HTTP 客户端选项，由 @sd2k 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F616 中完成\n* 功能 (mcp)：添加 WithAny，以实现灵活的工具属性，由 @otaviof 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F618 中完成\n* 📝 为 `issue-345-withany` 添加文档字符串，由 @coderabbitai[bot] 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F619 中完成\n\n## 新贡献者\n* @rabbah 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F591 中完成了首次贡献\n* @Artmorse 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F608 中完成了首次贡献\n* @jaredly 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F609 中完成了首次贡献\n* @otaviof 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F618 中完成了首次贡献\n* @coderabbitai[bot] 在 https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F619 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.41.1...v0.42.0","2025-10-21T07:29:38",{"id":216,"version":217,"summary_zh":218,"released_at":219},108194,"v0.42.0-beta.3","## What's Changed\r\n* Add support for Session-specific resources by @jaredly in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F610\r\n* feat: Add session resource helper functions by @ezynda3 in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F617\r\n* [disable-stream] Add WithDisableStreaming option to StreamableHTTP server to allow disabling streaming by @jaredly in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F613\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.42.0-beta.2...v0.42.0-beta.3","2025-10-17T13:45:33",{"id":221,"version":222,"summary_zh":223,"released_at":224},108195,"v0.42.0-beta.2","## What's Changed\r\n* fix: documentation typos by @Artmorse in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F608\r\n* fix: prevent tools invocation without valid session initialization by @ezynda3 in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F607\r\n* fix: make transport Start() idempotent to resolve issue #583 by @ezynda3 in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F606\r\n* feat: extend resource middlewares to resource templates by @tjhop in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F582\r\n* Preserve Tool _meta when marshaling to JSON by @jaredly in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F609\r\n* fix: reuse sessions correctly in streamable HTTP transport by @ezynda3 in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F615\r\n\r\n## New Contributors\r\n* @Artmorse made their first contribution in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F608\r\n* @jaredly made their first contribution in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F609\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.42.0-beta.1...v0.42.0-beta.2","2025-10-14T18:49:27",{"id":226,"version":227,"summary_zh":228,"released_at":229},108196,"v0.42.0-beta.1","## What's Changed\r\n* HTTP Sampling Improvements by @ezynda3 in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F601\r\n* feat: update type definition of _meta field to text\u002Fblob resources. by @rabbah in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F591\r\n\r\n## New Contributors\r\n* @rabbah made their first contribution in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F591\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.41.1...v0.42.0-beta.1","2025-09-30T16:34:16",{"id":231,"version":232,"summary_zh":233,"released_at":234},108197,"v0.41.1","## What's Changed\r\n* fix: replace bufio.Scanner with bufio.Reader to support large message… by @ezynda3 in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F603\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.41.0...v0.41.1","2025-09-30T15:45:21",{"id":236,"version":237,"summary_zh":238,"released_at":239},108198,"v0.41.0","## What's Changed\r\n* fix(oauth): use oauth-authorization-server discovery before default endpoints by @trungutt in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F581\r\n* Improve JSON-RPC error handling with typed errors and response constructors by @peteski22 in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F595\r\n* fix: Streamable HTTP client ping response handling by @havasik in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F578\r\n* feat: add support for call tool result annotations by @Crescent617 in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F547\r\n\r\n## New Contributors\r\n* @trungutt made their first contribution in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F581\r\n* @havasik made their first contribution in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F578\r\n* @Crescent617 made their first contribution in https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fpull\u002F547\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fmark3labs\u002Fmcp-go\u002Fcompare\u002Fv0.40.0...v0.41.0","2025-09-27T21:01:45"]