Integrations
Connect external services like Granola, Gmail, Google Calendar, GitHub, Slack, Discord, and X to Matrix OS.
Matrix OS connects to external services through secure OAuth flows. You authorize once, then Matrix can help read, search, draft, organize, schedule, post, and summarize through connected services.
You do not need to manage API keys or developer credentials. Connect the service, then ask Matrix for the result you want.
Available Services
| Service | What your agent can do |
|---|---|
| Gmail | Read, search, send emails. List and create labels; explicitly archive or mark individual messages read. |
| Google Calendar | List, create, update events. |
| Google Drive | List, read, upload, share files. |
| GitHub | List repos, issues, PRs. Create issues. Get notifications. |
| Slack | Send messages, list channels, search, add reactions. |
| Discord | Send messages, list servers and channels. |
| Granola | Search, list, and read meeting notes, folders, transcripts, and account details. |
| X | Read profiles and recent posts, search the last seven days, and publish posts or replies with approval. |
Connecting a Service
There are two ways to connect:
From Settings
Open Settings > Integrations. You'll see all available services with a Connect button. Click it, authorize in the popup, and the connection appears automatically.
From Conversation
Tell your agent what you need:
"Connect my Gmail"
The agent will give you an authorization link. Click it, authorize, done. The agent confirms once the connection is active.
You can also label connections for multiple accounts:
"Connect my work Gmail as Work Gmail"
Using Connected Services
Once connected, just ask naturally:
"What are my unread emails?" "Create a meeting with Alice tomorrow at 3pm" "Post 'deploy complete' to #engineering in Slack" "List my open GitHub issues in myorg/myrepo"
Review important actions
Matrix is useful because it can prepare and take action, but sensitive actions should stay visible. Ask it to draft before sending, summarize before deleting, and confirm before posting when the result matters.
Service Actions Reference
Gmail
| Action | Description | Required Params |
|---|---|---|
list_messages | List emails matching a query | -- |
get_message | Read a specific email | messageId |
send_email | Send an email | to, subject, body |
search | Search emails | query |
list_labels | List email labels/folders | -- |
list_history | Read a page of mailbox changes | startHistoryId (string) |
create_label | Create a Gmail label | name |
modify_message | Add/remove labels on one message | messageId and a nonempty label change |
Optional params: query (Gmail search syntax like is:unread, from:alice), maxResults, cc.
List/search and history calls accept pageToken. Pass the returned nextPageToken
unchanged to read the next page while keeping the same filters. Gmail pages allow
1–500 results. Keep startHistoryId as a string: converting it to a JavaScript
number can lose precision. Expired history IDs require a full resync, not an empty
successful import.
For modify_message, use addLabelIds and/or removeLabelIds. Removing INBOX
archives one message; removing UNREAD marks it read. Label creation and message
changes are write actions covered by native agent approval. Empty, duplicate,
conflicting, and TRASH label changes are rejected. No batch deletion is provided.
Integration foundation, not an inbox app
These additions require a release containing the personal-brain integration foundation. Check the connected runtime's available actions before using them. This is not a complete inbox application: historical ingestion, receipt and people extraction, durable sync cursors, and scheduled jobs require additional application and worker implementation. Connecting Gmail does not enable them.
Google Calendar
| Action | Description | Required Params |
|---|---|---|
list_events | List upcoming events | -- |
create_event | Create a new event | summary, start, end |
update_event | Update an existing event | eventId |
Date params use ISO 8601 format: 2026-04-06T09:00:00Z.
Google Drive
| Action | Description | Required Params |
|---|---|---|
list_files | List files in Drive | -- |
get_file | Get file metadata | fileId |
upload_file | Upload a file | name, content |
share_file | Share a file | fileId, email |
GitHub
| Action | Description | Required Params |
|---|---|---|
list_repos | List your repositories | -- |
list_issues | List issues for a repo | repo (e.g., owner/name) |
create_issue | Create a new issue | repo, title |
list_prs | List pull requests | repo |
get_notifications | Get notifications | -- |
Slack
| Action | Description | Required Params |
|---|---|---|
send_message | Send a message to a channel | channel, text |
list_channels | List available channels | -- |
list_messages | List messages in a channel | channel |
search | Search messages | query |
react | Add emoji reaction | channel, timestamp, emoji |
Discord
| Action | Description | Required Params |
|---|---|---|
send_message | Send a message | channelId, content |
list_servers | List servers the bot is in | -- |
list_channels | List channels in a server | serverId |
list_messages | List messages in a channel | channelId |
Granola
| Action | Description | Required Params |
|---|---|---|
search_notes | Ask a natural-language question across meeting notes | query |
list_folders | List accessible meeting folders | -- |
list_notes | List meeting notes, optionally filtered by folder or time range | -- |
get_note | Read a meeting note | noteId |
get_transcript | Read a meeting transcript when available on your plan | noteId |
get_account | Read the connected account and active workspace | -- |
Granola connects through its official MCP endpoint and browser OAuth. Matrix registers a public OAuth client automatically, so you do not need an API key or developer credentials. Matrix shows only the actions supported by your connection; some search, folder, and transcript capabilities depend on your Granola plan and workspace access.
X
| Action | Description | Required Params |
|---|---|---|
get_authenticated_user | Read the connected X account profile | -- |
get_user_by_username | Read an X profile by username | username (without @) |
list_user_posts | List recent posts from an X user ID | userId |
search_recent_posts | Search X posts from the last seven days | query |
create_post | Publish a post or reply from the connected account | text; optional replyToPostId |
X connects through managed browser OAuth and the official X API v2, so you do not need an API key or developer credentials. Usernames contain up to 15 letters, numbers, or underscores and should be passed without @. Keep user and post IDs as strings so they do not lose precision.
list_user_posts accepts maxResults from 5–100. Recent search accepts 10–100 results per request; pass the returned nextToken unchanged to continue the same query. X may further limit results and publishing based on the connected account's API access.
Posts and replies require native agent approval before Matrix sends them. This integration does not expose direct messages, follows, likes, reposts, or deletion.
Reading Beyond the First Page
- Calendar and Drive accept
pageToken; continue withnextPageToken. Drive also returnsincompleteSearch, which must not be treated as a complete search. - GitHub repository, issue, pull-request, and notification lists accept
pageandper_page. Link response headers are not exposed by this increment; continue numbered pages until an empty page rather than assuming one page is all results. - Slack channel/message lists accept
cursor; continue withresponse_metadata.next_cursor. Slack search usespageandcount. - Discord server/message lists accept either
beforeorafter, pluslimit. Keep these IDs as strings, not JavaScript numbers. - X recent search accepts
nextToken; pass the returned token unchanged with the same query to continue beyond the first page.
Service actions return one provider page. Your app or worker must retain its filters and checkpoint progress. Pipedream action/account discovery separately walks SDK pages with limits of 20 pages, 2,000 entries, 10 seconds per request, and a shared 30-second deadline. A later-page failure or exceeded bound rejects the inventory; it is not reported as a complete partial list. Account discovery does not request credentials.
Multiple Accounts
You can connect multiple accounts for the same service. For example, a Work Gmail and a Personal Gmail. Use labels to differentiate:
"Send from my Work Gmail: email alice@company.com about the Q2 report"
The agent uses the label parameter to target the right account. If no label is specified, the most recently connected account is used.
Managing Connections
View connections
"What services are connected?"
Or open Settings > Integrations to see all active connections with status indicators.
Disconnect a service
"Disconnect my GitHub"
Or click Disconnect in Settings. This revokes the connection's OAuth credentials when the provider supports revocation and removes the connection from your account.
Building Apps with Integrations
Apps you build can use connected services. When the agent creates an app that needs Gmail or Slack, the platform tracks which services each app requires:
{
"name": "Morning Briefing",
"integrations": {
"required": ["gmail", "google_calendar"],
"optional": ["slack"]
}
}If a required service isn't connected, the platform tells you what's missing and how to connect it.
How It Works
User -> Shell (Settings UI / Conversation)
|
Matrix Gateway
|
Platform-owned Integration Layer
- OAuth token management
- Action execution
- Credential storage
|
External Service APIs
(Gmail API, GitHub API, Slack API, etc.)Integration provider credentials stay on the platform. Customer workspaces call the platform integration layer through scoped Matrix routes, so apps and customer VPSes do not need raw provider secrets.
Error Handling
| Error | What it means | What to do |
|---|---|---|
| "Service not connected" | The service hasn't been authorized yet | Connect it first via Settings or conversation |
| "Rate limited" (429) | Too many requests to the service | Wait and try again (the retry_after field tells you how long) |
| "Timed out" (504) | The service took too long to respond | Try again or simplify the request |
| "Service unavailable" (503) | The integration provider is temporarily unavailable | Try again in a few minutes |
| "Missing required params" (400) | The action is missing required input | Check the action reference above |
Common Workflows
Morning Briefing
"Give me my morning briefing" -- agent reads unread emails, today's calendar, and summarizes both.
Cross-Service Automation
"Summarize open GitHub issues and post to #standup in Slack" -- agent reads from GitHub, formats, and posts to Slack.
Email + Calendar
"Email alice about the meeting and add it to my calendar" -- agent sends the email and creates the event in one conversation.
Drive Sharing
"Share the Q2 report with the marketing team" -- agent finds the file in Drive and shares it with specified emails.
How is this guide?