Sigao Li — personal MCP server

com.sigaoli由 sigaoli.com 發布官方發布者v1.0.0更新於 Oct 24, 2026

Read-only access to Sigao Li's profile, CV and case studies. Bilingual (EN/ZH).

已驗證Streamable HTTP可網頁執行知識與記憶

概覽

AI 產生的概覽

唯讀的遠端 MCP 伺服器,提供 Sigao Li 的個人簡介、履歷與專案案例(中英雙語)。

可以做什麼
  • 讀取本人身分、職涯敘述、聯絡連結與自我介紹
  • 取得完整履歷:現職、工作經歷、研究、教育、志工服務、獎項、技能與證照
  • 依 slug 取得單一專案案例全文,涵蓋挑戰、做法與成效
  • 以未知 slug 呼叫案例工具即可取得有效 slug 清單
適用情境
適合需要 Sigao Li 事實性背景時使用,例如撰寫介紹、整理履歷摘要或了解其專案細節,而不必爬取網站。它是針對單一人物的小型資訊來源,並非通用工具。
執行需求
遠端 Streamable HTTP 端點 api.sigaoli.com;未宣告任何驗證、API 金鑰、標頭或本機執行環境。需要能連線至該端點的網路。
安裝前請注意
伺服器為唯讀且不需憑證,風險較低。內容屬第三方自行發布的資料,應視為未經查證的陳述而非權威事實;請求會傳送至外部主機。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Sigao Li — personal MCP server,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/com.sigaoli%2Fprofile/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "sigao-li-personal": {
      "type": "http",
      "url": "https://api.sigaoli.com/mcp"
    }
  }
}

README

sigaoli.com

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.

Highlights

  • Generative canvas effects on a map motif — an interactive particle field (home), contour terrain (work), a "river as timeline" with a flow field (CV), and a geo-network arc map (photography); all vanilla canvas/SVG, tuned to 60fps with reduced-motion and mobile fallbacks
  • Dotted world map — land sampled from Natural Earth, with 88 GPS-extracted photo footprints across 6 countries; click a marker to open that country's gallery
  • Zoe, the digital doorcat — Sigao's cat (驺虞) lives in the corner of every page as a set of AI-generated, chroma-keyed VP9-alpha video clips pinned to shared anchor poses, driven by a state machine: she dozes off when ignored, reacts to page switches, listens while you type, "types back" while the assistant streams, and keeps a few easter eggs (production handbook in docs/)
  • Built-in AI layer — a floating chat assistant (fronted by Zoe) on every page — it suggests the single most relevant page as you ask, and greets a returning visitor by name (stored only in their own browser, opt-in) — plus a personal MCP server, both fed by a build-time knowledge pack generated from the same sources as the pages (see below)
  • Machine-readable by design — /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
  • Photographs file themselves — drop the full-resolution originals into _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
  • Either language pulls the other along — edit the Chinese or the English and commit. The hook works out which side moved and asks a model whether the edit actually changed what the other side must say. Polishing one language leaves the other alone; a changed fact is revised rather than rewritten, so hand-picked wording survives. Editing both in one commit counts as already handled by hand
  • Lighthouse (mobile): 96–100 across all categories; zero cookies, no paid services, and a plain-language privacy notice at /privacy

Commands

CommandAction
npm run devDev server at localhost:4321 (Astro 7 runs it as a daemon — stop with npx astro dev stop)
npm run buildProduction build to dist/
npm run previewServe the production build locally
npm testUnit tests for both hook pipelines (node --test, no extra dependencies)
npm run ingestPhoto ingest by hand. Normally the pre-commit hook runs it; useful for watching what it does
npm run syncBilingual sync by hand. Same — the hook runs it, this is for watching
node scripts/check-links.mjsInternal 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.mjsE2E chat-widget test (needs both dev servers running)
node scripts/verify-zoe.mjsE2E for Zoe's action state machine (append ?zoe-fast locally to compress minute-scale timers)
node scripts/verify-typeroute.mjsE2E 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 state never reaches idle and 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 the ZOE key (sitToLoaf).

The chat panel is rebuilt on every navigation — transition:persist keeps 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 sessionStorage with the history? Measure geometry only once the panel is visible — scrollHeight is 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.ts behind import.meta.env.DEV, secret in worker/.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

AI layer

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.

Editing content

  • Case studies / research: edit either language and commit. The pre-commit hook works out which side moved, asks a model whether the edit actually changed what the other side must say, and only then revises it — passing the existing translation along so a changed fact gets fixed without the rest of your wording being rewritten. Polish one language and the other is left alone. Edit both in one commit and that counts as already handled by hand. See docs/bilingual-sync-design.md.
  • CV: edit 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.)
  • UI strings & hero copy: hand-written bilingual dictionary in src/lib/i18n.ts.
  • Photos: drop the full-resolution originals into _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/<country-id>/ instead. Counts, the map and the AI knowledge pack all follow from photos.json automatically. See docs/photo-ingest-design.md.
  • AI assistant persona: edit src/data/knowledge/*.md; the knowledge pack rebuilds on every deploy and the assistant follows within ~10 minutes (Worker-side cache TTL).
  • Zoe's actions: source clips live outside the repo; the pipeline (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.

Local setup

Two chains run from a pre-commit hook: photo ingest, and bilingual sync. After cloning, point git at the tracked hooks directory once:

bash
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.

Deployment

Push to master → deploy.yml builds and deploys to Pages. Pushes to v2 build without deploying (verification).

Two more workflows watch rather than gate, each emailing on failure and neither able to hold up a release:

WorkflowWhenWhat
verify.ymlevery pushBuilds, checks internal links, then drives eight browser scripts against the production build. Failures upload screenshots and Playwright traces — drop a trace into trace.playwright.dev to replay the run frame by frame
audit.ymlMondaysnpm audit over the site and the worker

The audit used to gate the build. It reads the day's advisory database rather than this repository, so an untouched commit could go from green to red overnight — which is exactly what stopped a photo batch from shipping on 13 September. Knowing is worth an email; being blocked is not.

The Worker deploys separately: cd worker && npx wrangler deploy (secrets via wrangler secret put; custom domain api.sigaoli.com bound in the Cloudflare dashboard). When a batch changes both, deploy the Worker first — the chat UI calls its endpoints, so a site push ahead of the Worker leaves a brief window where those calls 404.

A deploy takes up to a minute to reach every edge location. Checking immediately reads the previous version, which has twice looked like a broken deploy when nothing was wrong — wait, then check.

Daily chat usage is at https://api.sigaoli.com/usage (last seven days, plus whether today has hit the cap). The cap itself is DAILY_CAP in worker/src/core/quota.ts; when it trips it emails once via Cloudflare Email Routing.

⚠️ Never click "Sync fork". This repository began as an academicpages fork; syncing would reset master to the upstream template. If that ever happens again: git push --force origin <good-commit>:master.

來源:README.md,提交 6268656

工具

3

get_profile

Get profile

Who Sigao Li is: identity, career narrative, contact links, and self-introduction.

輸入參數lang

list_experience

List experience

Full CV: current role, professional experience, research, education, volunteering, awards, skills, certifications.

輸入參數lang

get_case_study

Get case study

Full text of one project case study by slug (challenge / approach / impact). Call with an unknown slug to get the list of valid slugs.

輸入參數langslug必填

版本歷史

1
  1. v1.0.0最新Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。