dsh-saturdayCAUTION
Materials computing tools for AI agents: structures, engines, phonons, EOS, NEB, sampling, lineage.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://github.com/toki0413/dsh-saturday/actions/workflows/ci.yml) [](https://smithery.ai/servers/toki0413/saturday-materials)
简体中文 | English
Everything is a plugin。 Saturday 不是又一套材料计算引擎,不替代 DFT / MD / FEM / CFD 的任何求解器; 它是材料计算的组合层:引擎、结构源、工作流、分析工具全部以插件形态挂载到 DeepSeek Harness (dsh) / `@deepseek-ai/cordis` v4 运行时上,由 Agent 在运行时自由挂载、卸载与组合。
插件接口规范见 packages/bridge/docs/plugin-contract-v0.md(中文原本,英文摘要版同目录)。
60 秒上手
不需要 Python、不需要装任何求解器——有 Node ≥ 22 就能让 Agent 拿到真实的材料回算数值 (无 ASE 时自动走零依赖 lj-js 引擎;能量由引擎回算,非玩具占位假数)。
最快一行(连客户端都不配):npx -y @toki0413/mcp-server --relax Cu 直接打印 Cu 的每原子能量与所用引擎(装了 MACE/ASE 会自动升真物理)。
免装 Node/Python(全保真容器):docker run --rm ghcr.io/toki0413/saturday --relax Cu 一行拿 EMT 真值,镜像已内含 Node + Python + ASE(构建/推镜像由 GitHub Actions + GHCR 承担,本地不装工具链)。当前状态:镜像构建与容器内冒烟已在 CI 跑通,但 GHCR 推送只在打 v* tag 时发生,因此该命令自 v0.3.14 起可拉;现在就要零安装跑用上面那行 npx。
路径 A:接进任意 MCP 客户端(Claude Desktop / Cursor / Cherry Studio 等)——在客户端配置里加:
{
"mcpServers": {
"saturday-materials": { "command": "npx", "args": ["-y", "@toki0413/mcp-server"] }
}
}存盘重启客户端,对它说一句“把 Cu 弛豫一下并给出每原子能量”,它会调 potential.relax 返回 energyPerAtom(eV);material.load / workflow.screen(掺杂筛选)/ analysis.phonon(声子) 等 56 个工具都在。想要真实 EMT/LAMMPS 物理,再装 Python≥3.10 + ASE(见下“环境矩阵”), 引擎按能力自动升级,插件面契约与单位/指纹门禁不变。
路径 B:本地跑起来看全链
git clone https://github.com/toki0413/dsh-saturday && cd dsh-saturday npm install && npm test # 全量回归(纯 Node 即可) npm run demo # 一条十阶段端到端:加载→采样→筛选→声子→回算,环境自适应 npm run demo:agent # 一个 prompt 驱动整个发现链(mock LLM,无外部依赖)
想知道“我该调哪个工具”→ 见 docs/recipes.md(按意图找工具与参数); 5 分钟上手与拒绝伪造证据的演示 → docs/agent-e2e-demo.md。
核心范式
时空可组合性(
e0d4ad1a7283OBSERVED · 2026-10-12Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add mcp-server -- npx -y @toki0413/[email protected]
Exposed tools (56)
49 read · 7 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
analysis.coordination | read | 局域配位与短程有序分析。传 materialId(可选 rCut):逐原子配位数 + 最近/平均邻居距离、 |
analysis.elasticity | read | 完整 6×6 弹性刚度张量(Voigt):6 种独立应变 ± 中心差分共 12 次引擎应力计算, |
analysis.eos | read | Birch-Murnaghan 状态方程拟合。两条数据路: |
analysis.neb | read | NEB 最小能量路径与过渡态势垒。内置玩具体系 lj-double-well |
analysis.phonon | read | Γ 点声子分析(力注入式有限位移)。传 materialId,引擎做静态单点 |
analysis.phonon.thermo | read | 全布里渊区声子热力学:从超胞有限位移提取实空间力常数 Φ_{ij}(R)(最近镜像折回小格矢 + 牛顿第三对称 + ASR), |
analysis.quasiharmonic | read | 准谐近似热膨胀 α(T)/Grüneisen:对种子材料施各向同性体变标度,逐标度算静态能 E_static |
analysis.saddleSearch | read | QMM 鞍点搜索(不需 NEB 带、不需二阶导 callable):方向 F_eff=−∇E+2(ĉ·∇E)ĉ,ĉ 取 |
analysis.xrd | read | X 射线粉末衍射谱。传 materialId,纯几何计算各反射 d(hkl)/Bragg 2θ/相对强度 |F|2 与系统消光 |
analysis.xrd.latticeFromPeaks | read | 点阵参数精修:给已指派的实测粉末峰(peaks=[{twoThetaDeg, hkl:[h,k,l]}])与波长, |
analysis.xrd.phaseIdentify | read | XRD 相鉴定:给实测粉末峰(measuredPeaks=[{twoTheta,intensity}])与一组候选材料 ID, |
derivation.invalidate | read | 失效传播(§8.2):声明某引用失效并给出原因,沿推导图向下游传递; |
derivation.record | read | 登记一条推导:导出量(output)由哪些输入(inputs)经哪个生产者(producer)得出。 |
derivation.status | read | 查询导出量的活性状态:valid / invalid、冻结、修正记录与失效来源。 |
engine.availability | read | 可用性预检:逐已注册引擎探测运行时版本并如实报告(注册 = 声明层,可用 = 运行时层)。 |
material.load | read | 加载材料结构。支持化学式(如 |
potential.relax | read | 对材料做结构弛豫。引擎为 EMT:Python sidecar 有 ASE 时走真实 EMT |
runtime.capability.list | read | 运行时能力清单:每个已注册引擎的声明能力(capabilities+properties)、实测指纹 |
runtime.engine.attach | write | 运行时挂载引擎插件(不重启宿主、不中断其他插件事件流):按包名动态 import 并 apply; |
runtime.engine.crossCheck | read | 跨引擎对账(A/B):把同一 materialId 在两个或多个引擎上回算,机器并列每引擎的 |
runtime.engine.detach | read | 运行时拆下引擎:先查作业台账再注销——onActive refuse(缺省,有在途作业即拒 ACTIVE_JOBS) |
runtime.engine.rank | read | 跨引擎排序一致性:对一批 materialId 在两个(或多个)引擎回算 energyPerAtom, |
sampler.anchor.add | write | 混合提案锚点入库:闭环产出的参考结构(已注册材料或直交付 graph) |
sampler.anchor.audit | read | 审计调用方指定路径载荷的血缘完整率(只读,不回填):逐条目三态——可追溯(来源归一化为 material:/job:)/ |
sampler.anchor.export | read | 导出会话锚点库全量条目(无损 JSON 有效载荷):跨会话持久化的原语。 |
sampler.anchor.import | write | 从导出载荷回填锚点:逐条入库(谱系门禁复用库层:无来源即拒), |
sampler.anchor.load | read | 从调用方指定路径回填锚点(落盘载荷 → 会话库,支持 path 单载荷或 paths 多载荷合并): |
sampler.anchor.repair | read | 载荷侧修复原语(写新载荷,不碰原件):对审计报告中不可追溯条目逐条显式声明可追溯起源; |
sampler.anchor.save | write | 把会话锚点库落盘到调用方指定路径(导出载荷的磁盘端):无损 JSON, |
sampler.anchor.stats | read | 会话锚点库容量观测(只读,不变更):条目数 + 谱系形态分布(material:/job:/其他)+ 组分声明覆盖—— |
sampler.flow | read | 仿射耦合流参考结构采样(§4.5 采样语义,invertible 首实证): |
sampler.flow.encode | read | 双射输运映射的反向(契约:仅 invertible === true 提供):把与参考结构同拓扑的候选 graph |
sampler.mixture | read | 锚点引导的混合采样:从会话锚点库检索(拓扑硬门禁 + 组分 L1 距离)→ 最大余数法配额 → |
sampler.ou | read | OU 参考结构采样(§4.5 采样语义):均值回归锚定 referenceId 的受控扩散, |
sampler.perturb | read | 参考结构微扰采样(§4.5 采样语义):在 referenceId 结构的邻域内 |
sampler.rss | read | RSS 随机结构搜索采样(§4.5 采样语义,非 flow 生成式路线):在成分/原子数/ |
sampler.trigger.snapshot.load | write | 判据快照回填(只读校验后原样交付):校验版本戳与形态,快照不进锚点库、不进数据燃料—— |
sampler.trigger.snapshot.save | write | 判据快照落盘(跨会话续供):判据对账结论整体原样落盘——读数/阈值/结论一并保留, |
session.compare | read | 只读对照:并列各分支(默认全部)对同一 (subject,key) 的可见值、是否分歧、数值跨度。 |
session.fork | read | 从某决策线(默认当前主干)分叉一条新支:只登记父子与分叉点序号,不复制/改动任何已有状态, |
session.record | write | 把某支上算得的一个数值挂到 (subject,key)(如 energy/gap/aboveHull):add-only,同键再记则最新一条 |
session.status | read | 会话分支树快照:主干、各支(父/分叉点/祖先链/是否主干)、记录数。只读,便于 Agent 看清当前规划树。 |
session.trunk | read | 选一条决策线为主干(trunk):只是移动指针 + 审计,绝不删除其它分支或其记录—— |
structure.fromCif | read | CIF 文本 → 周期 Material(P1 子集:_cell 参数还原晶胞 + _atom_site 分数/笛卡尔坐标)。 |
structure.fromPoscar | read | VASP POSCAR 文本 → 周期 Material(解析 lattice/按元素分组/分数或笛卡尔坐标)。 |
structure.fromSmiles | read | SMILES → 3D 分子结构(RDKit ETKDG 嵌入 + MMFF/UFF 力场弛豫)。 |
structure.fromXyz | read | XYZ 文本 → Material(分子/非周期:零胞 + pbc=false,同 structure.fromSmiles 语义)。 |
structure.resolve | read | 经 Materials Project 解析化学式为候选结构(需 MP_API_KEY)。 |
trajectory.replay | read | 回放 Trajectory(append-only 事件流):重建材料计算索引。 |
workflow.activeLearning | read | basin-hopping 主动学习闭环(§4.3+§4.5 迭代版):每轮从当前最优结构微扰产候选→引擎 relax |
workflow.bayesOptimize | read | GP 代理贝叶斯优化(1D,极小化昂贵黑箱):对种子材料施体变标度 x(各向同性缩放), |
workflow.bayesOptimizePareto | read | 多目标(2)GP 贝叶斯优化:对种子材料体变标度 x,两目标 = [每原子能量 E/n, 最大残余力范数 max|F|](均最小化) |
workflow.ergodic | read | 遍历对账(§4.5 oracle 条款):采样候选的能量系综平均 对 |
workflow.explore | read | 采样 → 回算闭环(§4.5 oracle 条款):采样器在 referenceId 结构邻域产生候选, |
workflow.freeEnergy | read | 热力学第二档:构型自由能曲线。逐温度网格点恒温 MD 得 ⟨U⟩(β), |
workflow.screen | read | 批量掺杂筛选:基体 + 掺杂变体逐个弛豫,按能量排序。 |
Trust audit
CAUTIONgrade B · trust 82/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (3 observation(s))
- Network
- declared (1 observation(s))
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (14)
console.log(`证据源: ${joint.sourceNames.join(' × ')};权重归一 Σw = ${sum.toFixed(12)};ESS 占比 = ${joint.essFraction.toFixed(3)}`)console.log(`权重归一: Σw = ${sum.toFixed(12)}(配分函数归一,非近似);ESS 占比 = ${joint.essFraction.toFixed(3)}`)console.log(`联合排序: ${joint.entries.length} 候选全部回算成功;Σw = ${sum.toFixed(12)};ESS = ${joint.essFraction.toFixed(3)}`)console.log('排名 变体 成分 ΔH_f (eV/atom) hull 距离 判据形态')? '退化(= max(0,ΔH_f))' : '非退化(包络插值)'
const trajectoryPath = options.trajectoryPath ?? fileURLToPath(new URL('../../data/trajectory.jsonl', import.meta.url))sidecar: options.sidecar ?? fileURLToPath(new URL('../../python-bridge/sidecar.py', import.meta.url)),const health = await (await fetch(`http://127.0.0.1:${http.port}/health`)).json()await assert.rejects(() => fetch(`http://127.0.0.1:${http.port}/health`))@modelcontextprotocol/sdk, @toki0413/mcp-server, @deepseek-ai/cordis, @deepseek-ai/dsh-timeout
@toki0413/core, @toki0413/kernel, @toki0413/plugin-lj, @toki0413/python-bridge, @deepseek-ai/dsh-agent, @deepseek-ai/dsh-agent-loop, @deepseek-ai/dsh-invariants, @deepseek-ai/dsh-llm
@toki0413/core
@modelcontextprotocol/sdk, @toki0413/bridge, @toki0413/kernel, @toki0413/plugin-ase, @toki0413/plugin-branch, @toki0413/plugin-coordination, @toki0413/plugin-derivation, @toki0413/plugin-elasticity
@toki0413/core
Gates applied: no_behavioural_pass.
e0d4ad1a7283full audit observations/trust-audit/mcp-server/toki0413__dsh-saturday.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-12 | e0d4ad1a7283 | CAUTION | B | 82 | first audit |
Questions
What is the dsh-saturday MCP server?
Materials computing tools for AI agents: structures, engines, phonons, EOS, NEB, sampling, lineage.
What tools does dsh-saturday expose?
56 in total: 49 read-only, 7 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is dsh-saturday safe to connect to an agent?
With care. The audit graded it B (82/100) and found 14 things worth knowing before you trust this server, listed below with the exact line each was found on.
What credentials does dsh-saturday need?
It reads MP_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does dsh-saturday run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @toki0413/plugin-xrd at 0.3.14.
How current is this page?
The grade is for one exact copy of the source (e0d4ad1a7283), read on 2026-10-12. The repository is watched and re-audited when it changes.