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