Token导航 LogoToken导航TokenDH.com
研究检索敏感数据clawhub未标认证来源可访问clear审计通过

framer-crm-apiFramer CRM API 搜索

Agent Skill

用于辅助 API 设计、接口文档、请求响应结构和服务集成说明。它适合让 Agent 梳理 endpoint、生成 OpenAPI 草稿、检查字段命名、整理错误码或辅助前后端联调。使用时需要确认真实业务语义、鉴权方式、分页和错误处理规则;涉及生成接口文档时,应避免凭空补字段,最好从现有代码、schema 或接口样例中提取事实。

总安装

3,648

周安装

152

GitHub Stars

1

下载量

1,216
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:framer-crm-api(Framer CRM API 搜索)
来源仓库:https://github.com/berthelol/framer-crm-api
安装命令:
openclaw skills install framer-crm-api
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install framer-crm-api

简介

用于辅助 API 设计、接口文档和请求响应结构梳理。

  • 适合在 OpenClaw 中生成 OpenAPI 草稿、检查字段命名或整理错误码。
  • 使用时需确认业务语义、鉴权方式及分页规则,避免凭空补字段。
  • 安装命令:openclaw skills install framer-crm-api。
  • 建议核对来源仓库和原始 README 以确认具体用法与限制。

SKILL.md

name
framer-cms
description
>
metadata
openclaw
requires
env
bins
primaryEnv
FRAMER_API_KEY

Framer CMS — Server API Skill

Manage Framer CMS content programmatically via the framer-api npm package. Push articles, upload images, create collections, and publish/deploy — all from the terminal, no Framer app needed.

First-time setup (onboarding)

If this is the first time the user uses this skill in a project, run the onboarding flow described in references/onboarding.md.

Quick check: Look for FRAMER_PROJECT_URL and FRAMER_API_KEY in the user's .env file or environment. If missing, onboard.


How it works

This skill uses the Framer Server API (framer-api npm package) which connects to Framer projects via WebSocket using an API key. It provides full CMS CRUD, image uploads, publishing, and deployment.

Important: The framer-api package must be installed in the project. If not present, run:

npm i framer-api

All operations use ES module scripts (.mjs files) with this connection pattern:

import { connect } from "framer-api"

// IMPORTANT: API key is passed as a plain string (2nd argument), NOT as {apiKey: "..."}
const framer = await connect(process.env.FRAMER_PROJECT_URL, process.env.FRAMER_API_KEY)
try {
  // ... operations ...
} finally {
  await framer.disconnect()
}

Available operations

CMS Collections

OperationMethodNotes
List collectionsframer.getCollections()Returns all CMS collections
Get one collectionframer.getCollection(id)By collection ID
Create collectionframer.createCollection(name)Creates empty collection
Get fieldscollection.getFields()Field definitions (name, type, id)
Add fieldscollection.addFields([{type, name}])Add new fields to collection
Remove fieldscollection.removeFields([fieldId])Delete fields by ID
Reorder fieldscollection.setFieldOrder([fieldIds])Set field display order

CMS Items (articles, entries)

OperationMethodNotes
List itemscollection.getItems()All items with field data
Create itemscollection.addItems([{slug, fieldData}])Create new items. Returns undefined — re-fetch with getItems() to get IDs
Update item fieldsitem.setAttributes({ fieldData: { [fieldId]: {type, value} } })MUST wrap in fieldData: — without it, values are silently ignored
Update item slug/draftitem.setAttributes({ slug: "new", draft: false })Slug and draft are set directly (NOT inside fieldData)
Delete itemitem.remove()Single item
Bulk deletecollection.removeItems([itemIds])Multiple items
Reorder itemscollection.setItemOrder([itemIds])Set display order

⚠️ Critical: How to update CMS item fields

The setAttributes method has a non-obvious API design — field values MUST be wrapped in a fieldData key:

// ✅ CORRECT — fields wrapped in fieldData
await item.setAttributes({
  fieldData: {
    [titleFieldId]: { type: "string", value: "New Title" }
  }
})

// ❌ WRONG — silently ignored, no error thrown
await item.setAttributes({
  [titleFieldId]: { type: "string", value: "New Title" }
})

// ❌ WRONG — also silently ignored
await item.setAttributes({
  [titleFieldId]: "New Title"
})

Partial updates work: Only specified fields are changed. Other fields are preserved.

Non-field attributes (slug, draft) go directly on the object, NOT inside fieldData:

await item.setAttributes({ slug: "new-slug", draft: false })

Field data format

When creating/updating items, field data is keyed by field ID (not name):

const fields = await collection.getFields()
const titleField = fields.find(f => f.name === "Title")

await collection.addItems([{
  slug: "my-article",
  fieldData: {
    [titleField.id]: { type: "string", value: "My Article Title" },
  }
}])

Supported field types and their value format:

TypeValue formatExample
stringstring{ type: "string", value: "Hello" }
numbernumber{ type: "number", value: 42 }
booleanboolean{ type: "boolean", value: true }
datestring (UTC ISO){ type: "date", value: "2026-04-06T00:00:00Z" }
formattedTextstring (HTML){ type: "formattedText", value: "<h2>Title</h2><p>Text</p>" }
linkstring (URL){ type: "link", value: "https://example.com" }
imageImageAsset objectSee image upload section
enumstring (case name){ type: "enum", value: "Published" }
colorstring (hex/rgba){ type: "color", value: "#FF0000" }
fileFileAsset objectSimilar to image
collectionReferencestring (item ID){ type: "collectionReference", value: "itemId123" }
multiCollectionReferencestring[]{ type: "multiCollectionReference", value: ["id1","id2"] }

Images

Upload images from public URLs, then use the returned asset in CMS items:

const asset = await framer.uploadImage("https://example.com/photo.jpg")
// asset = { id, url, thumbnailUrl }

await item.setAttributes({
  fieldData: {
    [thumbnailField.id]: { type: "image", value: asset.url }
  }
})

Publishing & deployment

// Create a preview deployment
const result = await framer.publish()
// result = { deployment: { id }, hostnames: [...] }

// Promote preview to production
await framer.deploy(result.deployment.id)

Always ask the user before deploying to production. Publishing a preview is safe; deploying is live.

Project info & changes

await framer.getProjectInfo()       // { id, name, apiVersion1Id }
await framer.getCurrentUser()       // { id, name, avatar }
await framer.getPublishInfo()       // Current deployment status
await framer.getChangedPaths()      // { added, removed, modified }
await framer.getChangeContributors() // Contributor UUIDs
await framer.getDeployments()       // All deployment history

Other operations

OperationMethodNotes
Color stylesgetColorStyles(), createColorStyle()Design tokens
Text stylesgetTextStyles(), createTextStyle()Typography tokens
Code filesgetCodeFiles(), createCodeFile(name, code)Custom code overrides
Custom codegetCustomCode()Head/body code injection
FontsgetFonts()Project fonts
LocalesgetLocales(), getDefaultLocale()i18n
PagescreateWebPage(path), removeNode(id)Page management
Screenshotsscreenshot(nodeId, options)PNG buffer of any node
RedirectsaddRedirects([{from, to}])Requires paid plan
Node treegetNode(id), getChildren(id), getParent(id)DOM traversal

Common workflows

Push a new article to CMS

See references/cms-operations.md for the full pattern including field resolution, image upload, and error handling.

Bulk update articles

const items = await collection.getItems()
for (const item of items) {
  await item.setAttributes({
    fieldData: {
      [metaField.id]: { type: "string", value: generateMeta(item) }
    }
  })
}

Publish after CMS changes

const changes = await framer.getChangedPaths()
if (changes.added.length || changes.modified.length || changes.removed.length) {
  const result = await framer.publish()
  console.log("Preview:", result.hostnames)
  // Ask user before: await framer.deploy(result.deployment.id)
}

Important notes

  • API key scope: Each key is bound to one project. For multiple Framer sites, store multiple keys.
  • WebSocket connection: The connect() call opens a persistent WebSocket. Always call disconnect() when done, or use using framer = await connect(...) for auto-cleanup.
  • Field IDs, not names: CMS operations use field IDs. Always call getFields() first and resolve names to IDs.
  • Image fields: Pass the full framerusercontent.com URL from uploadImage(), not the asset ID.
  • Proxy methods: Most methods (getCollections, publish, etc.) are proxied — they don't appear in Object.keys(framer) but work correctly.
  • Rate limits: No documented rate limits, but avoid hammering. Add small delays for bulk operations (100+ items).
  • formattedText fields: Accept standard HTML (h1-h6, p, ul, ol, li, a, strong, em, img, blockquote, pre, code, table, etc.).
  • Draft items: Items can have draft: true — drafts are excluded from publishing.
  • Blog Posts collection: Collections managed by "thisPlugin" are read-only via the API. Only "user" managed collections can be modified.

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

78.72%
按下载量换算957

安全审计

VirusTotal

通过

ClawScan

通过

Static analysis

通过

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills