Tallied

com.withtallied由 withtallied.com 發布官方發布者v0.1.0更新於 Oct 24, 2026

Log hours and invoice clients from your AI chat. Time tracking and invoicing for freelancers.

已驗證Streamable HTTP可網頁執行效率與工作流金融

概覽

AI 產生的概覽

Tallied 是一個遠端計時與開立發票伺服器,讓 AI 助理記錄工時、檢視未請款時間並草擬客戶發票。

可以做什麼
透過告訴助理你做了什麼來記錄工時,依工作區設定與費率解析時長並計算金額。檢視未請款的工作並草擬客戶發票,發票 PDF 在服務行程內產生。執行補記、月末結算類流程,以及週報和客戶請款,這些以隨附技能和 MCP 提示的形式提供。帳戶設定、從 Toggl、Harvest 或 Clockify 匯入 CSV 以及帳務計費,透過小型網頁應用而非對話完成。
適用情境
適合希望以對話方式記錄可計費工時並產生發票的自由工作者與小型服務型業務,不必切換到獨立的計時軟體。當助理是主要介面、只在設定、匯入或帳務時偶爾使用網頁應用時最合適。
執行需求
遠端 MCP 端點,使用 Streamable HTTP 傳輸,OAuth 2.1 驗證為必需。登入方式為 Google OIDC 或電子郵件魔法連結,無密碼;首次使用者需在授權頁面建立工作區。自架需要 Node.js、Postgres,可選 SMTP 或 Resend 用於郵件,以及 Stripe 用於帳務與付款連結。
安裝前請注意
助理可以建立工時記錄和草擬發票,這些是對業務資料的寫入操作。發票透過 Stripe 付款連結收款,因此帳務與付款資料會傳送給 Stripe。自架需要 SESSION_SECRET 等密鑰,以及可選的 STRIPE_SECRET_KEY、STRIPE_WEBHOOK_SECRET、GOOGLE_CLIENT_SECRET、SMTP_URL 和 RESEND_API_KEY。README 提到審核者存取碼登入(REVIEWER_EMAIL、REVIEWER_ACCESS_CODE),審核後應移除。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Tallied,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

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

交給代理程式安裝

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

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

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

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "tallied": {
      "type": "http",
      "url": "https://withtallied.com/mcp"
    }
  }
}

README

Tallied

Tallied is a time-tracking and invoicing MCP server. It's connector-first: Claude and ChatGPT (or any MCP client) are the primary UI — you tell an assistant what you worked on and it logs the hours, ask what's unbilled and it drafts the invoice. A minimal web app handles the things chat is bad at: account settings, CSV import, and billing. Clients pay invoices through a Stripe payment link on a public, tokenized page.

Claude / ChatGPT / MCP client        │  MCP over Streamable HTTP (OAuth 2.1 bearer token)        ▼┌───────────────────────────────────────────────┐│  one origin (BASE_URL)                         ││  /mcp            MCP endpoint                  ││  /authorize /token /register /revoke           ││                   OAuth 2.1 authorization server││  /app/*          web app (settings, import,     ││                   billing)                      ││  /i/<token>      public invoice page + PDF      │└───────────────────────────────────────────────┘        │                    │                │        ▼                    ▼                ▼    Postgres              Stripe        SMTP / Resend (workspaces, entries,  (subscriptions,  (magic links,  invoices, tokens,      payment links)   invoice emails)  audit log)                                          pdfkit (invoice PDFs, in-process)

Quick start

bash
cp .env.example .envnpm installnpm run db:up          # postgres via docker compose, localhost:5433npm run db:migrate     # applies src/db/schema.sql idempotentlynpm run db:seed        # seeds a demo workspace; prints the login email# In production (compiled image, no tsx): node dist/scripts/seed.js [email protected]npm run build:app      # builds the MCP App UI bundle into app/dist/app.htmlnpm run dev            # tsx watch src/index.ts

Then connect with the MCP Inspector:

bash
npm run inspector

Choose Streamable HTTP, point it at http://localhost:3000/mcp, and connect. The inspector will hit the OAuth flow and open the login page in your browser. Without SMTP_URL or RESEND_API_KEY set, magic-link sign-in doesn't send an email — the link is printed to the server log and also shown directly on the "check your email" page, so local dev never needs a real mailbox.

Project layout

src/  index.ts       entry point  config.ts      env vars, plans, scopes  db/            schema.sql, migration runner, query helpers  lib/           dates, duration parsing, rates, ids, errors, money  services/      workspace, time entries, invoices, propose (catch-up), audit  mcp/           McpServer setup: tools, resources, prompts (src/mcp/server.ts)  auth/          OAuth provider, login/consent routes, sessions, Google OIDC  http/          express app, docs/marketing routes, web app routes, invoice pages  import/        CSV import (Toggl/Harvest/Clockify)  stripe/        billing checkout, Connect onboarding, webhook handling  email/         email sending via SMTP (nodemailer) or Resend (magic links, invoice emails)  pdf/           invoice PDF rendering (pdfkit)app/             MCP App UI source; scripts/build-app.ts bundles it into app/dist/app.html,                 which src/mcp/app-resource.ts embeds as an MCP UI resource and                 src/http/routes/invoice-public.ts reuses for the public invoice pageskills/          bundled Claude skills (log-day, catch-up, weekly-report,                 invoice-client, month-close) — also exposed as MCP prompts.claude-plugin/  Claude plugin/connector manifest.codex-plugin/   ChatGPT/Codex plugin manifestdocs/            privacy.md, terms.md, docs.md, landing.md, llms.txt — served live                 at /privacy, /terms, /docs, /, and /llms.txt by src/http/routes/docs.tstest/            unit tests (vitest) and the golden prompt set

Environment variables

VariableRequiredPurpose
NODE_ENVno (default development)production enables prod-only behavior (rate limiting, no dev magic-link shortcut)
PORTno (default 3000)HTTP port
BASE_URLno (default http://localhost:3000)Public origin. Everything — MCP, OAuth, web app, invoice pages — is served from here by default
MCP_URLno (default ${BASE_URL}/mcp)Override to put the MCP endpoint on its own subdomain
AUTH_ISSUER_URLno (default BASE_URL)Override to put the OAuth authorization server on its own subdomain
APP_URLno (default ${BASE_URL}/app)Override to put the web app on its own subdomain
DATABASE_URLno (default local docker-compose Postgres)Postgres connection string
SESSION_SECRETyes in productionSigns session cookies and magic links; openssl rand -hex 32
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETnoEnables "Continue with Google"; omit to offer only magic links
REVIEWER_EMAIL / REVIEWER_ACCESS_CODEnoEnables an access-code sign-in for directory reviewers into one seeded account. Remove after review
SMTP_URLnoAny SMTP provider, e.g. smtps://LOGIN:[email protected]:465; takes precedence over Resend
RESEND_API_KEYnoAlternative to SMTP_URL. With neither set, emails are printed to the log (dev only)
EMAIL_FROMnoFrom address for outbound email
STRIPE_SECRET_KEYnoEnables billing checkout and invoice payment links
STRIPE_WEBHOOK_SECRETno (required if STRIPE_SECRET_KEY is set)Verifies /webhooks/stripe payloads
STRIPE_PRICE_PRO / STRIPE_PRICE_TEAMnoPrice IDs for the paid plans
STRIPE_CONNECT_FEE_BPSno (default 0)Optional platform fee, in basis points, on Connect payment links
PRODUCT_NAMEno (default Tallied)Used in emails, docs pages, and MCP server metadata
SUPPORT_EMAILno (default support@localhost)Shown in docs and consent screens

See .env.example for the same list with inline comments.

OAuth notes

  • The @modelcontextprotocol/sdk router (mcpAuthRouter) provides the protocol surface: dynamic client registration, PKCE (S256), a form-encoded token endpoint, and RFC 8414 + RFC 9728 discovery metadata. src/http/app.ts mounts it at AUTH_ISSUER_URL and wires it to TallyOAuthProvider (src/auth/provider.ts), which persists clients, codes, and tokens in Postgres.
  • Identity is Google OIDC or an emailed magic link — no passwords. See src/auth/routes.ts.
  • The OAuth consent screen is signup. A user with no workspace yet gets an onboarding card (business name, default rate, currency, timezone) inline on the consent page; clicking Allow creates the workspace and completes the authorization in one step.
  • Tokens are opaque and hashed at rest (never stored in plain text). Access tokens last 1 hour; refresh tokens last 30 days and rotate on every use, with reuse detection (a reused, already-rotated refresh token revokes the whole token family).
  • To swap in a hosted identity/OAuth provider (Clerk, WorkOS, Stytch) instead of TallyOAuthProvider, replace it with the SDK's ProxyOAuthServerProvider, which delegates the same protocol surface to an upstream authorization server.

Deployment

Tallied runs on any host that gives you a stable HTTPS origin — Fly.io, Railway, Render, or similar.

  1. Set BASE_URL to your public origin. Set MCP_URL, AUTH_ISSUER_URL, and/or APP_URL only if you're splitting those surfaces across subdomains.
  2. npm run build (runs build:app then tsc), then npm start.
  3. Point your Postgres at DATABASE_URL and run npm run db:migrate.
  4. If using Stripe, register a webhook endpoint at ${BASE_URL}/webhooks/stripe subscribed to checkout.session.completed, payment_intent.succeeded, customer.subscription.updated, and customer.subscription.deleted.
  5. If using Google sign-in, add ${BASE_URL}/oauth/google/callback as an authorized redirect URI in the Google OAuth client.

Testing

  • npm test — unit tests (vitest).
  • test/golden-prompts.json — a hand-curated set of prompts and expected tool-call behavior. It's run manually, in both Claude and ChatGPT, before any change to tool names, descriptions, or input schemas — those are effectively a public API for the model and regressions there don't show up in unit tests.

Submission checklists

Before submitting to a connector directory, see docs/listing.md for store-listing copy and screenshots, and the product spec's submission checklist for the full requirements. Note that Claude's connector directory requires the submitting organization to be on a Team (or Enterprise) plan.

來源:README.md,提交 8ecfec8

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

1
  1. v0.1.0最新Sep 16, 2026

評分

已滿足適用檢查項的 75%

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

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

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