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 分