We build custom applications 5x faster and cheaper 🚀
Book a Free Consultation
Stuck on an error? Book a 30-minute call with an engineer and get a direct fix + next steps. No pressure, no commitment.
Short answer: Build Larry as an explicit OpenClaw skill by (1) choosing an authentication model (OAuth 2.0 for per-user access or an API key/service account for server-to-server), (2) implementing Larry’s API calls and webhook handlers as an external HTTPS service the skill will call, (3) installing and configuring the skill in ClawHub with the skill’s endpoint and storing credentials securely there, and (4) keeping stateful, long-running, or high-throughput pieces (databases, queues, schedulers) outside the agent runtime. Test locally (ngrok), validate webhooks and token refresh, add detailed logging and retries, and monitor API responses and scopes to debug issues.
const express = require('express');
const fetch = require('node-fetch');
const app = express();
app.use(express.json());
app.post('/skill/larry-invoke', async (req, res) => {
<b>//</b> Validate the request came from your trusted source (compare a signature, origin, or use ClawHub-provided authentication).
const invocation = req.body;
<b>//</b> Load stored credentials (from environment or a secrets manager).
const accessToken = process.env.LARRY_ACCESS_TOKEN;
try {
<b>//</b> Call Larry's API with the access token. Replace {LARRY_API_URL} with the real endpoint.
const r = await fetch('{LARRY_API_URL}/some-resource', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ input: invocation.input })
});
const body = await r.json();
<b>//</b> Return the response shape expected by the agent/skill contract.
res.json({ ok: true, result: body });
} catch (err) {
console.error('Larry call failed', err);
res.status(500).json({ ok: false, error: 'integration_failed' });
}
});
app.listen(3000, () => {
console.log('Skill endpoint listening on :3000');
});
<b>//</b> Example token exchange (replace placeholders with real URLs and values)
curl -X POST '{LARRY_TOKEN_URL}' \
-d 'grant_type=authorization_code' \
-d 'code=AUTH_CODE' \
-d 'redirect_uri=https://your-app.example.com/oauth/callback' \
-d 'client_id=CLIENT_ID' \
-d 'client_secret=CLIENT_SECRET'
Speak one‑on‑one with a senior engineer about your no‑code app, migration goals, and budget. In just half an hour you’ll leave with clear, actionable next steps—no strings attached.
1
The client cannot open the ClawRPC socket to clawd. Fix by confirming clawd is running, that the socket path is correct and accessible to the Larry client, and by examining clawd logs and permissions (SELinux, user, ownership). Restarting clawd or matching versions often resolves the handshake failure.
const net = require('net');
const socket = '/var/run/openclaw/clawd.sock';
const c = net.createConnection({ path: socket });
c.on('connect', () => { console.log('connected'); c.end(); });
c.on('error', (err) => { console.error('connect error', err.message); process.exit(1); });
2
The "Undefined template" error means clawctl couldn't locate the template your Larry handler references during registration — usually because the handler manifest doesn’t declare the template, the template filename/path/name is wrong, or the built handler package omitted the templates. Fix by correcting the manifest, including the template files in the package, and re-running registration.
// handler.yaml manifest snippet
name: larry-handler
template: larry-invoke-template // must match template filename/key
3
Short answer: make sender and receiver agree on the protobuf version — either revert the producer to v1, upgrade the consumer to accept v2 (with migration), or insert a translation shim that converts v2->v1 before EventBus deserialization. Regenerate protobuf stubs, deploy in a rolling, version-aware way, and add runtime validation and logging for schema mismatches.
// attempt decode with v1, fallback to v2 and transform
const v1 = rootV1.lookupType('EventV1');
const v2 = rootV2.lookupType('EventV2');
try {
const msg = v1.decode(buffer);
// handle v1
} catch (e) {
// fallback to v2 then map to v1 shape
const msgV2 = v2.decode(buffer);
const msgV1 = { /* map fields from msgV2 to v1 */ };
// handle transformed msgV1
}
4
Permission denied means the claw-agent process can't access the Larry plugin file; diagnose by checking UNIX permissions, SELinux context, and Linux capabilities, then fix by correcting ownership/mode, restoring SELinux labels or granting necessary capabilities (never leave SELinux disabled in production).
sudo ls -l /usr/lib/openclaw/plugins/Larry // check owner+mode
sudo ls -Z /usr/lib/openclaw/plugins/Larry // check SELinux context
sudo getcap /usr/lib/openclaw/plugins/Larry // check file capabilities
sudo journalctl -u claw-agent | tail -n 50 // agent logs
sudo ausearch -m AVC -ts recent // SELinux denials
sudo chown root:root ...; sudo chmod 755 ...sudo restorecon -v /usr/lib/openclaw/plugins/Larry or update policy if AVCs appear.sudo setcap cap_net_bind_service+ep /usr/lib/openclaw/plugins/Larrysudo setenforce 0 only briefly to confirm SELinux is the cause, then re-enable and fix policy.This prompt helps an AI assistant understand your setup and guide you through the fix step by step, without assuming technical knowledge.
From startups to enterprises and everything in between, see for yourself our incredible impact.
Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We’ll discuss your project and provide a custom quote at no cost.Â