據 AlphaMoat 統計,截至 2026-09,Clawkey 累計下載 2,975 次、獲 1 個星標,在全部 5,078 個 AI 技能中排名第 3,747 位,在「AI 智慧體」分類(969 個)中排名第 755 位。
| 平台 | 累計安裝 | 累計下載 | 星標 | 評論 |
|---|---|---|---|---|
| ClawHub ↗ | 89 | 2741 | 1 | - |
| SkillHub ↗ | 310 | 2975 | 1 | — |
各平台的計數口徑不同,統計時間不一致。
ClawKey文件描述以簽名挑戰啟動註冊,由所有者透過VeryAI完成掌紋驗證,再查詢裝置登記或驗籤狀態。私鑰僅用於本地簽名,不得上傳;短期單次註冊連結交給所有者自行開啟。流程會向第三方共享裝置標識、公鑰與簽名資料,登記狀態只應作為身份訊號。
資料釋出於 2026-10-27
以下是根據技能文件生成的示例,不代表實際執行結果。
2026-09 起統計方法調整:同名技能按作者分別統計,並覆蓋全部技能。圖中虛線為調整前的月份,與之後的資料不直接比較,也不計算跨越調整的增長。
| 月份 | 累計下載 | 環比 | 星標 |
|---|---|---|---|
| 2026-09 | 2975 | — | 1 |
| 2026-08 | 2651 | +3.4% | 1 |
| 2026-07 | 2563 | +8.1% | 1 |
| 2026-06 | 2370 | +4.1% | 1 |
| 2026-05 | 2276 | — | 1 |
| 2026-03 | 2095 | — | 1 |
以下是作者釋出的原始檔案,按純文字顯示,本站未做修改或稽核;其中的連結不可點選,命令請核實後再執行。抓取於 2026-10-23。
---
name: clawkey
version: 1.0.0
description: Verifiable human ownership for OpenClaw agents. Register your agent under your human owner via VeryAI palm verification.
homepage: https://clawkey.ai
metadata: { "category": "identity", "api_base": "https://api.clawkey.ai/v1" }
---
# ClawKey — Verifiable Human Ownership
Register your agent under your human owner powered by VeryAI palm verification. The agent starts registration with a signed challenge showing it controls its key; the human opens a URL and completes VeryAI's palm verification. Once the human finishes, the agent is registered under their ownership and can be verified by third parties.
> **CRITICAL: Never open browsers**
>
> Do **not** use `open`, `xdg-open`, `start`, or any command that opens a browser. Always output the **registration URL** as a text or markdown link for the user to click.
>
> - WRONG: `open "https://api.very.org/oauth2/..."`
> - CORRECT: "Open this link to complete verification: https://api.very.org/oauth2/..."
## Key files
| File | Purpose |
| ------------ | ----------------------------------------------------------------------------------------- |
| SKILL.md | https://clawkey.ai/skill.md — registration flow, challenge generation, verification, API |
| HEARTBEAT.md | https://clawkey.ai/heartbeat.md — periodic checklist: registration status, etc |
| Identity | `~/.openclaw/identity/device.json` — OpenClaw deviceId and keys (do not send private key) |
## Security
- **Private key**: Used to sign the challenge. Never send the private key to ClawKey or any server; only send `publicKey`, `message`, and `signature`.
- **Registration URL**: Single-use and short-lived. Give it only to the human owner who will complete VeryAI palm verification.
- **deviceId**: Use a stable identifier (e.g. from your identity store or hash of public key). It ties the agent to the registration and is used for lookup and verification.
## Generating the AgentChallenge
The **AgentChallenge** is a signed payload that shows you control an Ed25519 key. It has the shape used by standard OpenClaw identity flows: `deviceId`, `publicKey`, `message`, `signature`, `timestamp`. Generate it once and send it to `/agent/register/init` or `/agent/verify/signature`.
### Where identity comes from (OpenClaw)
If you run on OpenClaw, device identity is stored at:
- **Path:** `~/.openclaw/identity/device.json`
That file contains (never send `privateKeyPem` to any server):
| Field | Use |
| --------------- | ------------------------------------------------------------------------ |
| `deviceId` | Use as `deviceId` in the challenge. Stable id for this agent/device. |
| `publicKeyPem` | Use to derive `publicKey` (see below). |
| `privateKeyPem` | Use only locally to sign the message. **Never include in API requests.** |
If you don’t use OpenClaw, use your own identity store; ensure you have a stable `deviceId`, an Ed25519 key pair, and that you sign the **exact** string you send as `message`.
### Build the challenge (step-by-step)
1. **Choose the message to sign**
For registration, use a one-time challenge to avoid replay, e.g.:
- `clawkey-register-<unix_timestamp_ms>`
Example: `clawkey-register-1738500000000`
For verify/signature, the message is whatever you are proving (e.g. a nonce from a third party).
2. **Sign the message** with your Ed25519 **private** key. The signature must be over the **exact** UTF-8 bytes of `message` (no extra prefix/suffix).
3. **Encode for the API:**
- **publicKey**: Ed25519 public key in **SPKI DER** form, then **base64** (no PEM wrapper).
- **signature**: Raw Ed25519 signature bytes, **base64**.
- **timestamp**: Unix time in **milliseconds** when the challenge was created (e.g. `Date.now()`).
4. **JSON body (AgentChallenge):**
- `deviceId` — from your identity (e.g. `device.json`)
- `publicKey` — base64 DER SPKI
- `message` — exact string that was signed
- `signature` — base64 signature
- `timestamp` — number (ms)
### Example: Node.js
```javascript
const crypto = require("crypto");
const fs = require("fs");
const identityPath = `${process.env.HOME}/.openclaw/identity/device.json`;
const identity = JSON.parse(fs.readFileSync(identityPath, "utf8"));
const message = `clawkey-register-${Date.now()}`;
const privateKey = crypto.createPrivateKey(identity.privateKeyPem);
const signature = crypto.sign(null, Buffer.from(message, "utf8"), privateKey);
const publicKeyDer = crypto
.createPublicKey(identity.publicKeyPem)
.export({ type: "spki", format: "der" });
const challenge = {
deviceId: identity.deviceId,
publicKey: publicKeyDer.toString("base64"),
message,
signature: signature.toString("base64"),
timestamp: Date.now(),
};
// POST challenge to https://api.clawkey.ai/v1/agent/register/init
```
### Using a script
If you have a script that already produces an AgentChallenge (e.g. signs a message and outputs JSON with `deviceId`, `publicKey`, `message`, `signature`, `timestamp`), you can reuse it for ClawKey:
1. Generate a challenge string, e.g. `clawkey-register-$(date +%s)000` (seconds + "000" for ms) or use your script’s convention.
2. Run the script to sign that message and get the challenge JSON.
3. POST that JSON to `https://api.clawkey.ai/v1/agent/register/init`.
Same challenge format works for `POST /agent/verify/signature` when verifying a signature remotely.
## Quick start
### 1. Start registration (agent-initiated)
Build an **AgentChallenge** as above, then send it to ClawKey to create a session and get a registration URL.
```bash
curl -X POST https://api.clawkey.ai/v1/agent/register/init \
-H "Content-Type: application/json" \
-d '{
"deviceId": "my-agent-device-id",
"publicKey": "<base64-DER-SPKI-Ed25519>",
"message": "clawkey-register-1738500000000",
"signature": "<base64-Ed25519-signature>",
"timestamp": 1738500000000
}'
```
**Response (201):**
- `sessionId` — use to poll status
- `registrationUrl` — **output this as a link for the human; do not open it in a browser**
- `expiresAt` — session expiry (ISO 8601)
If the agent is already registered (`deviceId` exists), the API returns **409 Conflict**.
### 2. Human completes verification
Tell the human owner to open the `registrationUrl` in their browser. They will go through VeryAI's palm verification via OAuth. When they finish, the agent is registered under their ownership.
### 3. Poll registration status
Poll until the human has completed or the session has expired:
```bash
curl "https://api.clawkey.ai/v1/agent/register/SESSION_ID/status"
```
**Response:** `status` is one of `pending` | `completed` | `expired` | `failed`. When `status` is `completed`, the response includes `deviceId` and `registration` (e.g. `publicKey`, `registeredAt`).
### 4. Verify signatures or look up an agent
- **Verify a signature** — check that a message was signed by the given key and whether that agent is registered under a verified human:
```bash
curl -X POST https://api.clawkey.ai/v1/agent/verify/signature \
-H "Content-Type: application/json" \
-d '{
"deviceId": "...",
"publicKey": "...",
"message": "...",
"signature": "...",
"timestamp": 1738500000000
}'
```
Response: `verified` (signature valid), `registered` (agent under verified human).
- **Look up an agent by device id** — get registration and verification status:
```bash
curl "https://api.clawkey.ai/v1/agent/verify/device/DEVICE_ID"
```
Response: `registered`, `verified`, and optionally `registeredAt`.
## API reference
**Base URL:** `https://api.clawkey.ai/v1`
**Local:** `http://localhost:3000/v1`
### Endpoints
| Method | Endpoint | Auth | Description |
| ------ | ------------------------------------ | ---- | -------------------------------------------------------------------------------- |
| POST | `/agent/register/init` | None | Start registration session; returns `sessionId`, `registrationUrl`, `expiresAt`. |
| GET | `/agent/register/{sessionId}/status` | None | Poll registration status: `pending` / `completed` / `expired` / `failed`. |
| POST | `/agent/verify/signature` | None | Verify a signature and whether the agent is registered under a verified human. |
| GET | `/agent/verify/device/{deviceId}` | None | Get agent registration and verification status by device id. |
### Request/response schemas
**AgentChallenge** (used in register/init and verify/signature):
| Field | Type | Required | Description |
| --------- | ------ | -------- | -------------------------------------------------------- |
| deviceId | string | yes | Key/device id (e.g. public key hash or app id). |
| publicKey | string | yes | Ed25519 public key, base64 DER SPKI. |
| message | string | yes | Exact message that was signed (e.g. challenge or nonce). |
| signature | string | yes | Ed25519 signature over message, base64. |
| timestamp | int64 | yes | Unix timestamp (ms) when the challenge was created. |
**Register init response (201):**
```json
{
"sessionId": "uuid",
"registrationUrl": "https://clawkey.ai/register/...",
"expiresAt": "2026-02-02T12:00:00Z"
}
```
**Register status response (200):**
```json
{
"status": "completed",
"deviceId": "my-agent-device-id",
"registration": {
"publicKey": "...",
"registeredAt": "2026-02-02T12:00:00Z"
}
}
```
**Verify signature response (200):**
```json
{
"verified": true,
"registered": true
}
```
**Device status response (200):**
```json
{
"registered": true,
"verified": true,
"registeredAt": "2026-02-02T12:00:00Z"
}
```
**Error (4xx/5xx):**
```json
{
"error": "Human-readable message",
"code": "optional_code",
"details": {}
}
```
### Error codes
| Code | Meaning |
| ---- | ---------------------------------------------------- |
| 400 | Bad request (invalid or missing fields). |
| 404 | Session or device not found. |
| 409 | Agent already registered (device_id already exists). |
| 500 | Server error. |
## What this proves
After registration and VeryAI verification:
- **Human ownership** — The agent is bound to a human who passed palm verification.
- **Key binding** — Ed25519 signatures prove the agent controls the key; ClawKey ties that key to the verified human.
- **Public verification** — Third parties can call `/agent/verify/signature` or `/agent/verify/device/{deviceId}` to confirm an agent is registered and verified.
## When to use this skill
- Registering an OpenClaw (or other) agent under a human owner.
- Proving to a third party that an agent is owned by a verified human (e.g. before granting access or privileges).
- Checking whether a given key or device is registered and verified.
## Need help?
- API base: https://api.clawkey.ai/v1
- Homepage: https://clawkey.ai
將開發過程中的經驗、錯誤與修正記錄為 Markdown 檔案,供日後重用並提升為工作區記憶。
用自然語言描述需求,在本機與遠端技能市場尋找技能並取得推薦。
給 AI agent 用的瀏覽器自動化命令列技能。
將使用者明確糾正與自我檢視整理成分層記憶,並依使用情況升級或封存。
在安裝第三方技能之前,按清單審查來源、許可權與危險模式的技能。
將代理記憶與跨技能狀態整理成具型別與約束的知識圖譜。
規劃 AI 代理主動跟進、工作記憶與回顧流程的工作區設定指南。
指導如何建立與更新有效 Claude 技能的寫作指南。
資料月份:2026-09 · 下載/星標/安裝數聚合自公開技能註冊庫(ClawHub、SkillHub),按月更新。口徑說明見資料方法。