Yggdrasil

io.github.VonderVuflya由 GitHub 账号 VonderVuflya 发布v0.16.0更新于 Oct 24, 2026

One shared, durable memory for your AI coding agents — local-first, zero-dependency.

已验证STDIO仅桌面知识与记忆开发者工具

概览

AI 生成的概览

面向 AI 编程助手的本地优先共享记忆:让助手跨会话、跨工具保存、搜索并回忆项目决策与经验。

可以做什么
  • 保存决策、经验、项目状态等长期记忆,带去重与敏感信息防护
  • 按单个项目或跨项目搜索与回忆记忆
  • 开工前拉取项目记忆,并检查引擎健康状态
  • 把单条记忆导出为 Markdown 笔记,或把整理后的摘要写入代理记忆文件
  • 从既有代理对话记录、Obsidian 库和 CLAUDE.md 仓库播种记忆,并从其他记忆工具导入
  • 连接自己的两台机器,或通过自己的 git 仓库同步
适用场景
当你反复向新的 AI 会话解释同一项目的背景、决策和坑点,或在 Claude Code、Codex 等多个 MCP 宿主之间切换,并希望这些记忆留在自己机器上而非云端服务时适用。
运行要求
作为本地进程在桌面运行,通过 uvx 从 yggdrasil-memory 的 PyPI 包安装(也可用 npm、pipx、pip、Homebrew)。一次性引导安装会部署常驻本地守护进程并注册 MCP 工具。引擎自行生成本地令牌;YGG_ENGINE_TOKEN 密钥与 YGG_ENGINE_URL 基础地址用于让客户端连接引擎。可选的本地模型需要 Ollama、LM Studio 或 llama.cpp。
安装前请注意
记忆库会把项目细节持久化到磁盘并注入代理会话,任何已连接的代理都能看到,建议定期检查已存记忆。蒸馏前会脱敏并在写入时拒绝密钥,但记忆的可信度取决于写入者。连接机器会开放网络端口并在机器间共享记忆;删除会同步传播并优先于并发编辑。选用托管嵌入后端会把记忆文本发送到本机之外。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Yggdrasil,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

🌳 Yggdrasil

Stop re-explaining your project to every new AI session.
One local memory for Claude Code, Codex, and every MCP agent — shared across sessions, tools, and projects. Zero dependencies. Nothing leaves your machine.

[Latest release] [PyPI] [Glama quality score] [Benchmarks] [AGPL-3.0] [alpha]

Install · How it works · Numbers · Compare · FAQ

Read this in: Русский · 简体中文 · Español · Français · 日本語 · Deutsch


[Yggdrasil — a brand-new session already knows your project, and recalls a fix from another project]

Every new chat, your AI forgets. You re-explain the project, the decisions, the gotchas — every time, in every tool. Yggdrasil is a tiny always-on memory that any agent plugs into. Open a new session, in any project, with any AI, and it already knows what you decided, what broke, and what's still open.

text
$ cd ~/projects/checkout-api && claude        # a brand-new session
🌳 Yggdrasil  (injected automatically at session start)   • [project_status] payments refactor: idempotency keys added; open: e2e tests   • [lesson] webhook 401 → signing secret rotated; update env + redeploy
> "have I solved a flaky websocket reconnect anywhere before?"
🌳 recall → found in project `realtime-dash`:   refresh the token *before* opening the socket, then retry with capped backoff.

No "let me remind you what we did yesterday." It's just there.

🚀 Install

Two commands, inside Claude Code (the plugin launches via uv):

text
/plugin marketplace add VonderVuflya/Yggdrasil/plugin install yggdrasil

The engine lazy-starts on first use and generates its own local token — no API key, no cloud, nothing to configure. Codex and Cursor use the same flow.

All other channels — CLI daemon, Homebrew, npm, Claude Desktop, from source…
Host / toolCommand
uvx (recommended CLI)uvx --from yggdrasil-memory ygg install
npm / npxnpx yggdrasil-memory install
pipxpipx install yggdrasil-memory && ygg install
pippip install yggdrasil-memory && ygg install
Homebrew (macOS)brew install VonderVuflya/tap/yggdrasil && ygg install
Claude Desktop (app)drag the .mcpb from the latest release onto Settings → Extensions, paste your token (ygg token) — the desktop app then shares the same memory as your CLI agents (guide)
from sourceuvx --from git+https://github.com/VonderVuflya/yggdrasil.git ygg install

ygg install is a one-time guided setup: it installs an always-on background service, registers the MCP tools with every agent host it finds — Claude Code, Codex, OpenCode — and, if your hardware allows, recommends optional local models (or pick none to stay zero-config).

OpenCode — nothing to configure

Install OpenCode first, then run ygg install (or ygg redeploy if Yggdrasil is already set up) — the entry is written for you and merged into any existing opencode.json. Confirm with:

bash
opencode mcp list        # -> ✓ yggdrasil connected

Installed OpenCode after Yggdrasil? Just re-run ygg install.

If you'd rather write it by hand, note that OpenCode's schema differs from Claude's in four places at once — servers live under mcp (not mcpServers), type is required, command is one array (not command + args), and env is environment (not env), so the Claude snippet won't port:

jsonc
// ~/.config/opencode/opencode.json{  "$schema": "https://opencode.ai/config.json",  "mcp": {    "yggdrasil": {      "type": "local",      "command": ["/path/to/python3", "~/.yggdrasil/scripts/ygg_mcp_server.py"],      "enabled": true,      "environment": { "YGG_ENGINE_URL": "http://127.0.0.1:42069" }    }  }}

No token goes in the config — the engine reads the 0600 ~/.yggdrasil/token itself. Run ygg doctor if the tools don't show up.

There is also a yggdrasil-memory skill for any Claude surface: MCP connects the tools, the skill teaches the agent when to use them. Use both for the best behavior.

Try it with nothing installed and a throwaway DB: uvx --from yggdrasil-memory ygg serve --reset --db /tmp/ygg.sqlite.

Then just work: ask your agent "recall what we decided about this project", tell it "remember this decision" — next session it's already there. Verify the install any time with ygg doctor.

Already have history? Seed memory from your existing Claude Code + Codex transcripts, Obsidian vaults, and CLAUDE.md repos — distilled locally:

bash
ygg seed --dry-run    # see what it would import; drop the flag to distill for real

Leaving another memory tool? ygg import --from mcp-memory --path memory.json pulls its whole store into Yggdrasil (deduped, secret-guarded) — then you can delete it.

Why

  • 🧠 Persistent — decisions, lessons, and project status survive across sessions.
  • 🔌 One brain, every tool — Claude Code, Codex, OpenCode, and any MCP host share the same memory.
  • 🌐 Cross-project recall — "this looks like what you did in project B — reuse it?"
  • 🧹 Curated, not captured — your agent saves the few things that matter; governance dedupes and archives, never deletes.
  • 🌱 Self-maintaining (opt-in) — a small local model consolidates memory in the background. Zero API tokens.
  • 🪪 One identity everywhere — an optional name and persona every agent picks up, so Claude Code and Codex feel like the same assistant.
  • 🔒 100% local — your memory lives on your machine. No cloud, no account, no telemetry.

🧠 How it works

Yggdrasil is memory + tools — the intelligence is your LLM. It just makes sure the right memory is in front of the right agent at the right moment.

  • 🛎️ Always-on daemon — a tiny local service (~21 MB RAM) your agents reach over MCP tools (ygg_search, ygg_recall, ygg_remember …).
  • 🪝 Hooks — session start auto-injects identity, project status, and open follow-ups (~300 tokens); an optional per-prompt hook auto-recalls memory relevant to each request.
  • 📌 Ranking — pinned and frequently-recalled memories surface first.
  • 🧹 Governance — duplicates and conflicts are queued for review; changes are non-destructive (archive, never delete).
  • 📓 Obsidian — every memory doubles as a plain-Markdown note you can read, edit, and grep.

🎛️ Memory tiers — zero-config by default

Out of the box, Yggdrasil runs on SQLite + FTS5 with zero dependencies — instant keyword search, no models, nothing to download. Optional local models add two independent tiers:

TierYou addYou gain
0 · defaultnothing — SQLite + FTS5keyword search, zero deps, instant — recall@1 = 0.77
1 · semantican embedding model (all-minilm 45 MB · paraphrase-multilingual ~560 MB)search by meaning, across languages — recall@1 = 0.94, recall@3 1.00
2 · self-maintaininga small LLM (qwen2.5:1.5b ~1 GB)background dedupe/merge of memory (propose-only)

The runtime only computes vectors and runs the background model — every memory and every vector stays in the same local SQLite.

ygg install scans for Ollama, LM Studio and llama.cpp, offers to start whichever is installed but idle, and then shows one menu per job with green for models you already have and red for models it would download. Pick a row, and it writes embed_backend, embed_url and distill_url for you — including the part nobody guesses right, that embed_url wants the /v1 base while distill_url wants the host root. A runtime on another machine is one URL: paste it and the dialect is detected. ygg recommend shows the same scan plus the full catalog without changing anything.

Full model menu

Embeddings (semantic search):

ModelSizeGood for
all-minilm45 MBEnglish, tiny & fast
nomic-embed-text274 MBEnglish, better quality (768d)
mxbai-embed-large670 MBEnglish, high quality (1024d)
paraphrase-multilingual~560 MBmultilingual (EN/RU + 50 langs, 768d)
bge-m31.2 GBmultilingual, top quality (heavier)

Embedding backend — Ollama by default. ygg install sets all of this for you once you pick a runtime; the manual route below is for scripted setups and for changing one thing later. To use an OpenAI-compatible /v1/embeddings server instead (llama.cpp's llama-server --embeddings, OpenRouter, LM Studio, vLLM), set embed_backend:

bash
# local llama.cpp — no key neededygg config set embed_backend openaiygg config set embed_url http://127.0.0.1:8080/v1ygg config set embed_model bge-small-en-v1.5ygg redeploy
# OpenRouter — free embeddings, no GPU neededygg config set embed_backend openaiygg config set embed_url https://openrouter.ai/api/v1ygg config set embed_model nvidia/llama-nemotron-embed-vl-1b-v2:freeygg config set embed_api_key sk-or-...    # or export YGG_EMBED_API_KEYygg redeploy

The key is stored in ~/.yggdrasil/embed_api_key (0600) rather than config.json, and reaches the daemon as a file path — so it never shows up in ps, the launchd plist or the systemd unit. ygg config list masks it.

Check it took with ygg doctor — dense should name your model:

✓ dense    active (nvidia/llama-nemotron-embed-vl-1b-v2:free)

Wiring LM Studio or OpenRouter by hand? The gotchas (two URL shapes, model ids, JIT loading, inference vs provisioning keys, privacy filters) are in docs/model-backends.md.

Staying local still wins on quality and privacy: on the 232-memory / 110-query corpus, local paraphrase-multilingual scores recall@1 0.964 vs 0.946 for the free hosted model — and your memories never leave the machine. Reach for a hosted backend when the box can't run Ollama, not to chase accuracy.

Bigger vectors do not buy accuracy here — on the same corpus mxbai-embed-large (1024d) scores 0.809 and nomic-embed-text (768d) 0.818, a difference their confidence intervals swallow whole. What actually moves the number is whether the model handles your languages: both are English-only and collapse to 0.40–0.45 on cross-language queries, where the multilingual default holds 0.95.

Background consolidation (small LLM):

ModelSizeGood for
qwen2.5:0.5b~400 MBtiny, fast on CPU
qwen2.5:1.5b~1 GBbest CPU default
llama3.2:3b~2 GBbetter quality, slower on CPU

The engine itself is swappable — any service meeting the MemoryBackend contract is a drop-in (YGG_ENGINE_URL); see docs/backend-boundary.md.

🔗 One memory across your machines

Work on a laptop and a beefier box? Link them once and they stop being two brains.

text
# on the laptop$ ygg link🔗 pairing code   valid 5 minutes · single use
    ygg://192.168.3.152:42070/a4e0df489737#FOucjgJ1FrUB…
# on the other machine — paste it$ ygg link ygg://192.168.3.152:42070/a4e0df489737#FOucjgJ1FrUB…  ✓ linked with laptop   https://192.168.3.152:42070  ✓ laptop: fetch 84 · push 12 · delete 0 · tombstones 0

That's it. From then on a memory written on one machine is on the other in about a second, ygg delete removes it from both, and either machine keeps working with its own local copy when the other is asleep — reads never wait for the network. When a machine comes back, the two compare fingerprints and repair whatever they missed, without you running anything.

There is no polling. Yggdrasil is called a handful of times a day, so writes push as they happen and a sync is triggered by reads; idle machines send nothing.

What this is not: a cloud. There is no relay, no account, no server of ours in the path. The machines talk to each other directly over your own network, over TLS with each other's certificate pinned, using a key pair that exists only on those two machines. The pairing code itself names the issuing machine's certificate, so even the very first connection is verified — something else on the network answering in its place gets refused before the code's secret is sent. Nothing binds a network port until you run ygg link — install Yggdrasil and it stays on loopback, exactly as before.

text
ygg link --list          # what's linked, and whether writes are actually arrivingygg link --sync          # reconcile now, don't wait for a readygg unlink <name>        # revoke that machine's key here
Details: what travels, what stays, and when to use ygg sync instead

Travels: memories, their relations, and deletions. Stays put: how often you opened a memory and which machine you read it on — that's local ranking, not knowledge. Embedding vectors normally stay local too, with one exception: if both machines run the same embedding model, the vector rides along, so a compute box can do the embedding for the laptop and the laptop never runs a model.

The newer edit wins. Edit a memory on both machines before they talk and the more recent edit is kept on both (a shorter correction included).

Deletions win. If you delete a memory on one machine and edit it on the other at the same time, the deletion wins and the edit is lost. That's deliberate: "I deleted the leaked token" has to hold even when two clocks disagree. When you mean changed my mind, archive it instead — nothing is lost, and ygg unarchive brings it back on both machines (the later decision wins).

A firewall is caught at pairing. The machine that printed the code calls the other one back straight away; if it can't get through, ygg link says so and prints the one command that opens the port to that machine only (ufw, firewalld, Windows). ygg link --list and ygg doctor keep checking afterwards: a peer shows ✓ only once writes are confirmed delivered, otherwise the error and how many changes are waiting. A machine that gets a new address from DHCP is found again the next time it makes contact.

ygg sync (git) is still there and does a different job: machines that can't see each other, a work laptop behind a different network, a bare repo on a USB stick you carry. Use ygg link for machines on one network, ygg sync for everything else. Both share the same merge rules, so you can run both. If both machines are on a Tailscale tailnet, ygg link --tailscale works across networks too.

If the pairing code shows the wrong address (it prefers real Ethernet and Wi-Fi over VM bridges and VPNs, but can still guess wrong), pin it: ygg config set sync_host 192.168.3.152 — or print the code on the other machine: the side that pastes it always uses the address the route actually takes.

📊 The numbers

Measured by eval/ygg_eval.py — 232 memories, 110 labelled queries, ranking weights tuned on the dev split only, so holdout is the unbiased number (recall@1, with the paraphrase-multilingual model):

Search viewholdout recall@1recall@3zero-dep lexical
Within a project (the real path, pool ~11)0.941.000.76
Whole store (no filter, pool 232)0.720.870.69

Within a project — the path you use — the right memory is #1 for 0.94 of queries and in the top 3 every time (recall@3 = 1.00). Searching the whole store with no filter is harder (recall@1 0.72, recall@3 0.87 across all 232). Zero-dep lexical mode already solves keyword and code-identifier queries (1.00); the local model adds meaning and cross-language (crosslingual 0.25 → 0.95). The full breakdown in BENCHMARKS.md has 95% CIs, pool sizes, and per-class scores — rerun it in a minute: python3 eval/ygg_eval.py --report.

Corpus size is part of the number. On a real 4,799-memory store the default multilingual embedder falls to the lexical baseline (recall@1 0.55); bge-m3 holds 0.775 there. If your store grows into the thousands, pick bge-m3 — details in BENCHMARKS.md.

🆚 Yggdrasil vs the rest

Everyone else either auto-captures transcripts or sells you a cloud. Yggdrasil's bet: keep the few things that matter, curated and de-duped, in plain rows you own — and share them across every tool and project.

YggdrasilBuilt-in memory (Claude Code · Codex)claude-memmem0 / OpenMemorybasic-memory
Curated decisions / lessons / status (not transcripts)✅⚠️ auto-notes❌ captures everything⚠️⚠️ free-form notes
One memory across tools✅❌ vendor-siloed✅✅✅
Cross-project recall ("solved this in project B")✅❌ repo-scoped⚠️⚠️⚠️
100% local by default✅✅⚠️ cloud sync add-on❌ hosted-first✅
Zero dependencies (stdlib + SQLite)✅—❌ Node + Bun + worker daemon❌ Docker + Qdrant + LLM key❌
Works with no LLM & no API key✅✅❌ AI-compresses❌✅
Semantic search, fully local✅ opt-in Ollama❌ grep-only⚠️ optional Chroma⚠️ needs API key or Docker stack❌
Plain Markdown you own (Obsidian-ready)✅✅❌❌✅

Closest neighbor — claude-mem: capture-everything memory that records and AI-compresses every session (Node 20+ and Bun, a persistent worker daemon; Chroma optional). Yggdrasil is the opposite bet: a small, high-signal store instead of a growing firehose. mem0 is an SDK plus a hosted platform for building apps that remember their users — even self-hosted it needs an LLM API key. Built-in memories are genuinely useful — and structurally siloed: one vendor, one repo, one machine, literal grep. Yggdrasil is the layer above them (and ygg seed can bootstrap itself from those same transcripts). Different layer entirely: context-mode (live context window) and Context7 (fresh library docs) — both pair fine with Yggdrasil.

🧰 Commands

Agents see six MCP tools: ygg_health, ygg_bootstrap, ygg_search, ygg_recall, ygg_remember, ygg_materialize — auto-registered by the plugin or ygg install.

Full ygg CLI reference

Memory ops

CommandWhat it does
ygg recall --query "…"Cross-project search — "have I done this anywhere?"
ygg search --project P --query "…"Project-scoped search (--type, --tag, --limit, --json)
ygg remember --project P --type lesson --content "…"Save a durable memory (secret-guarded, deduped)
ygg bootstrap --project PPull a project's memory before starting work
ygg pin --id ID · ygg unpin --id IDPin a memory so it reliably surfaces
ygg relate --from A --rel solves --to B · ygg relations --id IDLink memories (solves/supersedes/contradicts) · see why a memory exists / what replaced it
ygg supersede --id OLD --by NEWArchive an outdated memory — --by records what replaced it
ygg unarchive --id IDBring an archived memory back (on linked machines too)
ygg materialize --id ID --project PExport one memory to an Obsidian note
ygg export-native --project PWrite a curated digest into AGENTS.md/MEMORY.md — feed Claude Code & Codex's native memory
ygg import --from TOOL --path PMigrate another memory tool's store into Yggdrasil (mcp-memory, basic-memory; --dry-run first)
ygg review [--apply]Work the governance queue — consolidate duplicates, flag stale/conflicting memories (archive-only, reversible)
ygg delete --id ID · ygg reset …Hard-delete one memory · bulk-undo a bad seed (confirms first)

Cold start

CommandWhat it does
ygg seedDistill Claude Code + Codex transcripts, Obsidian vaults, CLAUDE.md repos — incremental, deduped, fully local
ygg seed --dry-run · --forceDiscover + estimate only · re-distill everything
ygg seed --schedule 03:30Nightly auto-distill (launchd) — memory keeps itself fresh; off / status
ygg sync --repo <your-git-repo>Sync memory across machines through your own git repo — plain JSON files, no cloud in the loop
ygg link · ygg link <code>Link two of your machines directly on one network — live shared memory, pinned TLS, no relay
ygg link --list · ygg unlink <name>Show linked machines · revoke one
ygg distill --source PATHDistill one dir/file into lessons
ygg reindexBackfill missing embeddings (restores dense recall)

Service & setup

CommandWhat it does
ygg install · ygg doctor · ygg updateGuided setup · diagnose with actionable fixes · upgrade
ygg configShow/set persistent settings (list · get · set · unset)
ygg status · start · stop · restart · logsManage the always-on daemon
ygg hooks · unhooks · registerSessionStart hook on/off · (re)register MCP
ygg recommend · token · uninstallModel catalog · print auth token · remove everything

Give it a personality — edit ~/.yggdrasil/identity.json:

json
{ "name": "Jarvis", "persona": "concise, proactive, dry wit", "user_facts": ["prefers TypeScript", "ships small PRs"] }

Heavy seeding, weak laptop? Point distillation at any box on your LAN — a desktop with Ollama, LM Studio, llama.cpp, even an iPhone running a local-LLM server app: ygg config set distill_url http://<box>:11434. Yggdrasil auto-detects the API dialect (Ollama or OpenAI-compatible); your data still never leaves your network — details in docs/ygg-cli.md.

❓ FAQ

Claude Code already has built-in memory — why Yggdrasil?

Built-in memories are per-vendor, per-repo, per-machine, and retrieved by literal text match. Yggdrasil is the layer above: the same memory in Claude Code, Codex, and any MCP host, recall across projects, optional semantic search — still 100% local. It bridges them both ways: ygg seed distills your existing native memory + transcripts into the shared brain, and ygg export-native writes a curated digest back into AGENTS.md/MEMORY.md — so even a fresh clone or a tool without Yggdrasil still gets your curated memory.

Does it send my code or memory to the cloud?

No. The engine, the database, and the optional models all run locally. No account, no telemetry. The only outbound call is a version check against PyPI.

If you link two of your own machines with ygg link, memories travel between those two machines over your own network — directly, over TLS with a pinned certificate, with no relay and no server of ours in the path. Until you run that command nothing listens beyond loopback.

Can a malicious repo plant instructions in my memory?

Recalled memory is injected as clearly-framed reference notes, not instructions, with where each note came from and a marker when it belongs to a different project — so the agent treats it as data and asks before acting on anything in it. Secrets are redacted from transcripts before distillation and refused on write. Still: memory is only as trustworthy as what wrote it — review ygg review now and then.

Does it automatically remember everything?

No — by design. Retrieval is automatic; writing is deliberate (the agent calls ygg_remember for durable lessons). Capture-everything pollutes memory and burns tokens, so we don't. The optional background model consolidates what's already saved (propose-only).

Do I need a GPU or an API key?

No. The default is pure lexical search — zero dependencies, instant. Semantic search is opt-in and uses a local model via Ollama. The installer recommends one that fits your hardware.

How heavy is it, and what does it cost in tokens?

The engine idles at ~21 MB RAM (lexical default) with ~0% CPU; disk is tens of KB per memory. Session start injects ~300 tokens; each tool call returns a small snippet. All heavy work (indexing, embeddings, consolidation) runs off-LLM on your machine.

Can I edit or delete memories by hand?

Yes. Memories materialize to Markdown notes in an Obsidian vault — read, edit, or remove them like any file. Governance and review never delete anything — they archive, which is reversible. Only you hard-delete, explicitly, with ygg delete (and on linked machines that delete reaches both).

🚦 Status & roadmap

Alpha. The happy path and the governance loop are gate-tested (scripts/run_gates.sh); not yet hardened for multi-user or production use. macOS today; Linux/Windows service installers are built and in final on-device testing.

Shipped recently: 🔗 machine-to-machine memory (ygg link) · relation graph (ygg relate: solves / supersedes / contradicts).

Next: 🛰️ cross-surface (one memory across CLI, web, and phone — the HTTP facade is in, see docs/cross-surface.md) · 🐧 Linux/Windows GA.

🤝 Contributing

Issues and PRs welcome. Run scripts/run_gates.sh and python3 -m unittest discover -s tests before submitting — all gates must stay green.

📜 License

GNU AGPL v3.0 — see LICENSE. Free and open source: use, modify, self-host, redistribute. If you modify it or offer it as a network service, you must release your source under the same license.

来源:README.md,提交 3455d1c

工具

0
SourceWeft 曾在隔离沙箱中以无凭据方式启动该软件包一次,以列出其工具,但未能完成:该软件包类型无法在沙箱中运行。

版本历史

2
  1. v0.16.0最新Oct 22, 2026
  2. v0.15.0Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分