search
Search the writing corpus
Full-text (BM25) search across all essays, book chapters, and field notes. Returns ranked matches with a snippet, id, and canonical URL. Pass an id to get_document to read the full text.
limitquery必填section
io.github.saagpatel由 GitHub 帳號 saagpatel 發布v0.1.0更新於 Oct 24, 2026
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
發布方自己的服務:PortfolioFit
面向 saagarpatel.dev 公開語料的唯讀 MCP 伺服器,讓助理檢索並閱讀文章、書稿與筆記,並瀏覽專案與基準結果。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。
閱讀 https://sourceweft.com/mcp/io.github.saagpatel%2Fportfolio-mcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。把它新增到你客戶端的 mcpServers 設定中。
{
"mcpServers": {
"saagarpatel-dev-portfolio": {
"type": "http",
"url": "https://mcp.saagarpatel.dev/mcp"
}
}
}The agent-native layer of saagarpatel.dev: a Model Context Protocol server that lets any AI agent query Saagar's writing, projects, public-safe repo profiles, and benchmark results directly, instead of scraping HTML.
Read-only. Stateless. Public. No auth, no tracking, no database, no runtime egress.
The website stays a pure static site. This server is a sibling, not a backend bolted onto it:
portfolio-index repo): the build emits a static machine
corpus — corpus-index.json, per-document corpus/<id>.json, and
.well-known/mcp.json — plus public-safe repo profile artifacts when present,
served alongside the HTML. Already public.src/index.ts): a stateless Cloudflare Worker that bakes
the Layer 0 corpus into its bundle and serves it over MCP (streamable HTTP, the
WebStandardStreamableHTTPServerTransport). Zero runtime fetches.src/stdio.ts): the same server over stdio, for running
locally via npx saagar-portfolio-mcp. Identical tool/resource/prompt surface.The shared core (src/server.ts) is transport-agnostic; both layers wrap it.
All read-only (readOnlyHint: true). No tool takes a URL or filesystem path (no
SSRF / exfil surface).
Documents are also exposed as Resources (portfolio://essays/{slug}, portfolio://book/{slug},
portfolio://notes/{slug}, portfolio://profile), and there are two Prompts:
introduce_saagar and summarize_writing_on (grounded in a live search).
BM25 over a baked index (no embeddings in v1 — the committed corpus contains 166 docs and the calling LLM supplies the semantics). Titles are boosted. Embeddings are a measured Phase 3 upgrade, added only if retrieval quality proves insufficient.
From the repository root, use the pinned Node and npm versions from
.node-version and package.json. The checked-in public-safe corpus is enough
for routine checks; no sibling checkout, local portfolio import, signing key,
or Cloudflare credentials are needed.
make check runs lint, format validation, typecheck, tests, the stdio build and
protocol test, smoke, parity, and a package-content check. See
CI for the same aggregate gate. npm run dev starts
the local Worker.
npm run build:corpus regenerates source from a sibling checkout or an explicit
network URL; URL-mode builds omit OPERANT because its build inputs are not
published. Corpus generation is not required for ordinary fixture verification. npm run probe:mcp targets the live Worker by default, and the connected audit starts a
local Worker and invokes the separately installed mcp-audit CLI. Keep those
separate from local gates; deployment and signing remain operator-gated as
described below.
Inspect either transport with the MCP inspector:
Operator-gated (needs Cloudflare auth). v1 still deploys to the default
portfolio-mcp.<account>.workers.dev URL, and npm run probe:mcp uses that stable
Worker URL by default. Public discovery now advertises the verified custom endpoint
https://mcp.saagarpatel.dev/mcp; after any deploy, verify both the Worker and the
website manifest/readback path before changing .well-known/mcp.json.
wrangler.jsonc pins workers_dev: true so the public Worker URL stays live during any
future custom-domain experiments; do not remove it unless the website manifest has already
moved to a verified replacement endpoint.
Once published, anyone can run it locally with npx saagar-portfolio-mcp (no install).
Ed25519-sign .well-known/mcp.json so an agent or registry can verify it authentically
comes from Saagar (via saagar-mcp-kit's signing CLI, Node built-in crypto):
Override paths with --manifest=/--key=/--pub=/--sig=.
Commit the .sig + mcp-ed25519.pub (never the private key) into portfolio-index next to the manifest, then
redeploy the site. Re-run sign whenever the manifest changes (it signs the exact served bytes).
Designed to pass MCPAudit / mcp-trust (Saagar's own tools): only the inbound MCP
transport, no shell_execution / file_access / destructive / exfiltration, and no
caller-controlled egress (the corpus is baked). All tools are annotated read-only with
plain, non-injectable descriptions. bash scripts/audit-mcp.sh runs a connected scan.
Dogfooding this server surfaced a substring-matching false-positive bug in MCPAudit (it
matched port inside portfolio://); that fix lives in the MCPAudit repo and cut this
server's findings 62 → 14. The genuine tool surface scans clean (high_risk_servers: 0).
Node.js 24.21.0, npm 12.2.0, TypeScript, Cloudflare Workers, and the MCP SDK.
URL-mode corpus builds omit OPERANT, whose inputs are only available to local corpus builds. Worker deployment and package publication are not part of local verification.
Keep the published MCP endpoint and signed discovery manifest in sync when an operator authorizes a deployment. Registry publication remains a separate, explicitly authorized release action.
來源:README.md,提交 55de013
Search the writing corpus
Full-text (BM25) search across all essays, book chapters, and field notes. Returns ranked matches with a snippet, id, and canonical URL. Pass an id to get_document to read the full text.
limitquery必填sectionGet a document
Return the full Markdown of one document by id, e.g. "writing/the-handoff" or "book/preface". Get ids from search or list_corpus.
id必填List the corpus
List every document with its id, title, type, date, and word count, plus per-type counts. The table of contents for the whole site. Optionally filter by type.
typeGet profile
Return Saagar Patel's profile: name, one-line summary, site, and the about / now / uses pages. Start here to understand who this is and what they work on.
無需輸入參數。
List projects
List the curated, public projects with stack, status, last-active date, and test/CI signals, plus anonymized portfolio-wide aggregates. Optionally filter by status.
limitstatusList repo profiles
List public-safe repo answering profiles with repo id, attention state, freshness, and proof counts. Profiles are static artifacts baked from saagarpatel.dev, not live repo health.
limitattentionStateGet repo profile
Return one public-safe repo answering profile by repo_id, including purpose, safe commands, agent surfaces, proof refs, freshness, exclusions, limitations, and integrity metadata.
repoId必填Get OPERANT benchmark results
Return the public, sanitized OPERANT results: per-model operator-calibration-score (OCS) profiles, the headline figures, and the calibration-profiles (not a flat leaderboard) framing. Sourced from the published OPERANT mirror. Returns availability=false if no dataset was baked.
無需輸入參數。
已滿足適用檢查項的 100%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

fit.portfolio官方發布者
PortfolioFit 是遠端 MCP 伺服器,讓助理依投資指令核對標準化投資組合,並計算配置限制與統計指標。

dev.rye官方發布者
遠端 MCP 端點,提供 Cameron Rye 的部落格、作品集專案、簡介、閱讀清單與網站即時統計,以及聯絡與訂閱工具。
由 GitHub 帳號 shlokbam 發布
瞭解AI工程師Shlok Bam:專案、經驗、技能、專利。即時、唯讀。AI 翻譯

由 GitHub 帳號 HarshithNayakaL 發布
唯讀 MCP 伺服器,提供某作品集網站 JSON API、MCP、A2A 與 NLWeb 的開發者文件。

由 GitHub 帳號 HarshithNayakaL 發布
以唯讀方式存取 Harshith Nayaka L 的作品集網站,讓助理查詢其個人簡介、專案、案例研究、常見問題與 agent 技能。
src/ types.ts corpus + projects + operant shapes bm25.ts dependency-free BM25 + snippet (pure) tools.ts createTools(corpus) -> the 8 tools (pure, injectable) corpus.ts loads the baked corpus + accessors corpus.generated.ts AUTO-GENERATED by build:corpus server.ts buildServer(): shared MCP core (tools + resources + prompts) index.ts Cloudflare Worker transport (streamable HTTP) stdio.ts Layer 2 stdio transport (the npx CLI)scripts/ build-corpus.mjs bakes Layer 0 and local OPERANT inputs into corpus.generated.ts probe-mcp.mjs probes an MCP HTTP endpoint (saagar-mcp-kit driver + domain calls) audit-mcp.sh connected MCPAudit scan of this server (dogfood)test/ vitest: bm25, tools, full-protocol server testsnpm cimake checknpx @modelcontextprotocol/inspector http://localhost:8787/mcp # Layer 1 (HTTP)npx @modelcontextprotocol/inspector node dist/stdio.js # Layer 2 (stdio, after build:cli)npm run build:corpus && npm run deploy # wrangler deploynpm run probe:mcp # post-deploy live MCP readbacknpm run build:corpus && npm run build:cli # -> dist/stdio.jsnpm login && npm publish # public package: saagar-portfolio-mcpnpx mcp-kit-sign gen-key --manifest=../portfolio-index/.well-known/mcp.json # one-time; private key -> .signing/ (gitignored, NEVER commit)npm run sign # writes <manifest>.sig + publishes mcp-ed25519.pubnpm run sign:verify # checks manifest bytes against .sig + public key