Settings tools
Integrations and webhooks — browse/list/test the org's connected integrations (read-only; never exposes credentials), and manage incoming & outgoing webhooks (provision incoming webhook URLs to wire into a Webhook Trigger node; manage outgoing event subscriptions).
20 tools. Each is callable over MCP with a Bearer agx_ key that holds the required scope. The catalog is public (tools/list isn't scope-filtered); the scope below is enforced when the tool is called (tools/call) — a key without it is refused (default-deny).
get_incoming_webhook
Get one incoming webhook by id, including used_by (the active workflows whose webhook_trigger node binds it). No secret. Requires webhooks:read.
Required scope: webhooks:read
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | ✓ |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_incoming_webhook",
"arguments": {
"webhook_id": "\u2026"
}
}
}
get_incoming_webhook_logs
Recent request logs for an incoming webhook. Filters: status, limit. Requires webhooks:read.
Required scope: webhooks:read
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | ✓ | |
status | string | received | processed | failed | ignored. | |
limit | integer |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_incoming_webhook_logs",
"arguments": {
"webhook_id": "\u2026"
}
}
}
get_integration
Get one connected integration by id (type, name, flags, and which config fields are set — never their values). Requires integrations:read.
Required scope: integrations:read
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
integration_id | string | ✓ |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_integration",
"arguments": {
"integration_id": "\u2026"
}
}
}
get_integration_connect_link
Get a browser deep-link to connect a provider whose setup happens in the browser — OAuth or one-click Quick-Connect (google_ads/meta_ads/zoho_crm, and Google Sheets/Docs/Calendar, Calendly, Microsoft Calendar — any catalog type with auth_method:'oauth'). The user opens the link (signed in to Expedify), clicks Connect, and completes consent in the browser. Pass the EXACT integration_type the user named — this ALWAYS returns THAT provider's link and never substitutes another (asking for google_sheets must not yield zoho_sheets). Show the user the returned markdown_link AS A CLICKABLE MARKDOWN LINK (never paste the raw URL as plain text). Then confirm with list_integrations. For a pure API-key provider it still returns a link plus a note that create_integration connects it in chat (preferred). Errors only on an unknown/disabled type. Requires integrations:read; writes nothing.
Required scope: integrations:read
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
integration_type | string | ✓ | The exact type slug the user named (e.g. google_sheets, google_ads, zoho_crm). |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_integration_connect_link",
"arguments": {
"integration_type": "\u2026"
}
}
}
get_outgoing_webhook
Get one outgoing webhook by id. No secret. Requires webhooks:read.
Required scope: webhooks:read
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | ✓ |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_outgoing_webhook",
"arguments": {
"webhook_id": "\u2026"
}
}
}
create_incoming_webhook
Create an incoming webhook. Required: slug (unique, URL-safe — becomes /hooks/{org}/{slug}). Optional: name, description, expected_schema, is_active. Returns {id, slug, url, secret} — the SECRET is shown ONCE. Use the returned id as a webhook_trigger node's webhook_id to wire it to a workflow (create_workflow / edit_workflow). Requires webhooks:write.
Required scope: webhooks:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | ✓ | Unique URL-safe id (lowercase, hyphens). |
name | string | ||
description | string | ||
expected_schema | object | Optional JSON schema documenting the expected payload. | |
is_active | boolean |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_incoming_webhook",
"arguments": {
"slug": "\u2026"
}
}
}
create_integration
Connect a new API-key integration for the org (e.g. OpenAI, Resend, a WhatsApp BSP). Requires integrations:write; this stores a credential, so it pauses for user approval. FLOW — do NOT guess field values:
- Call list_available_integrations {type} first and read its
fields. - Ask the user for every field where required=true. For a field where secret=true, tell the user it's stored encrypted and never shown again; NEVER invent or guess a secret, and never echo it back after connecting.
- Call this with {integration_type, integration_name, configuration} where
configurationmaps the field keys to the user's values. - Then call test_integration {integration_id} and report the result.
- Confirm using the returned id/type/name/configured_fields. If the type connects via OAuth (e.g. google_ads, meta_ads, zoho_crm — any catalog entry with auth_method:'oauth'), do NOT call this; call get_integration_connect_link and give the user the returned link. This op also refuses an OAuth type with that link in the error.
Required scope: integrations:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
integration_type | string | ✓ | The type slug from list_available_integrations (e.g. openai, resend, wati). |
integration_name | string | ✓ | A human label for this connection (e.g. 'Production OpenAI'). |
configuration | object | ✓ | Field keys → values, per the type's catalog fields. Required fields must be present. Secret fields are stored encrypted and never returned. |
is_default | boolean | Make this the org's default for its category. |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_integration",
"arguments": {
"integration_type": "\u2026",
"integration_name": "\u2026",
"configuration": {}
}
}
}
create_outgoing_webhook
Create an outgoing webhook / event subscription. Required: name, url, events (non-empty array; see list_webhook_event_types). Optional: webhook_type (automatic|manual), is_active, retry_count, timeout_seconds. The URL is SSRF-validated (internal/private targets rejected). Returns {...,secret} ONCE — used to verify the X-Webhook-Signature. Requires webhooks:write.
Required scope: webhooks:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | ✓ | |
url | string | ✓ | Public https URL to POST to. |
events | array<string> | ✓ | Event names to subscribe to. |
webhook_type | string | automatic (default) | manual. | |
is_active | boolean | ||
retry_count | integer | ||
timeout_seconds | integer |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_outgoing_webhook",
"arguments": {
"name": "\u2026",
"url": "\u2026",
"events": []
}
}
}
update_incoming_webhook
Update an incoming webhook (partial): name/description/expected_schema/is_active. Slug is immutable. Requires webhooks:write.
Required scope: webhooks:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | ✓ | |
name | string | ||
description | string | ||
expected_schema | object | ||
is_active | boolean |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_incoming_webhook",
"arguments": {
"webhook_id": "\u2026"
}
}
}
update_outgoing_webhook
Update an outgoing webhook (partial): name/url/events/webhook_type/is_active/retry_count/timeout_seconds. URL is re-SSRF-validated. Requires webhooks:write.
Required scope: webhooks:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | ✓ | |
name | string | ||
url | string | ||
events | array<string> | ||
webhook_type | string | ||
is_active | boolean | ||
retry_count | integer | ||
timeout_seconds | integer |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_outgoing_webhook",
"arguments": {
"webhook_id": "\u2026"
}
}
}
delete_incoming_webhook
Delete an incoming webhook. Reference-checked: if any active workflow binds it, returns 409 with those workflows unless force=true. permanent=true hard-deletes. Requires webhooks:write.
Required scope: webhooks:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | ✓ | |
force | boolean | Delete even if workflows depend on it. | |
permanent | boolean | Hard delete (default false = retire the URL). |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_incoming_webhook",
"arguments": {
"webhook_id": "\u2026"
}
}
}
delete_outgoing_webhook
Delete an outgoing webhook. Requires webhooks:write.
Required scope: webhooks:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | ✓ |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_outgoing_webhook",
"arguments": {
"webhook_id": "\u2026"
}
}
}
list_available_integrations
Browse the CATALOG of integration TYPES this org can connect (OpenAI, WhatsApp, databases, storage, voice, …), grouped by category. Each type lists its auth_method ('api_key' → collect fields + create_integration; 'oauth' → get_integration_connect_link) and the config fields a connect requires. Pure metadata — no secrets. Optional category (llm/email/database/messaging/storage/voice/…) or type narrows it. Requires integrations:read.
Required scope: integrations:read
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | e.g. llm, email, database, messaging, storage, voice. | |
type | string | A single integration type slug (e.g. openai). |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_available_integrations",
"arguments": {}
}
}
list_incoming_webhooks
List the org's incoming webhooks (external systems POST to these to fire a workflow). Returns id + slug + live receiver URL + flags; never secrets. Pass used_by=true to include which workflows each is wired to. Requires webhooks:read.
Required scope: webhooks:read
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
used_by | boolean | Include the workflows each webhook is bound to. |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_incoming_webhooks",
"arguments": {}
}
}
list_integrations
List the org's CONNECTED integrations (id, integration_type, name, default/active flags, category). Use the returned id to wire an integration into a workflow node. For an LLM (core_agent/voice_agent) use category: llm — the org's openai/gemini/anthropic integrations. Never returns credentials. Filters: category (llm, voice, email, whatsapp, realtime, synthesizer, transcriber, database, …) and/or type (integration_type, e.g. openai). The filter token matches BOTH type and category, so type: llm also works. active_only defaults true. Requires integrations:read.
Required scope: integrations:read
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | Filter by category (llm, voice, email, whatsapp, realtime, synthesizer, transcriber, database, …). | |
type | string | Filter by integration_type (e.g. openai, gemini, resend). Also matches category. | |
active_only | boolean | Only active integrations (default true). |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_integrations",
"arguments": {}
}
}
list_outgoing_webhooks
List the org's outgoing webhooks / event subscriptions (Expedify POSTs to these external URLs on CRM events). No secrets. Filter: webhook_type. Requires webhooks:read.
Required scope: webhooks:read
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_type | string | automatic | manual. |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_outgoing_webhooks",
"arguments": {}
}
}
list_webhook_event_types
List the event types an outgoing webhook can subscribe to (grouped by category, e.g. contact.created, deal.stage_changed). Use these in events. Requires webhooks:read.
Required scope: webhooks:read
Input
No input parameters.
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_webhook_event_types",
"arguments": {}
}
}
regenerate_incoming_webhook_secret
Rotate an incoming webhook's secret. Returns the NEW secret once. Requires webhooks:write.
Required scope: webhooks:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | ✓ |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "regenerate_incoming_webhook_secret",
"arguments": {
"webhook_id": "\u2026"
}
}
}
test_integration
Run a connectivity check for one integration using its OWN stored credentials (you never provide them). Returns {success, message}. Side-effecting: makes a live outbound call to the provider, so it requires integrations:write (not a read-only key).
Required scope: integrations:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
integration_id | string | ✓ |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "test_integration",
"arguments": {
"integration_id": "\u2026"
}
}
}
test_outgoing_webhook
Send a TEST delivery to an outgoing webhook's URL — a real outbound POST (billing-gated). Optional test_data object as the payload. Returns {success, status_code, error}. Requires webhooks:write.
Required scope: webhooks:write
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string | ✓ | |
test_data | object | Optional custom payload body. |
Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "test_outgoing_webhook",
"arguments": {
"webhook_id": "\u2026"
}
}
}