DDNS MCP 服务完全指南:用 stdio 与 Streamable HTTP 把 DDNS 状态查询与同步接入 MCP 客户端
网络CLI【免费下载链接】DDNS自动更新域名解析到本机IP,支持dnspod,阿里DNS,CloudFlare,华为云,DNSCOM...项目地址https://gitcode.com/gh_mirrors/dd/DDNS点击查看免费下载DDNS 在 Python 标准库之上内置了一个零第三方依赖的 MCPModel Context Protocol服务让 GitHub Copilot 等 MCP 客户端可以读取本地缓存的 DDNS 状态或在人工确认后触发一次完整的 DNS 同步。本文基于 MCP 服务文档 展开完整覆盖 stdio 与 Streamable HTTP 两种传输的启动命令、监听参数、token 认证、CORS origin 白名单与协议限制并结合 ddns/mcp.py 与 ddns/mcp_http.py 的源码说明工具分发、凭据脱敏与取消机制的实现细节。读完后你可以把 DDNS 接入任意支持 MCP 的 Agent 客户端并理解服务端如何保证不把 DNS 服务商凭据泄漏进协议参数。服务定位与设计边界DDNS 的 MCP 服务有两条明确的设计约束只暴露两个无参工具。客户端能做的只有查询本地缓存状态get_ddns_status和按既有配置执行一次同步update_dns_records。工具不接受域名、IP、服务商或凭据参数避免模型绕过本地配置写入任意记录。不返回凭据。服务不会在协议参数或结果中返回 DNS 服务商凭据。这一点在源码 ddns/mcp.py 中体现为字段白名单STATUS_FIELDS (state, message, last_sync, addresses, providers, records)get_ddns_status只把DashboardService.dashboard()的结果裁剪到以上六个字段返回测试 tests/test_mcp.py 验证了即使内部状态包含token、scheduler、config_path、activities等敏感字段最终structuredContent与文本内容中都不会出现它们。MCP 模式下状态来自本地缓存而非实时查询 DNS 服务商这与 DDNS 缓存机制一致缓存默认位于临时目录的ddns.{hash}.cache可在配置中指定路径或用false关闭。配置文件解析规则MCP 模式的配置解析比常规ddns运行更严格配置路径优先级为-c/--config DDNS_CONFIG 默认本地配置路径两条硬性限制文档 mcp.md 明确说明只接受一份本地配置文件不支持远程 URL不支持多个-c。ddns/config/cli.py 在参数解析前就拦截多配置def _validate_explicit_mcp_configs(): if len(sys.argv) 1 or sys.argv[1] ! mcp: return config_paths _cli_config_paths(sys.argv[2:]) if config_paths is not None and len(config_paths) ! 1: sys.stderr.write(ddns mcp: exactly one local configuration file is supported.) sys.exit(2)_local_config_path 还会检查最终路径是否包含://是则报remote configuration files are not supported并退出。mcp子命令还受 _validate_mcp_mode_arguments 约束只允许-c/--config、--transport、--host、--port、--http-token、--http-origin这些选项出现未知选项会直接报错退出。stdio 模式下若在未指定-c时出现 HTTP 相关选项_handle_mcp_command 也会拒绝HTTP options require --transport http。stdio 传输默认stdio 模式不监听网络是最常用的接入方式ddns mcp -c /etc/ddns/config.jsonstdout 专用于每行一条 JSON-RPC 消息运行日志只写入 stderr。这一约束在实现中体现得很细致执行update_dns_records时同步过程产生的日志会污染 stdoutddns/mcp.py 通过临时重定向把 stdout 指向 stderr 来规避with _STDOUT_REDIRECT_LOCK: protocol_stdout sys.stdout try: sys.stdout sys.stderr status service.sync(sourceMCP, cancelledlambda: self._is_cancelled(request_id)) finally: sys.stdout protocol_stdout消息读取由独立线程完成McpServer.servestdin 每行解析为一个 JSON-RPC 消息解析失败的行返回 JSON-RPC-32700 Parse error。接入 GitHub Copilot CLIcopilot mcp add ddns -- ddns mcp -c /etc/ddns/config.json在任意支持 MCP 的客户端中配置{ mcpServers: { ddns: { command: ddns, args: [mcp, -c, /etc/ddns/config.json] } } }Windows 下 JSON 路径中的反斜杠需要写成\\也可以将command替换为ddns可执行文件的绝对路径。协议版本与生命周期stdio 支持 MCP2026-07-28并兼容2025-11-25的initialize生命周期McpServer 中PROTOCOL_VERSION与LEGACY_PROTOCOL_VERSION两个常量。现代协议请求要求params._meta携带io.modelcontextprotocol/protocolVersion、io.modelcontextprotocol/clientCapabilities版本不匹配时返回错误码-32022 Unsupported protocol version并附支持列表。兼容模式initialize下客户端必须发送含name/version的clientInfo且需等待notifications/initialized通知到达后才能调用工具否则返回-32600 Server is not initialized见 _handle_legacy_request。Streamable HTTP 传输启动独立 HTTP MCPddns mcp -c /etc/ddns/config.json --transport http默认 endpoint 为http://127.0.0.1:9876/mcp。如果运行 Web 控制台同一监听地址也会自动提供/mcpddns/web/server.py 的create_server在创建仪表盘服务器时同时挂载了McpHttpEndpoint与 Web API 共用端口和 token。独立模式与 Web 共用以下参数参数描述--host监听地址默认127.0.0.1支持具体局域网地址及0.0.0.0/::--port监听端口默认9876设为0时由系统分配--http-tokenWeb API 与 HTTP MCP 共享的 token仅允许无空格的可见 ASCII 字符--http-origin ORIGIN允许浏览器访问/mcp的精确 HTTP(S) origin可重复监听配置优先级为命令行 JSON 顶层http对象 DDNS_HTTP_*环境变量 127.0.0.1:9876。该优先级由 resolve_http_settings 实现先合并环境变量DDNS_HTTP_HOST/DDNS_HTTP_PORT/DDNS_HTTP_TOKEN/DDNS_HTTP_ORIGINS映射为http_host等键再覆盖 JSONhttp对象最后覆盖命令行传入值。JSON 写法示例见 JSON 配置参考{ http: { host: 127.0.0.1, port: 9876, token: null, origins: [https://ddns.example.com] } }参数校验同样值得注意token 经 _normalize_token 校验必须是无空格的可见 ASCIIhost拒绝包含空白、换行或路径字符的值非回环监听且 token 为空时在 normalize_http_settings 直接抛错A non-empty HTTP token is required for non-loopback listeners.。认证模型回环地址未配置 token 时Web API包括完整配置和服务商凭据与/mcp均免认证非回环或通配监听必须配置非空 token。MCP 客户端通过Authorization: Bearer token发送凭据。实现上McpHttpEndpoint._validate_access 分三步校验无 token 时只接受 Host 头解析出的回环地址_host_header_is_loopback否则返回421 invalid_hostOrigin头存在且不在白名单、也不等于请求自身的直接 origin 时返回403 invalid_origintoken 比对使用常量时间比较 request_token_matches底层hmac.compare_digest失败返回401并附WWW-Authenticate: Bearer realmddns-mcp。CORS 与反向代理注意事项DDNS 不提供 TLS。局域网监听必须置于受信 HTTPS 反向代理之后并保留Authorization、Host和Origin头。浏览器通过 TLS 终止代理访问/mcp时即使公网页面看起来同源也必须把精确的公网 HTTPS origin 配置到http.origins或--http-origin原生 MCP 客户端可不发送Origin。CORS 行为在 handle_options 中实现OPTIONS请求只在 origin 命中白名单时返回204与Access-Control-Allow-Headers: Authorization, Content-Type, MCP-Protocol-Version, Mcp-Method, Mcp-NamePOST响应则按 _cors_headers 仅对白名单 origin 附加Access-Control-Allow-Origin并带Vary: Origin。注意origins必须是精确 originnormalize_origin 不支持通配符、路径或凭据。请求框架约束HTTP transport 仅支持 MCP2026-07-28每个请求单独 POST 到/mcp必须Content-Type: application/json携带MCP-Protocol-Version、Mcp-Method头调用工具时还需Mcp-NameAccept同时包含application/json和text/event-stream。这些约束由 _read_message 与 _validate_envelope 逐条校验Mcp-Name还支持?base64?...?MIME 镜像值解码_decode_mirrored_value头体不一致统一返回错误码-32020。请求体上限 2 MiBMAX_BODY_SIZE超出返回413。当前为 tools-only 实现返回普通 JSON不提供 SSE、sessions、legacy HTTP、resources、prompts 或 subscriptions。方法不支持时返回405-32601 Method not found映射为 HTTP404协议版本错误映射为400见 handle_post。可用工具工具参数行为get_ddns_status无读取本地配置、缓存地址、缓存记录、服务商摘要和最近同步时间不实时查询 DNS 服务商update_dns_records无使用配置中的当前 IP 规则对所有已配置记录执行一次完整同步并返回同步后的状态工具定义集中在 ddns/mcp.py 的TOOLS元组中两者的inputSchema都是{type: object, additionalProperties: false}并带安全注解get_ddns_status标注readOnlyHint: true、destructiveHint: falseupdate_dns_records标注readOnlyHint: false、destructiveHint: true提示客户端这是有副作用的破坏性操作。update_dns_records会修改外部 DNS 状态客户端应在调用前保留人工确认——服务器在server/discover的instructions中也声明了同样要求McpServer._discover。_call_tool 对传入参数严格拒绝任何非空arguments都会触发This tool does not accept arguments未知工具名返回Unknown tool。每次调用通过service_factory构造DashboardServiceweb/service.pyupdate_dns_records最终走 DashboardService.sync逐个已配置服务商执行同步任一失败即记录failed状态并抛出DashboardOperationError全部成功则返回与get_ddns_status相同结构的最新状态。协议与运行限制文档列出的运行限制逐条都有源码或机制依据stdio 支持2026-07-28兼容2025-11-25initialize 生命周期HTTP 仅支持2026-07-28。独立 HTTP 服务器创建时显式把支持版本收窄为单一值mcp_http.create_server 中supported_versions(PROTOCOL_VERSION,)。stdio 客户端取消notifications/cancelled通知会被 _record_cancellation 记录update_dns_records执行期间DashboardService.sync 在每个服务商的同步前后都会检查cancelled()服务会在 IP 获取规则、域名记录及 DNS 服务商之间停止后续处理。HTTP 无 SSE 取消每次请求是无状态 POST客户端断开后同步可能继续完成日志会记录MCP HTTP client disconnected before receiving its responsehandle_post。已发出的 DNS API 请求无法撤销取消只能阻止尚未发出的部分。状态依赖本地缓存关闭缓存后另一进程中的后续状态请求无法还原此前的同步历史last_sync等状态存于进程内存_last_sync_*字段但update_dns_records调用本身仍会返回本次结果。避免多进程竞争不要让多个 Web、MCP 或系统任务进程同时更新同一份配置。DashboardService内部有RLock保护配置读写但这是进程内锁跨进程并发同步仍可能互相覆盖外部 DNS 状态。测试与验证路径两种传输的实现都有对应的回归测试可以作为行为验证依据tests/test_mcp.py验证server/discover声明的版本与tools能力、tools/list的确定性输出与安全注解、状态工具只返回白名单字段且不含凭据文本tests/test_mcp_http.py在真实回环端口上起服务验证 Streamable HTTP 的帧校验、Mcp-Method/Mcp-Name一致性、token 与 origin 拒绝路径401/403/421以及 resolve_http_settings 的优先级合并。小结DDNS 的 MCP 服务用标准库实现了一条最小可用的「状态查询 人工确认同步」通道stdio 模式一行命令即可挂进 Copilot 等本地客户端Streamable HTTP 模式则与 Web 控制台共用端口、token 与 origin 白名单天然适合同机管理面板与 MCP 客户端共享一个监听。配置上记住三件事即可MCP 模式只认单份本地配置、非回环监听必须带 token、浏览器跨源访问要配精确 origin。工具层刻意无参且字段白名单化把「能改什么」完全收敛到本地配置文件本身这是接入 Agent 时最重要的安全边界。赞分享网络CLI【免费下载链接】DDNS自动更新域名解析到本机IP,支持dnspod,阿里DNS,CloudFlare,华为云,DNSCOM...项目地址https://gitcode.com/gh_mirrors/dd/DDNS点击查看免费下载相关推荐MCP Python SDK 客户端传输层完全指南Streamable HTTP、stdio 与进程内传输MCP Python SDK 客户端传输层完全指南Streamable HTTP、stdio 与进程内传输 本指南基于官方 Python SDKModel人工智能MCP 服务MCP ClientsDeepSeek Harness 怎么接入外部 MCP 服务器dsh-mcp-client 的 stdio 与 streamable-http 配置DeepSeek Harness 怎么接入外部 MCP 服务器dsh mcp client 的 stdio 与 streamable http 配置 如果你的人工智能AI AgentAgent 框架DeepSeek将 MCP 客户端接入 OpenMedstdio 与 Streamable HTTP 的完整实战指南将 MCP 客户端接入 OpenMedstdio 与 Streamable HTTP 的完整实战指南 OpenMed 通过 Model Context Pro人工智能NLP医疗健康数据脱敏本地部署大模型AI 应用MCP 服务联邦学习上一篇Electron.NET 热更新终极指南无需重启应用的智能代码更新方案下一篇【实战指南】三步搞定NoteDiscovery云原生知识库容器化部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI辅助编码实践:用命令行工具自动生成代码文档

AI辅助编码实践:用命令行工具自动生成代码文档

自己维护的几个项目一直有个老大难问题:文档落后于代码。功能改了,说明文没跟上,新同事接手时只能对着代码猜逻辑。后来尝试用辅助编码工具一边写功能一边补文档,折腾了几周,沉淀出一个带命令行交互的文档生成小工具&a…

2026/10/13 7:33:05 阅读更多 →
Flutter同步方案鸿蒙化适配:CRDT冲突治理实践

Flutter同步方案鸿蒙化适配:CRDT冲突治理实践

如果你和我一样,正被“把一套 Flutter 同步方案搬到鸿蒙”这件事搞得焦头烂额,那这篇文章基本是为你准备的。最近我正好完成了一个基于 crdt_sync 的鸿蒙化适配项目,过程中把“同步资产”这几个字从口号拆成了实实在在的类、方法、通道和存储…

2026/10/13 7:32:05 阅读更多 →
Windows与Ubuntu双系统安装全攻略:从分区到引导修复

Windows与Ubuntu双系统安装全攻略:从分区到引导修复

看到“Windows系统上安装了Ubuntu”这句话,第一反应可能是:开机时多个选单,想进哪个进哪个。但落地时你很快会发现,这句话至少对应三种完全不同的结果——开机引导选单的双系统、Windows 窗口里跑的虚拟机、以及一条命令就能进的 …

2026/10/13 7:32:05 阅读更多 →

最新新闻

Schema标记实战:用结构化数据占据整个SERP

Schema标记实战:用结构化数据占据整个SERP

1. "占据整个SERP"到底是怎么回事:从一次搜索结果截图说起先别急着上代码,我们得先搞清楚一个问题:所谓"占据整个SERP",到底长什么样?去年我接手了一个垂直电商的小项目,卖的是某种小众…

2026/10/13 8:16:34 阅读更多 →
AutoTool实操:Agent工具路由如何省下30%推理成本

AutoTool实操:Agent工具路由如何省下30%推理成本

AAAI 2026 放榜之后,我朋友圈里最热闹的话题除了 Jev 这种突然爆火的开源 Agent 项目,就是各路团队在吐槽“推理成本根本扛不住”。Jev 确实把复杂任务的拆解能力拉到了一个新高度,但问题也随之而来:工具越挂越多、调用链越拉越长…

2026/10/13 8:16:34 阅读更多 →
免费磁盘清理工具 Czkawka:找重复文件与清理空文件夹完整上手指南

免费磁盘清理工具 Czkawka:找重复文件与清理空文件夹完整上手指南

免费磁盘清理工具 Czkawka:找重复文件与清理空文件夹完整上手指南 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka Czkawka 是一款用 Ru…

2026/10/13 8:16:34 阅读更多 →
Faker库实战:让接口测试与自动化测试的造数更真实高效

Faker库实战:让接口测试与自动化测试的造数更真实高效

做接口测试和自动化测试的朋友,应该都体验过那种被“假数据”支配的尴尬。我早年在某项目组做下单流程的接口测试,为了凑测试用户,手工在配置文件里写了几百个“张三”,手机号清一色13800138000,地址全是“北京市朝阳区…

2026/10/13 8:16:34 阅读更多 →
带实习生三个月,我总结了一套 Mentor 带教方法:从前端页面切入到后端接口拆解(附完整清单)

带实习生三个月,我总结了一套 Mentor 带教方法:从前端页面切入到后端接口拆解(附完整清单)

文档教程知识库 【免费下载链接】InterviewGuide 🔥🔥「InterviewGuide」是阿秀从校园->职场多年计算机自学过程的记录以及学弟学妹们计算机校招&秋招经验总结文章的汇总,包括但不限于C/C 、Golang、JavaScript、Vue、操作系统、数据结…

2026/10/13 8:16:34 阅读更多 →
CyFA:放弃预测残差,用循环特征对齐提升多变量时间序列异常检测

CyFA:放弃预测残差,用循环特征对齐提升多变量时间序列异常检测

多变量时间序列异常检测这块,我前前后后折腾了不少方案。最早用的也是"先预测、再算残差"的老路子,后来复现了 GDN 和 KDA 这两个基线,说实话越用越觉得别扭。直到我自己折腾出一个叫 CyFA 的思路,直接扔掉 Delta Rule&…

2026/10/13 8:15:34 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →