Velocms

org.velocms由 velocms.org 發布v0.1.3更新於 Oct 24, 2026

Draft, publish, and manage your VeloCMS blog from Claude, Cursor, or any MCP client.

已驗證STDIO僅桌面效率與工作流溝通與協作

概覽

AI 產生的概覽

一個本機 MCP 伺服器,讓助理透過 VeloCMS 的 REST API 起草、編輯、發布與管理部落格文章、留言、會員及網站設定。

可以做什麼
列出、讀取、建立、更新並永久刪除部落格文章,包含 SEO 欄位與標籤,並在草稿與已發布狀態間切換。瀏覽媒體庫並依 MIME 類型篩選。列出留言,並將其審核狀態設為已核准、待審核或垃圾留言。列出訂閱者與讀者(電子郵件由 API 遮罩),並讀取網站名稱、描述與功能旗標。
適用情境
適用於使用 Pro 或更高方案的 VeloCMS 部落格,希望助理不必開啟後台就能起草、修改、發布或撤回文章、審核留言或查看網站設定。
執行需求
以 stdio 在本機執行,通常透過 npx 取得,因此需要 Node.js。需要 VELOCMS_SITE_URL(部落格基礎網址)與 VELOCMS_API_KEY(在 VeloCMS 後台建立、具備所需權限範圍的 API 金鑰)。API 存取需要 Pro 或更高方案;缺少任一變數時伺服器會直接結束。
安裝前請注意
API 金鑰是限定單一租戶的憑證,具備部落格寫入權限,請勿放入共用設定。多個工具會變更線上內容:create_post、update_post、publish_post、unpublish_post、moderate_comment,以及永久性的 delete_post。速率限制依方案計算,伺服器不會自動重試。沒有上傳媒體的工具。

安裝

在 SourceWeft 中

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

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

@velocms/mcp

An MCP server for VeloCMS — draft, edit, publish, and manage your blog (posts, media, comments, members, site settings) from Claude Code, Claude Desktop, Cursor, or any other MCP client.

It's a thin, typed wrapper around the VeloCMS Public API (https://<your-blog>/api/v1, documented at /api/openapi on any VeloCMS site): every tool maps to one real API call, with Zod-validated inputs and readable errors — no scraping, no browser automation, just the platform's own supported REST API.

What it does

ToolWhat it does
list_postsList posts, paginated, optionally filtered by status (draft/published)
get_postFetch a single post by ID, including its full content and SEO fields
create_postCreate a new post (defaults to draft)
update_postPartially update an existing post — only the fields you pass change
delete_postPermanently delete a post
publish_postSet a post's status to published (stamps published_at)
unpublish_postSet a post's status back to draft
list_mediaList the media library, paginated, optionally filtered by MIME type
list_commentsList comments, paginated, optionally filtered by post or moderation status
moderate_commentSet a comment's status to approved, pending, or spam
list_membersList subscribers/readers (emails are masked, e.g. u***@example.com)
get_site_settingsRead the blog's name, description, and feature flags

Every tool ships a description an LLM can read to figure out when and how to use it — that's the point of MCP, not just a REST proxy with extra steps. See Tool reference below for full argument lists.

Setup

1. Get a VeloCMS API key

In your VeloCMS dashboard: Settings → API Keys → create a key with the scopes you need (posts:read, posts:write, media:read, comments:read, comments:moderate, members:read, site-settings:read, etc.). API access requires the Pro plan or higher.

2. Configure your MCP client

You don't need to clone this repo — npx fetches and runs it on demand.

Claude Code
bash
claude mcp add velocms \  --env VELOCMS_SITE_URL=https://myblog.velocms.org \  --env VELOCMS_API_KEY=velo_your_64_char_hex_key_here \  -- npx -y -p @velocms/mcp velocms-mcp

MCP servers register their tools at session start, so restart your Claude Code session after adding this.

Claude Desktop

Add to your claude_desktop_config.json (Settings → Developer → Edit Config):

json
{  "mcpServers": {    "velocms": {      "command": "npx",      "args": ["-y", "-p", "@velocms/mcp", "velocms-mcp"],      "env": {        "VELOCMS_SITE_URL": "https://myblog.velocms.org",        "VELOCMS_API_KEY": "velo_your_64_char_hex_key_here"      }    }  }}

Restart Claude Desktop after editing.

Cursor / any other MCP client

Same shape as above — point the client's MCP config at npx -y -p @velocms/mcp velocms-mcp with VELOCMS_SITE_URL and VELOCMS_API_KEY set in its env. The server speaks standard MCP over stdio, so any client that supports stdio MCP servers works.

3. Local install (contributing / running from source)

bash
git clone https://github.com/VeloCMS/velocms-mcp.gitcd velocms-mcpnpm installnpm run buildcp .env.example .env# edit .env and set VELOCMS_SITE_URL + VELOCMS_API_KEYVELOCMS_SITE_URL=... VELOCMS_API_KEY=... node dist/index.js

Config reference

Env varRequiredDescription
VELOCMS_SITE_URLyesYour blog's base URL — a *.velocms.org subdomain or a bound custom domain. No trailing slash needed.
VELOCMS_API_KEYyesAn API key from /admin/settings → API Keys. Requires Pro plan or higher. Never logged.

If either is missing, the server prints a clear message to stderr and exits immediately (process.exit(1)) — it never starts half-configured.

Tool reference

Argument names are camelCase; the server maps them to the API's snake_case JSON fields for you.

list_posts — page?, perPage? (max 100), status? (draft | published).

get_post — id (required).

create_post — title (required, ≤255 chars), slug?, contentHtml?, contentJson? (TipTap ProseMirror document — prefer contentHtml unless you need this), excerpt? (≤500), status? (draft default | published), tags? (string array), seoTitle? (≤60), seoDescription? (≤160).

update_post — id (required) + any of the create_post fields (all optional here). At least one field besides id is required — the tool rejects a no-op call before making any network request.

delete_post — id (required). Permanent.

publish_post / unpublish_post — id (required). Shorthand for update_post({ status: "published" }) / update_post({ status: "draft" }).

list_media — page?, perPage?, type? (MIME type prefix, e.g. "image").

list_comments — page?, perPage?, postId?, status? (approved | pending | spam).

moderate_comment — id (required), status (required: approved | pending | spam).

list_members — page?, perPage?, tier? (free | paid).

get_site_settings — no arguments.

Error handling model

The VeloCMS API returns a consistent JSON error envelope:

json
{ "error": { "code": "RATE_LIMITED", "message": "...", "details": {} } }

This client surfaces that message directly (never a raw stack trace), enriched with actionable hints:

  • 401 (UNAUTHORIZED) — the message tells you to check VELOCMS_API_KEY.
  • 403 (PLAN_UPGRADE_REQUIRED) — the message points at /admin/billing.
  • 403 (INVALID_SCOPE/FORBIDDEN) — the message tells you to check the key's scopes.
  • 429 (RATE_LIMITED) — the Retry-After response header (seconds) is parsed and included in the error message, and returned as retryAfterSeconds if you're calling the client library directly.
  • Any other non-2xx — the API's own code + message are surfaced as-is.

Rate limits are plan-based (Pro: 30/min, 1,000/hr · Business: 120/min, 5,000/hr · Agency: 300/min, 20,000/hr) — this server does not retry automatically; it fails fast with the wait time so an interactive tool call never blocks silently.

Security

  • Your API key is a tenant-scoped credential — it can only reach the one blog it was issued for, and only the endpoints its scopes allow.
  • The key is read once from the environment and never logged, echoed, or included in any tool output.
  • Member emails returned by list_members are masked by the API itself (e.g. u***@example.com) — this server never sees or handles unmasked member PII.
  • Encrypted tenant settings (Stripe keys, AI provider keys) are excluded from get_site_settings by the API — there is no way to read them through this server.

Notes on this MCP server

  • moderate_comment's body field is status, not action — PATCH /api/v1/comments/{id}/moderate takes { "status": "approved" | "pending" | "spam" } per the API's own schema, so the tool's input is named to match.
  • get_post and get_site_settings return the record directly (not wrapped in { "data": ... }) — only the write endpoints (create_post, update_post, moderate_comment) wrap their response, matching the API's own inconsistency here (documented in openapi.yaml).
  • There is currently no upload_media tool — POST /api/v1/media takes multipart/form-data, which doesn't map cleanly onto typical MCP client transports. list_media is available for referencing media already uploaded through the dashboard. Contributions welcome if you need this.

Development

bash
npm installnpm run typecheck   # tsc --noEmitnpm test             # vitest — all tests run against a mocked fetch, no live API callsnpm run build        # emits dist/

The test suite covers: the Authorization: Bearer header on every request, each tool's exact method/URL/body mapping, error-code mapping for 401/403/429/500 responses, and the missing-env-var fail-fast path. No test in this repository makes a real network call.

License

MIT — see LICENSE.

來源:README.md,提交 34ae477

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

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

評分

已滿足適用檢查項的 50%

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

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

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

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