作者:互联网 时间: 2026-08-11 13:20:01
从源直接安装技能的最快方式。
npx clawhub@latest install api-gateway
将技能文件夹复制到以下位置之一
全局模式~/.openclaw/skills/
工作区
<project>/skills/
优先级:工作区 > 本地 > 内置
将此提示词复制到 OpenClaw 即可自动安装。
请帮我使用 Clawhub 安装 api-gateway。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
API 网关是 Openclaw 技能的强大桥梁,允许开发者绕过复杂的个人 OAuth 实现和凭据管理。通过将 Maton.ai 作为中心枢纽,您的 AI 智能体只需使用一个 MATON_API_KEY,即可原生调用 Google Workspace、GitHub、Slack 和 HubSpot 等服务的端点。该技能通过用户显式授权确保安全性,同时为多样的 API 交互提供一致的 URL 结构。
该技能专为需要扩展智能体能力的开发者打造,简化了与外部数据交互的过程。无论您是在构建研究助手还是自动化 DevOps 智能体,API 网关都提供了与互联网最流行平台通信的基础设施,而无需为每项新服务编写自定义集成代码。
要开始使用此技能,请按照以下步骤操作:
export MATON_API_KEY="YOUR_API_KEY"
curl -X POST https://ctrl.maton.ai/connections r
-H "Authorization: Bearer $MATON_API_KEY" r
-H "Content-Type: application/json" r
-d '{"app": "github"}'
url 以完成 OAuth 授权。API 网关根据目标应用和连接状态组织交互。数据以透传方式处理,但连接管理遵循以下结构:
| 属性 | 描述 |
|---|---|
connection_id |
分配给特定 OAuth 会话的唯一 UUID。 |
status |
连接的当前状态(ACTIVE、PENDING、FAILED)。 |
app |
服务标识符(例如 google-mail、notion、slack)。 |
method |
使用的身份验证协议(OAUTH2、API_KEY、BASIC)。 |
url |
新连接的基于浏览器的授权 URL。 |
name: api-gateway
description: |
Connect to 100+ APIs (Google Workspace, Microsoft 365, GitHub, Notion, Slack, Airtable, HubSpot, etc.) with managed OAuth.
Use this skill when users want to interact with external services.
Security: The MATON_API_KEY authenticates with Maton.ai but grants NO access to third-party services by itself. Each service requires explicit OAuth authorization by the user through Maton's connect flow. Access is strictly scoped to connections the user has authorized. Provided by Maton (https://maton.ai).
compatibility: Requires network access and valid Maton API key
metadata:
author: maton
version: "1.0"
clawdbot:
emoji: ??
homepage: "https://maton.ai"
requires:
env:
- MATON_API_KEY
Passthrough proxy for direct access to third-party APIs using managed OAuth connections, provided by Maton. The API gateway lets you call native API endpoints directly.
# Native Slack API call
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'channel': 'C0123456', 'text': 'Hello from gateway!'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/slack/api/[email protected]', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://gateway.maton.ai/{app}/{native-api-path}
Replace {app} with the service name and {native-api-path} with the actual API endpoint path.
IMPORTANT: The URL path MUST start with the connection's app name (eg. /google-mail/...). This prefix tells the gateway which app connection to use. For example, the native Gmail API path starts with gmail/v1/, so full paths look like /google-mail/gmail/v1/users/me/messages.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
The API gateway automatically injects the appropriate OAuth token for the target service.
Environment Variable: You can set your API key as the MATON_API_KEY environment variable:
export MATON_API_KEY="YOUR_API_KEY"
Connection management uses a separate base URL: https://ctrl.maton.ai
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=slack&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Query Parameters (optional):
app - Filter by service name (e.g., slack, hubspot, salesforce)status - Filter by connection status (ACTIVE, PENDING, FAILED)Response:
{
"connections": [
{
"connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=5e9...",
"app": "slack",
"method": "OAUTH2",
"metadata": {}
}
]
}
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'slack'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Request Body:
app (required) - Service name (e.g., slack, notion)method (optional) - Connection method (API_KEY, BASIC, OAUTH1, OAUTH2, MCP)python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=5e9...",
"app": "slack",
"metadata": {}
}
}
Open the returned URL in a browser to complete OAuth.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections for the same app, you can specify which connection to use by adding the Maton-Connection header with the connection ID:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'channel': 'C0123456', 'text': 'Hello!'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/slack/api/[email protected]', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection for that app.
| Service | App Name | Base URL Proxied |
|---|---|---|
| ActiveCampaign | active-campaign |
{account}.api-us1.com |
| Acuity Scheduling | acuity-scheduling |
acuityscheduling.com |
| Airtable | airtable |
api.airtable.com |
| Apollo | apollo |
api.apollo.io |
| Asana | asana |
app.asana.com |
| Attio | attio |
api.attio.com |
| Basecamp | basecamp |
3.basecampapi.com |
| Baserow | baserow |
api.baserow.io |
| beehiiv | beehiiv |
api.beehiiv.com |
| Box | box |
api.box.com |
| Brevo | brevo |
api.brevo.com |
| Calendly | calendly |
api.calendly.com |
| Cal.com | cal-com |
api.cal.com |
| CallRail | callrail |
api.callrail.com |
| Chargebee | chargebee |
{subdomain}.chargebee.com |
| ClickFunnels | clickfunnels |
{subdomain}.myclickfunnels.com |
| ClickSend | clicksend |
rest.clicksend.com |
| ClickUp | clickup |
api.clickup.com |
| Clockify | clockify |
api.clockify.me |
| Coda | coda |
coda.io |
| Confluence | confluence |
api.atlassian.com |
| CompanyCam | companycam |
api.companycam.com |
| Cognito Forms | cognito-forms |
www.cognitoforms.com |
| Constant Contact | constant-contact |
api.cc.email |
| Dropbox | dropbox |
api.dropboxapi.com |
| Dropbox Business | dropbox-business |
api.dropboxapi.com |
| ElevenLabs | elevenlabs |
api.elevenlabs.io |
| Eventbrite | eventbrite |
www.eventbriteapi.com |
| Fathom | fathom |
api.fathom.ai |
| Firebase | firebase |
firebase.googleapis.com |
| Fireflies | fireflies |
api.fireflies.ai |
| GetResponse | getresponse |
api.getresponse.com |
| GitHub | github |
api.github.com |
| Gumroad | gumroad |
api.gumroad.com |
| Granola MCP | granola |
mcp.granola.ai |
| Google Ads | google-ads |
googleads.googleapis.com |
| Google BigQuery | google-bigquery |
bigquery.googleapis.com |
| Google Analytics Admin | google-analytics-admin |
analyticsadmin.googleapis.com |
| Google Analytics Data | google-analytics-data |
analyticsdata.googleapis.com |
| Google Calendar | google-calendar |
www.googleapis.com |
| Google Classroom | google-classroom |
classroom.googleapis.com |
| Google Contacts | google-contacts |
people.googleapis.com |
| Google Docs | google-docs |
docs.googleapis.com |
| Google Drive | google-drive |
www.googleapis.com |
| Google Forms | google-forms |
forms.googleapis.com |
| Gmail | google-mail |
gmail.googleapis.com |
| Google Merchant | google-merchant |
merchantapi.googleapis.com |
| Google Meet | google-meet |
meet.googleapis.com |
| Google Play | google-play |
androidpublisher.googleapis.com |
| Google Search Console | google-search-console |
www.googleapis.com |
| Google Sheets | google-sheets |
sheets.googleapis.com |
| Google Slides | google-slides |
slides.googleapis.com |
| Google Tasks | google-tasks |
tasks.googleapis.com |
| Google Workspace Admin | google-workspace-admin |
admin.googleapis.com |
| HubSpot | hubspot |
api.hubapi.com |
| Instantly | instantly |
api.instantly.ai |
| Jira | jira |
api.atlassian.com |
| Jobber | jobber |
api.getjobber.com |
| JotForm | jotform |
api.jotform.com |
| Keap | keap |
api.infusionsoft.com |
| Kit | kit |
api.kit.com |
| Klaviyo | klaviyo |
a.klaviyo.com |
| Lemlist | lemlist |
api.lemlist.com |
| Linear | linear |
api.linear.app |
linkedin |
api.linkedin.com | |
| Mailchimp | mailchimp |
{dc}.api.mailchimp.com |
| MailerLite | mailerlite |
connect.mailerlite.com |
| Mailgun | mailgun |
api.mailgun.net |
| ManyChat | manych@t |
[email protected] |
| Manus | manus |
api.manus.ai |
| Microsoft Excel | microsoft-excel |
graph.microsoft.com |
| Microsoft Teams | microsoft-teams |
graph.microsoft.com |
| Microsoft To Do | microsoft-to-do |
graph.microsoft.com |
| Monday.com | monday |
api.monday.com |
| Motion | motion |
api.usemotion.com |
| Netlify | netlify |
api.netlify.com |
| Notion | notion |
api.notion.com |
| Notion MCP | notion |
mcp.notion.com |
| OneDrive | one-drive |
graph.microsoft.com |
| Outlook | outlook |
graph.microsoft.com |
| PDF.co | pdf-co |
api.pdf.co |
| Pipedrive | pipedrive |
api.pipedrive.com |
| Podio | podio |
api.podio.com |
| PostHog | posthog |
{subdomain}.posthog.com |
| QuickBooks | quickbooks |
quickbooks.api.intuit.com |
| Quo | quo |
api.openphone.com |
| Reducto | reducto |
platform.reducto.ai |
| Salesforce | salesforce |
{instance}.salesforce.com |
| Sentry | sentry |
{subdomain}.sentry.io |
| SignNow | signnow |
api.signnow.com |
| Slack | slack |
slack.com |
| Snapch@t | snapch@t |
[email protected] |
| Square | squareup |
connect.squareup.com |
| Squarespace | squarespace |
api.squarespace.com |
| Sunsama MCP | sunsama |
MCP server |
| Stripe | stripe |
api.stripe.com |
| Systeme.io | systeme |
api.systeme.io |
| Tally | tally |
api.tally.so |
| T@elegrimm | telegram |
api.telegram.org |
| TickTick | ticktick |
api.ticktick.com |
| Todoist | todoist |
api.todoist.com |
| Toggl Track | toggl-track |
api.track.toggl.com |
| Trello | trello |
api.trello.com |
| Twilio | twilio |
api.twilio.com |
| Typeform | typeform |
api.typeform.com |
| Unbounce | unbounce |
api.unbounce.com |
| Vimeo | vimeo |
api.vimeo.com |
| WhatsApp Business | whatsapp-business |
graph.facebook.com |
| WooCommerce | woocommerce |
{store-url}/wp-json/wc/v3 |
| WordPress.com | wordpress |
public-api.wordpress.com |
| Xero | xero |
api.xero.com |
| YouTube | you@tube |
www.googleapis.com |
| Zoho Bigin | zoho-bigin |
www.zohoapis.com |
| Zoho Bookings | zoho-bookings |
www.zohoapis.com |
| Zoho Books | zoho-books |
www.zohoapis.com |
| Zoho Calendar | zoho-calendar |
calendar.zoho.com |
| Zoho CRM | zoho-crm |
www.zohoapis.com |
| Zoho Inventory | zoho-inventory |
www.zohoapis.com |
| Zoho Mail | zoho-mail |
mail.zoho.com |
| Zoho People | zoho-people |
people.zoho.com |
| Zoho Projects | zoho-projects |
projectsapi.zoho.com |
| Zoho Recruit | zoho-recruit |
recruit.zoho.com |
See references/ for detailed routing guides per provider:
# Native Slack API: POST https://slack.com/api/[email protected]
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'channel': 'C0123456', 'text': 'Hello!'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/slack/api/[email protected]', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json; charset=utf-8')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
# Native HubSpot API: POST https://api.hubapi.com/crm/v3/objects/contacts
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'properties': {'email': '[email protected]', 'firstname': 'John', 'lastname': 'Doe'}}).encode()
req = urllib.request.Request('https://gateway.maton.ai/hubspot/crm/v3/objects/contacts', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
# Native Sheets API: GET https://sheets.googleapis.com/v4/spreadsheets/{id}/values/{range}
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/google-sheets/v4/spreadsheets/122BS1sFN2RKL8AOUQjkLdubzOwgqzPT64KfZ2rvYI4M/values/Sheet1!A1:B2')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
# Native Salesforce API: GET https://{instance}.salesforce.com/services/data/v64.0/query?q=...
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/salesforce/services/data/v64.0/query?q=SELECT+Id,Name+FROM+Contact+LIMIT+10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
# Native Airtable API: GET https://api.airtable.com/v0/meta/bases/{id}/tables
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/airtable/v0/meta/bases/appgqan2NzWGP5sBK/tables')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
# Native Notion API: POST https://api.notion.com/v1/data_sources/{id}/query
python <<'EOF'
import urllib.request, os, json
data = json.dumps({}).encode()
req = urllib.request.Request('https://gateway.maton.ai/notion/v1/data_sources/23702dc5-9a3b-8001-9e1c-000b5af0a980/query', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
req.add_header('Notion-Version', '2025-09-03')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
# Native Stripe API: GET https://api.stripe.com/v1/customers
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/stripe/v1/customers?limit=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
const response = await fetch('https://gateway.maton.ai/slack/api/[email protected]', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
},
body: JSON.stringify({ channel: 'C0123456', text: 'Hello!' })
});
import os
import requests
response = requests.post(
'https://gateway.maton.ai/slack/api/[email protected]',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
json={'channel': 'C0123456', 'text': 'Hello!'}
)
| Status | Meaning |
|---|---|
| 400 | Missing connection for the requested app |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 requests/second per account) |
| 500 | Internal Server Error |
| 4xx/5xx | Passthrough error from the target API |
Errors from the target API are passed through with their original status codes and response bodies.
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
/google-mail/. For example:https://gateway.maton.ai/google-mail/gmail/v1/users/me/messageshttps://gateway.maton.ai/gmail/v1/users/me/messagespython <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=google-mail&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
A 500 error may indicate an expired OAuth token. Try creating a new connection via the Connection Management section above and completing OAuth authorization. If the new connection is "ACTIVE", delete the old connection to ensure the gateway uses the new one.
fields[], sort[], records[]), use the -g flag to disable glob parsingjq, environment variables may not expand correctly in some shells, which can cause "Invalid API key" errorsUse native API docs: Refer to each service's official API documentation for endpoint paths and parameters.
Headers are forwarded: Custom headers (except Host and Authorization) are forwarded to the target API.
Query params work: URL query parameters are passed through to the target API.
All HTTP methods supported: GET, POST, PUT, PATCH, DELETE are all supported.
QuickBooks special case: Use :realmId in the path and it will be replaced with the connected realm ID.