{
  "service": "slack",
  "displayName": "Slack",
  "categories": [
    "Communication",
    "Productivity"
  ],
  "authTypes": [
    "oauth2"
  ],
  "auth": [
    {
      "type": "oauth2",
      "authorizationUrl": "https://slack.com/oauth/v2/authorize",
      "tokenUrl": "https://slack.com/api/oauth.v2.access",
      "scopes": [
        "channels:read",
        "groups:read",
        "im:read",
        "mpim:read",
        "users:read",
        "channels:history",
        "groups:history",
        "im:history",
        "mpim:history",
        "files:read",
        "reactions:read",
        "chat:write",
        "im:write",
        "files:write",
        "reactions:write"
      ],
      "scopeSeparator": ",",
      "tokenEndpointAuthMethod": "client_secret_post"
    }
  ],
  "homepageUrl": "https://slack.com",
  "actions": [
    {
      "id": "slack.add_reaction",
      "service": "slack",
      "name": "add_reaction",
      "description": "Add an emoji reaction to a Slack message.",
      "requiredScopes": [
        "reactions:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "messageTs": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack message timestamp, for example '1711.0001'."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "The emoji reaction name without surrounding colons."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs",
          "name"
        ],
        "description": "Input parameters for adding a Slack reaction."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether Slack accepted the reaction request."
          }
        },
        "additionalProperties": false,
        "required": [
          "success"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.delete_file",
      "service": "slack",
      "name": "delete_file",
      "description": "Delete a Slack file.",
      "requiredScopes": [
        "files:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack file ID."
          }
        },
        "additionalProperties": false,
        "required": [
          "fileId"
        ],
        "description": "Input parameters for deleting a Slack file."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether Slack accepted the file delete request."
          },
          "fileId": {
            "type": "string",
            "description": "The Slack file ID that was deleted."
          }
        },
        "additionalProperties": false,
        "required": [
          "success",
          "fileId"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.delete_message",
      "service": "slack",
      "name": "delete_message",
      "description": "Delete a Slack message posted by the bot.",
      "requiredScopes": [
        "chat:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "messageTs": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack message timestamp, for example '1711.0001'."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs"
        ],
        "description": "Input parameters for deleting a Slack message."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "description": "The conversation identifier containing the message."
          },
          "messageTs": {
            "type": "string",
            "description": "The timestamp identifier of the message."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs"
        ],
        "description": "The output payload for a Slack message reference."
      }
    },
    {
      "id": "slack.get_channel_messages",
      "service": "slack",
      "name": "get_channel_messages",
      "description": "Get recent messages from a Slack conversation.",
      "requiredScopes": [
        "channels:history",
        "groups:history",
        "im:history",
        "mpim:history"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "The maximum number of messages to return."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId"
        ],
        "description": "Input parameters for reading Slack conversation history."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "messages": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "ts": {
                  "type": "string",
                  "description": "The message timestamp identifier."
                },
                "userId": {
                  "type": "string",
                  "description": "The user ID of the message author."
                },
                "text": {
                  "type": "string",
                  "description": "The text content of the message."
                }
              },
              "additionalProperties": true,
              "description": "A Slack message record."
            },
            "description": "The list of messages in the conversation."
          },
          "hasMore": {
            "type": "boolean",
            "description": "Whether more messages are available beyond this page."
          }
        },
        "additionalProperties": false,
        "required": [
          "messages",
          "hasMore"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.get_conversation",
      "service": "slack",
      "name": "get_conversation",
      "description": "Get metadata for a Slack conversation.",
      "requiredScopes": [
        "channels:read",
        "groups:read",
        "im:read",
        "mpim:read"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "includeLocale": {
            "type": "boolean",
            "description": "Whether Slack should include the locale field."
          },
          "includeNumMembers": {
            "type": "boolean",
            "description": "Whether Slack should include the member count field."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId"
        ],
        "description": "Input parameters for fetching a Slack conversation."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "conversation": {
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "description": "The unique identifier of the conversation."
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string",
                    "description": "The name of the conversation when available."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "public_channel",
                  "private_channel",
                  "im",
                  "mpim",
                  "unknown"
                ],
                "description": "The normalized Slack conversation type."
              },
              "isArchived": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the conversation is archived."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "isPrivate": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the conversation is private."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "isMember": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the bot user is a member."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "memberCount": {
                "type": "integer",
                "description": "The member count when Slack provides it."
              },
              "topic": {
                "anyOf": [
                  {
                    "type": "string",
                    "description": "The conversation topic."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "purpose": {
                "anyOf": [
                  {
                    "type": "string",
                    "description": "The conversation purpose."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "userId": {
                "type": "string",
                "description": "The linked user identifier for IM conversations."
              },
              "locale": {
                "type": "string",
                "description": "The locale returned by Slack when requested."
              }
            },
            "additionalProperties": false,
            "required": [
              "channelId",
              "name",
              "type",
              "isArchived",
              "isPrivate",
              "isMember",
              "topic",
              "purpose"
            ],
            "description": "A normalized Slack conversation record."
          }
        },
        "additionalProperties": false,
        "required": [
          "conversation"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.get_file",
      "service": "slack",
      "name": "get_file",
      "description": "Get metadata for a Slack file.",
      "requiredScopes": [
        "files:read"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack file ID."
          }
        },
        "additionalProperties": false,
        "required": [
          "fileId"
        ],
        "description": "Input parameters for fetching a Slack file."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "file": {
            "type": "object",
            "properties": {
              "fileId": {
                "type": "string",
                "description": "The Slack file ID."
              },
              "name": {
                "type": "string",
                "description": "The file name."
              },
              "title": {
                "type": "string",
                "description": "The file title."
              },
              "mimetype": {
                "type": "string",
                "description": "The file MIME type."
              },
              "urlPrivate": {
                "type": "string",
                "description": "The private Slack URL for the file when returned."
              }
            },
            "additionalProperties": true,
            "description": "A Slack file object returned by the Web API."
          }
        },
        "additionalProperties": false,
        "required": [
          "file"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.get_message_permalink",
      "service": "slack",
      "name": "get_message_permalink",
      "description": "Get a permalink for a Slack message.",
      "requiredScopes": [
        "channels:history",
        "groups:history",
        "im:history",
        "mpim:history"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "messageTs": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack message timestamp, for example '1711.0001'."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs"
        ],
        "description": "Input parameters for fetching a Slack message permalink."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "description": "The conversation identifier containing the target message."
          },
          "messageTs": {
            "type": "string",
            "description": "The timestamp identifier of the target message."
          },
          "permalink": {
            "type": "string",
            "description": "The permalink URL returned by Slack."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs",
          "permalink"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.get_reactions",
      "service": "slack",
      "name": "get_reactions",
      "description": "Get reactions for a Slack message.",
      "requiredScopes": [
        "reactions:read"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "messageTs": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack message timestamp, for example '1711.0001'."
          },
          "full": {
            "type": "boolean",
            "description": "Whether Slack should return the complete reaction user lists."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs"
        ],
        "description": "Input parameters for reading Slack reactions."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "type": "object",
            "additionalProperties": true,
            "description": "A Slack item with reactions."
          }
        },
        "additionalProperties": false,
        "required": [
          "item"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.get_thread",
      "service": "slack",
      "name": "get_thread",
      "description": "Get messages in a Slack thread.",
      "requiredScopes": [
        "channels:history",
        "groups:history",
        "im:history",
        "mpim:history"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "threadTs": {
            "type": "string",
            "minLength": 1,
            "description": "The timestamp of the parent message."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "threadTs"
        ],
        "description": "Input parameters for reading a Slack thread."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "messages": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "ts": {
                  "type": "string",
                  "description": "The message timestamp identifier."
                },
                "userId": {
                  "type": "string",
                  "description": "The user ID of the message author."
                },
                "text": {
                  "type": "string",
                  "description": "The text content of the message."
                }
              },
              "additionalProperties": true,
              "description": "A Slack message record."
            },
            "description": "The list of messages in the thread."
          },
          "hasMore": {
            "type": "boolean",
            "description": "Whether more messages are available beyond this page."
          }
        },
        "additionalProperties": false,
        "required": [
          "messages",
          "hasMore"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.get_user",
      "service": "slack",
      "name": "get_user",
      "description": "Get metadata for a Slack user.",
      "requiredScopes": [
        "users:read"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack user ID."
          },
          "includeLocale": {
            "type": "boolean",
            "description": "Whether Slack should include the locale field."
          }
        },
        "additionalProperties": false,
        "required": [
          "userId"
        ],
        "description": "Input parameters for fetching a Slack user."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "user": {
            "type": "object",
            "properties": {
              "userId": {
                "type": "string",
                "description": "The unique identifier of the user."
              },
              "username": {
                "anyOf": [
                  {
                    "type": "string",
                    "description": "The username of the user."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "realName": {
                "anyOf": [
                  {
                    "type": "string",
                    "description": "The real name of the user."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "displayName": {
                "anyOf": [
                  {
                    "type": "string",
                    "description": "The display name of the user."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "isBot": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the user is a bot user."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "isDeleted": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the user is deleted."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "isAdmin": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the user is an admin."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "isOwner": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the user is an owner."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "locale": {
                "type": "string",
                "description": "The locale returned by Slack when requested."
              }
            },
            "additionalProperties": false,
            "required": [
              "userId",
              "username",
              "realName",
              "displayName",
              "isBot",
              "isDeleted",
              "isAdmin",
              "isOwner"
            ],
            "description": "A normalized Slack user record."
          }
        },
        "additionalProperties": false,
        "required": [
          "user"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.list_channels",
      "service": "slack",
      "name": "list_channels",
      "description": "List Slack public channels visible to the bot.",
      "requiredScopes": [
        "channels:read"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "The maximum number of channels to return."
          }
        },
        "additionalProperties": false,
        "description": "Input parameters for listing Slack channels."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "channels": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "channelId": {
                  "type": "string",
                  "description": "The unique identifier of the channel."
                },
                "name": {
                  "type": "string",
                  "description": "The name of the channel."
                }
              },
              "additionalProperties": false,
              "required": [
                "channelId",
                "name"
              ],
              "description": "A Slack channel summary."
            },
            "description": "The list of Slack channels."
          }
        },
        "additionalProperties": false,
        "required": [
          "channels"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.list_conversations",
      "service": "slack",
      "name": "list_conversations",
      "description": "List Slack conversations visible to the bot.",
      "requiredScopes": [
        "channels:read",
        "groups:read",
        "im:read",
        "mpim:read"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200,
            "description": "The maximum number of conversations to return."
          },
          "cursor": {
            "type": "string",
            "description": "The Slack pagination cursor."
          },
          "types": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "public_channel",
                "private_channel",
                "im",
                "mpim"
              ],
              "description": "A Slack conversation type."
            },
            "description": "Conversation types to include.",
            "minItems": 1
          },
          "excludeArchived": {
            "type": "boolean",
            "description": "Whether archived conversations should be excluded."
          }
        },
        "additionalProperties": false,
        "description": "Input parameters for listing Slack conversations."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "conversations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "channelId": {
                  "type": "string",
                  "description": "The unique identifier of the conversation."
                },
                "name": {
                  "anyOf": [
                    {
                      "type": "string",
                      "description": "The name of the conversation when available."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "public_channel",
                    "private_channel",
                    "im",
                    "mpim",
                    "unknown"
                  ],
                  "description": "The normalized Slack conversation type."
                },
                "isArchived": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "description": "Whether the conversation is archived."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "isPrivate": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "description": "Whether the conversation is private."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "isMember": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "description": "Whether the bot user is a member."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "memberCount": {
                  "type": "integer",
                  "description": "The member count when Slack provides it."
                },
                "topic": {
                  "anyOf": [
                    {
                      "type": "string",
                      "description": "The conversation topic."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "purpose": {
                  "anyOf": [
                    {
                      "type": "string",
                      "description": "The conversation purpose."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "userId": {
                  "type": "string",
                  "description": "The linked user identifier for IM conversations."
                },
                "locale": {
                  "type": "string",
                  "description": "The locale returned by Slack when requested."
                }
              },
              "additionalProperties": false,
              "required": [
                "channelId",
                "name",
                "type",
                "isArchived",
                "isPrivate",
                "isMember",
                "topic",
                "purpose"
              ],
              "description": "A normalized Slack conversation record."
            },
            "description": "The list of Slack conversations."
          },
          "nextCursor": {
            "anyOf": [
              {
                "type": "string",
                "description": "The cursor for the next page."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "required": [
          "conversations",
          "nextCursor"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.list_files",
      "service": "slack",
      "name": "list_files",
      "description": "List Slack files visible to the bot, optionally filtered by channel or user.",
      "requiredScopes": [
        "files:read"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "userId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack user ID."
          },
          "types": {
            "type": "string",
            "description": "Comma-separated Slack file type filters, for example 'images,pdfs'."
          },
          "page": {
            "type": "integer",
            "minimum": 1,
            "description": "The page number to fetch."
          },
          "count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000,
            "description": "The number of files to return."
          }
        },
        "additionalProperties": false,
        "description": "Input parameters for listing Slack files."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "files": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "fileId": {
                  "type": "string",
                  "description": "The Slack file ID."
                },
                "name": {
                  "type": "string",
                  "description": "The file name."
                },
                "title": {
                  "type": "string",
                  "description": "The file title."
                },
                "mimetype": {
                  "type": "string",
                  "description": "The file MIME type."
                },
                "urlPrivate": {
                  "type": "string",
                  "description": "The private Slack URL for the file when returned."
                }
              },
              "additionalProperties": true,
              "description": "A Slack file object returned by the Web API."
            },
            "description": "The Slack files returned by Slack."
          },
          "paging": {
            "type": "object",
            "additionalProperties": true,
            "description": "Slack paging metadata when returned."
          }
        },
        "additionalProperties": false,
        "required": [
          "files",
          "paging"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.list_users",
      "service": "slack",
      "name": "list_users",
      "description": "List Slack users visible to the bot.",
      "requiredScopes": [
        "users:read"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200,
            "description": "The maximum number of users to return."
          },
          "cursor": {
            "type": "string",
            "description": "The Slack pagination cursor."
          },
          "includeLocale": {
            "type": "boolean",
            "description": "Whether Slack should include the locale field."
          }
        },
        "additionalProperties": false,
        "description": "Input parameters for listing Slack users."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "users": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "userId": {
                  "type": "string",
                  "description": "The unique identifier of the user."
                },
                "username": {
                  "anyOf": [
                    {
                      "type": "string",
                      "description": "The username of the user."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "realName": {
                  "anyOf": [
                    {
                      "type": "string",
                      "description": "The real name of the user."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "displayName": {
                  "anyOf": [
                    {
                      "type": "string",
                      "description": "The display name of the user."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "isBot": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "description": "Whether the user is a bot user."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "isDeleted": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "description": "Whether the user is deleted."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "isAdmin": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "description": "Whether the user is an admin."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "isOwner": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "description": "Whether the user is an owner."
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "locale": {
                  "type": "string",
                  "description": "The locale returned by Slack when requested."
                }
              },
              "additionalProperties": false,
              "required": [
                "userId",
                "username",
                "realName",
                "displayName",
                "isBot",
                "isDeleted",
                "isAdmin",
                "isOwner"
              ],
              "description": "A normalized Slack user record."
            },
            "description": "The list of Slack users."
          },
          "nextCursor": {
            "anyOf": [
              {
                "type": "string",
                "description": "The cursor for the next page."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false,
        "required": [
          "users",
          "nextCursor"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.open_conversation",
      "service": "slack",
      "name": "open_conversation",
      "description": "Open or resume a direct message with one Slack user.",
      "requiredScopes": [
        "im:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "userIds": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "description": "The Slack user ID."
            },
            "description": "The single Slack user to include in the DM.",
            "minItems": 1,
            "maxItems": 1
          },
          "preventCreation": {
            "type": "boolean",
            "description": "Whether Slack should avoid creating a new conversation."
          }
        },
        "additionalProperties": false,
        "required": [
          "userIds"
        ],
        "description": "Input parameters for opening a Slack DM."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "description": "The opened Slack conversation ID."
          },
          "conversation": {
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "description": "The unique identifier of the conversation."
              },
              "name": {
                "anyOf": [
                  {
                    "type": "string",
                    "description": "The name of the conversation when available."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "public_channel",
                  "private_channel",
                  "im",
                  "mpim",
                  "unknown"
                ],
                "description": "The normalized Slack conversation type."
              },
              "isArchived": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the conversation is archived."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "isPrivate": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the conversation is private."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "isMember": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "description": "Whether the bot user is a member."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "memberCount": {
                "type": "integer",
                "description": "The member count when Slack provides it."
              },
              "topic": {
                "anyOf": [
                  {
                    "type": "string",
                    "description": "The conversation topic."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "purpose": {
                "anyOf": [
                  {
                    "type": "string",
                    "description": "The conversation purpose."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "userId": {
                "type": "string",
                "description": "The linked user identifier for IM conversations."
              },
              "locale": {
                "type": "string",
                "description": "The locale returned by Slack when requested."
              }
            },
            "additionalProperties": false,
            "required": [
              "channelId",
              "name",
              "type",
              "isArchived",
              "isPrivate",
              "isMember",
              "topic",
              "purpose"
            ],
            "description": "A normalized Slack conversation record."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "conversation"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.post_ephemeral_message",
      "service": "slack",
      "name": "post_ephemeral_message",
      "description": "Post an ephemeral Slack message visible only to one user in a conversation.",
      "requiredScopes": [
        "chat:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "text": {
            "type": "string",
            "description": "Plain text message content. When blocks are provided, Slack uses this as notification and accessibility fallback text."
          },
          "blocks": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack Block Kit block object. Pass the block exactly as Slack documents it."
            },
            "description": "Slack Block Kit blocks to render in the message.",
            "minItems": 1
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack legacy attachment object. Prefer blocks for new messages when possible."
            },
            "description": "Slack legacy attachments to include in the message.",
            "minItems": 1
          },
          "unfurlLinks": {
            "type": "boolean",
            "description": "Whether Slack should unfurl links in the message."
          },
          "unfurlMedia": {
            "type": "boolean",
            "description": "Whether Slack should unfurl media in the message."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "description": "Slack message metadata to attach to the message."
          },
          "userId": {
            "type": "string",
            "description": "The user who should receive the ephemeral message."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "userId"
        ],
        "description": "Input parameters for posting an ephemeral Slack message.",
        "anyOf": [
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "blocks"
            ]
          },
          {
            "required": [
              "attachments"
            ]
          }
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "description": "The conversation identifier where the message was sent."
          },
          "messageTs": {
            "type": "string",
            "description": "The timestamp identifier of the ephemeral message."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.post_message",
      "service": "slack",
      "name": "post_message",
      "description": "Post a Slack message. Use text for plain messages, or blocks for rich Block Kit layouts with text as fallback.",
      "requiredScopes": [
        "chat:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "text": {
            "type": "string",
            "description": "Plain text message content. When blocks are provided, Slack uses this as notification and accessibility fallback text."
          },
          "blocks": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack Block Kit block object. Pass the block exactly as Slack documents it."
            },
            "description": "Slack Block Kit blocks to render in the message.",
            "minItems": 1
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack legacy attachment object. Prefer blocks for new messages when possible."
            },
            "description": "Slack legacy attachments to include in the message.",
            "minItems": 1
          },
          "unfurlLinks": {
            "type": "boolean",
            "description": "Whether Slack should unfurl links in the message."
          },
          "unfurlMedia": {
            "type": "boolean",
            "description": "Whether Slack should unfurl media in the message."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "description": "Slack message metadata to attach to the message."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId"
        ],
        "description": "Input parameters for posting a Slack message.",
        "anyOf": [
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "blocks"
            ]
          },
          {
            "required": [
              "attachments"
            ]
          }
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "ts": {
            "type": "string",
            "description": "The timestamp identifier of the posted message."
          },
          "channelId": {
            "type": "string",
            "description": "The channel ID where the message was posted."
          }
        },
        "additionalProperties": false,
        "required": [
          "ts",
          "channelId"
        ],
        "description": "The output payload for a posted Slack message."
      }
    },
    {
      "id": "slack.remove_reaction",
      "service": "slack",
      "name": "remove_reaction",
      "description": "Remove an emoji reaction from a Slack message.",
      "requiredScopes": [
        "reactions:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "messageTs": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack message timestamp, for example '1711.0001'."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "The emoji reaction name without surrounding colons."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs",
          "name"
        ],
        "description": "Input parameters for removing a Slack reaction."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether Slack accepted the reaction removal request."
          }
        },
        "additionalProperties": false,
        "required": [
          "success"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.reply_message",
      "service": "slack",
      "name": "reply_message",
      "description": "Reply to a Slack thread. Use text, blocks, or attachments for the reply content.",
      "requiredScopes": [
        "chat:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "text": {
            "type": "string",
            "description": "Plain text message content. When blocks are provided, Slack uses this as notification and accessibility fallback text."
          },
          "blocks": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack Block Kit block object. Pass the block exactly as Slack documents it."
            },
            "description": "Slack Block Kit blocks to render in the message.",
            "minItems": 1
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack legacy attachment object. Prefer blocks for new messages when possible."
            },
            "description": "Slack legacy attachments to include in the message.",
            "minItems": 1
          },
          "unfurlLinks": {
            "type": "boolean",
            "description": "Whether Slack should unfurl links in the message."
          },
          "unfurlMedia": {
            "type": "boolean",
            "description": "Whether Slack should unfurl media in the message."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "description": "Slack message metadata to attach to the message."
          },
          "threadTs": {
            "type": "string",
            "minLength": 1,
            "description": "The timestamp of the parent message to reply to."
          },
          "replyBroadcast": {
            "type": "boolean",
            "description": "Whether Slack should also broadcast the reply to the channel."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "threadTs"
        ],
        "description": "Input parameters for replying to a Slack thread.",
        "anyOf": [
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "blocks"
            ]
          },
          {
            "required": [
              "attachments"
            ]
          }
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "ts": {
            "type": "string",
            "description": "The timestamp identifier of the posted message."
          },
          "channelId": {
            "type": "string",
            "description": "The channel ID where the message was posted."
          }
        },
        "additionalProperties": false,
        "required": [
          "ts",
          "channelId"
        ],
        "description": "The output payload for a posted Slack message."
      }
    },
    {
      "id": "slack.schedule_message",
      "service": "slack",
      "name": "schedule_message",
      "description": "Schedule a Slack message to be posted later. Use text or blocks for the scheduled content.",
      "requiredScopes": [
        "chat:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "text": {
            "type": "string",
            "description": "Plain text message content. When blocks are provided, Slack uses this as notification and accessibility fallback text."
          },
          "blocks": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack Block Kit block object. Pass the block exactly as Slack documents it."
            },
            "description": "Slack Block Kit blocks to render in the message.",
            "minItems": 1
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack legacy attachment object. Prefer blocks for new messages when possible."
            },
            "description": "Slack legacy attachments to include in the message.",
            "minItems": 1
          },
          "unfurlLinks": {
            "type": "boolean",
            "description": "Whether Slack should unfurl links in the message."
          },
          "unfurlMedia": {
            "type": "boolean",
            "description": "Whether Slack should unfurl media in the message."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "description": "Slack message metadata to attach to the message."
          },
          "postAt": {
            "type": "integer",
            "description": "The Unix timestamp when Slack should post the message."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "postAt"
        ],
        "description": "Input parameters for scheduling a Slack message.",
        "anyOf": [
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "blocks"
            ]
          },
          {
            "required": [
              "attachments"
            ]
          }
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "description": "The conversation identifier where the message will be posted."
          },
          "scheduledMessageId": {
            "type": "string",
            "description": "The scheduled message identifier returned by Slack."
          },
          "postAt": {
            "type": "integer",
            "description": "The Unix timestamp when Slack will post the message."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "scheduledMessageId",
          "postAt"
        ],
        "description": "The output payload for this action."
      }
    },
    {
      "id": "slack.update_message",
      "service": "slack",
      "name": "update_message",
      "description": "Update a Slack message posted by the bot. Provide text, blocks, or attachments as the new message content.",
      "requiredScopes": [
        "chat:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "text": {
            "type": "string",
            "description": "Plain text message content. When blocks are provided, Slack uses this as notification and accessibility fallback text."
          },
          "blocks": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack Block Kit block object. Pass the block exactly as Slack documents it."
            },
            "description": "Slack Block Kit blocks to render in the message.",
            "minItems": 1
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "description": "A Slack legacy attachment object. Prefer blocks for new messages when possible."
            },
            "description": "Slack legacy attachments to include in the message.",
            "minItems": 1
          },
          "unfurlLinks": {
            "type": "boolean",
            "description": "Whether Slack should unfurl links in the message."
          },
          "unfurlMedia": {
            "type": "boolean",
            "description": "Whether Slack should unfurl media in the message."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "description": "Slack message metadata to attach to the message."
          },
          "messageTs": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack message timestamp, for example '1711.0001'."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs"
        ],
        "description": "Input parameters for updating a Slack message.",
        "anyOf": [
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "blocks"
            ]
          },
          {
            "required": [
              "attachments"
            ]
          }
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "channelId": {
            "type": "string",
            "description": "The conversation identifier containing the message."
          },
          "messageTs": {
            "type": "string",
            "description": "The timestamp identifier of the message."
          }
        },
        "additionalProperties": false,
        "required": [
          "channelId",
          "messageTs"
        ],
        "description": "The output payload for a Slack message reference."
      }
    },
    {
      "id": "slack.upload_file",
      "service": "slack",
      "name": "upload_file",
      "description": "Upload a file to Slack using the current external upload flow. Provide fileUrl; binary content is fetched by the connector runtime.",
      "requiredScopes": [
        "files:write"
      ],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "minLength": 1,
            "description": "The file name Slack should display."
          },
          "fileUrl": {
            "type": "string",
            "description": "A URL whose response body should be uploaded to Slack.",
            "format": "uri"
          },
          "title": {
            "type": "string",
            "description": "Optional file title shown in Slack."
          },
          "channelId": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack conversation or channel ID."
          },
          "initialComment": {
            "type": "string",
            "description": "Optional message text to post with the file."
          },
          "threadTs": {
            "type": "string",
            "minLength": 1,
            "description": "The Slack message timestamp, for example '1711.0001'."
          },
          "mimeType": {
            "type": "string",
            "minLength": 1,
            "description": "The content type to send while uploading the file."
          },
          "altText": {
            "type": "string",
            "description": "Alternative text for the uploaded file when Slack supports it."
          },
          "snippetType": {
            "type": "string",
            "description": "Slack snippet type for text snippets."
          }
        },
        "additionalProperties": false,
        "required": [
          "filename",
          "fileUrl"
        ],
        "description": "Input parameters for uploading a Slack file."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string",
            "description": "The uploaded Slack file ID."
          },
          "files": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "fileId": {
                  "type": "string",
                  "description": "The Slack file ID."
                },
                "name": {
                  "type": "string",
                  "description": "The file name."
                },
                "title": {
                  "type": "string",
                  "description": "The file title."
                },
                "mimetype": {
                  "type": "string",
                  "description": "The file MIME type."
                },
                "urlPrivate": {
                  "type": "string",
                  "description": "The private Slack URL for the file when returned."
                }
              },
              "additionalProperties": true,
              "description": "A Slack file object returned by the Web API."
            },
            "description": "Files returned by Slack after completing the upload."
          }
        },
        "additionalProperties": false,
        "required": [
          "fileId",
          "files"
        ],
        "description": "The output payload for this action."
      }
    }
  ]
}
