Run a valid discord.add_reaction call through the same SDK surface used by every toolkit.

Minimal tool call

ts
import { Eyeball } from "@eyeball/sdk";

const eyeball = new Eyeball({
  apiKey: process.env.EYEBALL_API_KEY!,
  baseUrl: process.env.EYEBALL_EXECUTOR_URL!,
});

const output = await eyeball.tools.run(
  "discord.add_reaction",
  {
  "conversationId": "example_conversationId",
  "messageId": "example_messageId",
  "reaction": "example_reaction"
},
  { userId: "demo_user",
  idempotencyKey: "docs:discord.add_reaction:demo-1" },
);
console.log(output);

The model receives canonical output. Your application retains the execution envelope through tools.execute or the execution APIs when it needs IDs, status, versions, and latency.

Supported canonical tools

ToolPurposeExecutionEffectVersion
discord.add_reactionAdd an emoji or provider-supported reaction to an existing message as the connected account or bot. Repeating the same reaction has no additional effect on providers that allow only one reaction per actor.sync or asyncmutation1.0.0
discord.create_channelCreate a channel, room, or group where the connected account or bot has permission. This changes shared workspace state and may notify or expose content to invited members.sync or asyncmutation1.0.0
discord.get_messageRetrieve one message and its normalized sender, content, thread, attachment, and reaction metadata. Use this after obtaining both the conversation and message identifiers.sync or asyncread1.0.0
discord.list_channelsList channels, rooms, groups, chats, or direct conversations visible to the connected account or bot. Use this to discover conversation identifiers before listing members or messages.sync or asyncread1.0.0
discord.list_membersList members visible to the connection, optionally scoped to a workspace or conversation. Use returned member identifiers for invitations, mentions, or direct-conversation workflows.sync or asyncread1.0.0
discord.list_messagesList recent messages in a channel, room, group, chat, or direct conversation with portable time filters and pagination. Use get_message when full metadata for one known message is needed.sync or asyncread1.0.0
discord.reply_to_messageReply to a specific message while preserving the provider's thread or reply relationship. Use send_message for a new top-level message; this sends content visible to conversation members.sync or asyncmutation1.0.0
discord.send_messageSend a new message to a channel, room, group, chat, or direct conversation. Use reply_to_message when preserving a specific thread or reply relationship matters; verify the destination and content before sending.sync or asyncmutation1.0.0

Only the rows above are implemented. A capability tool omitted by this manifest returns not_supported; eyeball never synthesizes provider parity.

Supported canonical triggers

This manifest does not implement a canonical trigger.

Input and output schemas

discord.add_reaction

Input schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:add_reaction:1.0.0:discord",
  "type": "object",
  "description": "Conversation, message, and reaction value to apply.",
  "additionalProperties": false,
  "required": [
    "conversationId",
    "messageId",
    "reaction"
  ],
  "properties": {
    "conversationId": {
      "type": "string",
      "description": "Provider identifier of the conversation containing the message.",
      "minLength": 1
    },
    "messageId": {
      "type": "string",
      "description": "Provider identifier of the message receiving the reaction.",
      "minLength": 1
    },
    "reaction": {
      "type": "string",
      "description": "Provider-supported emoji, shortcode, or reaction identifier to add.",
      "minLength": 1,
      "maxLength": 128
    }
  }
}

Output schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:add_reaction:output:1.0.0:discord",
  "type": "object",
  "description": "Result of applying the reaction to the target message.",
  "additionalProperties": false,
  "required": [
    "messageId",
    "reaction",
    "added"
  ],
  "properties": {
    "messageId": {
      "type": "string",
      "description": "Provider identifier of the reacted-to message.",
      "minLength": 1
    },
    "reaction": {
      "type": "string",
      "description": "Provider-normalized emoji, shortcode, or reaction identifier.",
      "minLength": 1
    },
    "added": {
      "type": "boolean",
      "description": "Whether the requested reaction is now applied by the connection."
    }
  }
}
discord.create_channel

Input schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:create_channel:1.0.0:discord",
  "type": "object",
  "description": "Workspace destination, channel identity, visibility, topic, and initial members.",
  "additionalProperties": false,
  "required": [
    "name"
  ],
  "properties": {
    "workspaceId": {
      "type": "string",
      "description": "Provider workspace, guild, team, or account identifier in which to create the channel.",
      "minLength": 1
    },
    "name": {
      "type": "string",
      "description": "Human-readable channel, room, or group name.",
      "minLength": 1,
      "maxLength": 100
    },
    "visibility": {
      "type": "string",
      "description": "Whether the new conversation is discoverable publicly or limited to invited members.",
      "enum": [
        "public",
        "private"
      ],
      "default": "public"
    },
    "topic": {
      "type": "string",
      "description": "Initial channel or room topic when supported.",
      "maxLength": 1024
    },
    "memberIds": {
      "type": "array",
      "description": "Provider member identifiers to invite when creating the conversation.",
      "uniqueItems": true,
      "items": {
        "type": "string",
        "description": "Provider identifier of an initial conversation member.",
        "minLength": 1
      }
    }
  }
}

Output schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:create_channel:output:1.0.0:discord",
  "type": "object",
  "description": "Provider identity and normalized attributes of the newly created conversation.",
  "additionalProperties": false,
  "required": [
    "conversationId",
    "name",
    "visibility",
    "createdAt"
  ],
  "properties": {
    "conversationId": {
      "type": "string",
      "description": "Provider identifier of the newly created channel, room, or group.",
      "minLength": 1
    },
    "name": {
      "type": "string",
      "description": "Provider-normalized conversation name.",
      "minLength": 1
    },
    "visibility": {
      "type": "string",
      "description": "Effective visibility of the newly created conversation.",
      "enum": [
        "public",
        "private"
      ]
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "description": "RFC 3339 timestamp when the provider created the conversation."
    }
  }
}
discord.get_message

Input schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:get_message:1.0.0:discord",
  "type": "object",
  "description": "Conversation and message identifiers for one provider message.",
  "additionalProperties": false,
  "required": [
    "conversationId",
    "messageId"
  ],
  "properties": {
    "conversationId": {
      "type": "string",
      "description": "Provider identifier of the conversation containing the message.",
      "minLength": 1
    },
    "messageId": {
      "type": "string",
      "description": "Provider identifier of the message to retrieve.",
      "minLength": 1
    }
  }
}

Output schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:get_message:output:1.0.0:discord",
  "type": "object",
  "description": "Normalized content and metadata for one conversation message.",
  "additionalProperties": false,
  "required": [
    "messageId",
    "conversationId",
    "sender",
    "text",
    "sentAt"
  ],
  "properties": {
    "messageId": {
      "type": "string",
      "description": "Provider identifier of the message.",
      "minLength": 1
    },
    "conversationId": {
      "type": "string",
      "description": "Provider identifier of the containing conversation.",
      "minLength": 1
    },
    "sender": {
      "type": "object",
      "description": "Normalized identity of the member or bot that sent the message.",
      "additionalProperties": false,
      "required": [
        "memberId",
        "displayName"
      ],
      "properties": {
        "memberId": {
          "type": "string",
          "description": "Provider identifier of the sender.",
          "minLength": 1
        },
        "displayName": {
          "type": "string",
          "description": "Human-readable sender name at retrieval time.",
          "minLength": 1
        },
        "handle": {
          "type": "string",
          "description": "Provider handle or username when available.",
          "minLength": 1
        },
        "isBot": {
          "type": "boolean",
          "description": "Whether the sender is represented as a bot or application account."
        }
      }
    },
    "text": {
      "type": "string",
      "description": "Normalized plain-text representation of the message content."
    },
    "rawMarkup": {
      "type": "string",
      "description": "Original provider markup when it differs materially from normalized text."
    },
    "sentAt": {
      "type": "string",
      "format": "date-time",
      "description": "RFC 3339 timestamp when the message was sent."
    },
    "editedAt": {
      "type": "string",
      "format": "date-time",
      "description": "RFC 3339 timestamp of the latest edit when the message was edited."
    },
    "threadId": {
      "type": "string",
      "description": "Provider identifier of the containing thread when applicable.",
      "minLength": 1
    },
    "replyToMessageId": {
      "type": "string",
      "description": "Provider identifier of the directly referenced parent message.",
      "minLength": 1
    },
    "attachments": {
      "type": "array",
      "description": "Metadata for files attached to the message.",
      "items": {
        "type": "object",
        "description": "Metadata identifying one message attachment.",
        "additionalProperties": false,
        "required": [
          "attachmentId",
          "fileName"
        ],
        "properties": {
          "attachmentId": {
            "type": "string",
            "description": "Provider-stable identifier for the attachment.",
            "minLength": 1
          },
          "fileName": {
            "type": "string",
            "description": "Attachment file name shown in the conversation.",
            "minLength": 1
          },
          "contentType": {
            "type": "string",
            "description": "MIME content type reported for the attachment.",
            "minLength": 1
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Provider URL for the attachment when the connection can access it."
          }
        }
      }
    },
    "reactions": {
      "type": "array",
      "description": "Aggregated reactions currently attached to the message.",
      "items": {
        "type": "object",
        "description": "One reaction value and its current aggregate count.",
        "additionalProperties": false,
        "required": [
          "reaction",
          "count"
        ],
        "properties": {
          "reaction": {
            "type": "string",
            "description": "Provider-supported emoji, shortcode, or reaction identifier.",
            "minLength": 1
          },
          "count": {
            "type": "integer",
            "description": "Number of members who applied this reaction.",
            "minimum": 0
          },
          "reactedByConnection": {
            "type": "boolean",
            "description": "Whether the connected bot or account applied this reaction."
          }
        }
      }
    }
  }
}
discord.list_channels

Input schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:list_channels:1.0.0:discord",
  "type": "object",
  "description": "Workspace scope, conversation filters, and pagination for channel discovery.",
  "additionalProperties": false,
  "properties": {
    "workspaceId": {
      "type": "string",
      "description": "Provider workspace, guild, team, or account identifier when the connection spans more than one.",
      "minLength": 1
    },
    "types": {
      "type": "array",
      "description": "Conversation types to include; omit to include every visible type.",
      "items": {
        "type": "string",
        "description": "Portable conversation type selector.",
        "enum": [
          "public",
          "private",
          "direct",
          "group"
        ]
      }
    },
    "includeArchived": {
      "type": "boolean",
      "description": "Whether to include archived or inactive conversations.",
      "default": false
    },
    "pageSize": {
      "type": "integer",
      "description": "Maximum number of channels to return in one page.",
      "minimum": 1,
      "maximum": 100,
      "default": 50
    },
    "pageToken": {
      "type": "string",
      "description": "Opaque continuation token from a previous channel page.",
      "minLength": 1
    }
  }
}

Output schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:list_channels:output:1.0.0:discord",
  "type": "object",
  "description": "One page of normalized conversations and an optional continuation token.",
  "additionalProperties": false,
  "required": [
    "channels"
  ],
  "properties": {
    "channels": {
      "type": "array",
      "description": "Channels, rooms, groups, chats, or direct conversations visible to the connection.",
      "items": {
        "type": "object",
        "description": "Normalized metadata for one visible conversation.",
        "additionalProperties": false,
        "required": [
          "conversationId",
          "name",
          "type",
          "archived"
        ],
        "properties": {
          "conversationId": {
            "type": "string",
            "description": "Provider identifier of the conversation.",
            "minLength": 1
          },
          "name": {
            "type": "string",
            "description": "Human-readable conversation name or participant label."
          },
          "type": {
            "type": "string",
            "description": "Portable classification of the conversation.",
            "enum": [
              "public",
              "private",
              "direct",
              "group"
            ]
          },
          "topic": {
            "type": "string",
            "description": "Current channel or room topic when supported."
          },
          "memberCount": {
            "type": "integer",
            "description": "Number of known conversation members when the provider exposes it.",
            "minimum": 0
          },
          "archived": {
            "type": "boolean",
            "description": "Whether the conversation is archived or inactive."
          }
        }
      }
    },
    "nextPageToken": {
      "type": "string",
      "description": "Opaque token to request the next page of channels; absent when the result is complete.",
      "minLength": 1
    }
  }
}
discord.list_members

Input schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:list_members:1.0.0:discord",
  "type": "object",
  "description": "Optional workspace or conversation scope and pagination for member discovery.",
  "additionalProperties": false,
  "properties": {
    "workspaceId": {
      "type": "string",
      "description": "Provider workspace, guild, team, or account identifier to scope the member list.",
      "minLength": 1
    },
    "conversationId": {
      "type": "string",
      "description": "Provider conversation identifier to list only members of that channel, room, group, or chat.",
      "minLength": 1
    },
    "pageSize": {
      "type": "integer",
      "description": "Maximum number of members to return in one page.",
      "minimum": 1,
      "maximum": 100,
      "default": 50
    },
    "pageToken": {
      "type": "string",
      "description": "Opaque continuation token from a previous member page.",
      "minLength": 1
    }
  }
}

Output schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:list_members:output:1.0.0:discord",
  "type": "object",
  "description": "One page of normalized member identities and an optional continuation token.",
  "additionalProperties": false,
  "required": [
    "members"
  ],
  "properties": {
    "members": {
      "type": "array",
      "description": "Members visible in the requested workspace or conversation scope.",
      "items": {
        "type": "object",
        "description": "Normalized identity and status for one workspace or conversation member.",
        "additionalProperties": false,
        "required": [
          "memberId",
          "displayName",
          "isBot"
        ],
        "properties": {
          "memberId": {
            "type": "string",
            "description": "Provider identifier of the member.",
            "minLength": 1
          },
          "displayName": {
            "type": "string",
            "description": "Human-readable member name at retrieval time.",
            "minLength": 1
          },
          "handle": {
            "type": "string",
            "description": "Provider handle or username when available.",
            "minLength": 1
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "Member email address when visible to the connection."
          },
          "role": {
            "type": "string",
            "description": "Provider-normalized role label when available.",
            "minLength": 1
          },
          "isBot": {
            "type": "boolean",
            "description": "Whether the member is represented as a bot or application account."
          },
          "status": {
            "type": "string",
            "description": "Provider-normalized membership or presence status when available.",
            "minLength": 1
          }
        }
      }
    },
    "nextPageToken": {
      "type": "string",
      "description": "Opaque token to request the next page of members; absent when the result is complete.",
      "minLength": 1
    }
  }
}
discord.list_messages

Input schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:list_messages:1.0.0:discord",
  "type": "object",
  "description": "Conversation identifier, time range, reply inclusion, and pagination for listing messages.",
  "additionalProperties": false,
  "required": [
    "conversationId"
  ],
  "properties": {
    "conversationId": {
      "type": "string",
      "description": "Provider identifier of the conversation whose messages should be listed.",
      "minLength": 1
    },
    "sentAfter": {
      "type": "string",
      "format": "date-time",
      "description": "Return messages sent at or after this RFC 3339 timestamp."
    },
    "sentBefore": {
      "type": "string",
      "format": "date-time",
      "description": "Return messages sent before this RFC 3339 timestamp."
    },
    "includeThreadReplies": {
      "type": "boolean",
      "description": "Whether to include thread replies in addition to top-level messages.",
      "default": false
    },
    "pageSize": {
      "type": "integer",
      "description": "Maximum number of messages to return in one page.",
      "minimum": 1,
      "maximum": 100,
      "default": 50
    },
    "pageToken": {
      "type": "string",
      "description": "Opaque continuation token from a previous message page.",
      "minLength": 1
    }
  }
}

Output schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:list_messages:output:1.0.0:discord",
  "type": "object",
  "description": "One page of normalized conversation messages and an optional continuation token.",
  "additionalProperties": false,
  "required": [
    "messages"
  ],
  "properties": {
    "messages": {
      "type": "array",
      "description": "Messages in provider-defined conversation order.",
      "items": {
        "type": "object",
        "description": "Normalized content and metadata for one conversation message.",
        "additionalProperties": false,
        "required": [
          "messageId",
          "conversationId",
          "sender",
          "text",
          "sentAt"
        ],
        "properties": {
          "messageId": {
            "type": "string",
            "description": "Provider identifier of the message.",
            "minLength": 1
          },
          "conversationId": {
            "type": "string",
            "description": "Provider identifier of the channel, room, group, chat, or direct conversation.",
            "minLength": 1
          },
          "sender": {
            "type": "object",
            "description": "Normalized identity of the member or bot that sent the message.",
            "additionalProperties": false,
            "required": [
              "memberId",
              "displayName"
            ],
            "properties": {
              "memberId": {
                "type": "string",
                "description": "Provider identifier of the sender.",
                "minLength": 1
              },
              "displayName": {
                "type": "string",
                "description": "Human-readable sender name at retrieval time.",
                "minLength": 1
              },
              "handle": {
                "type": "string",
                "description": "Provider handle or username when available.",
                "minLength": 1
              },
              "isBot": {
                "type": "boolean",
                "description": "Whether the sender is represented as a bot or application account."
              }
            }
          },
          "text": {
            "type": "string",
            "description": "Normalized plain-text representation of the message content."
          },
          "sentAt": {
            "type": "string",
            "format": "date-time",
            "description": "RFC 3339 timestamp when the message was sent."
          },
          "editedAt": {
            "type": "string",
            "format": "date-time",
            "description": "RFC 3339 timestamp of the latest edit when the message was edited."
          },
          "threadId": {
            "type": "string",
            "description": "Provider identifier of the containing thread when applicable.",
            "minLength": 1
          },
          "replyToMessageId": {
            "type": "string",
            "description": "Provider identifier of the directly referenced parent message.",
            "minLength": 1
          },
          "reactions": {
            "type": "array",
            "description": "Aggregated reactions currently attached to the message.",
            "items": {
              "type": "object",
              "description": "One reaction value and its current aggregate count.",
              "additionalProperties": false,
              "required": [
                "reaction",
                "count"
              ],
              "properties": {
                "reaction": {
                  "type": "string",
                  "description": "Provider-supported emoji, shortcode, or reaction identifier.",
                  "minLength": 1
                },
                "count": {
                  "type": "integer",
                  "description": "Number of members who applied this reaction.",
                  "minimum": 0
                },
                "reactedByConnection": {
                  "type": "boolean",
                  "description": "Whether the connected bot or account applied this reaction."
                }
              }
            }
          }
        }
      }
    },
    "nextPageToken": {
      "type": "string",
      "description": "Opaque token to request the next page of messages; absent when the result is complete.",
      "minLength": 1
    }
  }
}
discord.reply_to_message

Input schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:reply_to_message:1.0.0:discord",
  "type": "object",
  "description": "Conversation, parent message, reply text, and optional staged attachments.",
  "additionalProperties": false,
  "required": [
    "conversationId",
    "messageId",
    "text"
  ],
  "properties": {
    "conversationId": {
      "type": "string",
      "description": "Provider identifier of the conversation containing the parent message.",
      "minLength": 1
    },
    "messageId": {
      "type": "string",
      "description": "Provider identifier of the message being replied to.",
      "minLength": 1
    },
    "text": {
      "type": "string",
      "description": "Complete reply text in the provider's supported plain-text or markup syntax.",
      "minLength": 1
    },
    "attachments": {
      "type": "array",
      "description": "Previously staged Eyeball files to attach to the message.",
      "maxItems": 10,
      "items": {
        "type": "object",
        "description": "A staged file reference that the provider can attach.",
        "additionalProperties": false,
        "required": [
          "fileId",
          "fileName"
        ],
        "properties": {
          "fileId": {
            "type": "string",
            "description": "Eyeball identifier of the previously staged file.",
            "minLength": 1
          },
          "fileName": {
            "type": "string",
            "description": "File name conversation members should see.",
            "minLength": 1
          },
          "contentType": {
            "type": "string",
            "description": "MIME content type of the staged file when known.",
            "minLength": 1
          }
        }
      }
    }
  }
}

Output schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:reply_to_message:output:1.0.0:discord",
  "type": "object",
  "description": "Provider identifiers and send timestamp for the newly created reply.",
  "additionalProperties": false,
  "required": [
    "messageId",
    "conversationId",
    "parentMessageId",
    "sentAt"
  ],
  "properties": {
    "messageId": {
      "type": "string",
      "description": "Provider identifier of the created message.",
      "minLength": 1
    },
    "conversationId": {
      "type": "string",
      "description": "Provider identifier of the destination conversation.",
      "minLength": 1
    },
    "parentMessageId": {
      "type": "string",
      "description": "Provider identifier of the message that received the reply.",
      "minLength": 1
    },
    "sentAt": {
      "type": "string",
      "format": "date-time",
      "description": "RFC 3339 timestamp when the provider accepted or sent the message."
    }
  }
}
discord.send_message

Input schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:send_message:1.0.0:discord",
  "type": "object",
  "description": "Destination conversation, message content, and optional staged attachments.",
  "additionalProperties": false,
  "required": [
    "conversationId",
    "text"
  ],
  "properties": {
    "conversationId": {
      "type": "string",
      "description": "Provider identifier of the destination channel, room, group, chat, or direct conversation.",
      "minLength": 1
    },
    "text": {
      "type": "string",
      "description": "Complete message text in the provider's supported plain-text or markup syntax.",
      "minLength": 1
    },
    "replyToMessageId": {
      "type": "string",
      "description": "Optional parent message identifier when sending into a thread without strict reply semantics.",
      "minLength": 1
    },
    "attachments": {
      "type": "array",
      "description": "Previously staged Eyeball files to attach to the message.",
      "maxItems": 10,
      "items": {
        "type": "object",
        "description": "A staged file reference that the provider can attach.",
        "additionalProperties": false,
        "required": [
          "fileId",
          "fileName"
        ],
        "properties": {
          "fileId": {
            "type": "string",
            "description": "Eyeball identifier of the previously staged file.",
            "minLength": 1
          },
          "fileName": {
            "type": "string",
            "description": "File name conversation members should see.",
            "minLength": 1
          },
          "contentType": {
            "type": "string",
            "description": "MIME content type of the staged file when known.",
            "minLength": 1
          }
        }
      }
    }
  }
}

Output schema

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:eyeball:messaging_chat:send_message:output:1.0.0:discord",
  "type": "object",
  "description": "Provider identifiers and send timestamp for the newly created message.",
  "additionalProperties": false,
  "required": [
    "messageId",
    "conversationId",
    "sentAt"
  ],
  "properties": {
    "messageId": {
      "type": "string",
      "description": "Provider identifier of the created message.",
      "minLength": 1
    },
    "conversationId": {
      "type": "string",
      "description": "Provider identifier of the destination conversation.",
      "minLength": 1
    },
    "sentAt": {
      "type": "string",
      "format": "date-time",
      "description": "RFC 3339 timestamp when the provider accepted or sent the message."
    }
  }
}

Authentication

PropertyValue
Auth classapi_key
Required scopesNone
Optional scopesNone
Credential fieldsapiKey

Credentials are resolved inside the executor by CredentialProvider. They never belong in tool input, x_provider, model context, logs, or execution output.

Provider-specific extensions

This manifest declares no provider-specific schema extensions. Use only canonical fields.

Provider differences may appear only under x_provider.discord and only when the schema above declares them.

Sync and async behavior

All tools are synchronous by nature, but callers may choose mode: "async" to queue them.

Mutations require a stable Idempotency-Key. The TypeScript SDK accepts it as idempotencyKey; it is never part of the JSON request body.

REST example

Bash
curl "$EYEBALL_EXECUTOR_URL/v1/execute" \
  -H "Authorization: Bearer $EYEBALL_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: docs:discord.add_reaction:demo-1' \
  --data '{"tool":"discord.add_reaction","userId":"demo_user","input":{"conversationId":"example_conversationId","messageId":"example_messageId","reaction":"example_reaction"},"mode":"sync"}'

Mock support

Point EYEBALL_EXECUTOR_URL at a mock-configured executor to run through the real catalog, validation, credential seam, adapter, normalized errors, and execution records with no Discord account. Mock selection changes the executor endpoint and trusted provider base-URL configuration, never the execute request.

Limitations

  • This page describes the manifest's explicit P0 subset, not every operation offered by the provider.
  • Provider account policy, consent UI, quota details, and current wire compatibility still require a real-provider certification pass.
  • Fields outside the canonical schemas and declared x_provider extensions are rejected.

Versions

ContractVersion
Runtime catalog1.1
Manifest catalog1.0
Manifest schema1.0
Sourceactivepieces-bridge
TierP0
Capabilitiesmessaging_chat

Next

Use Testing with mocks to exercise this toolkit before connecting a live provider account.