[{"data":1,"prerenderedAt":4928},["ShallowReactive",2],{"search-docs":3,"doc-\u002Fai\u002Fmcp\u002Fserver":886},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,159,162,165,169,172,175,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,269,273,277,281,285,288,291,294,298,301,304,307,310,313,316,319,322,325,329,332,336,340,344,348,352,356,359,362,365,368,371,374,377,380,383,386,389,393,396,399,402,405,408,411,414,417,420,424,428,432,435,438,442,446,450,454,458,462,466,470,474,477,480,483,487,491,494,497,500,504,507,511,515,518,521,524,527,530,533,536,539,542,545,548,551,554,557,560,563,566,569,572,575,579,583,587,591,595,599,603,606,610,614,617,620,623,626,629,633,637,640,643,646,649,652,655,658,661,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,716,720,724,728,732,736,740,744,748,752,756,760,764,768,772,775,779,783,787,790,793,796,799,802,805,808,811,814,818,822,825,829,832,835,838,841,844,848,851,854,858,862,865,869,873,876,879,882],{"path":5,"title":6,"description":7},"\u002Fabout\u002Fauthor","作者相关","只想纯粹的做一个程序员...",{"path":9,"title":10,"description":11},"\u002Fabout\u002Fjourney","心路历程","",{"path":13,"title":14,"description":15},"\u002Fai\u002Fagent\u002Fframeworks","Agent 框架","主流 Agent 框架：LangChain、LlamaIndex、AutoGen、CrewAI",{"path":17,"title":18,"description":19},"\u002Fai\u002Fagent\u002Fhooks","Agent Hooks 与自动化","Claude Agent 的 Hooks 生命周期、事件类型、典型自动化场景",{"path":21,"title":22,"description":23},"\u002Fai\u002Fagent\u002Fintroduction","AI Agent 概述","AI Agent 核心概念：感知、规划、执行、记忆",{"path":25,"title":26,"description":27},"\u002Fai\u002Fagent\u002Fpractice","Agent 实战","AI Agent 实战：构建自主任务执行系统",{"path":29,"title":30,"description":31},"\u002Fai\u002Fagent\u002Fsdk","Claude Agent SDK 开发","使用 Claude Agent SDK 构建自定义 AI Agent：架构、API、生命周期",{"path":33,"title":34,"description":35},"\u002Fai\u002Fagent\u002Fsubagents","Subagents 子代理","用 Subagents 分解复杂任务、并发执行、隔离上下文",{"path":37,"title":38,"description":39},"\u002Fai\u002Fagent\u002Ftool-use","工具调用","AI Agent 工具调用：Function Calling、Tool Use 原理与实践",{"path":41,"title":42,"description":43},"\u002Fai\u002Ffundamentals\u002Fdeep-learning","深度学习入门","深度学习基础知识：前向传播、反向传播、损失函数、优化器",{"path":45,"title":46,"description":47},"\u002Fai\u002Ffundamentals\u002Fml-basics","机器学习基础","机器学习核心概念：监督学习、无监督学习、强化学习",{"path":49,"title":50,"description":51},"\u002Fai\u002Ffundamentals\u002Fneural-networks","神经网络原理","神经网络架构：CNN、RNN、注意力机制",{"path":53,"title":54,"description":55},"\u002Fai\u002Fgetting-started","AI 学习路线","AI 技术学习路线图，从基础到实战的完整指南",{"path":57,"title":58,"description":59},"\u002Fai\u002Fllm\u002Ffine-tuning","模型微调","大模型微调技术：LoRA、QLoRA、全量微调、RLHF",{"path":61,"title":62,"description":63},"\u002Fai\u002Fllm\u002Fintroduction","大模型概述","大语言模型发展历程、核心能力与主流模型对比",{"path":65,"title":66,"description":67},"\u002Fai\u002Fllm\u002Flocal-deploy","本地部署","大模型本地部署：Ollama、vLLM、llama.cpp",{"path":69,"title":70,"description":71},"\u002Fai\u002Fllm\u002Ftransformer","Transformer 架构","Transformer 架构详解：自注意力机制、位置编码、多头注意力",{"path":73,"title":74,"description":75},"\u002Fai\u002Fmcp\u002Fclient","MCP Client 开发","MCP Client 开发指南：连接、调用、集成",{"path":77,"title":78,"description":79},"\u002Fai\u002Fmcp\u002Fdebugging","MCP 调试与排错","MCP Server 开发与集成过程中的常见问题、日志分析、诊断工具",{"path":81,"title":82,"description":83},"\u002Fai\u002Fmcp\u002Fintroduction","MCP 概述","Model Context Protocol 协议概述：架构、核心概念、应用场景",{"path":85,"title":86,"description":87},"\u002Fai\u002Fmcp\u002Fserver","MCP Server 开发","MCP Server 开发指南：资源、工具、提示词的实现",{"path":89,"title":90,"description":91},"\u002Fai\u002Fmcp\u002Ftools","MCP Tools 深入","深入理解 MCP Tools：与 Resources\u002FPrompts 的差异、Schema 设计、Annotations 与权限控制",{"path":93,"title":94,"description":95},"\u002Fai\u002Fprompt\u002Fadvanced","高级 Prompt 模式","高级 Prompt 设计模式：Tree-of-Thought、自我反思、多轮对话策略",{"path":97,"title":98,"description":99},"\u002Fai\u002Fprompt\u002Fbasics","Prompt 基础","Prompt Engineering 入门：基本概念、角色设定、输出格式控制",{"path":101,"title":102,"description":103},"\u002Fai\u002Fprompt\u002Ftechniques","提示词技巧","常用提示词技巧：Few-shot、Chain-of-Thought、ReAct",{"path":105,"title":106,"description":107},"\u002Fai\u002Frag\u002Fembedding","文本嵌入","文本嵌入模型：Embedding 原理、模型选择、相似度计算",{"path":109,"title":110,"description":111},"\u002Fai\u002Frag\u002Fintroduction","RAG 概述","检索增强生成（RAG）架构原理、优势与应用场景",{"path":113,"title":114,"description":115},"\u002Fai\u002Frag\u002Fpractice","RAG 实战","RAG 应用实战：文档问答系统、知识库搭建",{"path":117,"title":118,"description":119},"\u002Fai\u002Frag\u002Fvector-database","向量数据库","主流向量数据库对比：Milvus、Pinecone、Chroma、Weaviate",{"path":121,"title":122,"description":123},"\u002Fai\u002Fskills\u002Fbest-practices","Skill 最佳实践","编写高质量 Skill 的设计原则、常见陷阱与优化技巧",{"path":125,"title":126,"description":127},"\u002Fai\u002Fskills\u002Fcreating","创建自定义 Skill","从零编写一个可被 Agent 自动发现和调用的 Skill",{"path":129,"title":130,"description":131},"\u002Fai\u002Fskills\u002Fintroduction","Agent Skills 概述","Claude Agent Skills 概念、工作原理、与 Tools\u002FMCP 的区别",{"path":133,"title":134,"description":135},"\u002Fgolang\u002Fadvanced\u002Fconcurrency","Go - 并发深入","深入理解 Go 并发编程的核心机制。",{"path":137,"title":138,"description":139},"\u002Fgolang\u002Fadvanced\u002Fgc","Go - 垃圾回收","理解 Go 的垃圾回收机制，掌握 GC 调优方法。",{"path":141,"title":142,"description":143},"\u002Fgolang\u002Fadvanced\u002Fgmp","Go - GMP 调度模型","GMP 是 Go 运行时调度器的核心模型，理解它对于编写高性能 Go 程序至关重要。",{"path":145,"title":146,"description":147},"\u002Fgolang\u002Fadvanced\u002Fgo-concurrency","Go - 并发编程","Go 的并发是其核心特性之一，通过 Goroutine 和 Channel 实现。",{"path":149,"title":150,"description":151},"\u002Fgolang\u002Fadvanced\u002Fmemory","Go - 内存模型","理解 Go 的内存分配机制和内存模型。",{"path":153,"title":154,"description":155},"\u002Fgolang\u002Fadvanced\u002Fprofiling","Go - 性能分析","掌握 Go 的性能分析工具：pprof、trace、benchmark。",{"path":157,"title":158,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-basic","Go - 基础语法",{"path":160,"title":161,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-composite","Go - 复合类型",{"path":163,"title":164,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-control","Go - 流程控制",{"path":166,"title":167,"description":168},"\u002Fgolang\u002Fcore\u002Fgo-error","Go - 错误处理","Go 使用显式的错误返回值来处理错误，而不是异常机制。",{"path":170,"title":171,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-function","Go - 函数",{"path":173,"title":174,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-install","Go - 环境搭建",{"path":176,"title":177,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-interface","Go - 接口",{"path":179,"title":180,"description":181},"\u002Fgolang\u002Fcore\u002Fgo-module","Go - 包管理","Go Modules 是 Go 1.11 引入的官方依赖管理方案，Go 1.16 后成为默认模式。",{"path":183,"title":184,"description":185},"\u002Fgolang\u002Fdistributed\u002Fgrpc","Go - gRPC","gRPC 是 Google 开发的高性能 RPC 框架，使用 Protocol Buffers 作为序列化协议。",{"path":187,"title":188,"description":189},"\u002Fgolang\u002Fdistributed\u002Fmicroservice","Go - 微服务","微服务架构的核心组件：服务发现、负载均衡、熔断降级。",{"path":191,"title":192,"description":193},"\u002Fgolang\u002Fdistributed\u002Fmq","Go - 消息队列","使用 Go 操作 Kafka 和 RabbitMQ。",{"path":195,"title":196,"description":197},"\u002Fgolang\u002Fdistributed\u002Fredis","Go - Redis","使用 go-redis 操作 Redis，实现缓存、分布式锁等功能。",{"path":199,"title":200,"description":201},"\u002Fgolang\u002Fengineering\u002Fconfig","Go - 配置管理","使用 viper 进行配置管理，支持多种配置格式和配置中心。",{"path":203,"title":204,"description":205},"\u002Fgolang\u002Fengineering\u002Fdocker","Go - Docker 部署","使用 Docker 容器化部署 Go 应用。",{"path":207,"title":208,"description":209},"\u002Fgolang\u002Fengineering\u002Fkubernetes","Go - Kubernetes 部署","在 Kubernetes 上部署和管理 Go 应用。",{"path":211,"title":212,"description":213},"\u002Fgolang\u002Fengineering\u002Flogging","Go - 日志系统","使用 zap 和 logrus 构建高性能结构化日志系统。",{"path":215,"title":216,"description":217},"\u002Fgolang\u002Fengineering\u002Ftesting","Go - 单元测试","Go 内置了强大的测试框架，掌握测试是编写高质量代码的基础。",{"path":219,"title":220,"description":221},"\u002Fgolang\u002Fstdlib\u002Fbufio","bufio","在 Go 语言中，bufio 包提供了带缓冲的 I\u002FO 操作，能够提高读写性能。以下是一些常用的 bufio 包 API 及其详细说明：",{"path":223,"title":224,"description":225},"\u002Fgolang\u002Fstdlib\u002Fcontainer","container","在Go语言标准库中，container 包提供了几种常用的数据结构实现，这些数据结构对于高效地管理和操作数据非常有用。以下是 container 包中主要的数据结构：",{"path":227,"title":228,"description":229},"\u002Fgolang\u002Fstdlib\u002Fcrypto","crypto","在 Go 语言中，crypto 包提供了一组用于加密和解密的功能。以下是一些常用的 crypto 包及其子包的 API 及其详细说明：",{"path":231,"title":232,"description":233},"\u002Fgolang\u002Fstdlib\u002Fencoding-csv","encoding\u002Fcsv","在 Go 语言中，encoding\u002Fcsv 包提供了对 CSV（逗号分隔值）文件进行读写的功能。以下是一些常用的 encoding\u002Fcsv 包的 API 及其详细说明：",{"path":235,"title":236,"description":237},"\u002Fgolang\u002Fstdlib\u002Fencoding-json","encoding\u002Fjson","在 Go 语言中，encoding\u002Fjson 包提供了对 JSON 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fjson 包的 API 及其详细说明：",{"path":239,"title":240,"description":241},"\u002Fgolang\u002Fstdlib\u002Fencoding-xml","encoding\u002Fxml","在 Go 语言中，encoding\u002Fxml 包提供了对 XML 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fxml 包的 API 及其详细说明：",{"path":243,"title":244,"description":245},"\u002Fgolang\u002Fstdlib\u002Fflag","flag","在Go语言中，flag 包是用于处理命令行参数的标准库，它提供了一种简单而直接的方式来解析和使用命令行参数。下面是关于 flag 包的一些基本介绍和常用功能：",{"path":247,"title":248,"description":249},"\u002Fgolang\u002Fstdlib\u002Ffmt","fmt","在 Go 语言的标准库中，fmt 包是非常重要的，它提供了处理格式化输入和输出的基本工具。以下是一些 fmt 包内常用的API：",{"path":251,"title":252,"description":253},"\u002Fgolang\u002Fstdlib\u002Fhttp","net\u002Fhttp","在 Go 语言中，net\u002Fhttp 包提供了用于构建 HTTP 客户端和服务器的强大工具。以下是一些常用的 net\u002Fhttp 包的 API 及其详细说明：",{"path":255,"title":256,"description":257},"\u002Fgolang\u002Fstdlib\u002Fio","io","在 Go 语言中，io 包提供了基本的输入输出功能。以下是一些常用的 io 包的 API 及其详细说明：",{"path":259,"title":260,"description":261},"\u002Fgolang\u002Fstdlib\u002Flog","log","在 Go 语言中，log 包提供了简单的日志记录功能。以下是一些常用的 log 包的 API 及其详细说明：",{"path":263,"title":264,"description":265},"\u002Fgolang\u002Fstdlib\u002Fmath","math","在 Go 语言中，math 包提供了基本的数学函数和常量。以下是一些常用的 math 包的 API 及其详细说明：",{"path":267,"title":268,"description":11},"\u002Fgolang\u002Fstdlib\u002Fnet","net",{"path":270,"title":271,"description":272},"\u002Fgolang\u002Fstdlib\u002Fos","os","在Go语言中，os 包是一个非常重要且常用的标准库，它提供了与操作系统交互的功能，包括文件操作、环境变量管理、进程管理等。下面是一些 os 包中常用的功能和API：",{"path":274,"title":275,"description":276},"\u002Fgolang\u002Fstdlib\u002Fsort","order","在 Go 语言中，sort 包提供了对切片和用户定义的集合进行排序的函数。它实现了常见的排序算法，如快速排序（Quicksort）和堆排序（Heapsort），并且为自定义集合提供了接口，使得用户可以根据特定的需求进行排序。",{"path":278,"title":279,"description":280},"\u002Fgolang\u002Fstdlib\u002Fstrconv","strconv","在 Go 语言中，strconv 包提供了字符串和基本数据类型之间的转换函数，例如将整数转换为字符串、字符串转换为整数，以及其他类型之间的转换。这些功能非常有用，特别是在处理用户输入或从外部数据源读取数据时。",{"path":282,"title":283,"description":284},"\u002Fgolang\u002Fstdlib\u002Ftime","time","在 Go 语言中，time 包提供了处理时间和日期的功能。以下是一些常用的 time 包的 API 及其详细说明：",{"path":286,"title":287,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ferror","Gin - 错误处理",{"path":289,"title":290,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ffile","Gin - 文件处理",{"path":292,"title":293,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fmiddleware","Gin - 中间件",{"path":295,"title":296,"description":297},"\u002Fgolang\u002Fweb\u002Fgin\u002Fquickstart","Gin - 快速开始","Gin 是目前最流行的 Go Web 框架，以高性能和简洁 API 著称。",{"path":299,"title":300,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frequest","Gin - 请求处理",{"path":302,"title":303,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fresponse","Gin - 响应处理",{"path":305,"title":306,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frouter","Gin - 路由",{"path":308,"title":309,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fvalidation","Gin - 参数校验",{"path":311,"title":312,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fassociation","GORM - 关联关系",{"path":314,"title":315,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fcrud","GORM - CRUD 操作",{"path":317,"title":318,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fmodel","GORM - 模型定义",{"path":320,"title":321,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fperformance","GORM - 日志与性能",{"path":323,"title":324,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquery","GORM - 高级查询",{"path":326,"title":327,"description":328},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquickstart","GORM - 快速开始","GORM 是 Go 语言最流行的 ORM 库，功能强大，使用简单。",{"path":330,"title":331,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Ftransaction","GORM - 事务与 Hook",{"path":333,"title":334,"description":335},"\u002Finterview\u002Fbasic","计算机基础面经","本章节汇总了面试中常见的通用技术概念，不局限于特定语言或数据库，是考察技术内功的关键考点。",{"path":337,"title":338,"description":339},"\u002Finterview\u002Fgolang","Golang 面试题","Go 语言面试高频考点，覆盖基础语法、数据结构、并发编程、内存管理、GC、调度器等核心知识。",{"path":341,"title":342,"description":343},"\u002Finterview\u002Fk8s","Kubernetes 面试题","Kubernetes（K8s）面试高频考点，覆盖架构原理、核心资源、网络存储、调度策略、运维监控等核心知识。",{"path":345,"title":346,"description":347},"\u002Finterview\u002Fmysql","MySQL 面试题","MySQL 数据库面试高频考点，覆盖索引、事务、锁、优化、主从复制等核心知识。",{"path":349,"title":350,"description":351},"\u002Finterview\u002Fredis","Redis 面试题","Redis 面试高频考点，覆盖数据结构、持久化、集群、缓存一致性、性能优化等核心知识。",{"path":353,"title":354,"description":355},"\u002Finterview\u002Frocketmq","RocketMQ 面试题","RocketMQ 面试高频考点，覆盖消息模型、可靠性、顺序消息、事务消息、存储与高可用等核心知识。",{"path":357,"title":358,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-arraylist","List - ArrayList 源码解析",{"path":360,"title":361,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-linkedlist","List - LinkedList 源码解析",{"path":363,"title":364,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-stack","List - Satck源码解析",{"path":366,"title":367,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-vectore","List - Vector 源码解析",{"path":369,"title":370,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-hashmap","Map - HashMap 源码解析",{"path":372,"title":373,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-linkedhashmap","Map - LinkedHashMap 源码解析",{"path":375,"title":376,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-treemap","Map - TreeMap 源码解析",{"path":378,"title":379,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-deque","Queue - Deque 接口解析",{"path":381,"title":382,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-queue","Queue - Queue 接口解析",{"path":384,"title":385,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-hashset","Set - HashSet源码解析",{"path":387,"title":388,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-linkedhashset","Set - LinkedHashSet 源码解析",{"path":390,"title":391,"description":392},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-treeset","Set - TreeSet源码解析","TreeSet 是一个 Set 集合接口的实现类，与 HashSet 类似，其底层也是通过维护了一个 TreeMap 对象来封装了一些实现方法，故本篇不再对 TreeSet 的底层原理进行详细说明，仅对常用 API 做简单介绍，如需了解 TreeMap 的底层实现原理，请移步 Map - HashMap 源码解析",{"path":394,"title":395,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fannotation","Java核心 - 注解",{"path":397,"title":398,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fbasic-grammar","Java核心 - 基础语法",{"path":400,"title":401,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fclass-and-object","Java核心 - 面向对象",{"path":403,"title":404,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fcommon-classes","Java核心 - 常用类",{"path":406,"title":407,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fexception","Java核心 - 异常处理",{"path":409,"title":410,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fgenerics","Java核心 - 泛型",{"path":412,"title":413,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fjdk-env-path","Java核心 - 环境搭建",{"path":415,"title":416,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Freflection","Java核心 - 反射",{"path":418,"title":419,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fstring","Java核心 - String 字符串",{"path":421,"title":422,"description":423},"\u002Fother\u002Fjava\u002Fio\u002Fbuffer-stream","Java IO - 缓冲流","缓冲流是对基本流的包装，通过内置缓冲区减少系统调用次数，大幅提升读写效率。",{"path":425,"title":426,"description":427},"\u002Fother\u002Fjava\u002Fio\u002Fbyte-stream","Java IO - 字节流","字节流是 Java IO 中最基本的流类型，以字节（byte）为单位进行数据读写，可以处理任意类型的文件。",{"path":429,"title":430,"description":431},"\u002Fother\u002Fjava\u002Fio\u002Fchar-stream","Java IO - 字符流","字符流以字符为单位进行读写，专门用于处理文本文件。相比字节流，字符流能够正确处理字符编码，避免中文乱码问题。",{"path":433,"title":434,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Ffile","Java IO - File 类",{"path":436,"title":437,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Fio-stream-system","Java IO - IO流概述",{"path":439,"title":440,"description":441},"\u002Fother\u002Fjava\u002Fio\u002Fnio","Java IO - NIO","NIO（New IO）是 JDK 1.4 引入的新 IO 模型，提供了更高效的 IO 操作方式，支持非阻塞 IO 和多路复用。",{"path":443,"title":444,"description":445},"\u002Fother\u002Fjava\u002Fjvm\u002Fclass-loading","类加载机制","类加载机制是 JVM 将 .class 文件加载到内存，并对数据进行校验、转换解析和初始化，最终形成可被 JVM 直接使用的 Java 类型的过程。",{"path":447,"title":448,"description":449},"\u002Fother\u002Fjava\u002Fjvm\u002Fgarbage-collection","垃圾回收","垃圾回收（Garbage Collection，GC）是 JVM 自动管理内存的机制，负责回收不再使用的对象所占用的内存。",{"path":451,"title":452,"description":453},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-memory","JVM 内存结构","JVM 在执行 Java 程序时，会把它管理的内存划分为若干个不同的数据区域。这些区域有各自的用途、创建和销毁时间。",{"path":455,"title":456,"description":457},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-tuning","JVM 调优","JVM 调优是优化 Java 应用性能的重要手段，主要包括参数配置、性能监控和问题排查。",{"path":459,"title":460,"description":461},"\u002Fother\u002Fjava\u002Fthread\u002Fatomic","原子类","Java 原子类（Atomic Classes）提供了一种无锁的线程安全方式，基于 CAS（Compare-And-Swap）操作实现。",{"path":463,"title":464,"description":465},"\u002Fother\u002Fjava\u002Fthread\u002Fcompletable-future","CompletableFuture","CompletableFuture 是 JDK 8 引入的异步编程工具，实现了 Future 和 CompletionStage 接口，支持函数式编程和链式调用。",{"path":467,"title":468,"description":469},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-collections","并发集合","Java 并发包提供了多种线程安全的集合类，用于替代传统的同步集合（如 Collections.synchronizedList）。",{"path":471,"title":472,"description":473},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-utils","并发工具类","Java 并发包提供了多种实用的并发工具类，用于控制线程之间的协调与同步。",{"path":475,"title":476,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fsynchronized-lock","同步机制",{"path":478,"title":479,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-basic","线程基础",{"path":481,"title":482,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-pool","线程池",{"path":484,"title":485,"description":486},"\u002Fother\u002Fspring-series\u002Fspring\u002Fannotations-beans","Spring - 基于注解管理Bean","从 Java 5 开始，Java 增加了对注解（Annotation）的支持，它是代码中的一种特殊标记，可以在编译、类加载和运行时被读取，执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下，在源代码中嵌入补充信息。",{"path":488,"title":489,"description":490},"\u002Fother\u002Fspring-series\u002Fspring\u002Fimplement-ioc","Spring - 原理手写IoC","Spring 框架的 IOC 是基于 Java 反射机制实现的，在学习手写 IoC 之前，你需要具备一定的 Java 反射相关的知识，参考本站内的 Java 教程。",{"path":492,"title":493,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fintroduction-case","Spring - 入门案例",{"path":495,"title":496,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aop","Spring - 面向切面AOP",{"path":498,"title":499,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aot","Spring - AOT提前编译",{"path":501,"title":502,"description":503},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-data-validation","Spring - 数据校验","在开发中，我们经常遇到参数校验的需求，比如用户注册的时候，要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式，我们会把校验的代码和真正的业务处理逻辑耦合在一起，而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则，把校验和业务逻辑分离开，让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装，方便在Spring中使用。",{"path":505,"title":506,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-i18n","Spring - 国际化i18n",{"path":508,"title":509,"description":510},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-ioc","Spring - IOC容器","IoC 是 Inversion of Control 的简写，译为“控制反转”，它不是一门技术，而是一种设计思想，是一个重要的面向对象编程法则，能够指导我们如何设计出松耦合、更优良的程序。",{"path":512,"title":513,"description":514},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-junit","Spring - 单元测试JUnit","在之前的测试方法中，几乎都能看到以下的两行代码：",{"path":516,"title":517,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-resources","Spring - 资源操作",{"path":519,"title":520,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-summarize","Spring - Spring概述",{"path":522,"title":523,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-transaction","Spring - 事务",{"path":525,"title":526,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fxml-beans","Spring - 基于XML管理Bean",{"path":528,"title":529,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-config","SpringBoot - 配置详解",{"path":531,"title":532,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-data","SpringBoot - 数据访问",{"path":534,"title":535,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-quickstart","SpringBoot - 快速入门",{"path":537,"title":538,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-web","SpringBoot - Web 开发",{"path":540,"title":541,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-config","SpringCloud - 配置中心",{"path":543,"title":544,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-discovery","SpringCloud - 服务注册与发现",{"path":546,"title":547,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-feign","SpringCloud - 服务调用",{"path":549,"title":550,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-gateway","SpringCloud - 服务网关",{"path":552,"title":553,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-introduction","SpringCloud - 微服务概述",{"path":555,"title":556,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-sentinel","SpringCloud - 服务保护",{"path":558,"title":559,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-databind","SpringMVC - 数据绑定与转换",{"path":561,"title":562,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-exception","SpringMVC - 异常处理",{"path":564,"title":565,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-interceptor","SpringMVC - 拦截器",{"path":567,"title":568,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-introduction","SpringMVC - 简介与环境搭建",{"path":570,"title":571,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-request","SpringMVC - 请求处理",{"path":573,"title":574,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-response","SpringMVC - 响应处理",{"path":576,"title":577,"description":578},"\u002Fproject\u002Frocket-leaf\u002Farchitecture","项目架构","Rocket-Leaf 的目录结构、模块划分、数据流向，以及各层之间的依赖关系。",{"path":580,"title":581,"description":582},"\u002Fproject\u002Frocket-leaf\u002Fbackend-layers","后端分层设计","Rocket-Leaf 的 model \u002F rocketmq \u002F service 三层结构，以及服务之间的依赖关系与设计取舍。",{"path":584,"title":585,"description":586},"\u002Fproject\u002Frocket-leaf\u002Fclient-manager","RocketMQ 客户端管理器","AdminClientManager 的多客户端池、默认连接懒加载、自动重连重试的设计与实现。",{"path":588,"title":589,"description":590},"\u002Fproject\u002Frocket-leaf\u002Fencryption","连接信息加密存储","AES-256-GCM + SHA-256 字段级派生密钥的实现，以及如何在不破坏兼容性的前提下为历史明文数据做透明迁移。",{"path":592,"title":593,"description":594},"\u002Fproject\u002Frocket-leaf\u002Ffrontend","前端结构与类型绑定","React + Vite 目录组织、自动生成的 Wails 绑定、api 薄封装与自定义 hooks 的职责划分。",{"path":596,"title":597,"description":598},"\u002Fproject\u002Frocket-leaf","项目简介","Rocket-Leaf 是一款基于 Wails v3 构建的跨平台 RocketMQ 桌面管理客户端，Go 后端 + React 前端。本文档系列拆解它的架构与关键实现。",{"path":600,"title":601,"description":602},"\u002Fproject\u002Frocket-leaf\u002Fwails-v3","Wails v3 入门","Wails v3 的核心概念、Service 绑定机制，以及 Rocket-Leaf 是如何用它把 Go 后端和 React 前端打通的。",{"path":604,"title":605,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-basic","Docker - 入门基础",{"path":607,"title":608,"description":609},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-compose","Docker - Compose","在部署应用时，常常使用到不止一个容器，那么在部署容器的时候就需要一个一个进行部署，这样的部署过程也相对来说比较繁琐复杂，也容易出问题，那么有没有一种更为简单的方法呢？",{"path":611,"title":612,"description":613},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-container-connection","Docker - 容器互联","在上一个章节中我们学习了 Docker 容器的端口映射，可以将 Docker 容器和本地以及网络中的端口进行连接起来。",{"path":615,"title":616,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-dockerfile","Docker - Dockerfile",{"path":618,"title":619,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-helloworld","Docker - HelloWorld",{"path":621,"title":622,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-install","Docker - 安装",{"path":624,"title":625,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-introduce","Docker - 简介",{"path":627,"title":628,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-object","Docker - 镜像、容器、仓库",{"path":630,"title":631,"description":632},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-warehouse","Docker - 仓库管理","仓库是集中存放资源的地方，代码仓库是存放代码的，那么Docker 中的仓库就是存放 Docker 镜像的。",{"path":634,"title":635,"description":636},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-web-containers","Docker - WEB应用实例","在之前的章节中，仅对普通容器进行了演示，但在实际中常常使用到 Docker 容器中的 WEB 应用程序。",{"path":638,"title":639,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-config","Kubernetes - ConfigMap 与 Secret",{"path":641,"title":642,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-helm","Kubernetes - Helm 包管理",{"path":644,"title":645,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-install","Kubernetes - 集群安装",{"path":647,"title":648,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-introduction","Kubernetes - 简介与架构",{"path":650,"title":651,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-kubectl","Kubernetes - kubectl 命令行工具",{"path":653,"title":654,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-monitoring","Kubernetes - 监控与日志",{"path":656,"title":657,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-network-security","Kubernetes - 网络与安全",{"path":659,"title":660,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-service","Kubernetes - Service 与 Ingress",{"path":662,"title":663,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-storage","Kubernetes - 持久化存储",{"path":665,"title":666,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-workload","Kubernetes - 工作负载资源",{"path":668,"title":669,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-bash","Linux - Bash 基础语法",{"path":671,"title":672,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-file-directory","Linux - 文件与目录操作",{"path":674,"title":675,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-network","Linux - 网络配置",{"path":677,"title":678,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-package","Linux - 软件包管理",{"path":680,"title":681,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-process","Linux - 进程管理",{"path":683,"title":684,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-scripts","Linux - 常用脚本示例",{"path":686,"title":687,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-service","Linux - 服务管理",{"path":689,"title":690,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-user-permission","Linux - 用户与权限管理",{"path":692,"title":693,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-https","Nginx - HTTPS 配置",{"path":695,"title":696,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-install","Nginx - 安装与配置",{"path":698,"title":699,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-loadbalance","Nginx - 负载均衡",{"path":701,"title":702,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-optimization","Nginx - 性能优化",{"path":704,"title":705,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-proxy","Nginx - 反向代理",{"path":707,"title":708,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-static","Nginx - 静态资源服务",{"path":710,"title":711,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-vhost","Nginx - 虚拟主机配置",{"path":713,"title":714,"description":715},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-architecture","MySQL 高可用架构","主从复制、读写分离、分库分表。",{"path":717,"title":718,"description":719},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-index","MySQL 索引","索引是帮助 MySQL 高效获取数据的有序数据结构。",{"path":721,"title":722,"description":723},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-lock","MySQL 锁","锁用于解决并发访问时的数据一致性问题。",{"path":725,"title":726,"description":727},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-optimize","MySQL 性能优化","SQL 优化是后端开发必备技能。",{"path":729,"title":730,"description":731},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-transaction","MySQL 事务","事务是一组不可分割的操作，要么全部成功，要么全部失败。",{"path":733,"title":734,"description":735},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-advanced","SQL 进阶","多表查询、子查询、函数、视图、存储过程。",{"path":737,"title":738,"description":739},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-basic","SQL 基础","SQL（Structured Query Language）是操作关系型数据库的标准语言。",{"path":741,"title":742,"description":743},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-advanced","Redis 进阶功能","事务、发布订阅、Lua 脚本、Pipeline。",{"path":745,"title":746,"description":747},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-basic","Redis 基础","Redis 安装配置与基本命令。",{"path":749,"title":750,"description":751},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-cluster","Redis 高可用","主从复制、哨兵、Cluster 集群。",{"path":753,"title":754,"description":755},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-datatype","Redis 数据类型","Redis 5 种基本数据类型 + 4 种特殊类型。",{"path":757,"title":758,"description":759},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-optimize","Redis 性能优化","内存优化、缓存问题、最佳实践。",{"path":761,"title":762,"description":763},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-persistence","Redis 持久化","Redis 提供 RDB 和 AOF 两种持久化方式。",{"path":765,"title":766,"description":767},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-principle","Redis 底层原理","数据结构、线程模型、网络模型。",{"path":769,"title":770,"description":771},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fbehaiver-patterns\u002Fobserver-pattern","观察者模式","观察者模式属于行为型模式，定义了对象之间的一对多的依赖关系，在这种模式中，当一个对象的状态发生变化时，所有依赖于它的对象都会得到通知，并且执行相关操作。观察者模式又被成为“发布—订阅模式”，即发布者发生改变后，会通知所有订阅者。",{"path":773,"title":774,"description":11},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Ffactory-pattern","工厂模式",{"path":776,"title":777,"description":778},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Fsingleton-pattern","单例模式","单例模式是最常用的设计模式之一，他可以保证在整个应用中，某个类只存在一个实例化对象，即全局使用到该类的只有一个对象，这种模式在需要限制某些类的实例数量时非常有用，通常全局只需要一个该对象即可，如一些配置文件映射对象、数据库连接对象等。",{"path":780,"title":781,"description":782},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fstructural-patterns\u002Fadapter-pattern","适配器模式","适配器模式是一种结构型模式，可以将一个类的接口转换成客户端所期望的另一种接口，适配器模式可以帮助开发人员在不修改现有代码的情况下，将不兼容的类组合在一起。",{"path":784,"title":785,"description":786},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-basic-operations","Git 创建版本库","在 Git 上创建版本库有两种方式，一种是直接拷贝远程 Git 仓库到本地，另外一种是我们自己创建本地的版本库。",{"path":788,"title":789,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-branch-manage","Git 分支管理",{"path":791,"title":792,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-content-operations","Git 仓库内容操作",{"path":794,"title":795,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-introduce-install","Git 介绍和安装",{"path":797,"title":798,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-remote-manage","Git 远程管理",{"path":800,"title":801,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-workspace-index-repo","Git 工作原理",{"path":803,"title":804,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fhomebrew","HomeBrew 教程",{"path":806,"title":807,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fidea\u002Fshortcuts","快捷键",{"path":809,"title":810,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fmaven\u002Fintroduce-install-config","Maven - 介绍、安装、配置",{"path":812,"title":813,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fbasic-knowledge","2. 基础知识",{"path":815,"title":816,"description":817},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomponent-communication","9. 组件通信","在前面的章节内，介绍了 Vue 中最核心的内容——组件的介绍和使用，和 Java 等编程语言相反，组件并不近似于这些变成语言中的类，类可以通过类或者其实例化的对象来相互交互，但 Vue 组件之间的作用域是相互独立的，这就意味着不同组件之间的数据无法相互引用。",{"path":819,"title":820,"description":821},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomputed","4. 计算属性","虽然直接在模板中使用表达式方便，但是如果在模板中添加很多逻辑，会让模板变的臃肿且难维护，耦合度较高。有没有一种简单的方式来实现呢？答案是有的。",{"path":823,"title":824,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcreate-vue-project","1. 环境搭建及安装",{"path":826,"title":827,"description":828},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Flife-cycle","6. 生命周期","生命周期是指组件从创建、挂载、更新到销毁的整个过程中所经历的一系列阶段。在 Vue 中，每个组件都有自己的生命周期，可以通过生命周期钩子函数来监听和处理组件在不同阶段的行为和状态。",{"path":830,"title":831,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fother-api","10. 其他 API",{"path":833,"title":834,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fpinia","8. Pinia",{"path":836,"title":837,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Frouter","7. 路由",{"path":839,"title":840,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Ftemplate-grammar","3. 指令及模板语法",{"path":842,"title":843,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fvue3-new-component","11. Vue3 新组件",{"path":845,"title":846,"description":847},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fwatch","5. 监视","Watch 是 Vue 提供的一个用于监视响应式数据变化并执行相应操作的 API，能够对响应式数据的变化做出一些操作的功能。Vue3 中的 Watch 支持多种用法，包括监视响应式对象、ref 对象、数组、函数等。",{"path":849,"title":850,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-introduction","Kafka 简介与安装",{"path":852,"title":853,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-producer-consumer","Kafka 生产者与消费者",{"path":855,"title":856,"description":857},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-springboot","Spring Boot 整合 Kafka","Spring Kafka 提供了对 Apache Kafka 的便捷集成。",{"path":859,"title":860,"description":861},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-exchange","RabbitMQ Exchange 详解","Exchange（交换机）是 RabbitMQ 的核心组件，负责接收生产者发送的消息，并根据规则将消息路由到一个或多个队列。",{"path":863,"title":864,"description":11},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-introduction","RabbitMQ 简介与安装",{"path":866,"title":867,"description":868},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-reliability","RabbitMQ 消息可靠性","消息可靠性是消息队列的核心要求，RabbitMQ 提供了多种机制来保证消息不丢失。",{"path":870,"title":871,"description":872},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-springboot","Spring Boot 整合 RabbitMQ","Spring AMQP 提供了对 RabbitMQ 的便捷集成，大大简化了开发工作。",{"path":874,"title":875,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-client","RocketMQ 客户端使用",{"path":877,"title":878,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-concepts","RocketMQ 核心概念",{"path":880,"title":881,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-installation","RocketMQ 安装部署",{"path":883,"title":884,"description":885},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-message-type","RocketMQ 消息类型","RocketMQ 支持多种消息类型，满足不同业务场景需求。",{"id":887,"title":86,"body":888,"description":87,"extension":4923,"meta":4924,"navigation":956,"path":85,"seo":4925,"stem":4926,"__hash__":4927},"docs\u002Fai\u002Fmcp\u002Fserver.md",{"type":889,"value":890,"toc":4889},"minimark",[891,895,904,908,911,916,919,975,978,981,989,993,997,1004,1160,1163,1167,1170,1173,1180,1310,1314,1318,1321,1545,1548,1551,1674,1677,1680,1759,1763,1766,1769,1878,1882,1885,2042,2045,2048,2116,2120,2123,2276,2279,2282,2285,2288,2291,2297,2301,2304,2356,2360,2363,3257,3261,3265,3268,4410,4414,4417,4457,4460,4476,4479,4483,4486,4495,4634,4637,4639,4642,4684,4687,4690,4740,4782,4786,4789,4840,4843,4846,4885],[892,893,894],"h2",{"id":894},"概述",[896,897,898,899,903],"p",{},"MCP Server 是 MCP 架构中的核心组件，负责向 AI 应用暴露工具、资源和提示词模板等能力。本文将以 ",[900,901,902],"strong",{},"Python SDK"," 为主要示例，带你从零开始开发一个完整的 MCP Server。",[905,906,907],"note",{},"\nMCP 官方提供了 Python 和 TypeScript 两种 SDK。本文以 Python SDK 为主进行讲解，TypeScript SDK 的 API 设计基本一致。\n",[892,909,910],{"id":910},"环境准备",[912,913,915],"h3",{"id":914},"安装-python-sdk","安装 Python SDK",[896,917,918],{},"推荐使用 Python 3.10 及以上版本。通过 pip 或 uv 安装 MCP Python SDK：",[920,921,925],"pre",{"className":922,"code":923,"language":924,"meta":11,"style":11},"language-bash shiki shiki-themes github-light github-light github-dark","# 使用 pip\npip install mcp\n\n# 使用 uv（推荐）\nuv add mcp\n","bash",[926,927,928,937,951,958,964],"code",{"__ignoreMap":11},[929,930,933],"span",{"class":931,"line":932},"line",1,[929,934,936],{"class":935},"sCsY4","# 使用 pip\n",[929,938,940,944,948],{"class":931,"line":939},2,[929,941,943],{"class":942},"snPdu","pip",[929,945,947],{"class":946},"sIIMD"," install",[929,949,950],{"class":946}," mcp\n",[929,952,954],{"class":931,"line":953},3,[929,955,957],{"emptyLinePlaceholder":956},true,"\n",[929,959,961],{"class":931,"line":960},4,[929,962,963],{"class":935},"# 使用 uv（推荐）\n",[929,965,967,970,973],{"class":931,"line":966},5,[929,968,969],{"class":942},"uv",[929,971,972],{"class":946}," add",[929,974,950],{"class":946},[912,976,977],{"id":977},"项目结构",[896,979,980],{},"一个典型的 MCP Server 项目结构如下：",[920,982,987],{"className":983,"code":985,"language":986},[984],"language-text","my-mcp-server\u002F\n├── pyproject.toml\n├── README.md\n└── src\u002F\n    └── my_mcp_server\u002F\n        ├── __init__.py\n        └── server.py\n","text",[926,988,985],{"__ignoreMap":11},[892,990,992],{"id":991},"创建基本-server","创建基本 Server",[912,994,996],{"id":995},"最简-server-示例","最简 Server 示例",[896,998,999,1000,1003],{},"使用 MCP Python SDK 的高级 API（",[926,1001,1002],{},"FastMCP","），只需几行代码就能创建一个 MCP Server：",[920,1005,1009],{"className":1006,"code":1007,"language":1008,"meta":11,"style":11},"language-python shiki shiki-themes github-light github-light github-dark","from mcp.server.fastmcp import FastMCP\n\n# 创建 MCP Server 实例\nmcp = FastMCP(\"my-server\")\n\n# 定义一个工具\n@mcp.tool()\ndef hello(name: str) -> str:\n    \"\"\"向指定的人打招呼\"\"\"\n    return f\"你好，{name}！欢迎使用 MCP。\"\n\n# 启动 Server\nif __name__ == \"__main__\":\n    mcp.run()\n","python",[926,1010,1011,1027,1031,1036,1053,1057,1063,1072,1096,1102,1126,1131,1137,1154],{"__ignoreMap":11},[929,1012,1013,1017,1021,1024],{"class":931,"line":932},[929,1014,1016],{"class":1015},"s8jYJ","from",[929,1018,1020],{"class":1019},"sxrX7"," mcp.server.fastmcp ",[929,1022,1023],{"class":1015},"import",[929,1025,1026],{"class":1019}," FastMCP\n",[929,1028,1029],{"class":931,"line":939},[929,1030,957],{"emptyLinePlaceholder":956},[929,1032,1033],{"class":931,"line":953},[929,1034,1035],{"class":935},"# 创建 MCP Server 实例\n",[929,1037,1038,1041,1044,1047,1050],{"class":931,"line":960},[929,1039,1040],{"class":1019},"mcp ",[929,1042,1043],{"class":1015},"=",[929,1045,1046],{"class":1019}," FastMCP(",[929,1048,1049],{"class":946},"\"my-server\"",[929,1051,1052],{"class":1019},")\n",[929,1054,1055],{"class":931,"line":966},[929,1056,957],{"emptyLinePlaceholder":956},[929,1058,1060],{"class":931,"line":1059},6,[929,1061,1062],{"class":935},"# 定义一个工具\n",[929,1064,1066,1069],{"class":931,"line":1065},7,[929,1067,1068],{"class":942},"@mcp.tool",[929,1070,1071],{"class":1019},"()\n",[929,1073,1075,1078,1081,1084,1088,1091,1093],{"class":931,"line":1074},8,[929,1076,1077],{"class":1015},"def",[929,1079,1080],{"class":942}," hello",[929,1082,1083],{"class":1019},"(name: ",[929,1085,1087],{"class":1086},"sBjJW","str",[929,1089,1090],{"class":1019},") -> ",[929,1092,1087],{"class":1086},[929,1094,1095],{"class":1019},":\n",[929,1097,1099],{"class":931,"line":1098},9,[929,1100,1101],{"class":946},"    \"\"\"向指定的人打招呼\"\"\"\n",[929,1103,1105,1108,1111,1114,1117,1120,1123],{"class":931,"line":1104},10,[929,1106,1107],{"class":1015},"    return",[929,1109,1110],{"class":1015}," f",[929,1112,1113],{"class":946},"\"你好，",[929,1115,1116],{"class":1086},"{",[929,1118,1119],{"class":1019},"name",[929,1121,1122],{"class":1086},"}",[929,1124,1125],{"class":946},"！欢迎使用 MCP。\"\n",[929,1127,1129],{"class":931,"line":1128},11,[929,1130,957],{"emptyLinePlaceholder":956},[929,1132,1134],{"class":931,"line":1133},12,[929,1135,1136],{"class":935},"# 启动 Server\n",[929,1138,1140,1143,1146,1149,1152],{"class":931,"line":1139},13,[929,1141,1142],{"class":1015},"if",[929,1144,1145],{"class":1086}," __name__",[929,1147,1148],{"class":1015}," ==",[929,1150,1151],{"class":946}," \"__main__\"",[929,1153,1095],{"class":1019},[929,1155,1157],{"class":931,"line":1156},14,[929,1158,1159],{"class":1019},"    mcp.run()\n",[896,1161,1162],{},"运行这个脚本后，一个支持 stdio 传输的 MCP Server 就启动了。",[892,1164,1166],{"id":1165},"实现-tools工具","实现 Tools（工具）",[896,1168,1169],{},"Tools 是 MCP Server 最常用的能力，允许 AI 模型通过 Server 执行具体操作。",[912,1171,1172],{"id":1172},"基本工具定义",[896,1174,1175,1176,1179],{},"使用 ",[926,1177,1178],{},"@mcp.tool()"," 装饰器即可定义工具。SDK 会自动从函数签名和类型注解中提取参数的 JSON Schema：",[920,1181,1183],{"className":1006,"code":1182,"language":1008,"meta":11,"style":11},"from mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"tools-demo\")\n\n@mcp.tool()\ndef add(a: float, b: float) -> float:\n    \"\"\"计算两个数的和\"\"\"\n    return a + b\n\n@mcp.tool()\ndef multiply(a: float, b: float) -> float:\n    \"\"\"计算两个数的乘积\"\"\"\n    return a * b\n",[926,1184,1185,1195,1199,1212,1216,1222,1245,1250,1263,1267,1273,1294,1299],{"__ignoreMap":11},[929,1186,1187,1189,1191,1193],{"class":931,"line":932},[929,1188,1016],{"class":1015},[929,1190,1020],{"class":1019},[929,1192,1023],{"class":1015},[929,1194,1026],{"class":1019},[929,1196,1197],{"class":931,"line":939},[929,1198,957],{"emptyLinePlaceholder":956},[929,1200,1201,1203,1205,1207,1210],{"class":931,"line":953},[929,1202,1040],{"class":1019},[929,1204,1043],{"class":1015},[929,1206,1046],{"class":1019},[929,1208,1209],{"class":946},"\"tools-demo\"",[929,1211,1052],{"class":1019},[929,1213,1214],{"class":931,"line":960},[929,1215,957],{"emptyLinePlaceholder":956},[929,1217,1218,1220],{"class":931,"line":966},[929,1219,1068],{"class":942},[929,1221,1071],{"class":1019},[929,1223,1224,1226,1228,1231,1234,1237,1239,1241,1243],{"class":931,"line":1059},[929,1225,1077],{"class":1015},[929,1227,972],{"class":942},[929,1229,1230],{"class":1019},"(a: ",[929,1232,1233],{"class":1086},"float",[929,1235,1236],{"class":1019},", b: ",[929,1238,1233],{"class":1086},[929,1240,1090],{"class":1019},[929,1242,1233],{"class":1086},[929,1244,1095],{"class":1019},[929,1246,1247],{"class":931,"line":1065},[929,1248,1249],{"class":946},"    \"\"\"计算两个数的和\"\"\"\n",[929,1251,1252,1254,1257,1260],{"class":931,"line":1074},[929,1253,1107],{"class":1015},[929,1255,1256],{"class":1019}," a ",[929,1258,1259],{"class":1015},"+",[929,1261,1262],{"class":1019}," b\n",[929,1264,1265],{"class":931,"line":1098},[929,1266,957],{"emptyLinePlaceholder":956},[929,1268,1269,1271],{"class":931,"line":1104},[929,1270,1068],{"class":942},[929,1272,1071],{"class":1019},[929,1274,1275,1277,1280,1282,1284,1286,1288,1290,1292],{"class":931,"line":1128},[929,1276,1077],{"class":1015},[929,1278,1279],{"class":942}," multiply",[929,1281,1230],{"class":1019},[929,1283,1233],{"class":1086},[929,1285,1236],{"class":1019},[929,1287,1233],{"class":1086},[929,1289,1090],{"class":1019},[929,1291,1233],{"class":1086},[929,1293,1095],{"class":1019},[929,1295,1296],{"class":931,"line":1133},[929,1297,1298],{"class":946},"    \"\"\"计算两个数的乘积\"\"\"\n",[929,1300,1301,1303,1305,1308],{"class":931,"line":1139},[929,1302,1107],{"class":1015},[929,1304,1256],{"class":1019},[929,1306,1307],{"class":1015},"*",[929,1309,1262],{"class":1019},[1311,1312,1313],"tip",{},"\n函数的 docstring 会被用作工具的描述信息，这对 AI 模型理解工具用途至关重要。请务必编写清晰准确的 docstring。\n",[912,1315,1317],{"id":1316},"使用-pydantic-模型定义复杂参数","使用 Pydantic 模型定义复杂参数",[896,1319,1320],{},"对于参数结构较复杂的工具，可以使用 Pydantic 模型：",[920,1322,1324],{"className":1006,"code":1323,"language":1008,"meta":11,"style":11},"from pydantic import BaseModel, Field\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"complex-tools\")\n\nclass QueryParams(BaseModel):\n    sql: str = Field(description=\"SQL 查询语句\")\n    database: str = Field(default=\"main\", description=\"目标数据库\")\n    limit: int = Field(default=100, description=\"最大返回行数\")\n\n@mcp.tool()\ndef query_database(params: QueryParams) -> str:\n    \"\"\"执行数据库查询\"\"\"\n    # 实际的数据库查询逻辑\n    return f\"查询 {params.database}: {params.sql} (限制 {params.limit} 行)\"\n",[926,1325,1326,1338,1348,1352,1365,1369,1386,1410,1441,1471,1475,1481,1495,1500,1505],{"__ignoreMap":11},[929,1327,1328,1330,1333,1335],{"class":931,"line":932},[929,1329,1016],{"class":1015},[929,1331,1332],{"class":1019}," pydantic ",[929,1334,1023],{"class":1015},[929,1336,1337],{"class":1019}," BaseModel, Field\n",[929,1339,1340,1342,1344,1346],{"class":931,"line":939},[929,1341,1016],{"class":1015},[929,1343,1020],{"class":1019},[929,1345,1023],{"class":1015},[929,1347,1026],{"class":1019},[929,1349,1350],{"class":931,"line":953},[929,1351,957],{"emptyLinePlaceholder":956},[929,1353,1354,1356,1358,1360,1363],{"class":931,"line":960},[929,1355,1040],{"class":1019},[929,1357,1043],{"class":1015},[929,1359,1046],{"class":1019},[929,1361,1362],{"class":946},"\"complex-tools\"",[929,1364,1052],{"class":1019},[929,1366,1367],{"class":931,"line":966},[929,1368,957],{"emptyLinePlaceholder":956},[929,1370,1371,1374,1377,1380,1383],{"class":931,"line":1059},[929,1372,1373],{"class":1015},"class",[929,1375,1376],{"class":942}," QueryParams",[929,1378,1379],{"class":1019},"(",[929,1381,1382],{"class":942},"BaseModel",[929,1384,1385],{"class":1019},"):\n",[929,1387,1388,1391,1393,1396,1399,1403,1405,1408],{"class":931,"line":1065},[929,1389,1390],{"class":1019},"    sql: ",[929,1392,1087],{"class":1086},[929,1394,1395],{"class":1015}," =",[929,1397,1398],{"class":1019}," Field(",[929,1400,1402],{"class":1401},"sP4rz","description",[929,1404,1043],{"class":1015},[929,1406,1407],{"class":946},"\"SQL 查询语句\"",[929,1409,1052],{"class":1019},[929,1411,1412,1415,1417,1419,1421,1424,1426,1429,1432,1434,1436,1439],{"class":931,"line":1074},[929,1413,1414],{"class":1019},"    database: ",[929,1416,1087],{"class":1086},[929,1418,1395],{"class":1015},[929,1420,1398],{"class":1019},[929,1422,1423],{"class":1401},"default",[929,1425,1043],{"class":1015},[929,1427,1428],{"class":946},"\"main\"",[929,1430,1431],{"class":1019},", ",[929,1433,1402],{"class":1401},[929,1435,1043],{"class":1015},[929,1437,1438],{"class":946},"\"目标数据库\"",[929,1440,1052],{"class":1019},[929,1442,1443,1446,1449,1451,1453,1455,1457,1460,1462,1464,1466,1469],{"class":931,"line":1098},[929,1444,1445],{"class":1019},"    limit: ",[929,1447,1448],{"class":1086},"int",[929,1450,1395],{"class":1015},[929,1452,1398],{"class":1019},[929,1454,1423],{"class":1401},[929,1456,1043],{"class":1015},[929,1458,1459],{"class":1086},"100",[929,1461,1431],{"class":1019},[929,1463,1402],{"class":1401},[929,1465,1043],{"class":1015},[929,1467,1468],{"class":946},"\"最大返回行数\"",[929,1470,1052],{"class":1019},[929,1472,1473],{"class":931,"line":1104},[929,1474,957],{"emptyLinePlaceholder":956},[929,1476,1477,1479],{"class":931,"line":1128},[929,1478,1068],{"class":942},[929,1480,1071],{"class":1019},[929,1482,1483,1485,1488,1491,1493],{"class":931,"line":1133},[929,1484,1077],{"class":1015},[929,1486,1487],{"class":942}," query_database",[929,1489,1490],{"class":1019},"(params: QueryParams) -> ",[929,1492,1087],{"class":1086},[929,1494,1095],{"class":1019},[929,1496,1497],{"class":931,"line":1139},[929,1498,1499],{"class":946},"    \"\"\"执行数据库查询\"\"\"\n",[929,1501,1502],{"class":931,"line":1156},[929,1503,1504],{"class":935},"    # 实际的数据库查询逻辑\n",[929,1506,1508,1510,1512,1515,1517,1520,1522,1525,1527,1530,1532,1535,1537,1540,1542],{"class":931,"line":1507},15,[929,1509,1107],{"class":1015},[929,1511,1110],{"class":1015},[929,1513,1514],{"class":946},"\"查询 ",[929,1516,1116],{"class":1086},[929,1518,1519],{"class":1019},"params.database",[929,1521,1122],{"class":1086},[929,1523,1524],{"class":946},": ",[929,1526,1116],{"class":1086},[929,1528,1529],{"class":1019},"params.sql",[929,1531,1122],{"class":1086},[929,1533,1534],{"class":946}," (限制 ",[929,1536,1116],{"class":1086},[929,1538,1539],{"class":1019},"params.limit",[929,1541,1122],{"class":1086},[929,1543,1544],{"class":946}," 行)\"\n",[912,1546,1547],{"id":1547},"异步工具",[896,1549,1550],{},"MCP SDK 原生支持异步函数：",[920,1552,1554],{"className":1006,"code":1553,"language":1008,"meta":11,"style":11},"import httpx\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"async-tools\")\n\n@mcp.tool()\nasync def fetch_url(url: str) -> str:\n    \"\"\"获取指定 URL 的内容\"\"\"\n    async with httpx.AsyncClient() as client:\n        response = await client.get(url)\n        return response.text[:2000]  # 限制返回长度\n",[926,1555,1556,1563,1573,1577,1590,1594,1600,1622,1627,1644,1657],{"__ignoreMap":11},[929,1557,1558,1560],{"class":931,"line":932},[929,1559,1023],{"class":1015},[929,1561,1562],{"class":1019}," httpx\n",[929,1564,1565,1567,1569,1571],{"class":931,"line":939},[929,1566,1016],{"class":1015},[929,1568,1020],{"class":1019},[929,1570,1023],{"class":1015},[929,1572,1026],{"class":1019},[929,1574,1575],{"class":931,"line":953},[929,1576,957],{"emptyLinePlaceholder":956},[929,1578,1579,1581,1583,1585,1588],{"class":931,"line":960},[929,1580,1040],{"class":1019},[929,1582,1043],{"class":1015},[929,1584,1046],{"class":1019},[929,1586,1587],{"class":946},"\"async-tools\"",[929,1589,1052],{"class":1019},[929,1591,1592],{"class":931,"line":966},[929,1593,957],{"emptyLinePlaceholder":956},[929,1595,1596,1598],{"class":931,"line":1059},[929,1597,1068],{"class":942},[929,1599,1071],{"class":1019},[929,1601,1602,1605,1608,1611,1614,1616,1618,1620],{"class":931,"line":1065},[929,1603,1604],{"class":1015},"async",[929,1606,1607],{"class":1015}," def",[929,1609,1610],{"class":942}," fetch_url",[929,1612,1613],{"class":1019},"(url: ",[929,1615,1087],{"class":1086},[929,1617,1090],{"class":1019},[929,1619,1087],{"class":1086},[929,1621,1095],{"class":1019},[929,1623,1624],{"class":931,"line":1074},[929,1625,1626],{"class":946},"    \"\"\"获取指定 URL 的内容\"\"\"\n",[929,1628,1629,1632,1635,1638,1641],{"class":931,"line":1098},[929,1630,1631],{"class":1015},"    async",[929,1633,1634],{"class":1015}," with",[929,1636,1637],{"class":1019}," httpx.AsyncClient() ",[929,1639,1640],{"class":1015},"as",[929,1642,1643],{"class":1019}," client:\n",[929,1645,1646,1649,1651,1654],{"class":931,"line":1104},[929,1647,1648],{"class":1019},"        response ",[929,1650,1043],{"class":1015},[929,1652,1653],{"class":1015}," await",[929,1655,1656],{"class":1019}," client.get(url)\n",[929,1658,1659,1662,1665,1668,1671],{"class":931,"line":1128},[929,1660,1661],{"class":1015},"        return",[929,1663,1664],{"class":1019}," response.text[:",[929,1666,1667],{"class":1086},"2000",[929,1669,1670],{"class":1019},"]  ",[929,1672,1673],{"class":935},"# 限制返回长度\n",[912,1675,1676],{"id":1676},"错误处理",[896,1678,1679],{},"工具函数中抛出的异常会被 SDK 捕获并返回给 Client。建议使用有意义的错误信息：",[920,1681,1683],{"className":1006,"code":1682,"language":1008,"meta":11,"style":11},"@mcp.tool()\ndef divide(a: float, b: float) -> float:\n    \"\"\"计算两个数的商\"\"\"\n    if b == 0:\n        raise ValueError(\"除数不能为零\")\n    return a \u002F b\n",[926,1684,1685,1691,1712,1717,1733,1748],{"__ignoreMap":11},[929,1686,1687,1689],{"class":931,"line":932},[929,1688,1068],{"class":942},[929,1690,1071],{"class":1019},[929,1692,1693,1695,1698,1700,1702,1704,1706,1708,1710],{"class":931,"line":939},[929,1694,1077],{"class":1015},[929,1696,1697],{"class":942}," divide",[929,1699,1230],{"class":1019},[929,1701,1233],{"class":1086},[929,1703,1236],{"class":1019},[929,1705,1233],{"class":1086},[929,1707,1090],{"class":1019},[929,1709,1233],{"class":1086},[929,1711,1095],{"class":1019},[929,1713,1714],{"class":931,"line":953},[929,1715,1716],{"class":946},"    \"\"\"计算两个数的商\"\"\"\n",[929,1718,1719,1722,1725,1728,1731],{"class":931,"line":960},[929,1720,1721],{"class":1015},"    if",[929,1723,1724],{"class":1019}," b ",[929,1726,1727],{"class":1015},"==",[929,1729,1730],{"class":1086}," 0",[929,1732,1095],{"class":1019},[929,1734,1735,1738,1741,1743,1746],{"class":931,"line":966},[929,1736,1737],{"class":1015},"        raise",[929,1739,1740],{"class":1086}," ValueError",[929,1742,1379],{"class":1019},[929,1744,1745],{"class":946},"\"除数不能为零\"",[929,1747,1052],{"class":1019},[929,1749,1750,1752,1754,1757],{"class":931,"line":1059},[929,1751,1107],{"class":1015},[929,1753,1256],{"class":1019},[929,1755,1756],{"class":1015},"\u002F",[929,1758,1262],{"class":1019},[892,1760,1762],{"id":1761},"实现-resources资源","实现 Resources（资源）",[896,1764,1765],{},"Resources 用于向 AI 模型暴露数据内容，让模型获取必要的上下文信息。",[912,1767,1768],{"id":1768},"静态资源",[920,1770,1772],{"className":1006,"code":1771,"language":1008,"meta":11,"style":11},"from mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"resources-demo\")\n\n@mcp.resource(\"config:\u002F\u002Fapp-settings\")\ndef get_app_settings() -> str:\n    \"\"\"返回应用配置信息\"\"\"\n    return \"\"\"\n    {\n        \"app_name\": \"MyApp\",\n        \"version\": \"1.0.0\",\n        \"debug\": false,\n        \"database_url\": \"postgresql:\u002F\u002Flocalhost\u002Fmydb\"\n    }\n    \"\"\"\n",[926,1773,1774,1784,1788,1801,1805,1817,1831,1836,1843,1848,1853,1858,1863,1868,1873],{"__ignoreMap":11},[929,1775,1776,1778,1780,1782],{"class":931,"line":932},[929,1777,1016],{"class":1015},[929,1779,1020],{"class":1019},[929,1781,1023],{"class":1015},[929,1783,1026],{"class":1019},[929,1785,1786],{"class":931,"line":939},[929,1787,957],{"emptyLinePlaceholder":956},[929,1789,1790,1792,1794,1796,1799],{"class":931,"line":953},[929,1791,1040],{"class":1019},[929,1793,1043],{"class":1015},[929,1795,1046],{"class":1019},[929,1797,1798],{"class":946},"\"resources-demo\"",[929,1800,1052],{"class":1019},[929,1802,1803],{"class":931,"line":960},[929,1804,957],{"emptyLinePlaceholder":956},[929,1806,1807,1810,1812,1815],{"class":931,"line":966},[929,1808,1809],{"class":942},"@mcp.resource",[929,1811,1379],{"class":1019},[929,1813,1814],{"class":946},"\"config:\u002F\u002Fapp-settings\"",[929,1816,1052],{"class":1019},[929,1818,1819,1821,1824,1827,1829],{"class":931,"line":1059},[929,1820,1077],{"class":1015},[929,1822,1823],{"class":942}," get_app_settings",[929,1825,1826],{"class":1019},"() -> ",[929,1828,1087],{"class":1086},[929,1830,1095],{"class":1019},[929,1832,1833],{"class":931,"line":1065},[929,1834,1835],{"class":946},"    \"\"\"返回应用配置信息\"\"\"\n",[929,1837,1838,1840],{"class":931,"line":1074},[929,1839,1107],{"class":1015},[929,1841,1842],{"class":946}," \"\"\"\n",[929,1844,1845],{"class":931,"line":1098},[929,1846,1847],{"class":946},"    {\n",[929,1849,1850],{"class":931,"line":1104},[929,1851,1852],{"class":946},"        \"app_name\": \"MyApp\",\n",[929,1854,1855],{"class":931,"line":1128},[929,1856,1857],{"class":946},"        \"version\": \"1.0.0\",\n",[929,1859,1860],{"class":931,"line":1133},[929,1861,1862],{"class":946},"        \"debug\": false,\n",[929,1864,1865],{"class":931,"line":1139},[929,1866,1867],{"class":946},"        \"database_url\": \"postgresql:\u002F\u002Flocalhost\u002Fmydb\"\n",[929,1869,1870],{"class":931,"line":1156},[929,1871,1872],{"class":946},"    }\n",[929,1874,1875],{"class":931,"line":1507},[929,1876,1877],{"class":946},"    \"\"\"\n",[912,1879,1881],{"id":1880},"动态资源资源模板","动态资源（资源模板）",[896,1883,1884],{},"使用 URI 模板可以定义动态资源，根据参数返回不同的内容：",[920,1886,1888],{"className":1006,"code":1887,"language":1008,"meta":11,"style":11},"@mcp.resource(\"users:\u002F\u002F{user_id}\u002Fprofile\")\ndef get_user_profile(user_id: str) -> str:\n    \"\"\"获取用户资料\"\"\"\n    # 实际应用中从数据库查询\n    users = {\n        \"001\": {\"name\": \"张三\", \"role\": \"admin\"},\n        \"002\": {\"name\": \"李四\", \"role\": \"developer\"},\n    }\n    user = users.get(user_id, {\"name\": \"未知\", \"role\": \"guest\"})\n    return str(user)\n",[926,1889,1890,1907,1925,1930,1935,1945,1974,1999,2003,2032],{"__ignoreMap":11},[929,1891,1892,1894,1896,1899,1902,1905],{"class":931,"line":932},[929,1893,1809],{"class":942},[929,1895,1379],{"class":1019},[929,1897,1898],{"class":946},"\"users:\u002F\u002F",[929,1900,1901],{"class":1086},"{user_id}",[929,1903,1904],{"class":946},"\u002Fprofile\"",[929,1906,1052],{"class":1019},[929,1908,1909,1911,1914,1917,1919,1921,1923],{"class":931,"line":939},[929,1910,1077],{"class":1015},[929,1912,1913],{"class":942}," get_user_profile",[929,1915,1916],{"class":1019},"(user_id: ",[929,1918,1087],{"class":1086},[929,1920,1090],{"class":1019},[929,1922,1087],{"class":1086},[929,1924,1095],{"class":1019},[929,1926,1927],{"class":931,"line":953},[929,1928,1929],{"class":946},"    \"\"\"获取用户资料\"\"\"\n",[929,1931,1932],{"class":931,"line":960},[929,1933,1934],{"class":935},"    # 实际应用中从数据库查询\n",[929,1936,1937,1940,1942],{"class":931,"line":966},[929,1938,1939],{"class":1019},"    users ",[929,1941,1043],{"class":1015},[929,1943,1944],{"class":1019}," {\n",[929,1946,1947,1950,1953,1956,1958,1961,1963,1966,1968,1971],{"class":931,"line":1059},[929,1948,1949],{"class":946},"        \"001\"",[929,1951,1952],{"class":1019},": {",[929,1954,1955],{"class":946},"\"name\"",[929,1957,1524],{"class":1019},[929,1959,1960],{"class":946},"\"张三\"",[929,1962,1431],{"class":1019},[929,1964,1965],{"class":946},"\"role\"",[929,1967,1524],{"class":1019},[929,1969,1970],{"class":946},"\"admin\"",[929,1972,1973],{"class":1019},"},\n",[929,1975,1976,1979,1981,1983,1985,1988,1990,1992,1994,1997],{"class":931,"line":1065},[929,1977,1978],{"class":946},"        \"002\"",[929,1980,1952],{"class":1019},[929,1982,1955],{"class":946},[929,1984,1524],{"class":1019},[929,1986,1987],{"class":946},"\"李四\"",[929,1989,1431],{"class":1019},[929,1991,1965],{"class":946},[929,1993,1524],{"class":1019},[929,1995,1996],{"class":946},"\"developer\"",[929,1998,1973],{"class":1019},[929,2000,2001],{"class":931,"line":1074},[929,2002,1872],{"class":1019},[929,2004,2005,2008,2010,2013,2015,2017,2020,2022,2024,2026,2029],{"class":931,"line":1098},[929,2006,2007],{"class":1019},"    user ",[929,2009,1043],{"class":1015},[929,2011,2012],{"class":1019}," users.get(user_id, {",[929,2014,1955],{"class":946},[929,2016,1524],{"class":1019},[929,2018,2019],{"class":946},"\"未知\"",[929,2021,1431],{"class":1019},[929,2023,1965],{"class":946},[929,2025,1524],{"class":1019},[929,2027,2028],{"class":946},"\"guest\"",[929,2030,2031],{"class":1019},"})\n",[929,2033,2034,2036,2039],{"class":931,"line":1104},[929,2035,1107],{"class":1015},[929,2037,2038],{"class":1086}," str",[929,2040,2041],{"class":1019},"(user)\n",[912,2043,2044],{"id":2044},"二进制资源",[896,2046,2047],{},"对于图片、PDF 等二进制内容，返回 bytes 类型即可：",[920,2049,2051],{"className":1006,"code":2050,"language":1008,"meta":11,"style":11},"@mcp.resource(\"images:\u002F\u002Flogo.png\")\ndef get_logo() -> bytes:\n    \"\"\"返回应用 Logo\"\"\"\n    with open(\"assets\u002Flogo.png\", \"rb\") as f:\n        return f.read()\n",[926,2052,2053,2064,2078,2083,2109],{"__ignoreMap":11},[929,2054,2055,2057,2059,2062],{"class":931,"line":932},[929,2056,1809],{"class":942},[929,2058,1379],{"class":1019},[929,2060,2061],{"class":946},"\"images:\u002F\u002Flogo.png\"",[929,2063,1052],{"class":1019},[929,2065,2066,2068,2071,2073,2076],{"class":931,"line":939},[929,2067,1077],{"class":1015},[929,2069,2070],{"class":942}," get_logo",[929,2072,1826],{"class":1019},[929,2074,2075],{"class":1086},"bytes",[929,2077,1095],{"class":1019},[929,2079,2080],{"class":931,"line":953},[929,2081,2082],{"class":946},"    \"\"\"返回应用 Logo\"\"\"\n",[929,2084,2085,2088,2091,2093,2096,2098,2101,2104,2106],{"class":931,"line":960},[929,2086,2087],{"class":1015},"    with",[929,2089,2090],{"class":1086}," open",[929,2092,1379],{"class":1019},[929,2094,2095],{"class":946},"\"assets\u002Flogo.png\"",[929,2097,1431],{"class":1019},[929,2099,2100],{"class":946},"\"rb\"",[929,2102,2103],{"class":1019},") ",[929,2105,1640],{"class":1015},[929,2107,2108],{"class":1019}," f:\n",[929,2110,2111,2113],{"class":931,"line":966},[929,2112,1661],{"class":1015},[929,2114,2115],{"class":1019}," f.read()\n",[892,2117,2119],{"id":2118},"实现-prompts提示词模板","实现 Prompts（提示词模板）",[896,2121,2122],{},"Prompts 允许 Server 提供预定义的提示词模板，帮助用户更高效地使用 AI。",[920,2124,2126],{"className":1006,"code":2125,"language":1008,"meta":11,"style":11},"from mcp.server.fastmcp import FastMCP\nfrom mcp.types import TextContent\n\nmcp = FastMCP(\"prompts-demo\")\n\n@mcp.prompt()\ndef code_review(language: str, code: str) -> str:\n    \"\"\"代码审查提示词模板\"\"\"\n    return f\"\"\"请对以下 {language} 代码进行审查，重点关注：\n1. 代码质量和可读性\n2. 潜在的 Bug 和安全隐患\n3. 性能优化建议\n4. 最佳实践遵循情况\n\n代码：\n```{language}\n{code}\n",[926,2127,2128,2138,2150,2154,2167,2171,2178,2201,2206,2225,2230,2235,2240,2245,2249,2254,2267],{"__ignoreMap":11},[929,2129,2130,2132,2134,2136],{"class":931,"line":932},[929,2131,1016],{"class":1015},[929,2133,1020],{"class":1019},[929,2135,1023],{"class":1015},[929,2137,1026],{"class":1019},[929,2139,2140,2142,2145,2147],{"class":931,"line":939},[929,2141,1016],{"class":1015},[929,2143,2144],{"class":1019}," mcp.types ",[929,2146,1023],{"class":1015},[929,2148,2149],{"class":1019}," TextContent\n",[929,2151,2152],{"class":931,"line":953},[929,2153,957],{"emptyLinePlaceholder":956},[929,2155,2156,2158,2160,2162,2165],{"class":931,"line":960},[929,2157,1040],{"class":1019},[929,2159,1043],{"class":1015},[929,2161,1046],{"class":1019},[929,2163,2164],{"class":946},"\"prompts-demo\"",[929,2166,1052],{"class":1019},[929,2168,2169],{"class":931,"line":966},[929,2170,957],{"emptyLinePlaceholder":956},[929,2172,2173,2176],{"class":931,"line":1059},[929,2174,2175],{"class":942},"@mcp.prompt",[929,2177,1071],{"class":1019},[929,2179,2180,2182,2185,2188,2190,2193,2195,2197,2199],{"class":931,"line":1065},[929,2181,1077],{"class":1015},[929,2183,2184],{"class":942}," code_review",[929,2186,2187],{"class":1019},"(language: ",[929,2189,1087],{"class":1086},[929,2191,2192],{"class":1019},", code: ",[929,2194,1087],{"class":1086},[929,2196,1090],{"class":1019},[929,2198,1087],{"class":1086},[929,2200,1095],{"class":1019},[929,2202,2203],{"class":931,"line":1074},[929,2204,2205],{"class":946},"    \"\"\"代码审查提示词模板\"\"\"\n",[929,2207,2208,2210,2212,2215,2217,2220,2222],{"class":931,"line":1098},[929,2209,1107],{"class":1015},[929,2211,1110],{"class":1015},[929,2213,2214],{"class":946},"\"\"\"请对以下 ",[929,2216,1116],{"class":1086},[929,2218,2219],{"class":1019},"language",[929,2221,1122],{"class":1086},[929,2223,2224],{"class":946}," 代码进行审查，重点关注：\n",[929,2226,2227],{"class":931,"line":1104},[929,2228,2229],{"class":946},"1. 代码质量和可读性\n",[929,2231,2232],{"class":931,"line":1128},[929,2233,2234],{"class":946},"2. 潜在的 Bug 和安全隐患\n",[929,2236,2237],{"class":931,"line":1133},[929,2238,2239],{"class":946},"3. 性能优化建议\n",[929,2241,2242],{"class":931,"line":1139},[929,2243,2244],{"class":946},"4. 最佳实践遵循情况\n",[929,2246,2247],{"class":931,"line":1156},[929,2248,957],{"emptyLinePlaceholder":956},[929,2250,2251],{"class":931,"line":1507},[929,2252,2253],{"class":946},"代码：\n",[929,2255,2257,2260,2262,2264],{"class":931,"line":2256},16,[929,2258,2259],{"class":946},"```",[929,2261,1116],{"class":1086},[929,2263,2219],{"class":1019},[929,2265,2266],{"class":1086},"}\n",[929,2268,2270,2272,2274],{"class":931,"line":2269},17,[929,2271,1116],{"class":1086},[929,2273,926],{"class":1019},[929,2275,2266],{"class":1086},[896,2277,2278],{},"请用中文给出详细的审查意见。\"\"\"",[896,2280,2281],{},"@mcp.prompt()\ndef sql_expert(table_schema: str, question: str) -> str:\n\"\"\"SQL 查询生成模板\"\"\"\nreturn f\"\"\"你是一位 SQL 专家。根据以下数据库表结构，生成满足需求的 SQL 查询语句。",[896,2283,2284],{},"表结构：\n{table_schema}",[896,2286,2287],{},"需求：{question}",[896,2289,2290],{},"请生成优化的 SQL 查询，并解释查询逻辑。\"\"\"",[920,2292,2295],{"className":2293,"code":2294,"language":986},[984],"\n\u003CNote>\nPrompt 模板返回的字符串会作为用户消息发送给 AI 模型。你也可以返回更复杂的消息结构，包含多轮对话上下文。\n\u003C\u002FNote>\n\n## 传输配置\n\n### stdio 传输（默认）\n\n默认情况下，`mcp.run()` 使用 stdio 传输方式。这是最简单的方式，适合本地使用：\n\n```python\nif __name__ == \"__main__\":\n    mcp.run()  # 默认使用 stdio\n",[926,2296,2294],{"__ignoreMap":11},[912,2298,2300],{"id":2299},"http-sse-传输","HTTP + SSE 传输",[896,2302,2303],{},"如果需要远程访问，可以使用 HTTP + SSE 传输：",[920,2305,2307],{"className":1006,"code":2306,"language":1008,"meta":11,"style":11},"if __name__ == \"__main__\":\n    mcp.run(transport=\"sse\", host=\"0.0.0.0\", port=8080)\n",[926,2308,2309,2321],{"__ignoreMap":11},[929,2310,2311,2313,2315,2317,2319],{"class":931,"line":932},[929,2312,1142],{"class":1015},[929,2314,1145],{"class":1086},[929,2316,1148],{"class":1015},[929,2318,1151],{"class":946},[929,2320,1095],{"class":1019},[929,2322,2323,2326,2329,2331,2334,2336,2339,2341,2344,2346,2349,2351,2354],{"class":931,"line":939},[929,2324,2325],{"class":1019},"    mcp.run(",[929,2327,2328],{"class":1401},"transport",[929,2330,1043],{"class":1015},[929,2332,2333],{"class":946},"\"sse\"",[929,2335,1431],{"class":1019},[929,2337,2338],{"class":1401},"host",[929,2340,1043],{"class":1015},[929,2342,2343],{"class":946},"\"0.0.0.0\"",[929,2345,1431],{"class":1019},[929,2347,2348],{"class":1401},"port",[929,2350,1043],{"class":1015},[929,2352,2353],{"class":1086},"8080",[929,2355,1052],{"class":1019},[892,2357,2359],{"id":2358},"完整示例文件系统-mcp-server","完整示例：文件系统 MCP Server",[896,2361,2362],{},"下面是一个功能完整的文件系统 MCP Server，支持文件的读取、写入、列出目录等操作：",[920,2364,2366],{"className":1006,"code":2365,"language":1008,"meta":11,"style":11},"import os\nfrom pathlib import Path\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"filesystem-server\")\n\n# 配置允许访问的根目录\nALLOWED_ROOT = Path(os.environ.get(\"MCP_ROOT_DIR\", os.path.expanduser(\"~\u002FDocuments\")))\n\ndef _validate_path(path: str) -> Path:\n    \"\"\"验证路径安全性，防止目录遍历攻击\"\"\"\n    resolved = (ALLOWED_ROOT \u002F path).resolve()\n    if not str(resolved).startswith(str(ALLOWED_ROOT.resolve())):\n        raise ValueError(f\"访问被拒绝：路径 {path} 超出了允许的根目录范围\")\n    return resolved\n\n@mcp.resource(\"fs:\u002F\u002Froot\")\ndef get_root_info() -> str:\n    \"\"\"返回根目录信息\"\"\"\n    return f\"当前根目录: {ALLOWED_ROOT}\"\n\n@mcp.tool()\ndef list_directory(path: str = \".\") -> str:\n    \"\"\"列出指定目录下的文件和子目录\"\"\"\n    target = _validate_path(path)\n    if not target.is_dir():\n        raise ValueError(f\"{path} 不是一个目录\")\n\n    entries = []\n    for entry in sorted(target.iterdir()):\n        entry_type = \"📁\" if entry.is_dir() else \"📄\"\n        size = entry.stat().st_size if entry.is_file() else 0\n        entries.append(f\"{entry_type} {entry.name}  ({size} bytes)\")\n\n    return \"\\n\".join(entries) if entries else \"（空目录）\"\n\n@mcp.tool()\ndef read_file(path: str) -> str:\n    \"\"\"读取文件内容（仅支持文本文件）\"\"\"\n    target = _validate_path(path)\n    if not target.is_file():\n        raise ValueError(f\"{path} 不是一个文件\")\n\n    return target.read_text(encoding=\"utf-8\")\n\n@mcp.tool()\ndef write_file(path: str, content: str) -> str:\n    \"\"\"写入内容到文件（会覆盖已有内容）\"\"\"\n    target = _validate_path(path)\n    target.parent.mkdir(parents=True, exist_ok=True)\n    target.write_text(content, encoding=\"utf-8\")\n    return f\"已成功写入文件: {path} ({len(content)} 字符)\"\n\n@mcp.tool()\ndef search_files(pattern: str, path: str = \".\") -> str:\n    \"\"\"在目录中搜索匹配指定模式的文件\"\"\"\n    target = _validate_path(path)\n    matches = list(target.rglob(pattern))\n\n    if not matches:\n        return f\"未找到匹配 '{pattern}' 的文件\"\n\n    results = []\n    for match in matches[:50]:  # 限制结果数量\n        rel_path = match.relative_to(ALLOWED_ROOT)\n        results.append(str(rel_path))\n\n    return \"\\n\".join(results)\n\nif __name__ == \"__main__\":\n    mcp.run()\n",[926,2367,2368,2375,2387,2397,2401,2414,2418,2423,2445,2449,2464,2469,2487,2508,2534,2541,2545,2556,2570,2576,2592,2597,2604,2627,2633,2644,2654,2679,2684,2695,2713,2736,2757,2797,2802,2828,2833,2840,2858,2864,2873,2883,2907,2912,2930,2935,2942,2965,2971,2980,3005,3019,3048,3053,3060,3088,3094,3103,3117,3122,3132,3152,3157,3167,3189,3204,3215,3220,3234,3239,3252],{"__ignoreMap":11},[929,2369,2370,2372],{"class":931,"line":932},[929,2371,1023],{"class":1015},[929,2373,2374],{"class":1019}," os\n",[929,2376,2377,2379,2382,2384],{"class":931,"line":939},[929,2378,1016],{"class":1015},[929,2380,2381],{"class":1019}," pathlib ",[929,2383,1023],{"class":1015},[929,2385,2386],{"class":1019}," Path\n",[929,2388,2389,2391,2393,2395],{"class":931,"line":953},[929,2390,1016],{"class":1015},[929,2392,1020],{"class":1019},[929,2394,1023],{"class":1015},[929,2396,1026],{"class":1019},[929,2398,2399],{"class":931,"line":960},[929,2400,957],{"emptyLinePlaceholder":956},[929,2402,2403,2405,2407,2409,2412],{"class":931,"line":966},[929,2404,1040],{"class":1019},[929,2406,1043],{"class":1015},[929,2408,1046],{"class":1019},[929,2410,2411],{"class":946},"\"filesystem-server\"",[929,2413,1052],{"class":1019},[929,2415,2416],{"class":931,"line":1059},[929,2417,957],{"emptyLinePlaceholder":956},[929,2419,2420],{"class":931,"line":1065},[929,2421,2422],{"class":935},"# 配置允许访问的根目录\n",[929,2424,2425,2428,2430,2433,2436,2439,2442],{"class":931,"line":1074},[929,2426,2427],{"class":1086},"ALLOWED_ROOT",[929,2429,1395],{"class":1015},[929,2431,2432],{"class":1019}," Path(os.environ.get(",[929,2434,2435],{"class":946},"\"MCP_ROOT_DIR\"",[929,2437,2438],{"class":1019},", os.path.expanduser(",[929,2440,2441],{"class":946},"\"~\u002FDocuments\"",[929,2443,2444],{"class":1019},")))\n",[929,2446,2447],{"class":931,"line":1098},[929,2448,957],{"emptyLinePlaceholder":956},[929,2450,2451,2453,2456,2459,2461],{"class":931,"line":1104},[929,2452,1077],{"class":1015},[929,2454,2455],{"class":942}," _validate_path",[929,2457,2458],{"class":1019},"(path: ",[929,2460,1087],{"class":1086},[929,2462,2463],{"class":1019},") -> Path:\n",[929,2465,2466],{"class":931,"line":1128},[929,2467,2468],{"class":946},"    \"\"\"验证路径安全性，防止目录遍历攻击\"\"\"\n",[929,2470,2471,2474,2476,2479,2481,2484],{"class":931,"line":1133},[929,2472,2473],{"class":1019},"    resolved ",[929,2475,1043],{"class":1015},[929,2477,2478],{"class":1019}," (",[929,2480,2427],{"class":1086},[929,2482,2483],{"class":1015}," \u002F",[929,2485,2486],{"class":1019}," path).resolve()\n",[929,2488,2489,2491,2494,2496,2499,2501,2503,2505],{"class":931,"line":1139},[929,2490,1721],{"class":1015},[929,2492,2493],{"class":1015}," not",[929,2495,2038],{"class":1086},[929,2497,2498],{"class":1019},"(resolved).startswith(",[929,2500,1087],{"class":1086},[929,2502,1379],{"class":1019},[929,2504,2427],{"class":1086},[929,2506,2507],{"class":1019},".resolve())):\n",[929,2509,2510,2512,2514,2516,2519,2522,2524,2527,2529,2532],{"class":931,"line":1156},[929,2511,1737],{"class":1015},[929,2513,1740],{"class":1086},[929,2515,1379],{"class":1019},[929,2517,2518],{"class":1015},"f",[929,2520,2521],{"class":946},"\"访问被拒绝：路径 ",[929,2523,1116],{"class":1086},[929,2525,2526],{"class":1019},"path",[929,2528,1122],{"class":1086},[929,2530,2531],{"class":946}," 超出了允许的根目录范围\"",[929,2533,1052],{"class":1019},[929,2535,2536,2538],{"class":931,"line":1507},[929,2537,1107],{"class":1015},[929,2539,2540],{"class":1019}," resolved\n",[929,2542,2543],{"class":931,"line":2256},[929,2544,957],{"emptyLinePlaceholder":956},[929,2546,2547,2549,2551,2554],{"class":931,"line":2269},[929,2548,1809],{"class":942},[929,2550,1379],{"class":1019},[929,2552,2553],{"class":946},"\"fs:\u002F\u002Froot\"",[929,2555,1052],{"class":1019},[929,2557,2559,2561,2564,2566,2568],{"class":931,"line":2558},18,[929,2560,1077],{"class":1015},[929,2562,2563],{"class":942}," get_root_info",[929,2565,1826],{"class":1019},[929,2567,1087],{"class":1086},[929,2569,1095],{"class":1019},[929,2571,2573],{"class":931,"line":2572},19,[929,2574,2575],{"class":946},"    \"\"\"返回根目录信息\"\"\"\n",[929,2577,2579,2581,2583,2586,2589],{"class":931,"line":2578},20,[929,2580,1107],{"class":1015},[929,2582,1110],{"class":1015},[929,2584,2585],{"class":946},"\"当前根目录: ",[929,2587,2588],{"class":1086},"{ALLOWED_ROOT}",[929,2590,2591],{"class":946},"\"\n",[929,2593,2595],{"class":931,"line":2594},21,[929,2596,957],{"emptyLinePlaceholder":956},[929,2598,2600,2602],{"class":931,"line":2599},22,[929,2601,1068],{"class":942},[929,2603,1071],{"class":1019},[929,2605,2607,2609,2612,2614,2616,2618,2621,2623,2625],{"class":931,"line":2606},23,[929,2608,1077],{"class":1015},[929,2610,2611],{"class":942}," list_directory",[929,2613,2458],{"class":1019},[929,2615,1087],{"class":1086},[929,2617,1395],{"class":1015},[929,2619,2620],{"class":946}," \".\"",[929,2622,1090],{"class":1019},[929,2624,1087],{"class":1086},[929,2626,1095],{"class":1019},[929,2628,2630],{"class":931,"line":2629},24,[929,2631,2632],{"class":946},"    \"\"\"列出指定目录下的文件和子目录\"\"\"\n",[929,2634,2636,2639,2641],{"class":931,"line":2635},25,[929,2637,2638],{"class":1019},"    target ",[929,2640,1043],{"class":1015},[929,2642,2643],{"class":1019}," _validate_path(path)\n",[929,2645,2647,2649,2651],{"class":931,"line":2646},26,[929,2648,1721],{"class":1015},[929,2650,2493],{"class":1015},[929,2652,2653],{"class":1019}," target.is_dir():\n",[929,2655,2657,2659,2661,2663,2665,2668,2670,2672,2674,2677],{"class":931,"line":2656},27,[929,2658,1737],{"class":1015},[929,2660,1740],{"class":1086},[929,2662,1379],{"class":1019},[929,2664,2518],{"class":1015},[929,2666,2667],{"class":946},"\"",[929,2669,1116],{"class":1086},[929,2671,2526],{"class":1019},[929,2673,1122],{"class":1086},[929,2675,2676],{"class":946}," 不是一个目录\"",[929,2678,1052],{"class":1019},[929,2680,2682],{"class":931,"line":2681},28,[929,2683,957],{"emptyLinePlaceholder":956},[929,2685,2687,2690,2692],{"class":931,"line":2686},29,[929,2688,2689],{"class":1019},"    entries ",[929,2691,1043],{"class":1015},[929,2693,2694],{"class":1019}," []\n",[929,2696,2698,2701,2704,2707,2710],{"class":931,"line":2697},30,[929,2699,2700],{"class":1015},"    for",[929,2702,2703],{"class":1019}," entry ",[929,2705,2706],{"class":1015},"in",[929,2708,2709],{"class":1086}," sorted",[929,2711,2712],{"class":1019},"(target.iterdir()):\n",[929,2714,2716,2719,2721,2724,2727,2730,2733],{"class":931,"line":2715},31,[929,2717,2718],{"class":1019},"        entry_type ",[929,2720,1043],{"class":1015},[929,2722,2723],{"class":946}," \"📁\"",[929,2725,2726],{"class":1015}," if",[929,2728,2729],{"class":1019}," entry.is_dir() ",[929,2731,2732],{"class":1015},"else",[929,2734,2735],{"class":946}," \"📄\"\n",[929,2737,2739,2742,2744,2747,2749,2752,2754],{"class":931,"line":2738},32,[929,2740,2741],{"class":1019},"        size ",[929,2743,1043],{"class":1015},[929,2745,2746],{"class":1019}," entry.stat().st_size ",[929,2748,1142],{"class":1015},[929,2750,2751],{"class":1019}," entry.is_file() ",[929,2753,2732],{"class":1015},[929,2755,2756],{"class":1086}," 0\n",[929,2758,2760,2763,2765,2767,2769,2772,2774,2777,2780,2782,2785,2787,2790,2792,2795],{"class":931,"line":2759},33,[929,2761,2762],{"class":1019},"        entries.append(",[929,2764,2518],{"class":1015},[929,2766,2667],{"class":946},[929,2768,1116],{"class":1086},[929,2770,2771],{"class":1019},"entry_type",[929,2773,1122],{"class":1086},[929,2775,2776],{"class":1086}," {",[929,2778,2779],{"class":1019},"entry.name",[929,2781,1122],{"class":1086},[929,2783,2784],{"class":946},"  (",[929,2786,1116],{"class":1086},[929,2788,2789],{"class":1019},"size",[929,2791,1122],{"class":1086},[929,2793,2794],{"class":946}," bytes)\"",[929,2796,1052],{"class":1019},[929,2798,2800],{"class":931,"line":2799},34,[929,2801,957],{"emptyLinePlaceholder":956},[929,2803,2805,2807,2810,2813,2815,2818,2820,2823,2825],{"class":931,"line":2804},35,[929,2806,1107],{"class":1015},[929,2808,2809],{"class":946}," \"",[929,2811,2812],{"class":1086},"\\n",[929,2814,2667],{"class":946},[929,2816,2817],{"class":1019},".join(entries) ",[929,2819,1142],{"class":1015},[929,2821,2822],{"class":1019}," entries ",[929,2824,2732],{"class":1015},[929,2826,2827],{"class":946}," \"（空目录）\"\n",[929,2829,2831],{"class":931,"line":2830},36,[929,2832,957],{"emptyLinePlaceholder":956},[929,2834,2836,2838],{"class":931,"line":2835},37,[929,2837,1068],{"class":942},[929,2839,1071],{"class":1019},[929,2841,2843,2845,2848,2850,2852,2854,2856],{"class":931,"line":2842},38,[929,2844,1077],{"class":1015},[929,2846,2847],{"class":942}," read_file",[929,2849,2458],{"class":1019},[929,2851,1087],{"class":1086},[929,2853,1090],{"class":1019},[929,2855,1087],{"class":1086},[929,2857,1095],{"class":1019},[929,2859,2861],{"class":931,"line":2860},39,[929,2862,2863],{"class":946},"    \"\"\"读取文件内容（仅支持文本文件）\"\"\"\n",[929,2865,2867,2869,2871],{"class":931,"line":2866},40,[929,2868,2638],{"class":1019},[929,2870,1043],{"class":1015},[929,2872,2643],{"class":1019},[929,2874,2876,2878,2880],{"class":931,"line":2875},41,[929,2877,1721],{"class":1015},[929,2879,2493],{"class":1015},[929,2881,2882],{"class":1019}," target.is_file():\n",[929,2884,2886,2888,2890,2892,2894,2896,2898,2900,2902,2905],{"class":931,"line":2885},42,[929,2887,1737],{"class":1015},[929,2889,1740],{"class":1086},[929,2891,1379],{"class":1019},[929,2893,2518],{"class":1015},[929,2895,2667],{"class":946},[929,2897,1116],{"class":1086},[929,2899,2526],{"class":1019},[929,2901,1122],{"class":1086},[929,2903,2904],{"class":946}," 不是一个文件\"",[929,2906,1052],{"class":1019},[929,2908,2910],{"class":931,"line":2909},43,[929,2911,957],{"emptyLinePlaceholder":956},[929,2913,2915,2917,2920,2923,2925,2928],{"class":931,"line":2914},44,[929,2916,1107],{"class":1015},[929,2918,2919],{"class":1019}," target.read_text(",[929,2921,2922],{"class":1401},"encoding",[929,2924,1043],{"class":1015},[929,2926,2927],{"class":946},"\"utf-8\"",[929,2929,1052],{"class":1019},[929,2931,2933],{"class":931,"line":2932},45,[929,2934,957],{"emptyLinePlaceholder":956},[929,2936,2938,2940],{"class":931,"line":2937},46,[929,2939,1068],{"class":942},[929,2941,1071],{"class":1019},[929,2943,2945,2947,2950,2952,2954,2957,2959,2961,2963],{"class":931,"line":2944},47,[929,2946,1077],{"class":1015},[929,2948,2949],{"class":942}," write_file",[929,2951,2458],{"class":1019},[929,2953,1087],{"class":1086},[929,2955,2956],{"class":1019},", content: ",[929,2958,1087],{"class":1086},[929,2960,1090],{"class":1019},[929,2962,1087],{"class":1086},[929,2964,1095],{"class":1019},[929,2966,2968],{"class":931,"line":2967},48,[929,2969,2970],{"class":946},"    \"\"\"写入内容到文件（会覆盖已有内容）\"\"\"\n",[929,2972,2974,2976,2978],{"class":931,"line":2973},49,[929,2975,2638],{"class":1019},[929,2977,1043],{"class":1015},[929,2979,2643],{"class":1019},[929,2981,2983,2986,2989,2991,2994,2996,2999,3001,3003],{"class":931,"line":2982},50,[929,2984,2985],{"class":1019},"    target.parent.mkdir(",[929,2987,2988],{"class":1401},"parents",[929,2990,1043],{"class":1015},[929,2992,2993],{"class":1086},"True",[929,2995,1431],{"class":1019},[929,2997,2998],{"class":1401},"exist_ok",[929,3000,1043],{"class":1015},[929,3002,2993],{"class":1086},[929,3004,1052],{"class":1019},[929,3006,3008,3011,3013,3015,3017],{"class":931,"line":3007},51,[929,3009,3010],{"class":1019},"    target.write_text(content, ",[929,3012,2922],{"class":1401},[929,3014,1043],{"class":1015},[929,3016,2927],{"class":946},[929,3018,1052],{"class":1019},[929,3020,3022,3024,3026,3029,3031,3033,3035,3037,3040,3043,3045],{"class":931,"line":3021},52,[929,3023,1107],{"class":1015},[929,3025,1110],{"class":1015},[929,3027,3028],{"class":946},"\"已成功写入文件: ",[929,3030,1116],{"class":1086},[929,3032,2526],{"class":1019},[929,3034,1122],{"class":1086},[929,3036,2478],{"class":946},[929,3038,3039],{"class":1086},"{len",[929,3041,3042],{"class":1019},"(content)",[929,3044,1122],{"class":1086},[929,3046,3047],{"class":946}," 字符)\"\n",[929,3049,3051],{"class":931,"line":3050},53,[929,3052,957],{"emptyLinePlaceholder":956},[929,3054,3056,3058],{"class":931,"line":3055},54,[929,3057,1068],{"class":942},[929,3059,1071],{"class":1019},[929,3061,3063,3065,3068,3071,3073,3076,3078,3080,3082,3084,3086],{"class":931,"line":3062},55,[929,3064,1077],{"class":1015},[929,3066,3067],{"class":942}," search_files",[929,3069,3070],{"class":1019},"(pattern: ",[929,3072,1087],{"class":1086},[929,3074,3075],{"class":1019},", path: ",[929,3077,1087],{"class":1086},[929,3079,1395],{"class":1015},[929,3081,2620],{"class":946},[929,3083,1090],{"class":1019},[929,3085,1087],{"class":1086},[929,3087,1095],{"class":1019},[929,3089,3091],{"class":931,"line":3090},56,[929,3092,3093],{"class":946},"    \"\"\"在目录中搜索匹配指定模式的文件\"\"\"\n",[929,3095,3097,3099,3101],{"class":931,"line":3096},57,[929,3098,2638],{"class":1019},[929,3100,1043],{"class":1015},[929,3102,2643],{"class":1019},[929,3104,3106,3109,3111,3114],{"class":931,"line":3105},58,[929,3107,3108],{"class":1019},"    matches ",[929,3110,1043],{"class":1015},[929,3112,3113],{"class":1086}," list",[929,3115,3116],{"class":1019},"(target.rglob(pattern))\n",[929,3118,3120],{"class":931,"line":3119},59,[929,3121,957],{"emptyLinePlaceholder":956},[929,3123,3125,3127,3129],{"class":931,"line":3124},60,[929,3126,1721],{"class":1015},[929,3128,2493],{"class":1015},[929,3130,3131],{"class":1019}," matches:\n",[929,3133,3135,3137,3139,3142,3144,3147,3149],{"class":931,"line":3134},61,[929,3136,1661],{"class":1015},[929,3138,1110],{"class":1015},[929,3140,3141],{"class":946},"\"未找到匹配 '",[929,3143,1116],{"class":1086},[929,3145,3146],{"class":1019},"pattern",[929,3148,1122],{"class":1086},[929,3150,3151],{"class":946},"' 的文件\"\n",[929,3153,3155],{"class":931,"line":3154},62,[929,3156,957],{"emptyLinePlaceholder":956},[929,3158,3160,3163,3165],{"class":931,"line":3159},63,[929,3161,3162],{"class":1019},"    results ",[929,3164,1043],{"class":1015},[929,3166,2694],{"class":1019},[929,3168,3170,3172,3175,3177,3180,3183,3186],{"class":931,"line":3169},64,[929,3171,2700],{"class":1015},[929,3173,3174],{"class":1019}," match ",[929,3176,2706],{"class":1015},[929,3178,3179],{"class":1019}," matches[:",[929,3181,3182],{"class":1086},"50",[929,3184,3185],{"class":1019},"]:  ",[929,3187,3188],{"class":935},"# 限制结果数量\n",[929,3190,3192,3195,3197,3200,3202],{"class":931,"line":3191},65,[929,3193,3194],{"class":1019},"        rel_path ",[929,3196,1043],{"class":1015},[929,3198,3199],{"class":1019}," match.relative_to(",[929,3201,2427],{"class":1086},[929,3203,1052],{"class":1019},[929,3205,3207,3210,3212],{"class":931,"line":3206},66,[929,3208,3209],{"class":1019},"        results.append(",[929,3211,1087],{"class":1086},[929,3213,3214],{"class":1019},"(rel_path))\n",[929,3216,3218],{"class":931,"line":3217},67,[929,3219,957],{"emptyLinePlaceholder":956},[929,3221,3223,3225,3227,3229,3231],{"class":931,"line":3222},68,[929,3224,1107],{"class":1015},[929,3226,2809],{"class":946},[929,3228,2812],{"class":1086},[929,3230,2667],{"class":946},[929,3232,3233],{"class":1019},".join(results)\n",[929,3235,3237],{"class":931,"line":3236},69,[929,3238,957],{"emptyLinePlaceholder":956},[929,3240,3242,3244,3246,3248,3250],{"class":931,"line":3241},70,[929,3243,1142],{"class":1015},[929,3245,1145],{"class":1086},[929,3247,1148],{"class":1015},[929,3249,1151],{"class":946},[929,3251,1095],{"class":1019},[929,3253,3255],{"class":931,"line":3254},71,[929,3256,1159],{"class":1019},[3258,3259,3260],"warning",{},"\n文件系统 Server 需要特别注意安全性。务必验证所有路径参数，防止目录遍历攻击，并限制可访问的目录范围。\n",[892,3262,3264],{"id":3263},"完整示例数据库查询-mcp-server","完整示例：数据库查询 MCP Server",[896,3266,3267],{},"以下示例实现了一个 SQLite 数据库查询 Server：",[920,3269,3271],{"className":1006,"code":3270,"language":1008,"meta":11,"style":11},"import sqlite3\nimport json\nfrom pathlib import Path\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"database-server\")\n\nDB_PATH = Path(os.environ.get(\"MCP_DB_PATH\", \"data.db\"))\n\ndef get_connection() -> sqlite3.Connection:\n    \"\"\"获取数据库连接\"\"\"\n    conn = sqlite3.connect(str(DB_PATH))\n    conn.row_factory = sqlite3.Row\n    return conn\n\n@mcp.resource(\"db:\u002F\u002Fschema\")\ndef get_schema() -> str:\n    \"\"\"获取数据库表结构\"\"\"\n    conn = get_connection()\n    cursor = conn.execute(\n        \"SELECT sql FROM sqlite_master WHERE type='table' ORDER BY name\"\n    )\n    schemas = [row[0] for row in cursor.fetchall() if row[0]]\n    conn.close()\n    return \"\\n\\n\".join(schemas)\n\n@mcp.resource(\"db:\u002F\u002Ftables\")\ndef list_tables() -> str:\n    \"\"\"列出所有数据表\"\"\"\n    conn = get_connection()\n    cursor = conn.execute(\n        \"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name\"\n    )\n    tables = [row[0] for row in cursor.fetchall()]\n    conn.close()\n    return json.dumps(tables, ensure_ascii=False)\n\n@mcp.tool()\ndef query(sql: str, limit: int = 100) -> str:\n    \"\"\"执行只读 SQL 查询（仅支持 SELECT 语句）\"\"\"\n    # 安全检查：仅允许 SELECT 语句\n    sql_stripped = sql.strip().upper()\n    if not sql_stripped.startswith(\"SELECT\"):\n        raise ValueError(\"仅允许执行 SELECT 查询语句\")\n\n    conn = get_connection()\n    try:\n        cursor = conn.execute(f\"{sql} LIMIT {limit}\")\n        columns = [desc[0] for desc in cursor.description]\n        rows = cursor.fetchall()\n\n        result = {\n            \"columns\": columns,\n            \"rows\": [dict(row) for row in rows],\n            \"row_count\": len(rows),\n        }\n        return json.dumps(result, ensure_ascii=False, indent=2)\n    except sqlite3.Error as e:\n        raise ValueError(f\"SQL 执行错误: {e}\")\n    finally:\n        conn.close()\n\n@mcp.tool()\ndef describe_table(table_name: str) -> str:\n    \"\"\"获取指定表的详细结构信息\"\"\"\n    conn = get_connection()\n    try:\n        cursor = conn.execute(f\"PRAGMA table_info({table_name})\")\n        columns = cursor.fetchall()\n\n        if not columns:\n            raise ValueError(f\"表 '{table_name}' 不存在\")\n\n        result = []\n        for col in columns:\n            result.append({\n                \"name\": col[1],\n                \"type\": col[2],\n                \"nullable\": not col[3],\n                \"primary_key\": bool(col[5]),\n            })\n        return json.dumps(result, ensure_ascii=False, indent=2)\n    finally:\n        conn.close()\n\n@mcp.prompt()\ndef data_analysis(table_name: str, question: str) -> str:\n    \"\"\"数据分析提示词模板\"\"\"\n    # 自动获取表结构作为上下文\n    conn = get_connection()\n    cursor = conn.execute(\n        f\"SELECT sql FROM sqlite_master WHERE type='table' AND name=?\",\n        (table_name,)\n    )\n    row = cursor.fetchone()\n    conn.close()\n\n    schema = row[0] if row else \"未找到表结构\"\n\n    return f\"\"\"你是一位数据分析专家。请根据以下信息进行分析：\n\n表结构：\n{schema}\n\n分析需求：{question}\n\n请先生成合适的 SQL 查询，然后使用 query 工具执行查询，最后对结果进行分析和可视化建议。\"\"\"\n\nif __name__ == \"__main__\":\n    mcp.run()\n",[926,3272,3273,3280,3287,3297,3307,3311,3324,3328,3348,3352,3362,3367,3385,3395,3402,3406,3417,3430,3435,3444,3454,3459,3464,3501,3506,3520,3524,3535,3548,3553,3561,3569,3574,3578,3600,3604,3621,3625,3631,3659,3664,3669,3679,3693,3706,3710,3718,3725,3760,3784,3794,3798,3807,3815,3838,3851,3856,3881,3894,3918,3925,3930,3934,3940,3958,3963,3971,3977,4002,4010,4014,4024,4050,4055,4064,4077,4083,4098,4110,4129,4149,4155,4178,4185,4190,4195,4202,4225,4231,4237,4246,4255,4267,4273,4278,4289,4294,4299,4322,4327,4337,4342,4348,4358,4363,4376,4381,4387,4392,4405],{"__ignoreMap":11},[929,3274,3275,3277],{"class":931,"line":932},[929,3276,1023],{"class":1015},[929,3278,3279],{"class":1019}," sqlite3\n",[929,3281,3282,3284],{"class":931,"line":939},[929,3283,1023],{"class":1015},[929,3285,3286],{"class":1019}," json\n",[929,3288,3289,3291,3293,3295],{"class":931,"line":953},[929,3290,1016],{"class":1015},[929,3292,2381],{"class":1019},[929,3294,1023],{"class":1015},[929,3296,2386],{"class":1019},[929,3298,3299,3301,3303,3305],{"class":931,"line":960},[929,3300,1016],{"class":1015},[929,3302,1020],{"class":1019},[929,3304,1023],{"class":1015},[929,3306,1026],{"class":1019},[929,3308,3309],{"class":931,"line":966},[929,3310,957],{"emptyLinePlaceholder":956},[929,3312,3313,3315,3317,3319,3322],{"class":931,"line":1059},[929,3314,1040],{"class":1019},[929,3316,1043],{"class":1015},[929,3318,1046],{"class":1019},[929,3320,3321],{"class":946},"\"database-server\"",[929,3323,1052],{"class":1019},[929,3325,3326],{"class":931,"line":1065},[929,3327,957],{"emptyLinePlaceholder":956},[929,3329,3330,3333,3335,3337,3340,3342,3345],{"class":931,"line":1074},[929,3331,3332],{"class":1086},"DB_PATH",[929,3334,1395],{"class":1015},[929,3336,2432],{"class":1019},[929,3338,3339],{"class":946},"\"MCP_DB_PATH\"",[929,3341,1431],{"class":1019},[929,3343,3344],{"class":946},"\"data.db\"",[929,3346,3347],{"class":1019},"))\n",[929,3349,3350],{"class":931,"line":1098},[929,3351,957],{"emptyLinePlaceholder":956},[929,3353,3354,3356,3359],{"class":931,"line":1104},[929,3355,1077],{"class":1015},[929,3357,3358],{"class":942}," get_connection",[929,3360,3361],{"class":1019},"() -> sqlite3.Connection:\n",[929,3363,3364],{"class":931,"line":1128},[929,3365,3366],{"class":946},"    \"\"\"获取数据库连接\"\"\"\n",[929,3368,3369,3372,3374,3377,3379,3381,3383],{"class":931,"line":1133},[929,3370,3371],{"class":1019},"    conn ",[929,3373,1043],{"class":1015},[929,3375,3376],{"class":1019}," sqlite3.connect(",[929,3378,1087],{"class":1086},[929,3380,1379],{"class":1019},[929,3382,3332],{"class":1086},[929,3384,3347],{"class":1019},[929,3386,3387,3390,3392],{"class":931,"line":1139},[929,3388,3389],{"class":1019},"    conn.row_factory ",[929,3391,1043],{"class":1015},[929,3393,3394],{"class":1019}," sqlite3.Row\n",[929,3396,3397,3399],{"class":931,"line":1156},[929,3398,1107],{"class":1015},[929,3400,3401],{"class":1019}," conn\n",[929,3403,3404],{"class":931,"line":1507},[929,3405,957],{"emptyLinePlaceholder":956},[929,3407,3408,3410,3412,3415],{"class":931,"line":2256},[929,3409,1809],{"class":942},[929,3411,1379],{"class":1019},[929,3413,3414],{"class":946},"\"db:\u002F\u002Fschema\"",[929,3416,1052],{"class":1019},[929,3418,3419,3421,3424,3426,3428],{"class":931,"line":2269},[929,3420,1077],{"class":1015},[929,3422,3423],{"class":942}," get_schema",[929,3425,1826],{"class":1019},[929,3427,1087],{"class":1086},[929,3429,1095],{"class":1019},[929,3431,3432],{"class":931,"line":2558},[929,3433,3434],{"class":946},"    \"\"\"获取数据库表结构\"\"\"\n",[929,3436,3437,3439,3441],{"class":931,"line":2572},[929,3438,3371],{"class":1019},[929,3440,1043],{"class":1015},[929,3442,3443],{"class":1019}," get_connection()\n",[929,3445,3446,3449,3451],{"class":931,"line":2578},[929,3447,3448],{"class":1019},"    cursor ",[929,3450,1043],{"class":1015},[929,3452,3453],{"class":1019}," conn.execute(\n",[929,3455,3456],{"class":931,"line":2594},[929,3457,3458],{"class":946},"        \"SELECT sql FROM sqlite_master WHERE type='table' ORDER BY name\"\n",[929,3460,3461],{"class":931,"line":2599},[929,3462,3463],{"class":1019},"    )\n",[929,3465,3466,3469,3471,3474,3477,3480,3483,3486,3488,3491,3493,3496,3498],{"class":931,"line":2606},[929,3467,3468],{"class":1019},"    schemas ",[929,3470,1043],{"class":1015},[929,3472,3473],{"class":1019}," [row[",[929,3475,3476],{"class":1086},"0",[929,3478,3479],{"class":1019},"] ",[929,3481,3482],{"class":1015},"for",[929,3484,3485],{"class":1019}," row ",[929,3487,2706],{"class":1015},[929,3489,3490],{"class":1019}," cursor.fetchall() ",[929,3492,1142],{"class":1015},[929,3494,3495],{"class":1019}," row[",[929,3497,3476],{"class":1086},[929,3499,3500],{"class":1019},"]]\n",[929,3502,3503],{"class":931,"line":2629},[929,3504,3505],{"class":1019},"    conn.close()\n",[929,3507,3508,3510,3512,3515,3517],{"class":931,"line":2635},[929,3509,1107],{"class":1015},[929,3511,2809],{"class":946},[929,3513,3514],{"class":1086},"\\n\\n",[929,3516,2667],{"class":946},[929,3518,3519],{"class":1019},".join(schemas)\n",[929,3521,3522],{"class":931,"line":2646},[929,3523,957],{"emptyLinePlaceholder":956},[929,3525,3526,3528,3530,3533],{"class":931,"line":2656},[929,3527,1809],{"class":942},[929,3529,1379],{"class":1019},[929,3531,3532],{"class":946},"\"db:\u002F\u002Ftables\"",[929,3534,1052],{"class":1019},[929,3536,3537,3539,3542,3544,3546],{"class":931,"line":2681},[929,3538,1077],{"class":1015},[929,3540,3541],{"class":942}," list_tables",[929,3543,1826],{"class":1019},[929,3545,1087],{"class":1086},[929,3547,1095],{"class":1019},[929,3549,3550],{"class":931,"line":2686},[929,3551,3552],{"class":946},"    \"\"\"列出所有数据表\"\"\"\n",[929,3554,3555,3557,3559],{"class":931,"line":2697},[929,3556,3371],{"class":1019},[929,3558,1043],{"class":1015},[929,3560,3443],{"class":1019},[929,3562,3563,3565,3567],{"class":931,"line":2715},[929,3564,3448],{"class":1019},[929,3566,1043],{"class":1015},[929,3568,3453],{"class":1019},[929,3570,3571],{"class":931,"line":2738},[929,3572,3573],{"class":946},"        \"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name\"\n",[929,3575,3576],{"class":931,"line":2759},[929,3577,3463],{"class":1019},[929,3579,3580,3583,3585,3587,3589,3591,3593,3595,3597],{"class":931,"line":2799},[929,3581,3582],{"class":1019},"    tables ",[929,3584,1043],{"class":1015},[929,3586,3473],{"class":1019},[929,3588,3476],{"class":1086},[929,3590,3479],{"class":1019},[929,3592,3482],{"class":1015},[929,3594,3485],{"class":1019},[929,3596,2706],{"class":1015},[929,3598,3599],{"class":1019}," cursor.fetchall()]\n",[929,3601,3602],{"class":931,"line":2804},[929,3603,3505],{"class":1019},[929,3605,3606,3608,3611,3614,3616,3619],{"class":931,"line":2830},[929,3607,1107],{"class":1015},[929,3609,3610],{"class":1019}," json.dumps(tables, ",[929,3612,3613],{"class":1401},"ensure_ascii",[929,3615,1043],{"class":1015},[929,3617,3618],{"class":1086},"False",[929,3620,1052],{"class":1019},[929,3622,3623],{"class":931,"line":2835},[929,3624,957],{"emptyLinePlaceholder":956},[929,3626,3627,3629],{"class":931,"line":2842},[929,3628,1068],{"class":942},[929,3630,1071],{"class":1019},[929,3632,3633,3635,3638,3641,3643,3646,3648,3650,3653,3655,3657],{"class":931,"line":2860},[929,3634,1077],{"class":1015},[929,3636,3637],{"class":942}," query",[929,3639,3640],{"class":1019},"(sql: ",[929,3642,1087],{"class":1086},[929,3644,3645],{"class":1019},", limit: ",[929,3647,1448],{"class":1086},[929,3649,1395],{"class":1015},[929,3651,3652],{"class":1086}," 100",[929,3654,1090],{"class":1019},[929,3656,1087],{"class":1086},[929,3658,1095],{"class":1019},[929,3660,3661],{"class":931,"line":2866},[929,3662,3663],{"class":946},"    \"\"\"执行只读 SQL 查询（仅支持 SELECT 语句）\"\"\"\n",[929,3665,3666],{"class":931,"line":2875},[929,3667,3668],{"class":935},"    # 安全检查：仅允许 SELECT 语句\n",[929,3670,3671,3674,3676],{"class":931,"line":2885},[929,3672,3673],{"class":1019},"    sql_stripped ",[929,3675,1043],{"class":1015},[929,3677,3678],{"class":1019}," sql.strip().upper()\n",[929,3680,3681,3683,3685,3688,3691],{"class":931,"line":2909},[929,3682,1721],{"class":1015},[929,3684,2493],{"class":1015},[929,3686,3687],{"class":1019}," sql_stripped.startswith(",[929,3689,3690],{"class":946},"\"SELECT\"",[929,3692,1385],{"class":1019},[929,3694,3695,3697,3699,3701,3704],{"class":931,"line":2914},[929,3696,1737],{"class":1015},[929,3698,1740],{"class":1086},[929,3700,1379],{"class":1019},[929,3702,3703],{"class":946},"\"仅允许执行 SELECT 查询语句\"",[929,3705,1052],{"class":1019},[929,3707,3708],{"class":931,"line":2932},[929,3709,957],{"emptyLinePlaceholder":956},[929,3711,3712,3714,3716],{"class":931,"line":2937},[929,3713,3371],{"class":1019},[929,3715,1043],{"class":1015},[929,3717,3443],{"class":1019},[929,3719,3720,3723],{"class":931,"line":2944},[929,3721,3722],{"class":1015},"    try",[929,3724,1095],{"class":1019},[929,3726,3727,3730,3732,3735,3737,3739,3741,3744,3746,3749,3751,3754,3756,3758],{"class":931,"line":2967},[929,3728,3729],{"class":1019},"        cursor ",[929,3731,1043],{"class":1015},[929,3733,3734],{"class":1019}," conn.execute(",[929,3736,2518],{"class":1015},[929,3738,2667],{"class":946},[929,3740,1116],{"class":1086},[929,3742,3743],{"class":1019},"sql",[929,3745,1122],{"class":1086},[929,3747,3748],{"class":946}," LIMIT ",[929,3750,1116],{"class":1086},[929,3752,3753],{"class":1019},"limit",[929,3755,1122],{"class":1086},[929,3757,2667],{"class":946},[929,3759,1052],{"class":1019},[929,3761,3762,3765,3767,3770,3772,3774,3776,3779,3781],{"class":931,"line":2973},[929,3763,3764],{"class":1019},"        columns ",[929,3766,1043],{"class":1015},[929,3768,3769],{"class":1019}," [desc[",[929,3771,3476],{"class":1086},[929,3773,3479],{"class":1019},[929,3775,3482],{"class":1015},[929,3777,3778],{"class":1019}," desc ",[929,3780,2706],{"class":1015},[929,3782,3783],{"class":1019}," cursor.description]\n",[929,3785,3786,3789,3791],{"class":931,"line":2982},[929,3787,3788],{"class":1019},"        rows ",[929,3790,1043],{"class":1015},[929,3792,3793],{"class":1019}," cursor.fetchall()\n",[929,3795,3796],{"class":931,"line":3007},[929,3797,957],{"emptyLinePlaceholder":956},[929,3799,3800,3803,3805],{"class":931,"line":3021},[929,3801,3802],{"class":1019},"        result ",[929,3804,1043],{"class":1015},[929,3806,1944],{"class":1019},[929,3808,3809,3812],{"class":931,"line":3050},[929,3810,3811],{"class":946},"            \"columns\"",[929,3813,3814],{"class":1019},": columns,\n",[929,3816,3817,3820,3823,3826,3829,3831,3833,3835],{"class":931,"line":3055},[929,3818,3819],{"class":946},"            \"rows\"",[929,3821,3822],{"class":1019},": [",[929,3824,3825],{"class":1086},"dict",[929,3827,3828],{"class":1019},"(row) ",[929,3830,3482],{"class":1015},[929,3832,3485],{"class":1019},[929,3834,2706],{"class":1015},[929,3836,3837],{"class":1019}," rows],\n",[929,3839,3840,3843,3845,3848],{"class":931,"line":3062},[929,3841,3842],{"class":946},"            \"row_count\"",[929,3844,1524],{"class":1019},[929,3846,3847],{"class":1086},"len",[929,3849,3850],{"class":1019},"(rows),\n",[929,3852,3853],{"class":931,"line":3090},[929,3854,3855],{"class":1019},"        }\n",[929,3857,3858,3860,3863,3865,3867,3869,3871,3874,3876,3879],{"class":931,"line":3096},[929,3859,1661],{"class":1015},[929,3861,3862],{"class":1019}," json.dumps(result, ",[929,3864,3613],{"class":1401},[929,3866,1043],{"class":1015},[929,3868,3618],{"class":1086},[929,3870,1431],{"class":1019},[929,3872,3873],{"class":1401},"indent",[929,3875,1043],{"class":1015},[929,3877,3878],{"class":1086},"2",[929,3880,1052],{"class":1019},[929,3882,3883,3886,3889,3891],{"class":931,"line":3105},[929,3884,3885],{"class":1015},"    except",[929,3887,3888],{"class":1019}," sqlite3.Error ",[929,3890,1640],{"class":1015},[929,3892,3893],{"class":1019}," e:\n",[929,3895,3896,3898,3900,3902,3904,3907,3909,3912,3914,3916],{"class":931,"line":3119},[929,3897,1737],{"class":1015},[929,3899,1740],{"class":1086},[929,3901,1379],{"class":1019},[929,3903,2518],{"class":1015},[929,3905,3906],{"class":946},"\"SQL 执行错误: ",[929,3908,1116],{"class":1086},[929,3910,3911],{"class":1019},"e",[929,3913,1122],{"class":1086},[929,3915,2667],{"class":946},[929,3917,1052],{"class":1019},[929,3919,3920,3923],{"class":931,"line":3124},[929,3921,3922],{"class":1015},"    finally",[929,3924,1095],{"class":1019},[929,3926,3927],{"class":931,"line":3134},[929,3928,3929],{"class":1019},"        conn.close()\n",[929,3931,3932],{"class":931,"line":3154},[929,3933,957],{"emptyLinePlaceholder":956},[929,3935,3936,3938],{"class":931,"line":3159},[929,3937,1068],{"class":942},[929,3939,1071],{"class":1019},[929,3941,3942,3944,3947,3950,3952,3954,3956],{"class":931,"line":3169},[929,3943,1077],{"class":1015},[929,3945,3946],{"class":942}," describe_table",[929,3948,3949],{"class":1019},"(table_name: ",[929,3951,1087],{"class":1086},[929,3953,1090],{"class":1019},[929,3955,1087],{"class":1086},[929,3957,1095],{"class":1019},[929,3959,3960],{"class":931,"line":3191},[929,3961,3962],{"class":946},"    \"\"\"获取指定表的详细结构信息\"\"\"\n",[929,3964,3965,3967,3969],{"class":931,"line":3206},[929,3966,3371],{"class":1019},[929,3968,1043],{"class":1015},[929,3970,3443],{"class":1019},[929,3972,3973,3975],{"class":931,"line":3217},[929,3974,3722],{"class":1015},[929,3976,1095],{"class":1019},[929,3978,3979,3981,3983,3985,3987,3990,3992,3995,3997,4000],{"class":931,"line":3222},[929,3980,3729],{"class":1019},[929,3982,1043],{"class":1015},[929,3984,3734],{"class":1019},[929,3986,2518],{"class":1015},[929,3988,3989],{"class":946},"\"PRAGMA table_info(",[929,3991,1116],{"class":1086},[929,3993,3994],{"class":1019},"table_name",[929,3996,1122],{"class":1086},[929,3998,3999],{"class":946},")\"",[929,4001,1052],{"class":1019},[929,4003,4004,4006,4008],{"class":931,"line":3236},[929,4005,3764],{"class":1019},[929,4007,1043],{"class":1015},[929,4009,3793],{"class":1019},[929,4011,4012],{"class":931,"line":3241},[929,4013,957],{"emptyLinePlaceholder":956},[929,4015,4016,4019,4021],{"class":931,"line":3254},[929,4017,4018],{"class":1015},"        if",[929,4020,2493],{"class":1015},[929,4022,4023],{"class":1019}," columns:\n",[929,4025,4027,4030,4032,4034,4036,4039,4041,4043,4045,4048],{"class":931,"line":4026},72,[929,4028,4029],{"class":1015},"            raise",[929,4031,1740],{"class":1086},[929,4033,1379],{"class":1019},[929,4035,2518],{"class":1015},[929,4037,4038],{"class":946},"\"表 '",[929,4040,1116],{"class":1086},[929,4042,3994],{"class":1019},[929,4044,1122],{"class":1086},[929,4046,4047],{"class":946},"' 不存在\"",[929,4049,1052],{"class":1019},[929,4051,4053],{"class":931,"line":4052},73,[929,4054,957],{"emptyLinePlaceholder":956},[929,4056,4058,4060,4062],{"class":931,"line":4057},74,[929,4059,3802],{"class":1019},[929,4061,1043],{"class":1015},[929,4063,2694],{"class":1019},[929,4065,4067,4070,4073,4075],{"class":931,"line":4066},75,[929,4068,4069],{"class":1015},"        for",[929,4071,4072],{"class":1019}," col ",[929,4074,2706],{"class":1015},[929,4076,4023],{"class":1019},[929,4078,4080],{"class":931,"line":4079},76,[929,4081,4082],{"class":1019},"            result.append({\n",[929,4084,4086,4089,4092,4095],{"class":931,"line":4085},77,[929,4087,4088],{"class":946},"                \"name\"",[929,4090,4091],{"class":1019},": col[",[929,4093,4094],{"class":1086},"1",[929,4096,4097],{"class":1019},"],\n",[929,4099,4101,4104,4106,4108],{"class":931,"line":4100},78,[929,4102,4103],{"class":946},"                \"type\"",[929,4105,4091],{"class":1019},[929,4107,3878],{"class":1086},[929,4109,4097],{"class":1019},[929,4111,4113,4116,4118,4121,4124,4127],{"class":931,"line":4112},79,[929,4114,4115],{"class":946},"                \"nullable\"",[929,4117,1524],{"class":1019},[929,4119,4120],{"class":1015},"not",[929,4122,4123],{"class":1019}," col[",[929,4125,4126],{"class":1086},"3",[929,4128,4097],{"class":1019},[929,4130,4132,4135,4137,4140,4143,4146],{"class":931,"line":4131},80,[929,4133,4134],{"class":946},"                \"primary_key\"",[929,4136,1524],{"class":1019},[929,4138,4139],{"class":1086},"bool",[929,4141,4142],{"class":1019},"(col[",[929,4144,4145],{"class":1086},"5",[929,4147,4148],{"class":1019},"]),\n",[929,4150,4152],{"class":931,"line":4151},81,[929,4153,4154],{"class":1019},"            })\n",[929,4156,4158,4160,4162,4164,4166,4168,4170,4172,4174,4176],{"class":931,"line":4157},82,[929,4159,1661],{"class":1015},[929,4161,3862],{"class":1019},[929,4163,3613],{"class":1401},[929,4165,1043],{"class":1015},[929,4167,3618],{"class":1086},[929,4169,1431],{"class":1019},[929,4171,3873],{"class":1401},[929,4173,1043],{"class":1015},[929,4175,3878],{"class":1086},[929,4177,1052],{"class":1019},[929,4179,4181,4183],{"class":931,"line":4180},83,[929,4182,3922],{"class":1015},[929,4184,1095],{"class":1019},[929,4186,4188],{"class":931,"line":4187},84,[929,4189,3929],{"class":1019},[929,4191,4193],{"class":931,"line":4192},85,[929,4194,957],{"emptyLinePlaceholder":956},[929,4196,4198,4200],{"class":931,"line":4197},86,[929,4199,2175],{"class":942},[929,4201,1071],{"class":1019},[929,4203,4205,4207,4210,4212,4214,4217,4219,4221,4223],{"class":931,"line":4204},87,[929,4206,1077],{"class":1015},[929,4208,4209],{"class":942}," data_analysis",[929,4211,3949],{"class":1019},[929,4213,1087],{"class":1086},[929,4215,4216],{"class":1019},", question: ",[929,4218,1087],{"class":1086},[929,4220,1090],{"class":1019},[929,4222,1087],{"class":1086},[929,4224,1095],{"class":1019},[929,4226,4228],{"class":931,"line":4227},88,[929,4229,4230],{"class":946},"    \"\"\"数据分析提示词模板\"\"\"\n",[929,4232,4234],{"class":931,"line":4233},89,[929,4235,4236],{"class":935},"    # 自动获取表结构作为上下文\n",[929,4238,4240,4242,4244],{"class":931,"line":4239},90,[929,4241,3371],{"class":1019},[929,4243,1043],{"class":1015},[929,4245,3443],{"class":1019},[929,4247,4249,4251,4253],{"class":931,"line":4248},91,[929,4250,3448],{"class":1019},[929,4252,1043],{"class":1015},[929,4254,3453],{"class":1019},[929,4256,4258,4261,4264],{"class":931,"line":4257},92,[929,4259,4260],{"class":1015},"        f",[929,4262,4263],{"class":946},"\"SELECT sql FROM sqlite_master WHERE type='table' AND name=?\"",[929,4265,4266],{"class":1019},",\n",[929,4268,4270],{"class":931,"line":4269},93,[929,4271,4272],{"class":1019},"        (table_name,)\n",[929,4274,4276],{"class":931,"line":4275},94,[929,4277,3463],{"class":1019},[929,4279,4281,4284,4286],{"class":931,"line":4280},95,[929,4282,4283],{"class":1019},"    row ",[929,4285,1043],{"class":1015},[929,4287,4288],{"class":1019}," cursor.fetchone()\n",[929,4290,4292],{"class":931,"line":4291},96,[929,4293,3505],{"class":1019},[929,4295,4297],{"class":931,"line":4296},97,[929,4298,957],{"emptyLinePlaceholder":956},[929,4300,4302,4305,4307,4309,4311,4313,4315,4317,4319],{"class":931,"line":4301},98,[929,4303,4304],{"class":1019},"    schema ",[929,4306,1043],{"class":1015},[929,4308,3495],{"class":1019},[929,4310,3476],{"class":1086},[929,4312,3479],{"class":1019},[929,4314,1142],{"class":1015},[929,4316,3485],{"class":1019},[929,4318,2732],{"class":1015},[929,4320,4321],{"class":946}," \"未找到表结构\"\n",[929,4323,4325],{"class":931,"line":4324},99,[929,4326,957],{"emptyLinePlaceholder":956},[929,4328,4330,4332,4334],{"class":931,"line":4329},100,[929,4331,1107],{"class":1015},[929,4333,1110],{"class":1015},[929,4335,4336],{"class":946},"\"\"\"你是一位数据分析专家。请根据以下信息进行分析：\n",[929,4338,4340],{"class":931,"line":4339},101,[929,4341,957],{"emptyLinePlaceholder":956},[929,4343,4345],{"class":931,"line":4344},102,[929,4346,4347],{"class":946},"表结构：\n",[929,4349,4351,4353,4356],{"class":931,"line":4350},103,[929,4352,1116],{"class":1086},[929,4354,4355],{"class":1019},"schema",[929,4357,2266],{"class":1086},[929,4359,4361],{"class":931,"line":4360},104,[929,4362,957],{"emptyLinePlaceholder":956},[929,4364,4366,4369,4371,4374],{"class":931,"line":4365},105,[929,4367,4368],{"class":946},"分析需求：",[929,4370,1116],{"class":1086},[929,4372,4373],{"class":1019},"question",[929,4375,2266],{"class":1086},[929,4377,4379],{"class":931,"line":4378},106,[929,4380,957],{"emptyLinePlaceholder":956},[929,4382,4384],{"class":931,"line":4383},107,[929,4385,4386],{"class":946},"请先生成合适的 SQL 查询，然后使用 query 工具执行查询，最后对结果进行分析和可视化建议。\"\"\"\n",[929,4388,4390],{"class":931,"line":4389},108,[929,4391,957],{"emptyLinePlaceholder":956},[929,4393,4395,4397,4399,4401,4403],{"class":931,"line":4394},109,[929,4396,1142],{"class":1015},[929,4398,1145],{"class":1086},[929,4400,1148],{"class":1015},[929,4402,1151],{"class":946},[929,4404,1095],{"class":1019},[929,4406,4408],{"class":931,"line":4407},110,[929,4409,1159],{"class":1019},[892,4411,4413],{"id":4412},"使用-mcp-inspector-测试","使用 MCP Inspector 测试",[896,4415,4416],{},"MCP Inspector 是官方提供的调试工具，可以直接与你的 MCP Server 进行交互测试：",[920,4418,4420],{"className":922,"code":4419,"language":924,"meta":11,"style":11},"# 安装 MCP Inspector\nnpx @modelcontextprotocol\u002Finspector\n\n# 测试你的 Server\nnpx @modelcontextprotocol\u002Finspector python src\u002Fmy_mcp_server\u002Fserver.py\n",[926,4421,4422,4427,4435,4439,4444],{"__ignoreMap":11},[929,4423,4424],{"class":931,"line":932},[929,4425,4426],{"class":935},"# 安装 MCP Inspector\n",[929,4428,4429,4432],{"class":931,"line":939},[929,4430,4431],{"class":942},"npx",[929,4433,4434],{"class":946}," @modelcontextprotocol\u002Finspector\n",[929,4436,4437],{"class":931,"line":953},[929,4438,957],{"emptyLinePlaceholder":956},[929,4440,4441],{"class":931,"line":960},[929,4442,4443],{"class":935},"# 测试你的 Server\n",[929,4445,4446,4448,4451,4454],{"class":931,"line":966},[929,4447,4431],{"class":942},[929,4449,4450],{"class":946}," @modelcontextprotocol\u002Finspector",[929,4452,4453],{"class":946}," python",[929,4455,4456],{"class":946}," src\u002Fmy_mcp_server\u002Fserver.py\n",[896,4458,4459],{},"MCP Inspector 提供了一个 Web 界面，你可以：",[4461,4462,4463,4467,4470,4473],"ul",{},[4464,4465,4466],"li",{},"查看 Server 暴露的所有 Tools、Resources 和 Prompts",[4464,4468,4469],{},"手动调用工具并查看返回结果",[4464,4471,4472],{},"测试资源的读取",[4464,4474,4475],{},"验证参数的 JSON Schema",[1311,4477,4478],{},"\n在开发过程中，建议始终使用 MCP Inspector 进行调试。它可以帮助你快速发现参数定义错误、返回格式问题等。\n",[892,4480,4482],{"id":4481},"在-claude-desktop-中配置","在 Claude Desktop 中配置",[896,4484,4485],{},"开发完成后，你可以将自己的 MCP Server 配置到 Claude Desktop 中使用。编辑配置文件：",[896,4487,4488,4491,4492],{},[900,4489,4490],{},"macOS:"," ",[926,4493,4494],{},"~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json",[920,4496,4500],{"className":4497,"code":4498,"language":4499,"meta":11,"style":11},"language-json shiki shiki-themes github-light github-light github-dark","{\n  \"mcpServers\": {\n    \"my-filesystem\": {\n      \"command\": \"python\",\n      \"args\": [\"\u002Fpath\u002Fto\u002Fsrc\u002Ffilesystem_server.py\"],\n      \"env\": {\n        \"MCP_ROOT_DIR\": \"\u002FUsers\u002Fyourname\u002FDocuments\"\n      }\n    },\n    \"my-database\": {\n      \"command\": \"python\",\n      \"args\": [\"\u002Fpath\u002Fto\u002Fsrc\u002Fdatabase_server.py\"],\n      \"env\": {\n        \"MCP_DB_PATH\": \"\u002Fpath\u002Fto\u002Fdata.db\"\n      }\n    }\n  }\n}\n","json",[926,4501,4502,4507,4515,4522,4534,4546,4553,4563,4568,4573,4580,4590,4601,4607,4617,4621,4625,4630],{"__ignoreMap":11},[929,4503,4504],{"class":931,"line":932},[929,4505,4506],{"class":1019},"{\n",[929,4508,4509,4512],{"class":931,"line":939},[929,4510,4511],{"class":1086},"  \"mcpServers\"",[929,4513,4514],{"class":1019},": {\n",[929,4516,4517,4520],{"class":931,"line":953},[929,4518,4519],{"class":1086},"    \"my-filesystem\"",[929,4521,4514],{"class":1019},[929,4523,4524,4527,4529,4532],{"class":931,"line":960},[929,4525,4526],{"class":1086},"      \"command\"",[929,4528,1524],{"class":1019},[929,4530,4531],{"class":946},"\"python\"",[929,4533,4266],{"class":1019},[929,4535,4536,4539,4541,4544],{"class":931,"line":966},[929,4537,4538],{"class":1086},"      \"args\"",[929,4540,3822],{"class":1019},[929,4542,4543],{"class":946},"\"\u002Fpath\u002Fto\u002Fsrc\u002Ffilesystem_server.py\"",[929,4545,4097],{"class":1019},[929,4547,4548,4551],{"class":931,"line":1059},[929,4549,4550],{"class":1086},"      \"env\"",[929,4552,4514],{"class":1019},[929,4554,4555,4558,4560],{"class":931,"line":1065},[929,4556,4557],{"class":1086},"        \"MCP_ROOT_DIR\"",[929,4559,1524],{"class":1019},[929,4561,4562],{"class":946},"\"\u002FUsers\u002Fyourname\u002FDocuments\"\n",[929,4564,4565],{"class":931,"line":1074},[929,4566,4567],{"class":1019},"      }\n",[929,4569,4570],{"class":931,"line":1098},[929,4571,4572],{"class":1019},"    },\n",[929,4574,4575,4578],{"class":931,"line":1104},[929,4576,4577],{"class":1086},"    \"my-database\"",[929,4579,4514],{"class":1019},[929,4581,4582,4584,4586,4588],{"class":931,"line":1128},[929,4583,4526],{"class":1086},[929,4585,1524],{"class":1019},[929,4587,4531],{"class":946},[929,4589,4266],{"class":1019},[929,4591,4592,4594,4596,4599],{"class":931,"line":1133},[929,4593,4538],{"class":1086},[929,4595,3822],{"class":1019},[929,4597,4598],{"class":946},"\"\u002Fpath\u002Fto\u002Fsrc\u002Fdatabase_server.py\"",[929,4600,4097],{"class":1019},[929,4602,4603,4605],{"class":931,"line":1139},[929,4604,4550],{"class":1086},[929,4606,4514],{"class":1019},[929,4608,4609,4612,4614],{"class":931,"line":1156},[929,4610,4611],{"class":1086},"        \"MCP_DB_PATH\"",[929,4613,1524],{"class":1019},[929,4615,4616],{"class":946},"\"\u002Fpath\u002Fto\u002Fdata.db\"\n",[929,4618,4619],{"class":931,"line":1507},[929,4620,4567],{"class":1019},[929,4622,4623],{"class":931,"line":2256},[929,4624,1872],{"class":1019},[929,4626,4627],{"class":931,"line":2269},[929,4628,4629],{"class":1019},"  }\n",[929,4631,4632],{"class":931,"line":2558},[929,4633,2266],{"class":1019},[892,4635,4636],{"id":4636},"部署建议",[912,4638,66],{"id":66},[896,4640,4641],{},"本地部署使用 stdio 传输，是最简单的方式：",[920,4643,4645],{"className":922,"code":4644,"language":924,"meta":11,"style":11},"# 直接运行\npython src\u002Fmy_mcp_server\u002Fserver.py\n\n# 或者打包为可执行命令\npip install -e .\nmy-mcp-server\n",[926,4646,4647,4652,4658,4662,4667,4679],{"__ignoreMap":11},[929,4648,4649],{"class":931,"line":932},[929,4650,4651],{"class":935},"# 直接运行\n",[929,4653,4654,4656],{"class":931,"line":939},[929,4655,1008],{"class":942},[929,4657,4456],{"class":946},[929,4659,4660],{"class":931,"line":953},[929,4661,957],{"emptyLinePlaceholder":956},[929,4663,4664],{"class":931,"line":960},[929,4665,4666],{"class":935},"# 或者打包为可执行命令\n",[929,4668,4669,4671,4673,4676],{"class":931,"line":966},[929,4670,943],{"class":942},[929,4672,947],{"class":946},[929,4674,4675],{"class":1086}," -e",[929,4677,4678],{"class":946}," .\n",[929,4680,4681],{"class":931,"line":1059},[929,4682,4683],{"class":942},"my-mcp-server\n",[912,4685,4686],{"id":4686},"远程部署",[896,4688,4689],{},"远程部署使用 HTTP + SSE 传输，适合团队共享：",[920,4691,4693],{"className":1006,"code":4692,"language":1008,"meta":11,"style":11},"# server.py\nif __name__ == \"__main__\":\n    mcp.run(transport=\"sse\", host=\"0.0.0.0\", port=8080)\n",[926,4694,4695,4700,4712],{"__ignoreMap":11},[929,4696,4697],{"class":931,"line":932},[929,4698,4699],{"class":935},"# server.py\n",[929,4701,4702,4704,4706,4708,4710],{"class":931,"line":939},[929,4703,1142],{"class":1015},[929,4705,1145],{"class":1086},[929,4707,1148],{"class":1015},[929,4709,1151],{"class":946},[929,4711,1095],{"class":1019},[929,4713,4714,4716,4718,4720,4722,4724,4726,4728,4730,4732,4734,4736,4738],{"class":931,"line":953},[929,4715,2325],{"class":1019},[929,4717,2328],{"class":1401},[929,4719,1043],{"class":1015},[929,4721,2333],{"class":946},[929,4723,1431],{"class":1019},[929,4725,2338],{"class":1401},[929,4727,1043],{"class":1015},[929,4729,2343],{"class":946},[929,4731,1431],{"class":1019},[929,4733,2348],{"class":1401},[929,4735,1043],{"class":1015},[929,4737,2353],{"class":1086},[929,4739,1052],{"class":1019},[920,4741,4743],{"className":922,"code":4742,"language":924,"meta":11,"style":11},"# 使用 Docker 部署\ndocker build -t my-mcp-server .\ndocker run -p 8080:8080 my-mcp-server\n",[926,4744,4745,4750,4766],{"__ignoreMap":11},[929,4746,4747],{"class":931,"line":932},[929,4748,4749],{"class":935},"# 使用 Docker 部署\n",[929,4751,4752,4755,4758,4761,4764],{"class":931,"line":939},[929,4753,4754],{"class":942},"docker",[929,4756,4757],{"class":946}," build",[929,4759,4760],{"class":1086}," -t",[929,4762,4763],{"class":946}," my-mcp-server",[929,4765,4678],{"class":946},[929,4767,4768,4770,4773,4776,4779],{"class":931,"line":953},[929,4769,4754],{"class":942},[929,4771,4772],{"class":946}," run",[929,4774,4775],{"class":1086}," -p",[929,4777,4778],{"class":946}," 8080:8080",[929,4780,4781],{"class":946}," my-mcp-server\n",[912,4783,4785],{"id":4784},"发布到-pypi","发布到 PyPI",[896,4787,4788],{},"如果你希望社区可以方便地安装你的 MCP Server，可以将其发布到 PyPI：",[920,4790,4794],{"className":4791,"code":4792,"language":4793,"meta":11,"style":11},"language-toml shiki shiki-themes github-light github-light github-dark","# pyproject.toml\n[project]\nname = \"my-mcp-server\"\nversion = \"0.1.0\"\ndescription = \"一个自定义 MCP Server\"\ndependencies = [\"mcp>=1.0.0\"]\n\n[project.scripts]\nmy-mcp-server = \"my_mcp_server.server:main\"\n","toml",[926,4795,4796,4801,4806,4811,4816,4821,4826,4830,4835],{"__ignoreMap":11},[929,4797,4798],{"class":931,"line":932},[929,4799,4800],{},"# pyproject.toml\n",[929,4802,4803],{"class":931,"line":939},[929,4804,4805],{},"[project]\n",[929,4807,4808],{"class":931,"line":953},[929,4809,4810],{},"name = \"my-mcp-server\"\n",[929,4812,4813],{"class":931,"line":960},[929,4814,4815],{},"version = \"0.1.0\"\n",[929,4817,4818],{"class":931,"line":966},[929,4819,4820],{},"description = \"一个自定义 MCP Server\"\n",[929,4822,4823],{"class":931,"line":1059},[929,4824,4825],{},"dependencies = [\"mcp>=1.0.0\"]\n",[929,4827,4828],{"class":931,"line":1065},[929,4829,957],{"emptyLinePlaceholder":956},[929,4831,4832],{"class":931,"line":1074},[929,4833,4834],{},"[project.scripts]\n",[929,4836,4837],{"class":931,"line":1098},[929,4838,4839],{},"my-mcp-server = \"my_mcp_server.server:main\"\n",[3258,4841,4842],{},"\n发布 MCP Server 前，请确保不会在代码中暴露敏感信息（如数据库密码、API 密钥等）。建议通过环境变量传递敏感配置。\n",[892,4844,4845],{"id":4845},"最佳实践",[4847,4848,4849,4855,4861,4867,4873,4879],"ol",{},[4464,4850,4851,4854],{},[900,4852,4853],{},"清晰的工具描述"," - 为每个工具编写准确、详细的 docstring，这是 AI 模型决定是否调用工具的关键依据",[4464,4856,4857,4860],{},[900,4858,4859],{},"输入验证"," - 严格验证所有输入参数，防止注入攻击和非法操作",[4464,4862,4863,4866],{},[900,4864,4865],{},"限制作用域"," - 每个 Server 专注于一个领域，避免创建\"万能\" Server",[4464,4868,4869,4872],{},[900,4870,4871],{},"错误信息友好"," - 返回有意义的错误信息，帮助 AI 模型理解失败原因并调整策略",[4464,4874,4875,4878],{},[900,4876,4877],{},"幂等设计"," - 尽可能将工具设计为幂等的，避免重复调用产生副作用",[4464,4880,4881,4884],{},[900,4882,4883],{},"资源利用"," - 善用 Resources 提供上下文，减少 AI 模型的猜测，提高工具调用准确率",[4886,4887,4888],"style",{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":11,"searchDepth":939,"depth":939,"links":4890},[4891,4892,4896,4899,4905,4910,4913,4914,4915,4916,4917,4922],{"id":894,"depth":939,"text":894},{"id":910,"depth":939,"text":910,"children":4893},[4894,4895],{"id":914,"depth":953,"text":915},{"id":977,"depth":953,"text":977},{"id":991,"depth":939,"text":992,"children":4897},[4898],{"id":995,"depth":953,"text":996},{"id":1165,"depth":939,"text":1166,"children":4900},[4901,4902,4903,4904],{"id":1172,"depth":953,"text":1172},{"id":1316,"depth":953,"text":1317},{"id":1547,"depth":953,"text":1547},{"id":1676,"depth":953,"text":1676},{"id":1761,"depth":939,"text":1762,"children":4906},[4907,4908,4909],{"id":1768,"depth":953,"text":1768},{"id":1880,"depth":953,"text":1881},{"id":2044,"depth":953,"text":2044},{"id":2118,"depth":939,"text":2119,"children":4911},[4912],{"id":2299,"depth":953,"text":2300},{"id":2358,"depth":939,"text":2359},{"id":3263,"depth":939,"text":3264},{"id":4412,"depth":939,"text":4413},{"id":4481,"depth":939,"text":4482},{"id":4636,"depth":939,"text":4636,"children":4918},[4919,4920,4921],{"id":66,"depth":953,"text":66},{"id":4686,"depth":953,"text":4686},{"id":4784,"depth":953,"text":4785},{"id":4845,"depth":939,"text":4845},"md",{},{"title":86,"description":87},"ai\u002Fmcp\u002Fserver","3Q8KCNcAgYGG6yasQi_HTihWZIsVv6CE7SJFAxhN4TE",1775474636173]