Slack Setup logo

Slack Setup

Organization
rejot-dev
slack-setup

Set up or verify Slack in Backoffice for bot-token API calls, sending messages, Events API webhooks, app mentions, URL verification, signing-secret validation, or checking whether a Slack event arrived.

Overview

Publisherrejot-dev
Repositoryfragno
Skill nameslack-setup
Stars
62
Forks
6
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by rejot-dev on GitHub. Read the source before you install it.

Installation

Install the Slack Setup AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/rejot-dev/fragno.git /tmp/fragno
mkdir -p .claude/skills
cp -r /tmp/fragno/apps/backoffice/content/marketplace/slack-setup/versions/1.0.0/skills/slack-setup .claude/skills/slack-setup
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Slack Setup in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Slack Setup on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Slack Setup is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Slack setup

Set Slack up as one handshake: connect → verify → receive → prove.

1. Inspect existing API connections

The API capability is available automatically for the current scope. Inspect the existing outbound API connections before creating or updating the Slack connection.

Complete when the existing outbound connections are known.

2. Collect missing secrets

Collect secrets through a durable Backoffice UI rather than chat. Define a workflow and return this exact shape from a completed step.do, including only the controls for secrets still missing:

js
await step.do("request Slack credentials", async () => ({
  $ui: {
    version: 1,
    state: { response: { botUserOAuthToken: "", signingSecret: "" } },
    spec: {
      root: "form",
      elements: {
        form: {
          type: "Stack",
          props: { gap: "md" },
          children: ["bot-token", "signing-secret", "submit"],
        },
        "bot-token": {
          type: "TextInput",
          props: {
            label: "Bot User OAuth Token",
            description: "Slack token beginning with xoxb-.",
            value: { $bindState: "/response/botUserOAuthToken" },
            required: true,
            secret: true,
          },
          children: [],
        },
        "signing-secret": {
          type: "TextInput",
          props: {
            label: "Signing Secret",
            description: "Slack App → Basic Information → App Credentials.",
            value: { $bindState: "/response/signingSecret" },
            required: true,
            secret: true,
          },
          children: [],
        },
        submit: {
          type: "WorkflowEventButton",
          props: {
            label: "Connect Slack",
            eventType: "slack.credentials-submitted",
            payload: { $state: "/response" },
          },
          children: [],
        },
      },
    },
  },
}));

const credentials = await step.waitForEvent("Slack credentials", {
  type: "slack.credentials-submitted",
});

Use credentials.payload.botUserOAuthToken and credentials.payload.signingSecret only inside later step.do calls. Keep them out of workflow output, tool summaries, and prose.

Complete when the workflow has received every missing secret through slack.credentials-submitted.

3. Connect the Slack bot

Use an existing active API connection whose slug is slack. Otherwise use the submitted Bot User OAuth Token to create this connection:

js
await api.createConnection({
  slug: "slack",
  name: "Slack",
  baseUrl: "https://slack.com/api",
  auth: { type: "bearer", token: botUserOAuthToken },
});

Treat tokens as secrets: use the exact user-supplied value only in the tool call and omit it from results and prose. Verify the connection with api.getAuthStatus, then call Slack's POST /auth.test with an empty JSON body. Slack API calls can return HTTP 200 for failures, so require both HTTP 200 and body.ok === true.

If verification fails, report Slack's error value and stop. Never replace a missing token with a placeholder or test credential.

Complete when authentication is active and auth.test returns ok: true.

4. Send messages

Send with POST /chat.postMessage and a JSON body containing channel and text:

js
await api.request({
  slug: "slack",
  method: "POST",
  path: "/chat.postMessage",
  headers: { Accept: "application/json", "Content-Type": "application/json" },
  json: { channel, text },
  timeoutMs: 30000,
});

Use the channel identifier exactly as the user supplied it. Make discovery calls such as conversations.list only when the user asks to resolve or browse channels. Require body.ok === true and report Slack's error otherwise.

Complete when Slack confirms the message with ok: true.

5. Configure inbound Slack events

Inspect before writing:

js
const existing = await api.getWebhookEndpoint({ endpointId: "slack" });

Use this Slack challenge configuration:

js
const verification = {
  type: "challenge",
  method: "POST",
  when: {
    type: "equals",
    source: { type: "jsonBodyPath", path: ["type"] },
    value: "url_verification",
  },
  response: {
    type: "echoText",
    source: { type: "jsonBodyPath", path: ["challenge"] },
  },
};
const deliveryIdentity = { type: "jsonBodyPath", path: ["event_id"] };

When the endpoint is absent, create it as a draft. createWebhookEndpoint replaces the complete resource, so use it only in this branch:

js
await api.createWebhookEndpoint({
  endpointId: "slack",
  name: "Slack",
  status: "draft",
  verification,
  deliveryIdentity,
  auth: { type: "none" },
});

When the endpoint exists, preserve its stored secrets and unrelated configuration. Use updateWebhookEndpoint and include only fields that must change. In particular, omit auth when the existing authConfig is already Slack-compatible HMAC; omission preserves the stored signing secret:

js
await api.updateWebhookEndpoint({
  endpointId: "slack",
  verification,
  deliveryIdentity,
});

A Slack-compatible existing HMAC configuration has all of these values:

  • type: "hmac" and algorithm: "sha256"
  • signature header x-slack-signature, hex encoding, and prefix v0=
  • timestamped body prefix v0:, header x-slack-request-timestamp, delimiter :, and a 300-second tolerance
  • at least one stored secretRef

Collect a Signing Secret only when creating the endpoint or replacing absent/incompatible HMAC. Activate or repair it with one patch containing the necessary changed fields and this auth value:

js
await api.updateWebhookEndpoint({
  endpointId: "slack",
  status: "active",
  verification,
  deliveryIdentity,
  auth: {
    type: "hmac",
    secret: signingSecret,
    algorithm: "sha256",
    signature: {
      location: "header",
      name: "x-slack-signature",
      encoding: "hex",
      prefix: "v0=",
    },
    signedPayload: {
      type: "timestampedBody",
      prefix: "v0:",
      timestampHeader: "x-slack-request-timestamp",
      delimiter: ":",
      toleranceSeconds: 300,
    },
  },
});

Re-read the endpoint after every write. Give its publicUrl to the user for Slack App → Event Subscriptions → Request URL. Tell the user to subscribe to the app_mention bot event, grant app_mentions:read and chat:write, reinstall the Slack app when scopes change, and retry Request URL verification.

Complete when the re-read endpoint is active with Slack challenge handling, event_id delivery identity, and timestamped HMAC verification. Never report an existing setup as verified from status alone.

6. Prove event delivery

When the user asks whether a Slack message arrived, call:

js
await hooks.list({ fragment: "api", pageSize: 10 });

Find the newest completed onWebhookReceived entry whose payload has endpointId: "slack". Confirm receipt from its parsed body.event, including event type, channel, and message text when present. Keep authorization tokens, signatures, raw headers, and unrelated payload fields out of the response.

A received event proves ingestion only. State clearly when no automation exists yet to reply. Sending a reply requires chat.postMessage, normally using body.event.channel; use body.event.ts as thread_ts only when the requested reply should be threaded.

Complete when the newest matching delivery is identified, or the absence of one is reported.

Frequently asked questions

What does the Slack Setup AI skill do?

Set up or verify Slack in Backoffice for bot-token API calls, sending messages, Events API webhooks, app mentions, URL verification, signing-secret validation, or checking whether a Slack event arrived.

Why use Slack Setup on TypingMind?

Because you install it once and use it with any model. Slack Setup is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Slack Setup in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/rejot-dev/fragno/tree/main/apps/backoffice/content/marketplace/slack-setup/versions/1.0.0/skills/slack-setup. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Slack Setup?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Slack Setup?

As many as you like. As long as a model supports skills, you can use Slack Setup with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Slack Setup AI skill free?

Yes. It is published on GitHub by rejot-dev under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇