Agent Connectors
A connector gives the agent the ability to act in the outside world: send email, send SMS, read Shopify orders, add calendar events. Every service you connect adds new tools to the agent's toolset — and every tool call passes through the policy engine.
First, a clarification: there are two kinds of connector
The word "connector" appears on two different screens in SemAgent. Confusing them is the most common mistake.
| Data Sources | Agent Connectors | |
|---|---|---|
| Screen | /settings/connectors | /settings/agent-connectors |
| Purpose | Feeds the knowledge base (read-only → embed) | Gives the agent the ability to act |
| Example | SQL, Drive, OneDrive, OneNote, Notion | SMTP, Twilio, Shopify Admin, WhatsApp |
| Risk | Reading | Writing/sending → approval required |
| Its docs | Data Sources | This page |
There is a third screen too: Social media connectors (/settings/social-connectors) — a separate system behind its own flag.
How to connect a service
- Open Admin panel → Settings → Connectors. Cards are split into Featured and More tabs.
- Click a card. The dialog shows the service description, the tools it will unlock, setup notes and the required fields.
- Fill in the fields and press Connect. Credentials are written, encrypted, to the Agent Vault.
- Press Test to verify it live. Tests have no side effects — the SMTP test, for instance, connects and authenticates but does not send mail.
A connected card gets a green Connected badge. You can later update fields via Reconfigure, or remove it with Disconnect.
Multiple accounts on the same service
You are not stuck with one account per service. You can connect several accounts to the same connector and give each one a nickname — e.g. "Main Account", "Accounting". You use that name when you talk to the agent:
List this week's orders using the Main Account accountTools take an account parameter for this (account="Main Account"); the agent matches the nickname itself.
If it's ambiguous, the agent doesn't guess — it asks. When more than one account on the same service is enabled and you haven't said which one to use, the agent does not pick one at random; it asks you which account you meant. If you'd rather it didn't ask, mark one account as default — that one is used automatically whenever it's ambiguous.
Your existing connection isn't lost — it becomes account #1. A connection you set up before multiple accounts existed stays exactly where it is, and it doesn't wait for you to add a second account: the moment you open that service's card in Connectors it is already sitting first in the Accounts list, carrying the "existing" badge and the default star. This applies to every connector — Gmail, Google Drive, Drive Upload, Shopify Admin, Etsy, SMTP, WhatsApp, SMS… — not just the one service you happened to add an account to. So anything you run without naming an account keeps working exactly as before. It behaves like any other account: you can rename, disable or edit it.
Where does the inherited account's name come from? It is derived from the connection's real identity: an email address, a store domain, and so on. If there is no identity to derive one from, it is named after the service ("Existing Google"); if the identity is nothing but a number, the service name is prefixed ("Etsy 63288487"). The name isn't fixed — change it to whatever you like with the inline pencil; the agent uses the name you give it.
A Gmail connection made with your own OAuth app is detected as well — an app password or IMAP is not required for it to be carried over.
What it looks like in the panel
On the Connectors screen each service is a single card, and inside it sits the list of accounts connected to that service. Every row has:
- Nickname — the name you say to the agent.
- Credentials entered badge — are this account's credentials in the Vault?
- "existing" badge — a connection carried over from before multiple accounts (see the note above).
- Default star — the account used when the request is ambiguous.
- Enable / disable — takes an account out of play without deleting it; a disabled account is invisible to the agent.
- Edit (pencil) — changes the name and credentials of that one account.
- Delete — removes the account record.
To add one, use Add account inside the card: type the nickname, fill in the service's fields, verify it live with Test.
Why inline editing? The card-level Reconfigure button was ambiguous once several accounts existed — it wasn't clear which one it changed. So every account now has its own pencil, and an edit always applies to exactly one account.
The add-account form: every field is explained
The form shows a label plus an explanation, not raw technical key names (like drive_oauth_client_id): which value is wanted, where to get it and the expected format. Example — a Google Drive (read) account:
- What's wanted is the full contents of the service-account JSON file — not a file path and not an email address. It's a multi-line field and the content starts with
{. - On a personal Drive you must share the folder you want read with the
client_emailaddress found inside that JSON; an unshared folder is invisible to the service account.
For Drive Upload you don't generate the refresh token yourself. On a Google Drive Upload (drive.file) account, save the Client ID + Client Secret, then press "Connect with Google (for this account)" on that account's row — the token is generated and written to that account. The refresh token field is optional; you can leave it empty.
Which services support it?
| Service | Example use |
|---|---|
| Email (SMTP) | Different sender addresses (support@ / billing@) |
| Gmail (IMAP + SMTP) | Several Gmail mailboxes |
| Google Drive (read) | Files across different Google accounts |
| Google Drive Upload (write) | A separate Drive archive per brand |
| Shopify (Admin API) | Several stores |
Vault-token services (like Printify and Notion) already supported multiple identities: store the secrets in the Vault under different names and tell the agent which one to use by its auth_secret name.
Credentials still live in the Agent Vault, encrypted with Fernet. The account record only holds the name and state — no tokens, no passwords.
Connection types
Every connector has a connection type. It determines what happens behind the scenes and what counts as "connected".
| Type | What connecting does | Its test |
|---|---|---|
mcp | Registers an MCP server; its domain is added to the egress list automatically | Connects and lists the tools |
rest | Adds the service domain to egress, stores the token in the Vault | A read-only ping request |
oauth_google | Adds googleapis.com to egress; stores an OAuth token or service-account JSON | Asks Google whether the token is valid |
smtp | Stores six SMTP fields as separate Vault secrets | Connect + authenticate (sends no mail) |
fields | Each required field becomes its own Vault secret | Service-specific verification |
whatsapp_qr | Pairs with your phone via QR code | Live session status |
guide | Nothing — no automatic connection yet (see below) | — |
Connectors you can connect today
The following are working — you can connect and test them from the panel. The "Tools unlocked" column lists what the agent can use afterwards.
E-commerce
| Service | Type | Fields you provide | Tools unlocked |
|---|---|---|---|
| Shopify | mcp | Store domain (store.myshopify.com) | MCP tools (listed by Test) |
| Shopify (Admin API) | fields | Store domain · Client ID · Client Secret | shopify_query, shopify_mutation |
| Printify | rest | Printify API token | http_request, data_aggregate |
| Etsy | rest | Etsy API key (keystring) | http_request, data_aggregate |
- How do I connect Shopify? Enter your store domain (
store.myshopify.com) and press Connect. Storefront MCP tools unlock — catalog search, read-only. - How do I connect Shopify (Admin API)? Enter the store domain, Client ID and Client Secret. The
shopify_query(read) andshopify_mutation(write) tools unlock. - How do I connect Printify? Enter your Printify API token. The agent reaches the Printify API through
http_request(products, shops, orders). - How do I connect Etsy? Enter your Etsy API keystring. That's enough for reading; writing on behalf of a shop additionally requires OAuth.
Shopify has two separate cards. Shopify (Storefront MCP) is catalog search — read-only. For write operations such as creating products, connect the Shopify (Admin API) card.
Shopify Admin: static tokens are gone. Shopify removed the legacy custom-app token on 1 January 2026. Create an app in the Dev Dashboard and enter its Client ID + Secret; a short-lived token is fetched automatically. No App Store review is needed for your own store — but the app and the store must live in the same Shopify organization, otherwise the test returns a clear error.
Messaging
| Service | Type | Fields you provide | Tools unlocked |
|---|---|---|---|
| Email (SMTP) | smtp | Host · Port · User · Password · From address · Display name (opt.) | email_send |
| SMS (Twilio) | fields | Account SID · Auth Token · From number | sms_send, call_make |
| SMS (NetGSM) | fields | User code · Password · Message header | sms_send |
| WhatsApp Business (official) | fields | Phone Number ID · Access token | whatsapp_send |
| WhatsApp (QR session) | whatsapp_qr | — (scan a QR from your phone) | whatsapp_qr_send |
- How do I connect Email (SMTP)? Enter the SMTP host, port, username, password and from address. The agent can then send email with
email_send. - How do I connect SMS (Twilio)? Enter the Account SID, Auth Token and the sender number you bought from Twilio.
sms_sendandcall_makeunlock. - How do I connect SMS (NetGSM)? Enter your NetGSM user code, password and your approved message header.
sms_sendunlocks. - How do I connect WhatsApp Business (official)? Enter the Phone Number ID from your Meta app and a permanent (system-user) access token.
whatsapp_sendunlocks. - How do I connect WhatsApp (QR session)? Generate a QR on the card and scan it from your phone.
whatsapp_qr_sendunlocks.
SMTP: with Gmail you must enable 2-Step Verification and generate an App Password; your normal account password will not work.
NetGSM: the message header must be approved on the NetGSM side. The test verifies your credentials against the balance endpoint.
Twilio: the same account powers both sms_send and call_make. Voice calling is the highest-risk channel and always requires approval.
WhatsApp: two paths, very different consequences
Official (Cloud API): requires Meta Business verification, a WhatsApp number, and an approved template for business-initiated messages. Verification can take weeks — start early. The 24-hour rule: if the customer wrote to you, free-form text is allowed; if you start the conversation, an approved template is mandatory.
QR session: on your phone, open WhatsApp → Settings → Linked Devices → Link a Device and scan the QR. The code refreshes roughly every 20 seconds and connects automatically once scanned.
The QR session is not official. It uses a WhatsApp Web session and violates the WhatsApp Terms of Service. If automation is detected, your number can be banned. Use it for low-volume, in-platform experiments; for critical workflows, prefer the official Cloud API.
| Service | Type | Fields you provide | Tools unlocked |
|---|---|---|---|
| Google Drive | oauth_google | OAuth access token or service-account JSON | drive_read, http_request |
| Google Drive Upload (drive.file) | fields | Client ID · Client Secret · Refresh token (optional — generated in one click). Scope: drive.file only | drive_upload |
| Google Calendar | oauth_google | OAuth access token or service-account JSON | calendar_list_events, calendar_create_event |
| Google Calendar (your own OAuth) | fields | Client ID · Client Secret · Refresh token | + calendar_delete_event |
| Gmail (IMAP + SMTP) | fields | Gmail address · App password (16 chars) | gmail_search, gmail_read, gmail_delete, gmail_forward, email_send |
| Gmail (your own OAuth) | fields | Client ID · Client Secret · Refresh token | gmail_search, gmail_read, gmail_delete, gmail_forward |
| Gmail (central OAuth) | guide | 🕓 Coming soon — not usable yet | |
- How do I connect Google Drive? Paste your OAuth access token or your service-account JSON.
drive_readunlocks. - How do I connect Google Drive Upload (drive.file)? Create an OAuth client in your own Google Cloud project (BYOC), save the Client ID + Client Secret, then press "Connect with Google (for this account)" on the account's row and approve the
drive.filepermission — the refresh token is generated and written to that account, so you don't have to produce one by hand (the field is optional).drive_uploadunlocks — putting email attachments and files the agent generated into Drive requires this connection. - How do I connect Google Calendar? Enter an OAuth access token or a service-account JSON.
calendar_list_eventsandcalendar_create_eventunlock. - How do I connect Google Calendar (your own OAuth)? Create an OAuth client in your own Google Cloud project and enter the Client ID, Client Secret and a refresh token with the
calendar.eventsscope. Events that send invitations are created through this. - How do I connect Gmail (IMAP + SMTP)? Enter your Gmail address and a 16-character app password.
gmail_search,gmail_read,gmail_delete,gmail_forwardandemail_sendunlock. - How do I connect Gmail (your own OAuth)? Enter the Client ID, Client Secret and a refresh token with the
gmail.modifyscope. - How do I connect Gmail (central OAuth)? You cannot — this card is "Coming soon".
Reading and writing Drive are two separate cards. Reading lives on the Google Drive card (drive_read); writing lives on the Google Drive Upload (drive.file) card (drive_upload). The write surface is deliberately minimal: on the drive.file scope the agent reaches only the files and folders it created itself — not your whole Drive. If it needs to write into a folder you created by hand, either let the agent build the folder tree, or put an identity with the full drive scope into the Vault.
One Gmail method at a time. The IMAP and your own OAuth cards cannot be used together. Remove the existing one before connecting the other — the panel warns you as well.
Why is there no central "Sign in with Google"? Reading Gmail falls under Google's restricted scope class, which requires the platform to pass a paid annual CASA security audit. Until that lands, two alternatives work today: IMAP (app password) or your own OAuth app. Sending email already works over SMTP.
The calendar-invite trap. Events created with a service account cannot send invitations (a Google rule: it requires Workspace + Domain-Wide Delegation). If you want attendees to receive an invite email, connect the Google Calendar (your own OAuth) card. While it is connected, events with attendees are created through it; otherwise the event is created without invitations.
The Google Calendar card also has a default calendar (calendar_id) field. The agent uses this calendar when you ask "what's on my calendar". On a personal Gmail account: the calendar address you shared with the service account. Leave it blank and the service account's own empty calendar is used.
Productivity
| Service | Type | Fields you provide | Tools unlocked |
|---|---|---|---|
| Notion | rest | Internal integration token | http_request, data_aggregate |
How do I connect Notion? Create an internal integration in Notion, paste the token, then share the relevant pages with that integration — unshared pages are invisible to the API.
Where to get each credential (step by step)
The token / key each connector asks for is issued from that service's own console. Below are the source steps for the real, connectable connectors.
Shopify (Admin API) — Client ID + Secret
- Go to the Shopify Dev Dashboard → Create app (in the same Shopify organization as your store).
- From the app's Settings / Client credentials, copy the Client ID and Client secret.
- In SemAgent's Shopify (Admin API) card, enter store domain + Client ID + Client Secret. The system fetches a short-lived token automatically (Client Credentials Grant); no App Store review is needed for your own store.
Note: the customer widget uses a separate connection for live data (OAuth or Client Credentials) — see Shopify & e-commerce.
Printify — API token
- Sign in at printify.com → My Profile → Connections.
- Click Generate to create a Personal Access Token and copy it.
- Paste it into SemAgent's Printify card. Docs: developers.printify.com.
Etsy — API keystring
- Etsy Developers → Create a New App.
- Copy the Keystring from the app page (enough for reading; writing on behalf of a shop additionally requires OAuth2).
- Enter it in SemAgent's Etsy card.
Notion — Internal Integration Token
- notion.so/my-integrations → New integration.
- Copy the Internal Integration Token (
secret_…/ntn_…). - Share the pages you want it to reach via ••• → Connections in Notion, then enter the token in SemAgent.
SMS/Voice (Twilio) — Account SID + Auth Token + number
- Sign in to the Twilio Console → the dashboard shows your Account SID and Auth Token (reveal the token with "Show").
- Phone Numbers → Buy a number with SMS/voice capability — that's your "from" number.
- Enter all three in SemAgent's SMS (Twilio) card. Docs: twilio.com/docs/sms.
SMS (NetGSM) — user code + password + header
- Sign in to your NetGSM account. Your user code (subscriber number) and API password are in the panel/account settings (define a separate API password if needed).
- Make sure the message header you'll send from (e.g.
COMPANYNAME) is approved in NetGSM — SMS won't go out with an unapproved header. - Enter all three in SemAgent's SMS (NetGSM) card. Docs: netgsm.com.tr/dokuman.
WhatsApp Business (official) — Phone Number ID + token
- Create an app on Meta for Developers → add the WhatsApp product.
- On the API Setup screen, copy the numeric Phone Number ID.
- For lasting access, create a System User and generate a permanent token with the
whatsapp_business_messagingpermission (temporary tokens expire in 24h). - Meta Business verification + (for business-initiated messages) an approved template are required — this can take weeks, start early. Guide: Cloud API get started.
Google (Drive/Calendar/Gmail — your own OAuth) — refresh token
- Google Cloud Console → Enable the relevant API (Gmail / Google Calendar / Drive).
- Credentials → Create credentials → OAuth client ID to create an OAuth 2.0 client; note the Client ID + Secret.
- OAuth Playground → gear → "Use your own OAuth credentials" → enter Client ID/Secret → pick the scope you need (
gmail.modify/calendar.events/drive.readonly) → Authorize → Exchange authorization code for tokens → copy the returned refresh token. - Drive Upload doesn't need this step: save the Client ID + Secret and press "Connect with Google (for this account)" on the account's row; the
drive.file-scoped token is generated for you. - Enter Client ID + Secret + refresh token in the matching SemAgent card. In "Testing" mode no CASA is required (100 users / 7-day token limit).
Gmail (IMAP) — app password
- Google Account → Security → enable 2-Step Verification (required).
- In the same area, App passwords → create a new one → copy the 16-character password.
- Enter your Gmail address + this 16-char password in SemAgent's Gmail (IMAP + SMTP) card (your normal account password won't work).
Social media credentials (Apify token, Reddit app, WoopSocial/Ayrshare/fal/Higgsfield keys) live on a separate screen with their own step-by-step guides: Social media connectors.
Connectors marked "Coming soon"
Some cards in the catalog carry a Coming soon badge. These do not auto-connect: instead of a Connect button you get an explanation. A card being visible does not mean it can be connected.
Concretely: Slack cannot be connected, Meta Ads cannot be connected, Google Ads cannot be connected, Microsoft 365 cannot be connected, Canva cannot be connected, Stripe cannot be connected. All of them are "Coming soon".
The full list of services marked "Coming soon" (none of them auto-connect): Gmail (central OAuth), Canva, Higgsfield, Meta (Facebook/Instagram), Meta Ads, Google Ads, Microsoft 365, Slack, Stripe, Cloudflare, Klaviyo, Hugging Face, Twilio (generic card), Booking.com, Turkish Airlines, Kiwi.com, Uber, Trivago, GoDaddy, Mercury, PDF Viewer, Control Chrome, Apify, Blender, Autodesk Fusion, ElevenLabs. The first six are listed on the Featured tab, the rest on More.
Can you still use them? Yes — by approving
Here is how to use a "Coming soon" service today:
- Add the service's API key to the Agent Vault (e.g.
slack_token). - Tell the agent what you want. It calls the service through the general-purpose
http_requesttool, referring to the secret by name. - Because the target domain is not on your egress list, the request is not blocked — it goes to approval. Approve the card and it runs.
That approval is a security feature and cannot be switched off. Even the pre-authorized tools list (auto-approve) does not skip approval for off-allow-list targets. Details: Security architecture.
The egress allow-list: domain permissions
The domains your agent may reach are kept in a per-tenant egress list. It fills up in two ways:
- When you connect a catalog connector — the service's domain is added automatically (catalog entries are pre-vetted).
- When you save the WoopSocial social connector —
api.woopsocial.comis added automatically.
Beyond that, there is no tenant screen for adding domains by hand; extra domains are defined by the platform administrator.
For a target that is not on the list, behaviour differs by layer — don't conflate them:
| Where | What happens to an off-list target |
|---|---|
Tool call (http_request etc.) | Approval Not blocked — raised as an approval card |
| Adding an MCP server | Rejected Not saved; returns an error |
Disconnecting
What happens on disconnect depends on the type — especially for secrets:
smtpandfields→ the field secrets are deleted from the Vault.mcp→ the MCP server registration is removed.restandoauth_google→ the domain leaves the egress list, but the token stays in the Vault. Delete it manually from the Vault if you want it gone.
If a connector will not show as "Connected": for rest and oauth_google the domain must be on the egress list and the token must exist in the Vault. For fields, every required field must be filled.
SemAgent