Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Read-only access to Sigao Li's profile, CV and case studies. Bilingual (EN/ZH).
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
适用于网页版、桌面版和手机版 Claude:
https://api.sigaoli.com/mcp在终端中运行这条命令
claude mcp add --transport http profile https://api.sigaoli.com/mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"profile": {
"url": "https://api.sigaoli.com/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"profile": {
"type": "http",
"url": "https://api.sigaoli.com/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
ChatGPT 只能连接互联网上的服务器:
https://api.sigaoli.com/mcp菜单名称可能因套餐和版本不同而略有差异。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
我们还没有读取这个服务器的工具列表;我们会轮流检查各个端点。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过域名 sigaoli.com 验证(注册中心会核实域名所有权)
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
尚未检查;我们会轮流检查各个端点
尚未检查;我们会轮流检查各个端点
尚未检查;我们会在检查端点时读取工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在作者的云端运行。通过互联网连接,无需安装,但你发送的内容会经过作者的服务器。
GitHub 仓库最后更新于–,最新版本(1.0.0)于3个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Zendesk
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Zendesk MCP Pack — tickets, users, organizations via OAuth.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
Personal website of Sigao Li — AI Product Manager · Spatial Data Scientist. _From maps to models, and the products in between._
Bilingual (English at /, 中文 at /zh/), built with Astro + Tailwind CSS v4 + GSAP, deployed to GitHub Pages via GitHub Actions. Launched 2026-06-11, replacing the previous Jekyll (academicpages) site.
docs/)/llms.txt, /llms-full.txt, /resume.json (JSON Resume), /knowledge.json, /.well-known/mcp.json, JSON-LD, and a robots.txt that explicitly welcomes AI crawlers_inbox/ and commit. A pre-commit hook works out the country from the coordinates against Natural Earth polygons, archives the originals outside git, derives masters with a maximum edge of 4096px and the EXIF stripped, asks a vision model for the bilingual caption, and registers everything in photos.json — the map, the counts and the assistant's knowledge all follow from there/privacy| Command | Action |
|---|---|
npm run dev | Dev server at localhost:4321 (Astro 7 runs it as a daemon — stop with npx astro dev stop) |
npm run build | Production build to dist/ |
npm run preview | Serve the production build locally |
npm test | Unit tests for both hook pipelines (node --test, no extra dependencies) |
npm run ingest | Photo ingest by hand. Normally the pre-commit hook runs it; useful for watching what it does |
npm run sync | Bilingual sync by hand. Same — the hook runs it, this is for watching |
node scripts/check-links.mjs | Internal link integrity check over dist/ |
node scripts/verify-nav.mjs 等 | Playwright interaction suites (run against a local server) |
npm run dev (in worker/) | Chat + MCP Worker at localhost:8787 (wrangler; secrets in worker/.dev.vars, never committed) |
node scripts/verify-chat.mjs | E2E chat-widget test (needs both dev servers running) |
node scripts/verify-zoe.mjs | E2E for Zoe's action state machine (append ?zoe-fast locally to compress minute-scale timers) |
node scripts/verify-typeroute.mjs | E2E for the intent-driven typing clip and the bilingual 404 page |
Any Playwright suite that waits on Zoe's state must pin the clock
(
Date.prototype.getHours = () => 14): between 23:00 and 06:00 she starts the
session asleep, so
statenever reachesidleand the run just times out.
When adding a Zoe clip, decide who prewarms it and when at the same time.
A clip that is only fetched at playback stalls on a slow connection, and the
stage shows nothing until it decodes. Prewarming has been missed three times
already. Note
warm()takes the *file* name (sit-to-loaf), not theZOE
key (
sitToLoaf).
The chat panel is rebuilt on every navigation —
transition:persistkeeps
Zoe's stage, not the panel. **Anything that lives only in panel DOM is gone
the moment a visitor clicks a link.** The streaming reply, the guidance chip
and the unsent draft each had to be given module state plus a path back
through
paint(); the chip was lost for weeks before anyone noticed. So when
adding persistent UI here, answer two questions up front: how does
paint()
rebuild it, and should it ride along in
sessionStoragewith the history?
Measure geometry only once the panel is visible —
scrollHeightis 0 while
it is hidden, which silently writes
height: 0px.
Turnstile guards `/chat` and `/classify`. It must never guard `/mcp`.
That endpoint exists so machines can read Sigao's profile — it is in the
official registry — and Turnstile exists to stop machines. It also costs
nothing to serve: the tools read the knowledge pack and never call a model.
The static outlets (
llms.txt,knowledge.json,.well-known/mcp.json) are
served by Pages and never reach the Worker at all.
Locally, Turnstile uses Cloudflare's always-pass test keys — sitekey in
site.tsbehindimport.meta.env.DEV, secret inworker/.dev.vars. The real
key rejects headless browsers, which is exactly its job, so every suite that
drives a real Worker would fail against it. The real secret exists only in
production, set with
wrangler secret put. A corollary worth remembering:
the production happy path cannot be verified from a script — reaching it
needs a human in a real browser. Automation can still prove the gate is up
(a request with no credential must return 403).
src/
├── pages/ # en routes + zh/ mirrors; llms.txt / resume.json / knowledge.json endpoints ├── components/ # Nav, Hero, WorldMap, Lightbox, CommandK, ChatWidget … │ └── pages/ # shared page bodies rendered by both locales ├── content/ # cases & research (en) + cases-zh & research-zh (generated, reviewed) ├── data/ # cv.json / cv.zh.json / photos.json (GPS + bilingual alts) │ └── knowledge/ # persona sources for the AI assistant (about / faq / guidelines / boundaries) ├── lib/ # i18n dict, GSAP lifecycle helper, site config │ └── knowledge/ # knowledge-pack pipeline (same-source layers + build-time privacy guard) └── assets/ # photo originals (optimized at build; originals never shipped) worker/ # Cloudflare Worker: /chat (SSE) + /classify (intent) + /mcp (MCP server) └── src/core/ # runtime-agnostic logic; Cloudflare specifics live only in src/adapter/ public/zoe/ # Zoe's clip library (600p VP9 alpha, lazy-loaded; idle loads first) docs/ # zoe-production-handbook.md — clip production specs & prompt cards
One knowledge layer, three outlets: /llms-full.txt for passive crawlers, a chat assistant (POST /chat, SSE) for humans, and an MCP server (/mcp, Streamable HTTP, no auth — tools: get_profile / list_experience / get_case_study) for visiting agents, both served from api.sigaoli.com (Cloudflare Worker, code in worker/). The knowledge pack (/knowledge.json) is assembled at build time from the same sources as the pages — persona markdown, cv.json, case studies, photo stats — so any content edit propagates to all three outlets on the next deploy, no manual step. A privacy guard fails the build if sensitive patterns (phone numbers, IDs, coordinates) ever leak into the pack.
Alongside each reply the chat runs a lightweight intent classifier (POST /classify, a small model) to suggest the single most relevant page, and can remember a returning visitor's name — both kept entirely in the visitor's own browser (opt-in, clearable via "Forget me"), never on a server. Visitors in the EU/EEA/UK have their chat and classification routed to an EU-hosted provider, never the China-direct API. What the site stores and sends is described in plain language at /privacy.
docs/bilingual-sync-design.md.src/data/cv.json or cv.zh.json — the hook keeps the other in step entry by entry, so changing one role doesn't touch the rest. The timeline, /resume.json and /llms-full.txt all render from it. Replace public/files/pdf/CV__Sigao_Li.pdf alongside. (skills is deliberately left out of the sync: the two languages use different shapes there and the renderer handles both.)src/lib/i18n.ts._inbox/ and commit. The pre-commit hook files them by GPS, archives the originals to _originals/ (never committed), derives serving masters with a maximum edge of 4096px, writes bilingual captions with a vision model, and registers them in src/data/photos.json. Photos without GPS go in _inbox/ / instead. Counts, the map and the AI knowledge pack all follow from photos.json automatically. See docs/photo-ingest-design.md.src/data/knowledge/*.md; the knowledge pack rebuilds on every deploy and the assistant follows within ~10 minutes (Worker-side cache TTL).scripts/zoe-board2.mjs → zoe-qc2.mjs → zoe-prod2.mjs) keys, QCs, mirrors and encodes them into public/zoe/. New actions = one clip + one row in the ZOE table in ChatWidget.astro; specs and prompt cards in docs/zoe-production-handbook.md.Two chains run from a pre-commit hook: photo ingest, and bilingual sync. After cloning, point git at the tracked hooks directory once:
git config core.hooksPath .githooks
Without this neither runs — photos dropped into _inbox/ stay there, and the two languages stop tracking each other. Both exit immediately when there is nothing to do, so an ordinary commit is unaffected.
Both need .env (copy .env.example): the model calls for captions, translation and the staleness check all go through that gateway.
Regenerating the lock file. package-lock.json has to be built on Linux. npm records only the optional dependencies it can resolve on the machine it runs on, so a lock made on Windows omits what sharp needs on a runner and npm ci refuses to install. After changing dependencies here, run the Relock on Linux workflow from the Actions tab; it rebuilds the lock, proves npm ci works, and commits the result. Ordinary pushes never need it — and if you forget, the verify job says so.
Push to master → deploy.yml builds and depl
只显示了开头部分;其余内容请在仓库中阅读