
Chasa
io.github.docracy1由 GitHub 账号 docracy1 发布v1.0.0更新于 Oct 24, 2026
AI invoice follow-up emails for freelancers. Draft-only, never sends for you.
概览
为自由职业者的逾期发票起草 AI 催款邮件,语气随逾期天数升级,只生成草稿、绝不代发。
- 可以做什么
- 为未付发票起草催款邮件,语气随逾期天数从友好逐步升级到坚定、直接
- 列出并复用可复制的邮件模板
- 只产出草稿,由你复制到 Gmail、Outlook 或 Apple Mail 中发送
- 只读工具公开可用,起草需要登录会话或 API 密钥
- 适用场景
- 适合需要帮忙措辞催款邮件的自由职业者和小型工作室,且不希望把发信权限交出去。当你想按发票逾期程度得到语气合适的草稿时最有用。
- 运行要求
- 远程 MCP 端点位于 api.chasa.io(旧域名会重定向到 docstoc)。只读工具公开,起草工具需要登录会话或 API 密钥。免费方案每月 5 次 AI 草稿,付费方案按月计费。
安装
在 SourceWeft 中
- 打开 控制台中的 Chasa,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。
交给智能体安装
把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。
阅读 https://sourceweft.com/mcp/io.github.docracy1%2Fchasa/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。其他 MCP 客户端
把它添加到你客户端的 mcpServers 配置中。
{
"mcpServers": {
"chasa": {
"type": "http",
"url": "https://api.chasa.io/mcp"
}
}
}README
docstoc
Paste your unpaid invoices. Get the follow-up email already written, in the right tone for how late it is.
docstoc never emails your clients for you — it drafts follow-ups you copy into Gmail, Outlook, or Apple Mail. Tone escalates with days overdue (friendly → firm → direct).
Live URLs
Worker PUBLIC_APP_URL is https://docstoc.io (magic links, OAuth callbacks, Stripe return URLs, digest links).
Legacy chasa.io / api.chasa.io 301 to docstoc (Pages _middleware.ts + worker redirect). See scripts/oauth-redirect-uris.md for provider console URIs.
Go-live checklist
- Attach
docstoc.ioon Cloudflare Pages projectchasaand wait for Active. www.docstoc.io→ apex: handled byapps/web/functions/_middleware.ts(redeploy web).chasa.io/www.chasa.io→docstoc.io: same middleware.api.chasa.io→api.docstoc.io: worker middleware inapps/worker/src/lib/legacyHostRedirect.ts.- Register OAuth redirect URIs on
api.docstoc.io— seescripts/oauth-redirect-uris.md. - Optional DMARC:
./scripts/dmarc-remove-rua.sh(removesrua=from_dmarc.docstoc.io). - Run
./scripts/go-live-verify.sh.
The order does not matter: browser-facing links are built from the origin the request came in on (see “App origin resolution” below), so pages.dev and chasa.io both keep working whichever is deployed first.
App origin resolution
Magic links, post-login redirects, Stripe return URLs and team invites use the origin the user is actually on, not PUBLIC_APP_URL. The Pages /api proxy forwards it as X-Docstoc-App-Origin, and the worker honours it only if it matches lib/appUrl.ts's allowlist (PUBLIC_APP_URL, docstoc.io, www.docstoc.io, legacy chasa.io hosts, *.pages.dev project/preview hosts, localhost). This keeps preview deploys self-contained and makes the domain cutover zero-downtime.
Requests that arrive without a trusted origin — provider OAuth callbacks hitting api.docstoc.io directly, and the digest cron — still fall back to PUBLIC_APP_URL.
Product specs
Plans & pricing
Stripe price IDs live in apps/worker/wrangler.toml as STRIPE_PRICE_SOLO (maps to Pro), STRIPE_PRICE_PRO / STRIPE_PRICE_ENTERPRISE (map to Business; non-secret). Billing portal and webhooks update accounts.plan and is_paid.
Feature matrix (by plan)
Workspace roles: owner is always admin. Invited members can use Pro+ features; admin-only actions: branding, webhooks, connector OAuth connect/import, API key CRUD, team invites.
App routes (/app/*)
All app routes except /login and /admin require a session. Unauthenticated users redirect to /login. SPA analytics require cookie consent (GDPR).
i18n (EN + ES)
Same path as Docracy: lightweight catalogs in apps/web/app/src/lib/i18n/ (no i18next). LocaleProvider + EN|ES switcher on login, sidebar, and More sheet. P1 covers login / shell / welcome; expand catalogs for the rest of the app next. Preference stored as chasa_locale. Marketing HTML stays English until a later pass.
Marketing & SEO (static HTML in apps/web/public/)
- Homepage with pricing, FAQ JSON-LD, competitor comparison
- SEO landing pages:
/invoice-follow-up,/payment-reminder,/overdue-invoice,/chase-invoices,/freelancer-invoice-follow-up /features/(index, AI tone, templates),/docs/,/ai,/about/blog/(3 articles + dynamicpost.html)/free-templates/— 15 generated template pages + index- Legal:
/privacy,/terms,/imprint sitemap.xml,robots.txt,404.html, cookie consent, scroll-depth analytics- Self-hosted fonts (no Google Fonts); enforcing CSP via
_headers
Regenerate free templates after editing apps/web/scripts/generate-free-templates.mjs:
Architecture
Monorepo (npm workspaces):
Data: Cloudflare D1 (chasa-db). OAuth tokens encrypted at rest (AES-GCM, TOKEN_SECRET). Sessions in sessions table; magic links single-use (atomic consume).
AI: Cloudflare Workers AI (@cf/meta/llama-3.1-8b-instruct-fp8). Prompts wrap user content in delimiters to reduce injection.
API surface (worker)
Security & compliance (implemented)
- Free-tier quota: 5 AI drafts/month enforced in D1 (
ai_usage), not client-side - Rate limits: AI drafts, MCP, analytics, admin login (D1 buckets)
- Turnstile: fail-closed in production HTTPS when secret is set; 60s magic-link cooldown per email
- HKDF token purposes: separate keys for session, magic-link, API key, admin, invite, OAuth state, webhook signing (legacy hash fallback on lookup)
- Session rotation: prior sessions invalidated on magic-link login; admin sessions cleared on admin login
- Session cleanup: daily cron purges expired sessions, magic links, rate-limit buckets
- RBAC: workspace admin for branding, webhooks, connector OAuth, API keys, team invites
- Input validation: Zod schemas on all JSON API routes (auth, emails, clients, team, webhooks, billing, admin, MCP draft args)
- Stripe webhooks: event-id deduplication (
stripe_events) - Outbound webhooks:
X-Chasa-Signature: sha256=…HMAC - Click tracking: redirects only to URLs stored when the tracked email was created
- Webhook URLs: SSRF checks (no localhost / private IPs)
- OAuth state: timing-safe HMAC compare
- CSP: enforcing policy on Pages with a nonce per page instead of
'unsafe-inline'(apps/web/functions/lib/csp.ts, applied infunctions/_middleware.ts);report-uri→/api/csp-report. The API worker sends the same header set (apps/worker/src/lib/securityHeaders.ts). - GDPR: cookie consent gates SPA analytics; no visitor IDs on page views (aggregate only)
- Secrets: never committed —
wrangler secret put …
Local development
Without RESEND_API_KEY, magic links log to the worker console — copy the URL into your browser.
Quality checks
CI (.github/workflows/ci.yml) runs lint → test → static HTML validation → typecheck on every PR; auto-deploys worker + web on push to main when CLOUDFLARE_API_TOKEN is set.
Deploy manually
The Google step (apps/web/scripts/gsc-sitemap.mjs) needs the service account key at
~/.config/docstoc/gsc-service-account.json (never in the repo) and the service account as a Full user of the
docstoc.io Search Console property. Without the key it prints a note and exits 0.
After schema changes:
Migrations 0001–0011 include plans, admin/analytics, branding, webhooks, API keys, cloud connectors, clients/aging, parity features, and security hardening (rate limits, AI usage, Stripe idempotency, tracking link allowlist).
Cloudflare Turnstile (bot protection)
Protects /api/auth/request and admin login.
- Cloudflare Dashboard → Turnstile → Add widget
- Hostnames:
chasa-71s.pages.dev,chasa.io,localhost - Site key →
TURNSTILE_SITE_KEYinwrangler.toml[vars] - Secret →
wrangler secret put TURNSTILE_SECRET_KEY - Redeploy worker. Login UI reads config from
GET /api/auth/config.
Local / without keys: verification bypassed with console warning. Test keys:
One-time cloud setup
-
cd apps/worker && wrangler d1 create chasa-db— pastedatabase_idintowrangler.toml -
wrangler d1 migrations apply chasa-db --remote -
Stripe (test mode first): create two recurring Prices (Pro $14.99, Business $39.99). Copy
price_…IDs intowrangler.toml:STRIPE_PRICE_SOLO,STRIPE_PRICE_PRO,STRIPE_PRICE_ENTERPRISE
-
wrangler secret put TOKEN_SECRET—openssl rand -hex 32 -
wrangler secret put STRIPE_SECRET_KEY(test key first) -
Stripe webhook →
https://api.chasa.io/api/billing/webhook— events:checkout.session.completed,customer.subscription.deleted→wrangler secret put STRIPE_WEBHOOK_SECRET -
wrangler secret put RESEND_API_KEY— verify sending domain in Resend -
Turnstile — see above
-
wrangler secret put ADMIN_PASSWORD— for/app/admin9a. AI Document Generator (optional, public marketing tool): Google AI Studio → create a free API key →wrangler secret put GEMINI_API_KEY. Free tier is rate-limited; the worker also enforces its own per-IP limit + Turnstile. Seeapps/worker/src/lib/geminiDocGen.ts. -
Cloud storage OAuth (optional, Pro+):
Google Sign-In redirect:
https://api.docstoc.io/api/auth/google/callbackStep-by-step for each provider:
scripts/connectors-docstoc-setup.md -
QuickBooks Online + Xero (optional, Pro+):
See
scripts/connectors-docstoc-setup.mdfor console steps. -
Cloudflare Pages project
chasa+ custom domainchasa.io; Worker custom domainapi.chasa.io -
Switch to Stripe live keys/prices/webhook only after end-to-end test-mode smoke test
Local secrets (apps/worker/.dev.vars, gitignored)
Stripe CLI for local webhooks:
Staging environment
Uses separate D1 (chasa-db-staging) — create and paste ID in wrangler.toml [env.staging].
SEO launch checklist
Automated (build)
generate-seo.mjs runs on every npm run build and writes:
sitemap.xml— all public pages (marketing, templates, blog)robots.txt— crawl rules + sitemap URLblog/feed.xml— RSS for blog posts{indexnow-key}.txt— IndexNow key file for Bing/Yandex- Verification meta on
index.html/ai.htmlwhen env vars are set (see below)
Press kit at /press — logos, boilerplate, suggested anchor text for backlinks.
Google Search Console (one-time)
-
Add property
https://chasa.ioat Search Console -
Choose HTML tag verification → copy the
content="…"value -
Rebuild with the token:
Or use DNS TXT in Cloudflare (no rebuild needed).
-
Submit sitemap:
https://chasa.io/sitemap.xml -
URL Inspection on
/,/app/,/payment-reminder,/free-templates/
Optional Bing: BING_SITE_VERIFICATION=… same as Google.
After deploy, ping IndexNow (Bing):
Backlinks (founder — use /press)
Site-side done: social links + sameAs schema on all pages, internal links from blog → landing pages, RSS + llms.txt.
Still manual (copy from press kit):
- LinkedIn company page — website field + launch post linking to
/app/or a blog article - X @DocstocHQ — pin launch post
- Product Hunt / Indie Hackers when ready
- RELACON GmbH website cross-link to
chasa.io - 3–5 freelancer communities — link to
/blog/articles or/free-templates/, not just homepage - Email signature with
chasa.io
Entity
docstoc is a product of RELACON GmbH, Vienna, Austria. See /imprint and /privacy.
Contact: [email protected]
来源:README.md,提交 5325584
工具
0版本历史
1- v1.0.0最新Sep 16, 2026
评分
已满足适用检查项的 40%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通必需25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式必需10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分
请在仓库或注册中心条目中声明许可证。