name: matrix-integrations description: Use Matrix OS platform-owned integrations from apps or agents without exposing provider secrets on customer VPSes or inside Agent. version: 1.0.0 author: Matrix OS license: MIT platforms: [linux, macos] metadata: agent: tags: [Matrix OS, integrations, Pipedream, OAuth, platform] related_skills: [matrix-app-builder] config: - key: matrix.gateway_url description: Matrix gateway URL reachable from the Agent runtime. default: "http://localhost:4000" prompt: Matrix gateway URL
Matrix Integrations
When to Use
Use this when the user wants Gmail, Calendar, Drive, GitHub, Slack, Discord, or other external services inside Matrix.
Security Model
- Platform owns Pipedream credentials and OAuth app secrets.
- Customer VPSes should not store provider secrets.
- Agent should not store provider secrets.
- Apps call Matrix integration endpoints through Matrix auth.
- Provider names and raw upstream errors should not be exposed as client-facing error details.
Agent Flow
- Check connected services.
- If missing, start OAuth through Matrix.
- After the user finishes OAuth, sync services.
- Call the service action through Matrix.
- Store resulting app data in Matrix/Postgres if needed.
Gateway API
Default base URL inside a Matrix user instance:
http://localhost:4000
Use the configured skills.config.matrix.gateway_url if Agent injects one.
List Connected Services
curl -fsS "$MATRIX_GATEWAY_URL/api/integrations"
Start OAuth
curl -fsS "$MATRIX_GATEWAY_URL/api/integrations/connect" \
-H 'Content-Type: application/json' \
-d '{"service":"github","label":"Work GitHub"}'
Return the connect URL to the user. Do not immediately claim success.
Sync After OAuth
curl -fsS "$MATRIX_GATEWAY_URL/api/integrations/sync" \
-X POST \
-H 'Content-Type: application/json' \
-d '{}'
Call an Action
curl -fsS "$MATRIX_GATEWAY_URL/api/integrations/call" \
-H 'Content-Type: application/json' \
-d '{"service":"github","action":"list_repos","params":{"sort":"updated","per_page":10}}'
In-App Bridge
Inside a Matrix app iframe, use the injected window.MatrixOS bridge. Apps run as sandboxed
srcdoc iframes; direct fetch() calls to /api/bridge/* are blocked by the shell CORS/CSP
boundary.
async function listServices() {
if (!window.MatrixOS?.integrations) throw new Error("Matrix integrations bridge is unavailable");
return window.MatrixOS.integrations();
}
async function callService(service: string, action: string, params: unknown) {
if (!window.MatrixOS?.service) throw new Error("Matrix service bridge is unavailable");
return window.MatrixOS.service(service, action, params);
}
Common Actions
- Gmail:
list_messages,get_message,send_email,search,list_labels - Google Calendar:
list_events,create_event,update_event,delete_event - Google Drive:
list_files,get_file,upload_file,share_file - GitHub:
list_repos,list_issues,create_issue,list_prs,get_notifications - Slack:
send_message,list_channels,list_messages,search,react - Discord:
send_message,list_servers,list_channels,list_messages
Pitfalls
- Do not ask for provider API keys in chat.
- Do not put OAuth tokens in
matrix.json, app source, or Agent config. - Do not call provider APIs directly from app code unless the provider is public and unauthenticated.
- After OAuth, always sync before saying the connection failed.
- If a customer VPS lacks Pipedream env vars, that is expected. The gateway should proxy integration calls to platform.
Verification
GET /api/integrationsreturns services or an empty list, not a 404.- OAuth connect returns a URL.
- Sync works after the user authorizes.
- App code uses
window.MatrixOS.integrations()/window.MatrixOS.service(), not raw provider secrets or direct/api/bridge/*fetches.