self-integrationConnect to any external app and perform actions on it. Use when the user wants to interact with external services like Slack, Linear, HubSpot, Salesforce, Jira, GitHub, Google Sheets, or any other app β send messages, create tasks, sync data, manage contacts, or perform any API operation.
Install via ClawdBot CLI:
clawdbot install bratchenko/self-integrationConnect to any external app and perform actions on it. Uses the Membrane API.
All requests go to ${MEMBRANE_API_URL:-https://api.getmembrane.com} with a Bearer token:
Authorization: Bearer $MEMBRANE_TOKEN
Content-Type: application/json
Get the API token from the Membrane dashboard.
A connection is an authenticated link to an external app (e.g. a user's Slack workspace, a HubSpot account). You need one before you can run actions.
GET /connections
Look for a connection matching the target app. Key fields: id, name, connectorId, disconnected.
If a matching connection exists and disconnected is false, skip to Step 2.
A connector is a pre-built adapter for an external app. Search by app name:
GET /search?q=slack
Look for results with elementType: "connector". Use element.id as connectorId in step 1d.
If nothing is found, go to step 1c to build a connector.
Create a Membrane Agent session to build a connector:
POST /agent/sessions with body {"prompt": "Build a connector for Slack (https://slack.com)"}
Adjust the prompt to describe the actual app you need. Poll GET /agent/sessions/{sessionId}?wait=true&timeout=30 until state is "idle" or status is "completed".
You can send follow-up instructions via POST /agent/sessions/{sessionId}/message or abort via POST /agent/sessions/{sessionId}/interrupt.
After the connector is built, search for it again (step 1b).
Create a connection request so the user can authenticate with the external app:
POST /connection-requests with body {"connectorId": "cnt_abc123"}
The response includes a url. Tell the user to open the url to complete authentication (OAuth, API key, etc.).
Poll until the user completes authentication:
GET /connection-requests/{requestId}
status: "pending" β user hasn't completed yet, poll again.status: "success" β done. Use resultConnectionId as the connection ID going forward.status: "error" β failed. Check resultError for details.An action is an operation you can perform on a connected app (e.g. "Create task", "Send message", "List contacts").
Search using a natural language description of what you want to do:
GET /actions?connectionId=con_abc123&intent=send+a+message&limit=10
Each result includes id, name, description, inputSchema (what parameters the action accepts), and outputSchema (what it returns).
If no suitable action exists, go to step 2b.
Use Membrane Agent. ALWAYS include the connection ID in the prompt:
POST /agent/sessions with body {"prompt": "Create a tool to send a message in a channel for connection con_abc123"}
Adjust the prompt to describe the actual action you need. Poll for completion the same way as step 1c. After the action is built, search for it again (step 2a).
Execute the action using the action ID from step 2 and the connection ID from step 1:
POST /actions/{actionId}/run?connectionId=con_abc123 with body {"input": {"channel": "#general", "text": "Hello!"}}
Provide input matching the action's inputSchema.
The result is in the output field of the response.
Base URL: ${MEMBRANE_API_URL:-https://api.getmembrane.com}
Auth header: Authorization: Bearer $MEMBRANE_TOKEN
List all connections.
Response:
{
"items": [
{
"id": "string",
"name": "string",
"connectorId": "string",
"integrationId": "string (optional)",
"disconnected": "boolean",
"state": "NOT_CONFIGURED | SETUP_IN_PROGRESS | SETUP_FAILED | READY",
"error": "object (optional)",
"createdAt": "datetime",
"updatedAt": "datetime"
}
]
}
Search workspace elements by keyword.
Query parameters:
| Param | Type | Description |
|---|---|---|
| q | string (required) | Search query (1-200 chars) |
| elementType | string (optional) | Filter by type: Connector, Integration, Action, etc. |
| limit | number (optional) | Max results (1-100) |
Response:
{
"items": [
{
"elementType": "Connector",
"element": {
"id": "string",
"name": "string",
"logoUri": "string (optional)"
}
}
]
}
Create a connection request for user authentication.
Request body (at least one identifier required):
| Field | Type | Description |
|---|---|---|
| connectorId | string | Connector ID |
| integrationId | string | Integration ID (alternative) |
| integrationKey | string | Integration key (alternative) |
| connectionId | string | Existing connection ID (for reconnecting) |
| name | string | Custom connection name |
| connectorVersion | string | Connector version |
| connectorParameters | object | Connector-specific parameters |
Response:
{
"requestId": "string",
"url": "string",
"status": "pending | success | cancelled | error",
"connectorId": "string (optional)",
"integrationId": "string (optional)",
"resultConnectionId": "string (optional, set on success)",
"resultError": "object (optional, set on error)",
"createdAt": "datetime"
}
Check connection request status. Same response schema as POST.
List or search actions.
Query parameters:
| Param | Type | Description |
|---|---|---|
| connectionId | string | Filter by connection |
| integrationId | string | Filter by integration |
| intent | string | Natural language search (max 200 chars) |
| limit | number | Max results (default 10) |
Response:
{
"items": [
{
"id": "string",
"name": "string",
"key": "string",
"description": "string (optional)",
"type": "string",
"inputSchema": "JSON Schema (optional)",
"outputSchema": "JSON Schema (optional)",
"integrationId": "string (optional)",
"connectionId": "string (optional)"
}
]
}
Run an action.
Query parameters:
| Param | Type | Description |
|---|---|---|
| connectionId | string | Connection to run the action on |
Request body:
| Field | Type | Description |
|---|---|---|
| input | any | Parameters matching the action's inputSchema |
Response:
{
"output": "any"
}
Create an agent session to build connectors or actions.
Request body:
| Field | Type | Description |
|---|---|---|
| prompt | string (required) | Task description |
Response:
{
"id": "string",
"status": "queued | starting | running | completed | failed | cancelled",
"state": "busy | idle",
"prompt": "string",
"createdAt": "datetime",
"updatedAt": "datetime"
}
Get agent session status.
Query parameters:
| Param | Type | Description |
|---|---|---|
| wait | boolean | If true, long-poll until session is idle or timeout |
| timeout | number | Max wait in seconds (1-60, default 30) |
Response: same schema as POST /agent/sessions.
Send a follow-up message to an active agent session.
Request body:
| Field | Type | Description |
|---|---|---|
| input | string (required) | Message to send |
Response: same schema as POST /agent/sessions.
Abort an agent session.
Response:
{
"interrupted": "boolean"
}
All requests go to the Membrane API. No other external services are contacted directly by this skill.
| Endpoint | Data Sent |
|---|---|
| ${MEMBRANE_API_URL:-https://api.getmembrane.com}/* | API token, connection parameters, action inputs, agent prompts |
MEMBRANE_TOKEN is a high-privilege credential that can create connections and run actions across external apps. Treat it as a secret.By using this skill, data is sent to Membrane. Only install if you trust Membrane with access to your connected apps.
AI Usage Analysis
Analysis is being generated⦠refresh in a few seconds.
iMessage/SMS CLI for listing chats, history, watch, and sending.
Use when you need to control Discord from Clawdbot via the discord tool: send messages, react, post or upload stickers, upload emojis, run polls, manage threads/pins/search, fetch permissions or member/role/channel info, or handle moderation actions in Discord DMs or channels.
Use when you need to control Slack from Clawdbot via the slack tool, including reacting to messages or pinning/unpinning items in Slack channels or DMs.
Send WhatsApp messages to other people or search/sync WhatsApp history via the wacli CLI (not for normal user chats).
Build or update the BlueBubbles external channel plugin for Clawdbot (extension package, REST send/probe, webhook inbound).
OpenClaw skill for designing Telegram Bot API workflows and command-driven conversations using direct HTTPS requests (no SDKs).