资讯动态

MCP servers 仓库 Everything Server 项目结构详解:目录布局、模块职责与源码级实现导读

发布时间:2026/9/5 19:38:47 来源:尧图企业网站定制
MCP servers 仓库 Everything Server 项目结构详解目录布局、模块职责与源码级实现导读【免费下载链接】serversModel Context Protocol Servers项目地址: https://gitcode.com/GitHub_Trending/se/servers本文基于src/everything/docs/structure.md这份官方结构文档展开逐目录、逐文件地讲解 MCP Everything 参考服务器的项目组织方式入口与传输选择、文档体系、prompts / resources / tools 三大原语的注册编排、server 工厂与 transport 层的落地实现。读完之后你可以快速定位任意功能对应的源码文件理解各模块之间的调用关系并按照仓库既有模式为该服务器新增工具、资源、提示词或传输方式。总体目录布局structure.md首先给出了一份完整的目录树这是理解整个 Everything Server 的骨架src/everything ├── index.ts ├── AGENTS.md ├── package.json ├── docs │ ├── architecture.md │ ├── extension.md │ ├── features.md │ ├── how-it-works.md │ ├── instructions.md │ ├── startup.md │ └── structure.md ├── prompts │ ├── index.ts │ ├── args.ts │ ├── completions.ts │ ├── simple.ts │ └── resource.ts ├── resources │ ├── index.ts │ ├── files.ts │ ├── session.ts │ ├── subscriptions.ts │ └── templates.ts ├── server │ ├── index.ts │ ├── logging.ts │ └── roots.ts ├── tools │ ├── index.ts │ ├── echo.ts │ ├── get-annotated-message.ts │ ├── get-env.ts │ ├── get-resource-links.ts │ ├── get-resource-reference.ts │ ├── get-roots-list.ts │ ├── get-structured-content.ts │ ├── get-sum.ts │ ├── get-tiny-image.ts │ ├── gzip-file-as-resource.ts │ ├── simulate-research-query.ts │ ├── toggle-simulated-logging.ts │ ├── toggle-subscriber-updates.ts │ ├── trigger-elicitation-request.ts │ ├── trigger-elicitation-request-async.ts │ ├── trigger-long-running-operation.ts │ ├── trigger-sampling-request.ts │ ├── trigger-sampling-request-async.ts │ └── trigger-url-elicitation.ts └── transports ├── sse.ts ├── stdio.ts └── streamableHttp.ts从目录树可以清楚看到分层思路prompts/、resources/、tools/分别承载 MCP 协议三大原语每个目录内部都是一个index.ts编排器 每个功能一个文件的模式server/负责组装服务器实例transports/负责三种通信方式stdio、SSE、Streamable HTTPdocs/则是随构建一起打包进发行产物的文档集。同一套文档导航中还包括 架构说明、扩展指南、功能清单、工作原理 与 启动流程结构文档与它们互为补充。入口层index.ts、AGENTS.md 与 package.jsonindex.ts基于第一个 CLI 参数选择传输index.ts 是整个服务器的启动入口逻辑非常克制读取process.argv取第一个参数作为传输名缺省为stdio通过switch分支动态import对应的传输模块./transports/stdio.js、./transports/sse.js、./transports/streamableHttp.js从而保证只有被请求的传输模块会被加载和执行避免其他模块在未被使用时就完成初始化遇到未知参数时打印使用说明node ./index.js [stdio|sse|streamableHttp]并以退出码 1 结束。对应到 npm scripts 上就是 package.json 中的三个启动命令start:stdio: node dist/index.js stdio, start:sse: node dist/index.js sse, start:streamableHttp: node dist/index.js streamableHttpAGENTS.md面向 Agent 的编码规范AGENTS.md 是写给 Agent / LLM 的开发者指南规定了构建与运行命令、代码风格ES 模块 .js导入后缀、严格类型、zod schema 校验、2 空格缩进、camelCase / PascalCase / kebab-case 的命名约定等以及扩展服务器的规则新工具、资源、提示词分别放在对应目录导出registerX(server)函数再接入中心index.ts编排。它相当于把如何正确地扩展这个服务器固化成了可被机器读取的约束。package.json元数据、脚本与依赖package.json 声明了包名modelcontextprotocol/server-everything当前版本 2.0.0bin字段将dist/index.js暴露为mcp-server-everything可执行命令files只发布dist目录。关键脚本为build: tsc shx cp -r docs dist/ shx chmod x dist/*.js, watch: tsc --watch, test: vitest run --coveragebuild脚本做了三件事TypeScript 编译到dist/、把docs/原样复制到dist/这就是server/index.ts启动时能读到instructions.md的前提、标记编译后的入口脚本可执行。依赖方面运行时依赖modelcontextprotocol/sdk、express、cors、zod、jszip开发依赖含typescript、vitest、prettier、shx。docs/ 文档体系docs/目录在结构文档中被逐一列出每个文件承担明确职责文件职责architecture.md描述服务器架构传输层、会话初始化、原语注册extension.md讲解如何扩展新工具、提示词、资源或传输features.md完整的功能参考所有 prompts、resources、tools 与协议行为how-it-works.mdSSE 与 Streamable HTTP 传输的搭建方式与 session 管理instructions.md人类可读的使用指引启动时被服务器读取并在 initialize 交互中返回给客户端startup.md启动时序、环境检查与初始化structure.md即本文所依据的结构文档其中instructions.md有特殊的运行时身份readInstructions()会在服务器创建时把它读入内存。从 resources/index.ts 的readInstructions实现可以看到它按相对路径docs/instructions.md读取文件读取失败时返回一条错误说明字符串而不是抛异常——这解释了为什么构建脚本必须把docs/复制到dist/中一起发布。prompts/ 提示词目录prompts/的 index.ts 提供registerPrompts(server)编排函数把注册工作委托给各个提示词文件simple.ts注册simple-prompt无参数返回单条用户消息args.ts注册args-prompt带两个参数city必填、state可选用于演示参数化消息拼装completions.ts注册completable-prompt参数使用 SDK 的completable(...)助手支持服务器驱动的补全如department以及上下文相关的name补全resource.ts导出registerEmbeddedResourcePrompt(server)注册resource-prompt——接受resourceTypeText 或 Blob与resourceId整数在返回消息中嵌入一个动态生成的指定类型资源。它内部直接复用resources/templates.ts暴露的构造函数是资源与提示词跨模块协作的典型示例。resources/ 资源目录resources/实际包含五个文件index.ts 中的编排器只做两件事export const registerResources (server: McpServer) { registerResourceTemplates(server); registerFileResources(server); };templates.ts两个动态模板资源templates.ts 通过ResourceTemplate注册两个模板驱动的动态资源文本demo://resource/dynamic/text/{resourceId}MIMEtext/plain二进制demo://resource/dynamic/blob/{resourceId}MIMEapplication/octet-streamBase64 载荷结构文档称该路径变量为{index}其约束是必须为有限的正整数源码中的parseResourceIdtemplates.ts正是这样校验的——非正整数或未知 URI 会抛出Unknown resource错误。内容在请求时才生成并带当前时间戳。此外还注册了resourceId的模板补全函数只接受正整数字符串。该文件还对外暴露四个辅助函数供其他模块尤其是resource-prompt直接构造动态资源textResource(uri, resourceId) // 生成文本型动态资源 textResourceUri(resourceId) // 生成 demo://resource/dynamic/text/{id} blobResource(uri, resourceId) // 生成 Blob 型动态资源 blobResourceUri(resourceId) // 生成 demo://resource/dynamic/blob/{id}files.ts静态文件资源files.ts为docs/目录下每个文件注册一个静态资源URI 遵循demo://resource/static/document/filename模式MIME 类型按扩展名映射.md→text/markdown、.txt→text/plain、.json→application/json其余默认text/plain。session.ts与subscriptions.ts结构文档对这两个文件的描述较简略但它们承担会话级能力session.ts提供按会话注册/查找临时资源的机制。gzip-file-as-resource工具就用它把压缩后的 Blob 注册为会话资源URI 形如demo://resource/session/name、mimeType: application/gzip生命周期仅限当前会话subscriptions.tsserver/index.ts 从这里导入setSubscriptionHandlers与stopSimulatedResourceUpdates前者为服务器挂接资源订阅处理后者在会话清理时停止模拟的资源更新检查配合toggle-subscriber-updates工具触发。server/ 服务器组装index.ts服务器工厂server/index.ts 导出createServer()工厂函数返回{ server, cleanup }通过readInstructions()载入服务器指令创建InMemoryTaskStore与InMemoryTaskMessageQueue以支持实验性 Tasks 能力构造McpServer声明能力包括tools.listChanged、prompts.listChanged、resources.subscribe/listChanged、logging以及taskslist、cancel 与tools.call请求依次调用registerTools(server)、registerResources(server)、registerPrompts(server)再挂接setSubscriptionHandlers(server)注册oninitialized钩子在客户端能力已知后注册条件工具见下文 tools 一节并在 350ms 延迟后调用syncRoots同步 roots注释说明延迟是为了避免在notifications/initialized处理完成前发出请求导致丢失见 server/index.tscleanup(sessionId)负责会话结束时的收尾停止模拟日志stopSimulatedLogging、停止模拟资源更新、清理 task store 定时器、清除初始化超时。传输层在客户端断开时调用cleanup()这是服务器状态与传输生命周期解耦的关键设计。logging.ts与roots.tslogging.ts实现模拟日志——按随机间隔向客户端会话发送不同级别的日志消息由toggle-simulated-logging工具按需启停roots.ts提供syncRoots在初始化后向客户端请求 roots 列表并缓存供get-roots-list工具返回客户端最近一次发送的 roots。tools/ 工具目录两级注册机制结构文档将tools/index.ts描述为registerTools(server)编排器。深入 tools/index.ts 源码可以看到实际存在两级注册export const registerTools (server: McpServer) { registerEchoTool(server); registerGetAnnotatedMessageTool(server); // ... 共 13 个无条件工具 }; export const registerConditionalTools (server: McpServer) { registerGetRootsListTool(server); registerTriggerElicitationRequestTool(server); // ... 其余依赖客户端能力的工具 };第一级在createServer()中立即执行注册与客户端能力无关的工具第二级registerConditionalTools在server.server.oninitialized中执行因为roots、elicitation、sampling、Tasks 等工具依赖客户端在 initialize 阶段声明的能力。这一分层在 server/index.ts 中有对应调用是理解该服务器启动时序的重要细节。各工具的职责沿用结构文档描述并对照源码印证echo.ts接收消息并返回Echo: {message}get-annotated-message.ts演示内容级注解——按messageTypeerror | success | debug输出带priority、audience注解的主文本消息includeImage为 true 时附带一张小型 PNG 图片该服务器所有工具均带工具级注解readOnlyHint、destructiveHint、idempotentHint、openWorldHintget-env.ts以格式化 JSON 返回当前进程环境变量便于调试配置get-resource-links.ts返回一段引导text块加多个resource_link项get-resource-reference.ts返回选定动态资源的引用get-roots-list.ts返回客户端最近一次发送的 roots 列表get-structured-content.ts演示structuredContent结构化响应get-sum.tsZod 输入 schema求a、b之和get-tiny-image.ts返回一张小型 PNGMCP 徽标image内容及说明文本trigger-long-running-operation.ts按duration秒与steps数模拟长时任务客户端提供progressToken时发送notifications/progress进度通知toggle-simulated-logging.ts/toggle-subscriber-updates.ts分别启停当前会话的模拟日志与模拟资源订阅更新检查trigger-elicitation-request.ts向客户端/LLM 发起elicitation/create并返回结果trigger-elicitation-request-async.ts演示双向 Tasks——带任务元数据发起 elicitation 请求随后轮询客户端tasks/get端点获取完成状态再取最终结果trigger-sampling-request.ts/trigger-sampling-request-async.ts同步与基于双向任务的sampling/createMessage请求演示trigger-url-elicitation.ts发送带外 URL 模式mode: url含elicitationId请求路径的 elicitation 请求或抛出UrlElicitationRequiredError错误码-32042走客户端处理路径错误路径携带的前置 elicitation 指向不同 URLhttps://modelcontextprotocol.io客户端满足后重试同一调用时忽略errorPath改走请求路径避免客户端在同一错误上死循环simulate-research-query.ts基于 MCP TasksSEP-1686的任务型工具模拟带进度更新的多阶段研究操作当查询被标记为含糊且客户端支持 elicitation 时会在执行中途暂停并通过elicitation/create请求澄清使用server.experimental.tasks.registerToolTask()且execution: { taskSupport: required }gzip-file-as-resource.ts抓取 URL 或 data URI 内容并 gzip 压缩默认返回指向会话级资源的resource_link也可返回内联resource含 gzip 数据该会话资源在会话期间可通过resources/list发现。它受三个环境变量控制GZIP_MAX_FETCH_SIZE字节默认 10 MiBGZIP_MAX_FETCH_TIME_MILLIS毫秒默认 30000GZIP_ALLOWED_DOMAINS逗号分隔的域名白名单留空表示允许所有域名transports/ 传输目录三种传输模块各自是一个可独立执行的 Express/Node 入口stdio.ts启动StdioServerTransport通过createServer()创建服务器并连接处理SIGINT以优雅关闭并在退出前调用cleanup()清理所有活动 interval。sse.ts基于 Express 暴露两个端点GET /sse为每个会话建立一条 SSE 连接POST /message接收客户端消息。通过 transport 映射表管理多个并发客户端每次新连接时创建SSEServerTransport再经createServer()建服务器并连接断开时调用cleanup()。streamableHttp.tsstreamableHttp.ts 用单个/mcp端点承载 POSTJSON-RPC、GETSSE 流与 DELETE会话终止底层使用 SDK 的StreamableHTTPServerTransport。源码印证了结构文档的三点描述自定义的InMemoryEventStorestreamableHttp.ts实现storeEvent/replayEventsAfter支持 SSE 断线后的事件重放即可恢复会话以sessionId为键维护transports: Mapstring, StreamableHTTPServerTransport收到携带mcp-session-id头的 POST 时复用既有传输无 session 时初始化请求则新建createServer()实例并连接启用宽松 CORSorigin: *注释明确这是为 Inspector 直连调试所用并暴露mcp-session-id、last-event-id、mcp-protocol-version响应头。测试验证与扩展路径src/everything/__tests__/下有五组测试与目录结构一一对应registrations.test.ts、tools.test.ts、prompts.test.ts、resources.test.ts、server.test.ts通过npm run testvitest 覆盖率运行。其中 registrations.test.ts 直接验证了registerResources对 mock 服务器的注册调用为本文所述的编排器 单文件工厂模式提供了可执行的验证依据。当你要为这个服务器新增功能时结构文档指出的扩展约定是跟随所在目录的既有模式导出一个registerX(server)函数再接入对应的中心index.tstools/index.ts、resources/index.ts或prompts/index.ts更完整的扩展说明见 extension.md 与 AGENTS.md。小结Everything Server 的结构可以概括为一条清晰的链条index.ts按 CLI 参数选择传输 → 传输模块调用createServer()工厂 → 工厂声明能力并依次执行registerTools/registerResources/registerPrompts三个编排器 → 初始化完成后按客户端能力补充条件工具 → 会话结束时以cleanup()统一回收定时器等资源。每个功能独立成文件、以 kebab-case 命名、由register*函数注入使得目录布局、注册时序与测试边界三者高度一致。对于想学习 MCP 服务器工程化组织或想参考如何在单一参考实现中覆盖全部协议特性的开发者这套结构本身就是最有价值的部分。【免费下载链接】serversModel Context Protocol Servers项目地址: https://gitcode.com/GitHub_Trending/se/servers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价