Back to Eliza

Signal Connector

packages/docs/connectors/signal.md

2.0.17.6 KB
Original Source

Signal Connector

Connect your agent to Signal for private and group messaging via signal-cli using the @elizaos/plugin-signal package.

Prerequisites

  • signal-cli installed and a registered/linked Signal account
  • signal-cli running in HTTP daemon mode

Configuration

NameRequiredDescription
SIGNAL_ACCOUNT_NUMBERYesSignal account phone number in E.164 format (e.g., +1234567890)
SIGNAL_HTTP_URLNoSignal CLI REST API URL (e.g., http://localhost:8080)
SIGNAL_CLI_PATHNoPath to signal-cli executable (alternative to HTTP API)
SIGNAL_SHOULD_IGNORE_GROUP_MESSAGESNoIf true, only respond to direct messages

The connector auto-enables when token/botToken/apiKey is set, OR any of authDir/account/httpUrl/httpHost/httpPort/cliPath is set, OR accounts contains configured entries.

Configure in ~/.eliza/eliza.json:

json
{
  "connectors": {
    "signal": {
      "account": "+1234567890",
      "httpUrl": "http://localhost:8080",
      "dmPolicy": "pairing"
    }
  }
}

Setup

1. Install signal-cli

Install signal-cli and register or link a Signal account:

bash
signal-cli -a +1234567890 register
signal-cli -a +1234567890 verify CODE

2. Start signal-cli in HTTP Mode

bash
signal-cli -a +1234567890 daemon --http localhost:8080

3. Configure Eliza

Add the connectors.signal block to eliza.json as shown in the minimal configuration above.

Disabling

To explicitly disable the connector even when an account is configured:

json
{
  "connectors": {
    "signal": {
      "account": "+1234567890",
      "httpUrl": "http://localhost:8080",
      "enabled": false
    }
  }
}

Features

The plugin-auto-enable.ts module checks connectors.signal in your config. The plugin auto-enables when any of the following conditions are met (and enabled is not explicitly false):

  • token, botToken, or apiKey is truthy (generic trigger fields)
  • account is set together with httpUrl
  • cliPath is set (signal-cli binary path for auto-start)
  • Any of authDir, httpHost, or httpPort is set
  • accounts contains at least one configured entry

No environment variable is required to trigger auto-enable — it is driven entirely by the connector config object.

Environment Variables

The runtime injects the following environment variables from your connectors.signal config into process.env, so the plugin can read them at startup:

VariableRequiredDescription
SIGNAL_ACCOUNT_NUMBERYesSignal phone number in E.164 format (e.g., +1234567890)
SIGNAL_HTTP_URLNoHTTP URL for signal-cli REST API (e.g., http://localhost:8080)
SIGNAL_CLI_PATHNoPath to signal-cli executable (alternative to HTTP API)
SIGNAL_SHOULD_IGNORE_GROUP_MESSAGESNoIf true, the bot will only respond to direct messages

You do not need to set these manually — they are derived from the connector config at runtime.

Full Configuration Reference

All fields are defined under connectors.signal in eliza.json.

Core Fields

FieldTypeDefaultDescription
accountstringSignal phone number in E.164 format (e.g. +1234567890)
httpUrlstringHTTP URL for signal-cli daemon (e.g. http://localhost:8080)
httpHoststringHostname alternative to httpUrl
httpPortinteger > 0Port alternative to httpUrl
cliPathstringPath to signal-cli binary for auto-start
autoStartbooleanAuto-start signal-cli when the connector loads
startupTimeoutMsinteger (1000-120000)Milliseconds to wait for CLI startup (1-120 seconds)
receiveMode"on-start" | "manual""on-start"When to begin receiving messages
namestringAccount display name
enabledbooleanExplicitly enable/disable
capabilitiesstring[]Capability flags
configWritesbooleanAllow config writes from Signal events

Message Handling

FieldTypeDefaultDescription
ignoreAttachmentsbooleanIgnore incoming attachments (default behaviour includes them)
ignoreStoriesbooleanIgnore story messages (default behaviour excludes them)
sendReadReceiptsbooleanSend read receipts for received messages
historyLimitinteger >= 0Max messages in context
dmHistoryLimitinteger >= 0History limit for DMs
dmsobjectPer-DM history overrides keyed by DM ID. Each value: {historyLimit?: int}
textChunkLimitinteger > 0Max characters per message chunk
chunkMode"length" | "newline"Long message splitting strategy
mediaMaxMbinteger > 0Max media file size in MB
markdownobjectTable rendering: tables can be "off", "bullets", or "code"

Access Policies

FieldTypeDefaultDescription
dmPolicy"pairing" | "allowlist" | "open" | "disabled""pairing"DM access policy. "open" requires allowFrom to include "*"
allowFrom(string|number)[]User IDs allowed to DM
groupPolicy"open" | "disabled" | "allowlist""allowlist"Group join policy
groupAllowFrom(string|number)[]User IDs allowed in groups

Streaming Configuration

FieldTypeDefaultDescription
blockStreamingbooleanDisable streaming entirely
blockStreamingCoalesceobjectCoalescing settings: minChars, maxChars, idleMs

Actions

FieldTypeDescription
actions.reactionsbooleanSend reactions

Reaction Notifications

FieldTypeDescription
reactionNotifications"off" | "own" | "all" | "allowlist"Which reactions trigger notifications
reactionAllowlist(string|number)[]User IDs whose reactions trigger notifications (when reactionNotifications is "allowlist")
reactionLevel"off" | "ack" | "minimal" | "extensive"Reaction response verbosity

Heartbeat

json
{
  "connectors": {
    "signal": {
      "heartbeat": {
        "showOk": true,
        "showAlerts": true,
        "useIndicator": true
      }
    }
  }
}

Multi-Account Support

The accounts field allows running multiple Signal accounts from a single agent:

json
{
  "connectors": {
    "signal": {
      "accounts": {
        "personal": {
          "account": "+1234567890",
          "httpUrl": "http://localhost:8080",
          "dmPolicy": "pairing"
        },
        "work": {
          "account": "+0987654321",
          "httpUrl": "http://localhost:8081",
          "dmPolicy": "allowlist",
          "allowFrom": ["+1111111111"]
        }
      }
    }
  }
}

Each account entry accepts all the same fields as the top-level connectors.signal configuration. Top-level fields act as defaults that individual accounts can override.

Validation

  • When dmPolicy is "open", the allowFrom array must include "*".
  • startupTimeoutMs must be between 1000 and 120000 (1-120 seconds).