rtfx.pro
pro.rtfx由 rtfx.pro 發布官方發布者v1.0.0更新於 Oct 26, 2026
Publish what Claude makes (HTML, PDF, small site) to a private link only chosen people can open.
概覽
託管的 rtfx.pro MCP 伺服器,讓助理把 HTML 頁面、PDF 和小型靜態網站發佈到私有、受存取控管的連結,並管理分享、版本與瀏覽紀錄。
- 可以做什麼
- 把請求中攜帶的 HTML 頁面、PDF 或小型多檔案網站發佈出去並回傳穩定連結;為過大的網站或含二進位檔案的網站預留一次性上傳連結。
- 列出產物,查看詳情、完整版本歷史、分享名單與瀏覽次數,以及彙總統計。
- 變更誰可以開啟某個產物,把連結回復到較早版本,或憑確認 slug 永久刪除產物。
- 檢查目前連線如何驗證,以及執行個體是否正常回應。
- 適用情境
- 適合讓 Claude 把做好的到達頁、報告或小型網站發佈成只給指定對象開啟的私有連結,並保留版本、查看誰造訪過。託管版只發佈工具呼叫中攜帶的內容,因此更適合助理已持有的內容,而非磁碟上的檔案。
- 執行需求
- 遠端 Streamable HTTP 端點 mcp.rtfx.pro,在 Claude 中作為自訂連接器加入,或用 Claude Code 指令加入。驗證為 OAuth 2.1,含探索與動態用戶端註冊,無需貼上任何內容;作用域為 rtfx:read、rtfx:publish、rtfx:manage。需要 rtfx.pro 帳號,分享、回復與刪除需要 manage 作用域。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 rtfx.pro,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
交給代理程式安裝
把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。
閱讀 https://sourceweft.com/mcp/pro.rtfx%2Frtfx/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。其他 MCP 客戶端
把它新增到你客戶端的 mcpServers 設定中。
{
"mcpServers": {
"rtfx-pro": {
"type": "http",
"url": "https://mcp.rtfx.pro/mcp"
}
}
}README
artifacts-server
Private, access-gated hosting for landing pages and HTML/Claude artifacts,
running entirely on Cloudflare Workers. A public product site at / (plus /docs, /signup
and /login) explains the product and lets people start on the Free plan. Sign-in is app-owned
and passwordless: rtfx.pro emails a one-time code or magic link, then a host-only rtfx_session
keeps the browser signed in. One dashboard at /admin handles publishing, sharing and the gallery
of everything shared with you. Artifacts — single HTML files or multi-file static bundles — are
published from a web dashboard, a CLI, or an agent session (Claude Code, Hermes). With
per-artifact permissions and versioning.
- 🤖 Agent-native publishing — Claude Code, a native MCP server, Hermes, the CLI and the HTTP API all take the same path a human takes; no separate, weaker agent route. See
plugins/rtfxanddocs/MCP.md. - 👥 Access by identity first — each artifact is private, shared with named people, or open to all signed-in users. Unauthorized and non-existent both return 404.
- 🔗 Revocable share links — for someone who will not have an account, create a capability URL for exactly one artifact, optionally expiring in 1–365 days. Only a hash is stored.
- 🕓 Versioning — every re-publish is a new immutable version; roll back within your plan's retention window (free keeps the last 5; paid plans keep everything).
- 📈 Views log + read receipts — see who viewed each artifact, when, which version, and from where, with an email the first time each named recipient opens it.
- 🏢 Workspaces & roles — artifacts belong to an account with
owner/admin/member/viewerroles; instance privilege is re-derived from config, never read from a table. - 🔗 Canonical workspace addresses — every workspace has an address (generated as
w-xxxxxxxx; a paid workspace can claim a custom one) and every artifact link isrtfx.pro/<workspace>/<artifact>— e.g.rtfx.pro/yogev/q3-board-report. It is the only URL the product shows or returns: the viewer renders on the app host and frames the sandboxed content origin, which is never an address. Olda.rtfx.pro/<slug>/links redirect browsers to it. A path on the app host, not a custom domain. - 🌐 Public product site —
/,/docs,/signup,/login,/privacyand/termsare reachable by anyone, with SEO metadata,sitemap.xml,robots.txtandllms.txt; everything else needs an identity. - 🔒 Access-gated dashboard — app-owned email OTP/magic-link sign-in for
/adminand the API; the app stores no passwords. - 🖼️ One dashboard — publish and manage under Artifacts; everything shared with you under Gallery. Same shell, same nav, same brand.
- 🔑 API tokens — hashed bearer tokens for server-to-server publishing (Hermes Cloud, CI), scoped, owner-bound and revocable.
- ☁️ All Cloudflare — Worker + R2 (files) + D1 (metadata). No servers, no database to run.
Stack: TypeScript · Hono · Cloudflare Workers / R2 / D1 / Email Sending · Lemon Squeezy
Not built yet, and deliberately not implied anywhere in the copy: per-link passwords,
custom domains for artifacts (branded workspace addresses are a path on the app host, not your own
hostname), comments/approvals, a public gallery of artifacts, usage-based
billing, and per-seat billing beyond the fixed seats included in each plan. Access is by identity
first; share links are separate capability URLs with optional expiry and immediate revocation. The competitive reasoning, and the full
table-stakes-vs-differentiators split, is in docs/POSITIONING.md. The public
site is one page: rtfx.pro — connect the MCP server, then publish, share, delete.
How it works
/,/signup,/login,/docs,/privacy,/terms,robots.txt,sitemap.xmlandllms.txtare public product/crawler pages.- rtfx.pro sessions authenticate dashboard/API/artifact requests with a signed
rtfx_sessioncookie created after email-code or magic-link verification. - The Worker authorizes per-artifact (who sees what), serves the current version of each artifact, renders the public site and the dashboard, and exposes a JSON API.
- R2 stores files under
<slug>/v<N>/…; D1 stores metadata.
See docs/ARCHITECTURE.md for details.
Prerequisites
- Node.js 18+
- A Cloudflare account with a domain (zone) on the account (you'll serve from a hostname you control, plus a separate content hostname if you want the same isolation as rtfx.pro).
- Cloudflare Workers, R2, D1 and Email Sending enabled.
npx wrangler login(authorizes Workers/R2/D1/deploy)
Quick deploy
npm run setup is the simple, single-hostname path: it creates the R2 bucket + D1 database,
applies the schema, fills the basic Worker config, deploys, and leaves you to add production-only
choices such as a separate content hostname, Email Sending, billing secrets and legal values. For a
multi-hostname deployment like rtfx.pro, use docs/SELF_HOSTING.md plus the
manual steps below instead of relying on the setup script.
When it finishes, configure Email Sending and SESSION_SECRET, then open
https://<your-domain>/signup or /login to create the first account. ADMIN_EMAILS in
wrangler.jsonc decides who gets platform-admin rights.
Manual deployment
Step-by-step without the setup script
Deploying with a separate content-only hostname (multiple
routesentries, e.g. app + content-host isolation)?npm run setuponly supports a single hostname — seedocs/DEPLOY_RTFX.mdfor a worked example runbook.
Email Sending is required for sign-in. Enable it for the domain, verify SPF/DKIM/DMARC, and keep
MAIL_FROM inside the Worker send_email.allowed_sender_addresses. The app sends a one-time code
or magic link, then issues its own host-only rtfx_session cookie. Fresh deployments do not need
Cloudflare Access.
Configuration
All config lives in wrangler.jsonc (vars) plus one secret. See the comments there.
Usage
Public product site
https://<your-domain>/ — public, no login required. Positions the product, covers use cases and
differentiators, and collects /waitlist access requests. Its two CTAs are deliberately distinct:
Request access (for people without an account) and Sign in (/login, for people with one).
/docs is the public documentation page (publishing, Claude Code/Hermes, the access model,
#why-rtfx, FAQ). See docs/PUBLIC_SITE.md for the SEO/crawler surface and
the copy rules, and docs/POSITIONING.md for what the copy may claim.
Sign-in
https://<your-domain>/login — public, app-owned sign-in. It emails a one-time code or magic
link, verifies it, then sets a host-only rtfx_session cookie. It renders signed-out, already
signed-in and paused-account states. There is no password auth and no Cloudflare Access dependency
in a fresh deployment.
Dashboard
https://<your-domain>/admin — publish artifacts, manage per-artifact access, upload new
versions / roll back, and (admins only) manage people. Every user, admins included, sees only
the artifacts they own or belong to; platform admins get no access to other people's artifact
content, versions, view log, access list or share links. The Platform section (super admin) lists
every artifact as metadata only (owner, size, counts, dates) and offers an audited abuse-delete. The Gallery section at
/admin/gallery is filtered to what each viewer may open — what they own plus what has been
shared with them. /gallery is kept as a redirect into it; visiting it signed out goes to
/login.
People (user management)
Admin-only, in the dashboard and at /api/users. The app owns identity with signed sessions and
stores account/user state in D1:
The Worker re-derives platform privilege from config, never from a user-writable table. Lifecycle actions can pause/re-enable/remove accounts and revoke API tokens, but API tokens are refused from user-management routes entirely.
CLI
token-* and user-* require an app session with the right platform/workspace role — an API
token can't mint or revoke tokens, or change who may sign in.
Remote MCP server (hosted)
rtfx.pro is a remote MCP server. Add it to Claude (claude.ai, Claude Desktop and mobile use the same flow: Customize → Connectors → + Add → Add custom connector) and ask Claude to publish, share and delete. Step by step with screenshots: rtfx.pro/guide.
- Endpoint:
https://mcp.rtfx.pro/mcp(Streamable HTTP) - Auth: OAuth 2.1 with discovery, dynamic client registration and client ID metadata documents
(CIMD); nothing to paste. Scopes:
rtfx:read,rtfx:publish,rtfx:manage. - Claude Code:
claude mcp add --transport http rtfx https://mcp.rtfx.pro/mcp
The hosted server publishes content sent inside the tool call; it cannot read a path on your disk
(use the local plugin below for that). Tools (REMOTE_TOOLS in src/mcp.ts):
Claude Code plugin (local, stdio alternative)
This repository is also a Claude Code marketplace. Installing the plugin makes publishing part of the conversation rather than a separate step:
Then sign in from the session — no token to copy, paste or store:
That runs an OAuth authorization-code flow with PKCE against the instance, on a loopback redirect,
and writes a 0600 credential to ~/.config/rtfx/credentials.json (refresh tokens rotate;
/rtfx:logout revokes both tokens and deletes it). For CI and scripted use, an environment token
is the fallback and takes precedence over any stored sign-in:
The publisher (plugins/rtfx/scripts/rtfx.mjs) is dependency-free Node 18+, so it also works as a
plain CLI on a machine that has never checked this repo out. It refuses to upload .env, *.pem,
*.key and similar, and skips .git/node_modules, printing everything it left out.
This works today and needs nobody's approval — any repository with a valid
.claude-plugin/marketplace.json is a Claude Code marketplace. The plugin is not listed in
Anthropic's community or official marketplace; what a submission to the first would need is written
down in docs/ANTHROPIC_PLUGIN_SUBMISSION.md.
Details, testing and design notes: docs/CLAUDE_CODE.md. Release notes:
plugins/rtfx/CHANGELOG.md.
Claude Desktop Extension
Download it from the current release or build it locally:
That installs the same local MCP server without hand-editing claude_desktop_config.json. Because it
runs on the user's machine, it can publish local paths/folders. Leave the optional API token blank
when using the browser OAuth credential store; expose access management only when explicitly needed.
Full details: docs/CLAUDE_DESKTOP.md.
Local MCP server (stdio alternative)
The hosted server above is the default. The plugin also ships a native local MCP server (plugins/rtfx/scripts/rtfx-mcp.mjs), so a client
with no shell to run a command in — Claude Desktop, or anything else that speaks MCP — publishes
through tool calls instead. Installing the plugin registers it; for a manual Claude Desktop setup,
point claude_desktop_config.json at the script:
Tools: publish (with a dry_run that uploads nothing), list_artifacts, get_versions,
rollback, doctor, and update_access behind an opt-in env var. Same token, same scopes, same
bundle filters — it is a wrapper over the same libraries as the CLI, not a second implementation.
Zero dependencies, no MCP SDK, Node 18+.
Tool schemas, client configuration and when to use the plugin instead:
docs/MCP.md.
API tokens (server-to-server)
Automated publishers — Hermes Cloud, CI, scripts — authenticate with a hashed API token sent
as Authorization: Bearer <token>, instead of a browser login:
- Only a SHA-256 hash of each token is stored; the plaintext is shown once, at creation.
- Every token has an owner and so inherits that person's ownership rules — an admin token manages everything, a user's token only their own artifacts.
- Scopes (
read,publish,manage) narrow a token below its owner's rights; they never widen anyone's. Default isread,publish, so a publishing integration can't delete. - Tokens are revocable (
token-revoke), can carry an expiry, and are revoked automatically when their owner is removed from rtfx.pro.
Two surfaces, on purpose. /api/… is the dashboard's browser/session API: the app-owned
rtfx_session identifies you and ordinary role checks decide what you may do. /api/machine/… is
the same artifact surface for machines — publish, list, versions, rollback, views, sharing, delete
— behind a stricter gate that requires a bearer token and refuses a browser session outright
(requireApiToken in src/auth.ts). User management, token issuance and workspace membership are
deliberately not mounted there: they require a signed-in app session with the right role, and
refuse API tokens whatever the path.
Full request/response contract, error codes and rollback flow:
docs/HERMES_CLOUD.md.
Permissions
The app decides who is signed in by verifying an emailed code or magic link and setting an
rtfx_session cookie. The Worker decides who sees each artifact: restricted (only granted
emails) or everyone (everyone in the artifact's workspace). Platform admins see metadata only, never content. New artifacts are private by default. A direct
URL a viewer lacks access to returns 404.
Ownership. Every artifact belongs to the person/workspace that published it
(artifacts.owner_email / artifacts.account_id). Instance admins (ADMIN_EMAILS /
SUPER_ADMIN_EMAILS) manage everything; ordinary signed-in members manage the artifacts their
workspace role allows — their dashboard, /api/artifacts list, version previews and analytics are
scoped to artifacts they own/manage. Attempts to read or change someone else's artifact return
404, so a slug they don't own is indistinguishable from one that doesn't exist. Being granted
view access never confers management rights, and publishing to a slug someone else owns is refused
(409 slug_taken) rather than adding a version to their artifact. Account/user management is
admin-only, and API tokens are deliberately refused from those routes.
Artifacts with no owner (published before this model, or by a legacy service token with no email)
are manageable by admins only. Run migrations/0005_owner_email.sql on an existing database; it
backfills owners from created_by where that was a real email. API tokens live in
migrations/0006_api_tokens.sql, and the local user/account tables in 0007 onward are additive.
Accounts / workspaces. An artifact also belongs to an account — the workspace that owns
it, and later the thing a plan is billed to (artifacts.account_id). Every person gets a
personal workspace automatically; a team workspace can have several members with an account
role of owner, admin, member or viewer. member and up manage the workspace's
artifacts; a viewer can open them but not change them.
Four ideas are kept apart on purpose, and it is worth reading the row you care about twice:
Being owner of a workspace is not being an admin of the instance, and there is no way to
become one by writing to the database: instance privilege is re-derived from configuration on
every request and is never read from a table. That is the property the test suite guards hardest.
This is entirely additive. account_id is nullable everywhere, owner_email is still checked
first, and an artifact the backfill never adopted behaves exactly as it did before. Run
migrations/0008_accounts.sql, 0009_account_links.sql and 0010_backfill_accounts.sql on an
existing database — 0008 and 0010 are safe to re-run, 0009 adds two columns and is not (check
PRAGMA table_info(artifacts) first). None of them is strictly required: the Worker provisions
the same rows on first use. See docs/ARCHITECTURE.md for the full model.
Versioning
Each publish to an existing slug creates a new immutable version and makes it live. On the free
plan the five most recent versions are retained and older ones expire — their bytes are removed
but the history entry stays, so a version list never has holes in it. Paid plans keep every
version. Previous
versions are kept. Admins preview any version at /v/<slug>/<n>/; roll back from the dashboard
or rollback <slug> <n>.
Views log
Each artifact records a view when a signed-in person loads an HTML page (assets, machine/
service-token fetches, and admin version previews aren't counted). The admin dashboard and
views <slug> show total/unique counts and a recent log (time · viewer · version · country).
Views are retained indefinitely; prune the artifact_views table if it grows large.
Development
Locally there is no real email challenge. To simulate a specific viewer, send an X-Dev-Email header; to
simulate a signed-out visitor (e.g. to see /gallery redirect to /login), send
X-Dev-Anonymous: true. Both are honored only when DEV_LOGIN=true, which npm run dev sets —
never in production.
Contributing
Issues and PRs welcome — see CONTRIBUTING.md. Please run npm run check
before opening a PR. Security reports: see SECURITY.md — GitHub Security
Advisories, never a public issue.
Self-hosting
Everything needed to run your own instance is in this repository; you supply your own Cloudflare
account, R2/D1, mail path, session secret, optional Lemon Squeezy billing config, and your own
legal values — the /privacy and /terms pages ship as an operator template and say so on the
page. See docs/SELF_HOSTING.md.
Open source, and where the line is
The source is MIT and public on purpose: an access-control product should let you read the code that enforces the access. The Worker, the plugin, the local and remote MCP servers, the CLI, the tests and the docs are all here, and the parts that run on your own machine are not held back.
The hosted rtfx.pro service is operated separately from this source. Its customer data, live
account configuration, support and billing pipelines and commercial materials are not in this
repository — and the name, mark and domain are not part of the MIT grant, which is a copyright
licence and does not license trademarks. Fork it and run it; please call it your own thing.
The full boundary — what is intentionally public, what stays out, and why — is in
OPEN_SOURCE.md. The threat model, the plugin's credential handling and the
local-vs-remote MCP boundary are in SECURITY.md.
License
來源:README.md,提交 d33d4f2
工具
0版本歷史
1- v1.0.0最新Oct 26, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通必需25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式必需10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分