clawdirect-dev
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseClawDirect-Dev
ClawDirect-Dev
Build agent-facing web experiences with ATXP-based authentication.
Reference implementation: https://github.com/napoleond/clawdirect
基于ATXP认证构建面向Agent的Web体验。
What is ATXP?
什么是ATXP?
ATXP (Agent Transaction Protocol) enables AI agents to authenticate and pay for services. When building agent-facing websites, ATXP provides:
- Agent identity: Know which agent is making requests
- Payments: Charge for premium actions (optional)
- MCP integration: Expose tools that agents can call programmatically
For full ATXP details: https://skills.sh/atxp-dev/cli/atxp
ATXP(Agent Transaction Protocol,Agent交易协议)支持AI Agent进行身份认证并为服务付费。在构建面向Agent的网站时,ATXP可提供:
- Agent身份识别:了解发起请求的Agent身份
- 支付功能:为高级操作收费(可选)
- MCP集成:暴露Agent可通过编程调用的工具
ATXP详细文档:https://skills.sh/atxp-dev/cli/atxp
How Agents Interact
Agent的交互方式
Agents interact with your site in two ways:
- Browser: Agents use browser automation tools to visit your website, click buttons, fill forms, and navigate—just like humans do
- MCP tools: Agents call your MCP endpoints directly for programmatic actions (authentication, payments, etc.)
The cookie-based auth pattern bridges these: agents get an auth cookie via MCP, then use it while browsing.
Important: Agent browsers often cannot set HTTP-only cookies directly. The recommended pattern is for agents to pass the cookie value in the query string (e.g., ), and have the server set the cookie and redirect to a clean URL.
?myapp_cookie=XYZAgent通过两种方式与你的站点交互:
- 浏览器:Agent使用浏览器自动化工具访问你的网站,点击按钮、填写表单、导航页面——就像人类用户一样
- MCP工具:Agent直接调用你的MCP端点来执行程序化操作(如身份认证、支付等)
基于Cookie的认证模式可衔接这两种方式:Agent通过MCP获取认证Cookie,然后在浏览时使用该Cookie。
重要提示:Agent浏览器通常无法直接设置HTTP-only Cookie。推荐的模式是Agent在查询字符串中传递Cookie值(例如:),由服务器设置Cookie并重定向至干净的URL。
?myapp_cookie=XYZArchitecture Overview
架构概述
┌──────────────────────────────────────────────────────────────────┐
│ AI Agent │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ Browser Tool │ │ MCP Client │ │
│ │ (visits website) │ │ (calls tools) │ │
│ └─────────┬───────────┘ └───────────┬─────────────┘ │
└────────────┼─────────────────────────────────┼──────────────────┘
│ │
▼ ▼
┌────────────────────────────────────────────────────────────────┐
│ Your Application │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ Web Server │ │ MCP Server │ │
│ │ (Express) │ │ (@longrun/turtle) │ │
│ │ │ │ │ │
│ │ - Serves UI │ │ - yourapp_cookie │ │
│ │ - Cookie auth │ │ - yourapp_action │ │
│ └─────────┬───────────┘ └───────────┬─────────────┘ │
│ │ │ │
│ └──────────┬─────────────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ SQLite │ │
│ │ auth_cookies │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘┌──────────────────────────────────────────────────────────────────┐
│ AI Agent │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ Browser Tool │ │ MCP Client │ │
│ │ (visits website) │ │ (calls tools) │ │
│ └─────────┬───────────┘ └───────────┬─────────────┘ │
└────────────┼─────────────────────────────────┼──────────────────┘
│ │
▼ ▼
┌────────────────────────────────────────────────────────────────┐
│ Your Application │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ Web Server │ │ MCP Server │ │
│ │ (Express) │ │ (@longrun/turtle) │ │
│ │ │ │ │ │
│ │ - Serves UI │ │ - yourapp_cookie │ │
│ │ - Cookie auth │ │ - yourapp_action │ │
│ └─────────┬───────────┘ └───────────┬─────────────┘ │
│ │ │ │
│ └──────────┬─────────────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ SQLite │ │
│ │ auth_cookies │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘Build Steps
构建步骤
- Create MCP server alongside your website
- Implement cookie tool in the MCP server
- Use cookie for auth in your web API
- Publish an agent skill for your site
- 在网站旁创建MCP服务器
- 在MCP服务器中实现Cookie工具
- 在Web API中使用Cookie进行认证
- 为你的站点发布Agent技能
Step 1: Project Setup
步骤1:项目搭建
Initialize a Node.js project with the required stack:
bash
mkdir my-agent-app && cd my-agent-app
npm init -y
npm install @longrun/turtle @atxp/server @atxp/express better-sqlite3 express cors dotenv zod
npm install -D typescript @types/node @types/express @types/cors @types/better-sqlite3 tsxCreate :
tsconfig.jsonjson
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "dist",
"rootDir": "src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true
},
"include": ["src/**/*"]
}Create :
.envFUNDING_DESTINATION_ATXP=<your_atxp_account>
PORT=3001使用所需技术栈初始化Node.js项目:
bash
mkdir my-agent-app && cd my-agent-app
npm init -y
npm install @longrun/turtle @atxp/server @atxp/express better-sqlite3 express cors dotenv zod
npm install -D typescript @types/node @types/express @types/cors @types/better-sqlite3 tsx创建:
tsconfig.jsonjson
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "dist",
"rootDir": "src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true
},
"include": ["src/**/*"]
}创建:
.envFUNDING_DESTINATION_ATXP=<your_atxp_account>
PORT=3001Step 2: Database with Cookie Auth
步骤2:带Cookie认证的数据库
Create :
src/db.tstypescript
import Database from 'better-sqlite3';
import crypto from 'crypto';
const DB_PATH = process.env.DB_PATH || './data.db';
let db: Database.Database;
export function getDb(): Database.Database {
if (!db) {
db = new Database(DB_PATH);
db.pragma('journal_mode = WAL');
// Auth cookies table - maps cookies to ATXP accounts
db.exec(`
CREATE TABLE IF NOT EXISTS auth_cookies (
cookie_value TEXT PRIMARY KEY,
atxp_account TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
// Add your app's tables here
}
return db;
}
export function createAuthCookie(atxpAccount: string): string {
const cookieValue = crypto.randomBytes(32).toString('hex');
getDb().prepare(`
INSERT INTO auth_cookies (cookie_value, atxp_account)
VALUES (?, ?)
`).run(cookieValue, atxpAccount);
return cookieValue;
}
export function getAtxpAccountFromCookie(cookieValue: string): string | null {
const result = getDb().prepare(`
SELECT atxp_account FROM auth_cookies WHERE cookie_value = ?
`).get(cookieValue) as { atxp_account: string } | undefined;
return result?.atxp_account || null;
}创建:
src/db.tstypescript
import Database from 'better-sqlite3';
import crypto from 'crypto';
const DB_PATH = process.env.DB_PATH || './data.db';
let db: Database.Database;
export function getDb(): Database.Database {
if (!db) {
db = new Database(DB_PATH);
db.pragma('journal_mode = WAL');
// Auth cookies table - maps cookies to ATXP accounts
db.exec(`
CREATE TABLE IF NOT EXISTS auth_cookies (
cookie_value TEXT PRIMARY KEY,
atxp_account TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
// Add your app's tables here
}
return db;
}
export function createAuthCookie(atxpAccount: string): string {
const cookieValue = crypto.randomBytes(32).toString('hex');
getDb().prepare(`
INSERT INTO auth_cookies (cookie_value, atxp_account)
VALUES (?, ?)
`).run(cookieValue, atxpAccount);
return cookieValue;
}
export function getAtxpAccountFromCookie(cookieValue: string): string | null {
const result = getDb().prepare(`
SELECT atxp_account FROM auth_cookies WHERE cookie_value = ?
`).get(cookieValue) as { atxp_account: string } | undefined;
return result?.atxp_account || null;
}Step 3: MCP Tools with Cookie Tool
步骤3:带Cookie工具的MCP工具集
Create :
src/tools.tstypescript
import { defineTool } from '@longrun/turtle';
import { z } from 'zod';
import { requirePayment, atxpAccountId } from '@atxp/server';
import BigNumber from 'bignumber.js';
import { createAuthCookie } from './db.js';
// Cookie tool - agents call this to get browser auth
export const cookieTool = defineTool(
'myapp_cookie', // Replace 'myapp' with your app name
'Get an authentication cookie for browser use. Set this cookie to authenticate when using the web interface.',
z.object({}),
async () => {
// Free but requires ATXP auth
const accountId = atxpAccountId();
if (!accountId) {
throw new Error('Authentication required');
}
const cookie = createAuthCookie(accountId);
return JSON.stringify({
cookie,
instructions: 'To authenticate in a browser, navigate to https://your-domain.com?myapp_cookie=<cookie_value> - the server will set the HTTP-only cookie and redirect. Alternatively, set the cookie directly if your browser tool supports it.'
});
}
);
// Example paid tool
export const paidActionTool = defineTool(
'myapp_action',
'Perform some action. Cost: $0.10',
z.object({
input: z.string().describe('Input for the action')
}),
async ({ input }) => {
await requirePayment({ price: new BigNumber(0.10) });
const accountId = atxpAccountId();
if (!accountId) {
throw new Error('Authentication required');
}
// Your action logic here
return JSON.stringify({ success: true, input });
}
);
export const allTools = [cookieTool, paidActionTool];创建:
src/tools.tstypescript
import { defineTool } from '@longrun/turtle';
import { z } from 'zod';
import { requirePayment, atxpAccountId } from '@atxp/server';
import BigNumber from 'bignumber.js';
import { createAuthCookie } from './db.js';
// Cookie tool - agents call this to get browser auth
export const cookieTool = defineTool(
'myapp_cookie', // Replace 'myapp' with your app name
'Get an authentication cookie for browser use. Set this cookie to authenticate when using the web interface.',
z.object({}),
async () => {
// Free but requires ATXP auth
const accountId = atxpAccountId();
if (!accountId) {
throw new Error('Authentication required');
}
const cookie = createAuthCookie(accountId);
return JSON.stringify({
cookie,
instructions: 'To authenticate in a browser, navigate to https://your-domain.com?myapp_cookie=<cookie_value> - the server will set the HTTP-only cookie and redirect. Alternatively, set the cookie directly if your browser tool supports it.'
});
}
);
// Example paid tool
export const paidActionTool = defineTool(
'myapp_action',
'Perform some action. Cost: $0.10',
z.object({
input: z.string().describe('Input for the action')
}),
async ({ input }) => {
await requirePayment({ price: new BigNumber(0.10) });
const accountId = atxpAccountId();
if (!accountId) {
throw new Error('Authentication required');
}
// Your action logic here
return JSON.stringify({ success: true, input });
}
);
export const allTools = [cookieTool, paidActionTool];Step 4: Express API with Cookie Validation
步骤4:带Cookie验证的Express API
Create :
src/api.tstypescript
import { Router, Request, Response } from 'express';
import { getAtxpAccountFromCookie } from './db.js';
export const apiRouter = Router();
// Helper to extract cookie
function getCookieValue(req: Request, cookieName: string): string | null {
const cookieHeader = req.headers.cookie;
if (!cookieHeader) return null;
const cookies = cookieHeader.split(';').map(c => c.trim());
for (const cookie of cookies) {
if (cookie.startsWith(`${cookieName}=`)) {
return cookie.substring(cookieName.length + 1);
}
}
return null;
}
// Middleware to require cookie auth
function requireCookieAuth(req: Request, res: Response, next: Function) {
const cookieValue = getCookieValue(req, 'myapp_cookie');
if (!cookieValue) {
res.status(401).json({
error: 'Authentication required',
message: 'Use the myapp_cookie MCP tool to get an authentication cookie'
});
return;
}
const atxpAccount = getAtxpAccountFromCookie(cookieValue);
if (!atxpAccount) {
res.status(401).json({
error: 'Invalid cookie',
message: 'Your cookie is invalid or expired. Get a new one via the MCP tool.'
});
return;
}
// Attach account to request for use in handlers
(req as any).atxpAccount = atxpAccount;
next();
}
// Public endpoint (no auth)
apiRouter.get('/api/public', (_req: Request, res: Response) => {
res.json({ message: 'Public data' });
});
// Protected endpoint (requires cookie auth)
apiRouter.post('/api/protected', requireCookieAuth, (req: Request, res: Response) => {
const account = (req as any).atxpAccount;
res.json({ message: 'Authenticated action', account });
});创建:
src/api.tstypescript
import { Router, Request, Response } from 'express';
import { getAtxpAccountFromCookie } from './db.js';
export const apiRouter = Router();
// Helper to extract cookie
function getCookieValue(req: Request, cookieName: string): string | null {
const cookieHeader = req.headers.cookie;
if (!cookieHeader) return null;
const cookies = cookieHeader.split(';').map(c => c.trim());
for (const cookie of cookies) {
if (cookie.startsWith(`${cookieName}=`)) {
return cookie.substring(cookieName.length + 1);
}
}
return null;
}
// Middleware to require cookie auth
function requireCookieAuth(req: Request, res: Response, next: Function) {
const cookieValue = getCookieValue(req, 'myapp_cookie');
if (!cookieValue) {
res.status(401).json({
error: 'Authentication required',
message: 'Use the myapp_cookie MCP tool to get an authentication cookie'
});
return;
}
const atxpAccount = getAtxpAccountFromCookie(cookieValue);
if (!atxpAccount) {
res.status(401).json({
error: 'Invalid cookie',
message: 'Your cookie is invalid or expired. Get a new one via the MCP tool.'
});
return;
}
// Attach account to request for use in handlers
(req as any).atxpAccount = atxpAccount;
next();
}
// Public endpoint (no auth)
apiRouter.get('/api/public', (_req: Request, res: Response) => {
res.json({ message: 'Public data' });
});
// Protected endpoint (requires cookie auth)
apiRouter.post('/api/protected', requireCookieAuth, (req: Request, res: Response) => {
const account = (req as any).atxpAccount;
res.json({ message: 'Authenticated action', account });
});Step 5: Server Entry Point
步骤5:服务器入口文件
Create :
src/index.tstypescript
import 'dotenv/config';
import express from 'express';
import cors from 'cors';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { createServer } from '@longrun/turtle';
import { atxpExpress } from '@atxp/express';
import { getDb } from './db.js';
import { allTools } from './tools.js';
import { apiRouter } from './api.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const FUNDING_DESTINATION = process.env.FUNDING_DESTINATION_ATXP;
if (!FUNDING_DESTINATION) {
throw new Error('FUNDING_DESTINATION_ATXP is required');
}
const PORT = process.env.PORT ? parseInt(process.env.PORT) : 3001;
async function main() {
// Initialize database
getDb();
// Create MCP server
const mcpServer = createServer({
name: 'myapp',
version: '1.0.0',
tools: allTools
});
// Create Express app
const app = express();
app.use(cors());
app.use(express.json());
// Cookie bootstrap middleware - handles ?myapp_cookie=XYZ for agent browsers
// Agent browsers often can't set HTTP-only cookies directly, so they pass the cookie
// value in the query string and the server sets it, then redirects to clean URL
app.use((req, res, next) => {
const cookieValue = req.query.myapp_cookie;
if (typeof cookieValue === 'string' && cookieValue.length > 0) {
res.cookie('myapp_cookie', cookieValue, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
path: '/',
maxAge: 30 * 24 * 60 * 60 * 1000 // 30 days
});
const url = new URL(req.originalUrl, `http://${req.headers.host}`);
url.searchParams.delete('myapp_cookie');
res.redirect(302, url.pathname + url.search || '/');
return;
}
next();
});
// Mount MCP server with ATXP at /mcp
app.use('/mcp', atxpExpress({
fundingDestination: FUNDING_DESTINATION,
handler: mcpServer.handler
}));
// Mount API routes
app.use(apiRouter);
// Serve static frontend (if you have one)
app.use(express.static(join(__dirname, '..', 'public')));
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
console.log(` - MCP endpoint: http://localhost:${PORT}/mcp`);
console.log(` - API endpoint: http://localhost:${PORT}/api`);
});
}
main().catch(console.error);创建:
src/index.tstypescript
import 'dotenv/config';
import express from 'express';
import cors from 'cors';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { createServer } from '@longrun/turtle';
import { atxpExpress } from '@atxp/express';
import { getDb } from './db.js';
import { allTools } from './tools.js';
import { apiRouter } from './api.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const FUNDING_DESTINATION = process.env.FUNDING_DESTINATION_ATXP;
if (!FUNDING_DESTINATION) {
throw new Error('FUNDING_DESTINATION_ATXP is required');
}
const PORT = process.env.PORT ? parseInt(process.env.PORT) : 3001;
async function main() {
// Initialize database
getDb();
// Create MCP server
const mcpServer = createServer({
name: 'myapp',
version: '1.0.0',
tools: allTools
});
// Create Express app
const app = express();
app.use(cors());
app.use(express.json());
// Cookie bootstrap middleware - handles ?myapp_cookie=XYZ for agent browsers
// Agent browsers often can't set HTTP-only cookies directly, so they pass the cookie
// value in the query string and the server sets it, then redirects to clean URL
app.use((req, res, next) => {
const cookieValue = req.query.myapp_cookie;
if (typeof cookieValue === 'string' && cookieValue.length > 0) {
res.cookie('myapp_cookie', cookieValue, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
path: '/',
maxAge: 30 * 24 * 60 * 60 * 1000 // 30 days
});
const url = new URL(req.originalUrl, `http://${req.headers.host}`);
url.searchParams.delete('myapp_cookie');
res.redirect(302, url.pathname + url.search || '/');
return;
}
next();
});
// Mount MCP server with ATXP at /mcp
app.use('/mcp', atxpExpress({
fundingDestination: FUNDING_DESTINATION,
handler: mcpServer.handler
}));
// Mount API routes
app.use(apiRouter);
// Serve static frontend (if you have one)
app.use(express.static(join(__dirname, '..', 'public')));
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
console.log(` - MCP endpoint: http://localhost:${PORT}/mcp`);
console.log(` - API endpoint: http://localhost:${PORT}/api`);
});
}
main().catch(console.error);Step 6: Create Agent Skill
步骤6:创建Agent技能
Create a skill for agents to interact with your app. Structure:
my-skill/
└── SKILL.mdSKILL.md template:
markdown
---
name: myapp
description: Interact with MyApp. Use this skill to [describe what agents can do]. Requires ATXP authentication.
---创建供Agent与你的应用交互的技能,结构如下:
my-skill/
└── SKILL.mdSKILL.md模板:
markdown
---
name: myapp
description: Interact with MyApp. Use this skill to [describe what agents can do]. Requires ATXP authentication.
---MyApp
MyApp
[Brief description] at https://your-domain.com
[Brief description] at https://your-domain.com
Quick Start
Quick Start
- Install ATXP:
npx skills add atxp-dev/cli --skill atxp - Call MCP tools:
npx atxp-call https://your-domain.com/mcp <tool> [params]
- Install ATXP:
npx skills add atxp-dev/cli --skill atxp - Call MCP tools:
npx atxp-call https://your-domain.com/mcp <tool> [params]
Authentication
Authentication
Get a cookie for browser use:
```bash
npx atxp-call https://your-domain.com/mcp myapp_cookie '{}'
```
If using a browser, navigate with the cookie in the query string:
```
https://your-domain.com?myapp_cookie=<cookie_value>
```
The server will set the HTTP-only cookie and redirect to clean the URL.
Alternative (if your browser tool supports direct cookie setting):
- Cookie name:
myapp_cookie - Cookie value: Value from tool response
- Domain:
your-domain.com - Path:
/ - HttpOnly:
true
Get a cookie for browser use:
```bash
npx atxp-call https://your-domain.com/mcp myapp_cookie '{}'
```
If using a browser, navigate with the cookie in the query string:
```
https://your-domain.com?myapp_cookie=<cookie_value>
```
The server will set the HTTP-only cookie and redirect to clean the URL.
Alternative (if your browser tool supports direct cookie setting):
- Cookie name:
myapp_cookie - Cookie value: Value from tool response
- Domain:
your-domain.com - Path:
/ - HttpOnly:
true
MCP Tools
MCP Tools
| Tool | Description | Cost |
|---|---|---|
| Get auth cookie | Free |
| Perform action | $0.10 |
For ATXP details: https://skills.sh/atxp-dev/cli/atxp
undefined| Tool | Description | Cost |
|---|---|---|
| Get auth cookie | Free |
| Perform action | $0.10 |
For ATXP details: https://skills.sh/atxp-dev/cli/atxp
undefinedDeployment
部署
This generates a standard Node.js application deployable to any hosting service:
- Render - Easy Node.js hosting with persistent disks
- Railway - Simple deployments from Git
- Fly.io - Global edge deployment
- DigitalOcean App Platform
- Heroku
Ensure your hosting provides:
- Node.js 18+ runtime
- Persistent storage for SQLite (or switch to PostgreSQL)
- Environment variable configuration
这会生成一个标准的Node.js应用,可部署至任何托管服务:
- Render - 支持持久化磁盘的简易Node.js托管
- Railway - 基于Git的简单部署
- Fly.io - 全球边缘部署
- DigitalOcean App Platform
- Heroku
确保你的托管服务提供:
- Node.js 18+运行时
- SQLite的持久化存储(或切换至PostgreSQL)
- 环境变量配置
Reference
参考
Full working example: https://github.com/napoleond/clawdirect
Key files to study:
- - MCP tool definitions with ATXP payments
src/tools.ts - - Cookie auth database schema
src/db.ts - - Express routes with cookie validation
src/api.ts - - Server setup with turtle + ATXP
src/index.ts - - Auth pattern documentation
docs/agent-cookie-auth.md
For ATXP authentication details: https://skills.sh/atxp-dev/cli/atxp
需重点研究的关键文件:
- - 带ATXP支付的MCP工具定义
src/tools.ts - - Cookie认证数据库 schema
src/db.ts - - 带Cookie验证的Express路由
src/api.ts - - 基于turtle + ATXP的服务器配置
src/index.ts - - 认证模式文档
docs/agent-cookie-auth.md
ATXP认证详细信息:https://skills.sh/atxp-dev/cli/atxp
Adding Your Project to ClawDirect
将你的项目添加至ClawDirect
When your agent-facing site is ready, add it to the ClawDirect directory at https://claw.direct so other agents can discover it.
当你的面向Agent的站点准备就绪后,可将其添加至ClawDirect目录(https://claw.direct),以便其他Agent发现。
Add a New Entry
添加新条目
bash
npx atxp-call https://claw.direct/mcp clawdirect_add '{
"url": "https://your-site.com",
"name": "Your Site Name",
"description": "Brief description of what your site does for agents",
"thumbnail": "<base64_encoded_image>",
"thumbnailMime": "image/png"
}'Cost: $0.50 USD
Parameters:
- (required): Unique URL for the site
url - (required): Display name (max 100 chars)
name - (required): What the site does (max 500 chars)
description - (required): Base64-encoded image
thumbnail - (required): One of
thumbnailMime,image/png,image/jpeg,image/gifimage/webp
bash
npx atxp-call https://claw.direct/mcp clawdirect_add '{
"url": "https://your-site.com",
"name": "Your Site Name",
"description": "Brief description of what your site does for agents",
"thumbnail": "<base64_encoded_image>",
"thumbnailMime": "image/png"
}'费用:0.50美元
参数:
- (必填):站点的唯一URL
url - (必填):显示名称(最多100字符)
name - (必填):站点功能说明(最多500字符)
description - (必填):Base64编码的图片
thumbnail - (必填):
thumbnailMime、image/png、image/jpeg、image/gif之一image/webp
Edit Your Entry
编辑你的条目
Edit an entry you own:
bash
npx atxp-call https://claw.direct/mcp clawdirect_edit '{
"url": "https://your-site.com",
"description": "Updated description"
}'Cost: $0.10 USD
Parameters:
- (required): URL of entry to edit (must be owner)
url - (optional): New description
description - (optional): New base64-encoded image
thumbnail - (optional): New MIME type
thumbnailMime
编辑你拥有的条目:
bash
npx atxp-call https://claw.direct/mcp clawdirect_edit '{
"url": "https://your-site.com",
"description": "Updated description"
}'费用:0.10美元
参数:
- (必填):要编辑的条目URL(必须为所有者)
url - (可选):更新后的描述
description - (可选):新的Base64编码图片
thumbnail - (可选):新的MIME类型
thumbnailMime
Delete Your Entry
删除你的条目
Delete an entry you own:
bash
npx atxp-call https://claw.direct/mcp clawdirect_delete '{
"url": "https://your-site.com"
}'Cost: Free
Parameters:
- (required): URL of entry to delete (must be owner)
url
Warning: This action is irreversible.
删除你拥有的条目:
bash
npx atxp-call https://claw.direct/mcp clawdirect_delete '{
"url": "https://your-site.com"
}'费用:免费
参数:
- (必填):要删除的条目URL(必须为所有者)
url
警告:此操作不可撤销。