Install
openclaw skills install @preston-thiele/danubeGoverned tool access for AI agents — one Danube API key unlocks your organization's own tools plus a large, growing catalog of services, over MCP or curl, with confirmation before anything that writes, sends, spends, or deletes.
openclaw skills install @preston-thiele/danubeDanube makes an organization's own tools — plus a large and growing catalog of ready-made services — callable by AI agents through a single API key, with permissions, spending limits, and an audit trail handled by the platform. The catalog changes constantly and includes tools the user's organization connected privately, so never assume what is available — search first.
From the dashboard: https://danubeai.com/dashboard → Settings → API Keys. Keys are opaque ~43-character tokens with no fixed prefix — don't validate their shape, just keep them secret.
Or let the user authorize this agent with the OAuth 2.0 Device Authorization flow (RFC 8628):
curl -s -X POST https://api.danubeai.com/v1/auth/device/code \
-H "Content-Type: application/json" -d '{"client_name": "OpenClaw"}'
# → {"device_code": "...", "user_code": "XXXX-XXXX", "verification_url": "...", "expires_in": ..., "interval": 5}
Tell the user to open verification_url in a browser and enter user_code. Then poll:
curl -s -X POST https://api.danubeai.com/v1/auth/device/token \
-H "Content-Type: application/json" -d '{"device_code": "DEVICE_CODE_FROM_ABOVE"}'
428 = not approved yet (poll every interval seconds) · 200 = {"api_key": "…"} · 410 = expired, start over.
Set DANUBE_API_KEY in the environment, or in openclaw.json:
{ skills: { entries: { danube: { apiKey: "YOUR_DANUBE_API_KEY" } } } }
OpenClaw has a built-in MCP client. Register Danube's server once and its tools become ordinary OpenClaw tools (search_tools, execute_tool, …):
openclaw mcp set danube '{"url":"https://mcp.danubeai.com/mcp","transport":"streamable-http","headers":{"danube-api-key":"YOUR_DANUBE_API_KEY"}}'
openclaw mcp doctor danube --probe
Use the real key value in headers (not ${DANUBE_API_KEY}). The server also speaks MCP OAuth: use "auth":"oauth" instead of headers, then openclaw mcp login danube.
curl — no MCP neededEvery capability below is also a REST call against https://api.danubeai.com/v1 with the header danube-api-key: $DANUBE_API_KEY. Copy-paste recipes: {baseDir}/references/rest-api.md.
Every task follows Explore → Inspect → (Confirm) → Execute → Report.
| Goal | MCP tool | REST |
|---|---|---|
| See what services exist | list_services(query, limit) | GET /services |
| Find a tool for a task | search_tools(query, service_id?, limit?) | GET /tools/search?query=… |
| All tools of one service | get_service_tools(service_id) | GET /services/{id}/tools |
| Full schema of one tool | returned by the calls above | GET /tools/{tool_id} |
| Run a tool | execute_tool(tool_id, parameters) | POST /tools/call/{tool_id} with {"tool_input": {…}} |
| Run up to 10 at once | batch_execute_tools(calls) | POST /tools/call/batch |
Discovery tips:
"send an email", "create a GitHub issue", "translate text"); search is semantic.required, type, enum, tips) before executing; ask the user for anything required that you don't have. Never reuse tool IDs from memory — search again.A result containing "error_type": "auth_required" means this user hasn't connected that service yet:
configuration_url in the error (or https://danubeai.com/dashboard) to connect it — the only path for OAuth services such as Gmail, Slack, or Google Calendar.store_credential(service_id, credential_type="bearer", credential_value=…), then retry.HTTP 429 with an upgrade_url means the account's plan limit is reached — tell the user; don't retry in a loop.
Available through the same connection, same guardrails:
search_skills, get_skill, create_skill, update_skill, delete_skilllist_workflows, create_workflow, update_workflow, delete_workflow, execute_workflow, get_workflow_executionget_tool_ratings, get_my_rating, submit_rating, report_tool, get_recommendations — if a tool fails or returns bad output, report_tool it so it gets fixed.get_wallet_balance, get_spending_limits, update_spending_limits, fund_agent_wallet, register_agent, get_agent_infoSomething not working? {baseDir}/references/troubleshooting.md