Paw Pulse

com.dougalpaw由 dougalpaw.com 發布官方發布者v0.3.0更新於 Oct 26, 2026

Heartbeat and tokens/sec monitoring for self-hosted LLM servers (Ollama etc.), with down alerts.

已驗證Streamable HTTP可網頁執行雲端與基礎設施安全與監控

概覽

AI 產生的概覽

Paw Pulse 的遠端 MCP 伺服器:推送式心跳與 tokens/sec 監控,自架 LLM 伺服器掛掉或變慢時發出告警。

可以做什麼
  • 建立匿名監控,並一次性取得 ingest token 與 manage token
  • 查詢監控目前狀態並列出最近的心跳紀錄
  • 修改監控名稱、寬限期、變慢門檻、webhook 或可見性
  • 永久刪除監控及其所有心跳紀錄
  • 取得在被監控機器上安裝心跳腳本並透過 cron 執行的 shell 指令
適用情境
適合自架 LLM 伺服器(Ollama、llama.cpp、vLLM 或任何相容 OpenAI 的端點)或其他由 cron 驅動的機器,想請助理代為建立與管理上線率及吞吐量監控,並在掛掉或變慢時收到告警,同時不把機器暴露到公網。
執行需求
需要一個遠端 Streamable HTTP 端點,連線不需帳號或驗證。監控以隨機 id 加上 ingest token 與 manage token 識別,變更類工具需以參數傳入 manage token。被監控機器需透過 cron 執行一支小型用戶端腳本,告警會送到自行設定的 webhook 網址。
安裝前請注意
create_monitor 只回傳一次 ingest token 與 manage token,無法找回,請妥善保存;持有 manage token 的人可變更或刪除監控。update_monitor 與 delete_monitor 會變更或永久刪除資料,刪除無法復原。webhook 告警會把監控名稱、狀態與時間戳送到你選擇的第三方網址。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Paw Pulse,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

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

交給代理程式安裝

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

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

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

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "paw-pulse": {
      "type": "http",
      "url": "https://pulse.dougalpaw.com/mcp"
    }
  }
}

README

Paw Pulse

Push-based heartbeat and performance monitor for self-hosted LLM servers (Ollama, llama.cpp, vLLM, anything OpenAI-compatible). Know when your home AI box dies or slows down, without exposing it to the internet.

Live instance: https://pulse.dougalpaw.com

[Demo: Ollama fails, Paw Pulse posts a DOWN alert to Discord, then a recovery]

Built, deployed, and operated by Pup, an AI agent, as part of the Dougal Paw project. No accounts, no IP storage, no personal data: monitors are anonymous, identified only by a random id plus an ingest token and a manage token.

How it works

A tiny client script (pawpulse.sh) runs on the box hosting your LLM server and POSTs a heartbeat out to this service every few minutes. If heartbeats stop arriving within the configured grace period, the monitor flips to down. Your LLM server never accepts an inbound connection.

No LLM on the box? LLM_KIND=none sends a plain heartbeat, so the same alerts work for a NAS, a backup job or any cron task.

On Ollama it can also catch the quiet failures: set slow_tps_threshold to hear when generation crawls, or min_gpu_pct to hear when a model has fallen back from GPU to CPU (the client reads size_vram from /api/ps; needs jq).

Guides:

Stack

  • Cloudflare Workers (free tier) + D1 + Cron Triggers.
  • TypeScript, Hono as a thin router.
  • No other runtime dependencies.

Project layout

src/  index.ts       Hono app: routes, pages, cron entrypoint  service.ts     Business logic shared by REST and MCP  db.ts          D1 queries  state.ts       Pure state-machine logic (unit tested)  validation.ts  Pure input validation (unit tested)  cron.ts        Per-minute sweep: state transitions + alert dispatch  webhook.ts     Outbound alert delivery (Discord-aware, generic JSON fallback)  mcp.ts         Remote MCP server (Streamable HTTP, stateless)  openapi.ts     OpenAPI 3.1 document served at /openapi.json  llms.ts        /llms.txt content  templates.ts   HTML pages (/, /privacy, /s/:id)  badge.ts       Shields-style SVG badge renderer  static/        Served static assets (pawpulse.sh)migrations/      D1 schema (0001_init.sql)test/            node:test unit tests for state.ts and validation.ts

API

See /openapi.json for the full spec and /llms.txt for a terse summary.

  • POST /v1/monitors — create a monitor.
  • POST /v1/monitors/:id/beat — send a heartbeat (Authorization: Bearer <ingest_token>).
  • GET /v1/monitors/:id/status — current state; public monitors need no auth.
  • GET /v1/monitors/:id/heartbeats — recent heartbeats.
  • PATCH / DELETE /v1/monitors/:id — manage/remove (Authorization: Bearer <manage_token>).
  • GET /s/:id — public HTML status page. GET /badge/:id.svg — status badge.
  • GET /pawpulse.sh — the client script.
  • POST /mcp — remote MCP server (see below).

MCP

https://pulse.dougalpaw.com/mcp is a remote MCP server (Streamable HTTP). It is stateless: each POST carries one JSON-RPC message and gets a JSON response, with no sessions and no SSE stream, which the spec allows. It supports protocol versions 2025-06-18, 2025-03-26 and 2024-11-05.

Tools: create_monitor, setup_instructions, get_status, list_heartbeats, update_monitor, delete_monitor. They use the same service layer as the REST API. No auth is needed to connect; tools that change a monitor take its manage_token as an argument.

json
{ "mcpServers": { "pawpulse": { "type": "http", "url": "https://pulse.dougalpaw.com/mcp" } } }

Alerts

Set a monitor's webhook_url and you get a message when it goes down, gets slow or recovers. The format is picked from the URL: Discord, Slack, Microsoft Teams (Workflows), Telegram (https://api.telegram.org/bot<token>/sendMessage?chat_id=<id>) and Google Chat get native messages; any other https URL gets generic JSON (content, text, monitor_name, alert, state, timestamp). Self-hosters can switch all alerts off with ALERTS_ENABLED = "false" in wrangler.toml.

Development

pnpm installnpm test         # unit tests (node:test, no network/D1 needed)npm run typecheck

Deploy

npx wrangler d1 create pawpulse                 # once; copy the database_id into wrangler.tomlnpx wrangler d1 migrations apply pawpulse --remotenpx wrangler deploy

Cron runs every minute (* * * * *) and sweeps monitors for grace-period expiry and slow-tps thresholds, firing at most one webhook per state change and capping outbound webhook fetches per run to stay under the Workers free-tier 50-subrequest limit.

Privacy

See /privacy. No accounts, no cookies, no analytics, no IP logging — anywhere. DELETE /v1/monitors/:id permanently removes a monitor and all its heartbeats.

Licence

MIT. See LICENSE.

來源:README.md,提交 f984c2a

工具

6

create_monitor

Create monitor

Create a new anonymous Paw Pulse monitor. Returns ingest_token and manage_token exactly once — store them, they cannot be recovered.

輸入參數namepublicmin_gpu_pctwebhook_urlgrace_secondsslow_tps_threshold

get_status

Get monitor status

Get the current status of a monitor. Private monitors require manage_token.

輸入參數id必填manage_token

list_heartbeats

List recent heartbeats

List recent heartbeats for a monitor (newest first). Private monitors require manage_token.

輸入參數id必填limitmanage_token

update_monitor

Update monitor settings

Change a monitor's name, grace period, slow threshold, webhook or visibility. Only the fields you pass change.

輸入參數id必填namepublicmin_gpu_pctwebhook_urlmanage_token必填grace_secondsslow_tps_threshold

delete_monitor

Delete monitor

Permanently delete a monitor and all its heartbeats. Cannot be undone.

輸入參數id必填manage_token必填

setup_instructions

Get setup instructions

Shell commands to install the heartbeat script on the box being monitored and run it from cron. Pass the id and ingest_token from create_monitor.

輸入參數id必填llm_kindingest_token必填

版本歷史

1
  1. v0.3.0最新Oct 20, 2026

評分

已滿足適用檢查項的 100%

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

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分