{
  "schemaVersion": "1.0",
  "item": {
    "slug": "self-integration",
    "name": "Self-Integration",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/bratchenko/self-integration",
    "canonicalUrl": "https://clawhub.ai/bratchenko/self-integration",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/self-integration",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=self-integration",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/self-integration"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/self-integration",
    "agentPageUrl": "https://openagent3.xyz/skills/self-integration/agent",
    "manifestUrl": "https://openagent3.xyz/skills/self-integration/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/self-integration/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Self-Integration",
        "body": "Connect to any external app and perform actions on it. Uses the Membrane API."
      },
      {
        "title": "Making API Requests",
        "body": "All requests go to ${MEMBRANE_API_URL:-https://api.getmembrane.com} with a Bearer token:\n\nAuthorization: Bearer $MEMBRANE_TOKEN\nContent-Type: application/json\n\nGet the API token from the Membrane dashboard."
      },
      {
        "title": "Step 1: Get a Connection",
        "body": "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.\n\n1a. Check for existing connections\n\nGET /connections\n\nLook for a connection matching the target app. Key fields: id, name, connectorId, disconnected.\n\nIf a matching connection exists and disconnected is false, skip to Step 2.\n\n1b. Find a connector\n\nA connector is a pre-built adapter for an external app. Search by app name:\n\nGET /search?q=slack\n\nLook for results with elementType: \"connector\". Use element.id as connectorId in step 1d.\n\nIf nothing is found, go to step 1c to build a connector.\n\n1c. Build a connector (if none exists)\n\nCreate a Membrane Agent session to build a connector:\n\nPOST /agent/sessions with body {\"prompt\": \"Build a connector for Slack (https://slack.com)\"}\n\nAdjust 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\".\n\nYou can send follow-up instructions via POST /agent/sessions/{sessionId}/message or abort via POST /agent/sessions/{sessionId}/interrupt.\n\nAfter the connector is built, search for it again (step 1b).\n\n1d. Request a connection\n\nCreate a connection request so the user can authenticate with the external app:\n\nPOST /connection-requests with body {\"connectorId\": \"cnt_abc123\"}\n\nThe response includes a url. Tell the user to open the url to complete authentication (OAuth, API key, etc.).\n\n1e. Check connection result\n\nPoll until the user completes authentication:\n\nGET /connection-requests/{requestId}\n\nstatus: \"pending\" — user hasn't completed yet, poll again.\nstatus: \"success\" — done. Use resultConnectionId as the connection ID going forward.\nstatus: \"error\" — failed. Check resultError for details."
      },
      {
        "title": "Step 2: Get an Action",
        "body": "An action is an operation you can perform on a connected app (e.g. \"Create task\", \"Send message\", \"List contacts\").\n\n2a. Search for actions\n\nSearch using a natural language description of what you want to do:\n\nGET /actions?connectionId=con_abc123&intent=send+a+message&limit=10\n\nEach result includes id, name, description, inputSchema (what parameters the action accepts), and outputSchema (what it returns).\n\nIf no suitable action exists, go to step 2b.\n\n2b. Build an action (if none exists)\n\nUse Membrane Agent. ALWAYS include the connection ID in the prompt:\n\nPOST /agent/sessions with body {\"prompt\": \"Create a tool to send a message in a channel for connection con_abc123\"}\n\nAdjust 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)."
      },
      {
        "title": "Step 3: Run an Action",
        "body": "Execute the action using the action ID from step 2 and the connection ID from step 1:\n\nPOST /actions/{actionId}/run?connectionId=con_abc123 with body {\"input\": {\"channel\": \"#general\", \"text\": \"Hello!\"}}\n\nProvide input matching the action's inputSchema.\n\nThe result is in the output field of the response."
      },
      {
        "title": "API Reference",
        "body": "Base URL: ${MEMBRANE_API_URL:-https://api.getmembrane.com}\nAuth header: Authorization: Bearer $MEMBRANE_TOKEN"
      },
      {
        "title": "GET /connections",
        "body": "List all connections.\n\nResponse:\n\n{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"name\": \"string\",\n      \"connectorId\": \"string\",\n      \"integrationId\": \"string (optional)\",\n      \"disconnected\": \"boolean\",\n      \"state\": \"NOT_CONFIGURED | SETUP_IN_PROGRESS | SETUP_FAILED | READY\",\n      \"error\": \"object (optional)\",\n      \"createdAt\": \"datetime\",\n      \"updatedAt\": \"datetime\"\n    }\n  ]\n}"
      },
      {
        "title": "GET /search",
        "body": "Search workspace elements by keyword.\n\nQuery parameters:\n\nParamTypeDescriptionqstring (required)Search query (1-200 chars)elementTypestring (optional)Filter by type: Connector, Integration, Action, etc.limitnumber (optional)Max results (1-100)\n\nResponse:\n\n{\n  \"items\": [\n    {\n      \"elementType\": \"Connector\",\n      \"element\": {\n        \"id\": \"string\",\n        \"name\": \"string\",\n        \"logoUri\": \"string (optional)\"\n      }\n    }\n  ]\n}"
      },
      {
        "title": "POST /connection-requests",
        "body": "Create a connection request for user authentication.\n\nRequest body (at least one identifier required):\n\nFieldTypeDescriptionconnectorIdstringConnector IDintegrationIdstringIntegration ID (alternative)integrationKeystringIntegration key (alternative)connectionIdstringExisting connection ID (for reconnecting)namestringCustom connection nameconnectorVersionstringConnector versionconnectorParametersobjectConnector-specific parameters\n\nResponse:\n\n{\n  \"requestId\": \"string\",\n  \"url\": \"string\",\n  \"status\": \"pending | success | cancelled | error\",\n  \"connectorId\": \"string (optional)\",\n  \"integrationId\": \"string (optional)\",\n  \"resultConnectionId\": \"string (optional, set on success)\",\n  \"resultError\": \"object (optional, set on error)\",\n  \"createdAt\": \"datetime\"\n}"
      },
      {
        "title": "GET /connection-requests/:requestId",
        "body": "Check connection request status. Same response schema as POST."
      },
      {
        "title": "GET /actions",
        "body": "List or search actions.\n\nQuery parameters:\n\nParamTypeDescriptionconnectionIdstringFilter by connectionintegrationIdstringFilter by integrationintentstringNatural language search (max 200 chars)limitnumberMax results (default 10)\n\nResponse:\n\n{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"name\": \"string\",\n      \"key\": \"string\",\n      \"description\": \"string (optional)\",\n      \"type\": \"string\",\n      \"inputSchema\": \"JSON Schema (optional)\",\n      \"outputSchema\": \"JSON Schema (optional)\",\n      \"integrationId\": \"string (optional)\",\n      \"connectionId\": \"string (optional)\"\n    }\n  ]\n}"
      },
      {
        "title": "POST /actions/:actionId/run",
        "body": "Run an action.\n\nQuery parameters:\n\nParamTypeDescriptionconnectionIdstringConnection to run the action on\n\nRequest body:\n\nFieldTypeDescriptioninputanyParameters matching the action's inputSchema\n\nResponse:\n\n{\n  \"output\": \"any\"\n}"
      },
      {
        "title": "POST /agent/sessions",
        "body": "Create an agent session to build connectors or actions.\n\nRequest body:\n\nFieldTypeDescriptionpromptstring (required)Task description\n\nResponse:\n\n{\n  \"id\": \"string\",\n  \"status\": \"queued | starting | running | completed | failed | cancelled\",\n  \"state\": \"busy | idle\",\n  \"prompt\": \"string\",\n  \"createdAt\": \"datetime\",\n  \"updatedAt\": \"datetime\"\n}"
      },
      {
        "title": "GET /agent/sessions/:id",
        "body": "Get agent session status.\n\nQuery parameters:\n\nParamTypeDescriptionwaitbooleanIf true, long-poll until session is idle or timeouttimeoutnumberMax wait in seconds (1-60, default 30)\n\nResponse: same schema as POST /agent/sessions."
      },
      {
        "title": "POST /agent/sessions/:id/message",
        "body": "Send a follow-up message to an active agent session.\n\nRequest body:\n\nFieldTypeDescriptioninputstring (required)Message to send\n\nResponse: same schema as POST /agent/sessions."
      },
      {
        "title": "POST /agent/sessions/:id/interrupt",
        "body": "Abort an agent session.\n\nResponse:\n\n{\n  \"interrupted\": \"boolean\"\n}"
      },
      {
        "title": "External Endpoints",
        "body": "All requests go to the Membrane API. No other external services are contacted directly by this skill.\n\nEndpointData Sent${MEMBRANE_API_URL:-https://api.getmembrane.com}/*API token, connection parameters, action inputs, agent prompts"
      },
      {
        "title": "Security & Privacy",
        "body": "All data is sent to the Membrane API over HTTPS.\nMEMBRANE_TOKEN is a high-privilege credential that can create connections and run actions across external apps. Treat it as a secret.\nConnection authentication (OAuth, API keys) is handled by Membrane — credentials for external apps are stored by the Membrane service, not locally.\nAction inputs and outputs pass through the Membrane API to the connected external app.\n\nBy using this skill, data is sent to Membrane. Only install if you trust Membrane with access to your connected apps."
      }
    ],
    "body": "Self-Integration\n\nConnect to any external app and perform actions on it. Uses the Membrane API.\n\nMaking API Requests\n\nAll requests go to ${MEMBRANE_API_URL:-https://api.getmembrane.com} with a Bearer token:\n\nAuthorization: Bearer $MEMBRANE_TOKEN\nContent-Type: application/json\n\n\nGet the API token from the Membrane dashboard.\n\nWorkflow\nStep 1: Get a Connection\n\nA 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.\n\n1a. Check for existing connections\n\nGET /connections\n\nLook for a connection matching the target app. Key fields: id, name, connectorId, disconnected.\n\nIf a matching connection exists and disconnected is false, skip to Step 2.\n\n1b. Find a connector\n\nA connector is a pre-built adapter for an external app. Search by app name:\n\nGET /search?q=slack\n\nLook for results with elementType: \"connector\". Use element.id as connectorId in step 1d.\n\nIf nothing is found, go to step 1c to build a connector.\n\n1c. Build a connector (if none exists)\n\nCreate a Membrane Agent session to build a connector:\n\nPOST /agent/sessions with body {\"prompt\": \"Build a connector for Slack (https://slack.com)\"}\n\nAdjust 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\".\n\nYou can send follow-up instructions via POST /agent/sessions/{sessionId}/message or abort via POST /agent/sessions/{sessionId}/interrupt.\n\nAfter the connector is built, search for it again (step 1b).\n\n1d. Request a connection\n\nCreate a connection request so the user can authenticate with the external app:\n\nPOST /connection-requests with body {\"connectorId\": \"cnt_abc123\"}\n\nThe response includes a url. Tell the user to open the url to complete authentication (OAuth, API key, etc.).\n\n1e. Check connection result\n\nPoll until the user completes authentication:\n\nGET /connection-requests/{requestId}\n\nstatus: \"pending\" — user hasn't completed yet, poll again.\nstatus: \"success\" — done. Use resultConnectionId as the connection ID going forward.\nstatus: \"error\" — failed. Check resultError for details.\nStep 2: Get an Action\n\nAn action is an operation you can perform on a connected app (e.g. \"Create task\", \"Send message\", \"List contacts\").\n\n2a. Search for actions\n\nSearch using a natural language description of what you want to do:\n\nGET /actions?connectionId=con_abc123&intent=send+a+message&limit=10\n\nEach result includes id, name, description, inputSchema (what parameters the action accepts), and outputSchema (what it returns).\n\nIf no suitable action exists, go to step 2b.\n\n2b. Build an action (if none exists)\n\nUse Membrane Agent. ALWAYS include the connection ID in the prompt:\n\nPOST /agent/sessions with body {\"prompt\": \"Create a tool to send a message in a channel for connection con_abc123\"}\n\nAdjust 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).\n\nStep 3: Run an Action\n\nExecute the action using the action ID from step 2 and the connection ID from step 1:\n\nPOST /actions/{actionId}/run?connectionId=con_abc123 with body {\"input\": {\"channel\": \"#general\", \"text\": \"Hello!\"}}\n\nProvide input matching the action's inputSchema.\n\nThe result is in the output field of the response.\n\nAPI Reference\n\nBase URL: ${MEMBRANE_API_URL:-https://api.getmembrane.com} Auth header: Authorization: Bearer $MEMBRANE_TOKEN\n\nGET /connections\n\nList all connections.\n\nResponse:\n\n{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"name\": \"string\",\n      \"connectorId\": \"string\",\n      \"integrationId\": \"string (optional)\",\n      \"disconnected\": \"boolean\",\n      \"state\": \"NOT_CONFIGURED | SETUP_IN_PROGRESS | SETUP_FAILED | READY\",\n      \"error\": \"object (optional)\",\n      \"createdAt\": \"datetime\",\n      \"updatedAt\": \"datetime\"\n    }\n  ]\n}\n\nGET /search\n\nSearch workspace elements by keyword.\n\nQuery parameters:\n\nParam\tType\tDescription\nq\tstring (required)\tSearch query (1-200 chars)\nelementType\tstring (optional)\tFilter by type: Connector, Integration, Action, etc.\nlimit\tnumber (optional)\tMax results (1-100)\n\nResponse:\n\n{\n  \"items\": [\n    {\n      \"elementType\": \"Connector\",\n      \"element\": {\n        \"id\": \"string\",\n        \"name\": \"string\",\n        \"logoUri\": \"string (optional)\"\n      }\n    }\n  ]\n}\n\nPOST /connection-requests\n\nCreate a connection request for user authentication.\n\nRequest body (at least one identifier required):\n\nField\tType\tDescription\nconnectorId\tstring\tConnector ID\nintegrationId\tstring\tIntegration ID (alternative)\nintegrationKey\tstring\tIntegration key (alternative)\nconnectionId\tstring\tExisting connection ID (for reconnecting)\nname\tstring\tCustom connection name\nconnectorVersion\tstring\tConnector version\nconnectorParameters\tobject\tConnector-specific parameters\n\nResponse:\n\n{\n  \"requestId\": \"string\",\n  \"url\": \"string\",\n  \"status\": \"pending | success | cancelled | error\",\n  \"connectorId\": \"string (optional)\",\n  \"integrationId\": \"string (optional)\",\n  \"resultConnectionId\": \"string (optional, set on success)\",\n  \"resultError\": \"object (optional, set on error)\",\n  \"createdAt\": \"datetime\"\n}\n\nGET /connection-requests/:requestId\n\nCheck connection request status. Same response schema as POST.\n\nGET /actions\n\nList or search actions.\n\nQuery parameters:\n\nParam\tType\tDescription\nconnectionId\tstring\tFilter by connection\nintegrationId\tstring\tFilter by integration\nintent\tstring\tNatural language search (max 200 chars)\nlimit\tnumber\tMax results (default 10)\n\nResponse:\n\n{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"name\": \"string\",\n      \"key\": \"string\",\n      \"description\": \"string (optional)\",\n      \"type\": \"string\",\n      \"inputSchema\": \"JSON Schema (optional)\",\n      \"outputSchema\": \"JSON Schema (optional)\",\n      \"integrationId\": \"string (optional)\",\n      \"connectionId\": \"string (optional)\"\n    }\n  ]\n}\n\nPOST /actions/:actionId/run\n\nRun an action.\n\nQuery parameters:\n\nParam\tType\tDescription\nconnectionId\tstring\tConnection to run the action on\n\nRequest body:\n\nField\tType\tDescription\ninput\tany\tParameters matching the action's inputSchema\n\nResponse:\n\n{\n  \"output\": \"any\"\n}\n\nPOST /agent/sessions\n\nCreate an agent session to build connectors or actions.\n\nRequest body:\n\nField\tType\tDescription\nprompt\tstring (required)\tTask description\n\nResponse:\n\n{\n  \"id\": \"string\",\n  \"status\": \"queued | starting | running | completed | failed | cancelled\",\n  \"state\": \"busy | idle\",\n  \"prompt\": \"string\",\n  \"createdAt\": \"datetime\",\n  \"updatedAt\": \"datetime\"\n}\n\nGET /agent/sessions/:id\n\nGet agent session status.\n\nQuery parameters:\n\nParam\tType\tDescription\nwait\tboolean\tIf true, long-poll until session is idle or timeout\ntimeout\tnumber\tMax wait in seconds (1-60, default 30)\n\nResponse: same schema as POST /agent/sessions.\n\nPOST /agent/sessions/:id/message\n\nSend a follow-up message to an active agent session.\n\nRequest body:\n\nField\tType\tDescription\ninput\tstring (required)\tMessage to send\n\nResponse: same schema as POST /agent/sessions.\n\nPOST /agent/sessions/:id/interrupt\n\nAbort an agent session.\n\nResponse:\n\n{\n  \"interrupted\": \"boolean\"\n}\n\nExternal Endpoints\n\nAll requests go to the Membrane API. No other external services are contacted directly by this skill.\n\nEndpoint\tData Sent\n${MEMBRANE_API_URL:-https://api.getmembrane.com}/*\tAPI token, connection parameters, action inputs, agent prompts\nSecurity & Privacy\nAll data is sent to the Membrane API over HTTPS.\nMEMBRANE_TOKEN is a high-privilege credential that can create connections and run actions across external apps. Treat it as a secret.\nConnection authentication (OAuth, API keys) is handled by Membrane — credentials for external apps are stored by the Membrane service, not locally.\nAction inputs and outputs pass through the Membrane API to the connected external app.\n\nBy using this skill, data is sent to Membrane. Only install if you trust Membrane with access to your connected apps."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/bratchenko/self-integration",
    "publisherUrl": "https://clawhub.ai/bratchenko/self-integration",
    "owner": "bratchenko",
    "version": "1.1.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/self-integration",
    "downloadUrl": "https://openagent3.xyz/downloads/self-integration",
    "agentUrl": "https://openagent3.xyz/skills/self-integration/agent",
    "manifestUrl": "https://openagent3.xyz/skills/self-integration/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/self-integration/agent.md"
  }
}