← Back to Blog

Approve AI Agent Skills from Slack — Human-in-the-Loop in Your Channel

Your AI agent runs a task, hits a manual checkpoint, and posts a message in your Slack channel asking for approval. Reply yes — the pipeline continues. Reply no — it stops. No dashboard, no browser tab, just Slack.

✋

What You Will Build

A three-skill pipeline connected to your Slack workspace. The first two skills run automatically, then the pipeline pauses for your approval before the third runs:

chain-test (auto)
→
chain-followup (auto)
→
chain-manual ✋ (manual)

At the manual step, your Slack bot posts a message and waits. You reply yes in the channel — the final skill runs and posts the result.

What You Need


Step 1

Create the Project Folder

Create a folder called chain-slack/. One root agent.yaml orchestrates all three skills — no separate YAML files per skill needed:

chain-slack/
├── agent.yaml                  # orchestrator — lists all 3 skills
├── oe-config.json               # LLM + server + Slack bot token
├── chain-test/
│   └── SKILL.md                # greeter — fires first, auto
├── chain-followup/
│   └── SKILL.md                # summarises greeter — auto
└── chain-manual/
    └── SKILL.md                # waits for your approval — manual

Step 2

Create agent.yaml

The root agent.yaml lists all three skills in the order they run. auto skills fire immediately; manual skills pause for your approval in Slack.

agent.yaml
name: Chain Slack — Approval Demo
description: Three-skill pipeline with automatic and manual approval stages.

skills:
  # Runs first — auto (no approval needed)
  - path: ./chain-test
    trigger_type: auto

  # Runs second — auto (fires immediately after chain-test)
  - path: ./chain-followup
    trigger_type: auto

  # Runs third — manual (pauses and asks for your approval in Slack)
  - path: ./chain-manual
    trigger_type: manual

trigger_type: auto fires immediately and passes output as context to the next skill. trigger_type: manual pauses the pipeline and posts a Slack message asking for your approval before continuing.


Step 3

Create the SKILL.md Files

chain-test/SKILL.md
---
name: chain-test
description: Greets you and chains to two follow-up skills. Tests auto and manual skill behaviour.
license: Apache-2.0
metadata:
  author: Open Enthrium
  version: "1.0"
---

You are a helpful assistant.

## Step 1: Greet
Say hello, mention today's date, and give one fun fact about today in history.
chain-followup/SKILL.md
---
name: chain-followup
description: Runs automatically after the greeter and summarises its output.
license: Apache-2.0
metadata:
  author: Open Enthrium
  version: "1.0"
---

You are a summarizer assistant.

## Step 1: Summarize
The previous skill just ran. Summarize its output in one sentence
and say "Auto skill complete ✅".
chain-manual/SKILL.md
---
name: chain-manual
description: Runs only after the user approves in Slack.
license: Apache-2.0
metadata:
  author: Open Enthrium
  version: "1.0"
---

You are an assistant that confirms tasks.

## Step 1: Confirm
The user approved running you from Slack.
Acknowledge the approval, briefly reference what the previous skills said,
and say "Manual approval complete ✅".

Step 4

Create oe-config.json

Add your LLM key, server settings, and Slack bot token. Leave publicUrl blank — you will fill it in after the Cloudflare tunnel starts.

oe-config.json
{
  "llm": {
    "provider": "openai",
    "model": "gpt-4o",
    "apiKey": "sk-..."
  },
  "server": {
    "enabled": true,
    "port": 3333,
    "publicUrl": "",
    "webhook": true
  },
  "connectors": [
    {
      "connection_name": "My Slack Bot",
      "connection_type": "slack",
      "botToken": "xoxb-YOUR-BOT-TOKEN",
      "auto_reply": true,
      "rate_limit": { "messages_per_minute": 10 },
      "history": { "enabled": true, "max_messages": 10 }
    }
  ]
}

Replace sk-... with your LLM API key and xoxb-YOUR-BOT-TOKEN with your Slack bot token. See Connect OE Runtime to Slack for how to create a Slack app and get the token.


Step 5

Start a Cloudflare Tunnel

Slack needs a public HTTPS URL to deliver events to your server. Cloudflare Tunnel gives you one for free — no account or signup needed.

npx cloudflared tunnel --url http://localhost:3333
https://purple-mouse-1234.trycloudflare.com

Copy that URL. Keep this terminal open — the tunnel must stay running while you test.


Step 6

Update publicUrl and Start the Server

Open oe-config.json and paste the Cloudflare URL into publicUrl:

"publicUrl": "https://purple-mouse-1234.trycloudflare.com"

Open a second terminal and start OE Runtime from inside the chain-slack/ folder:

cd chain-slack
npx -y @openenthrium/oe-runtime@latest --serve --config oe-config.json
  Agent         Chain Slack — Approval Demo
  Skills        chain-test (auto) · chain-followup (auto) · chain-manual (manual)
  Webhook       POST /webhook/slack

  Slack: paste this URL in Event Subscriptions →
  https://purple-mouse-1234.trycloudflare.com/webhook/slack

The server prints the exact webhook URL to paste into your Slack app. Make sure Socket Mode is OFF in your Slack app (Settings → Socket Mode) — when Socket Mode is on, Slack ignores the webhook URL and your server receives nothing.


Step 7

Verify Event Subscriptions

In your Slack app at api.slack.com/apps, confirm that:

The Cloudflare tunnel URL changes every time you restart npx cloudflared. Each new session: update publicUrl in oe-config.json, restart the server, then paste the new URL in Event Subscriptions and re-verify.


Step 8

Test the Pipeline in Slack

In your Slack channel, type (no slash needed):

# your-channel
U
you9:02 AM
run chain-test
🤖
OE Bot9:02 AM
Hello! Today is August 13, 2026. Fun fact: on this day in 2004, the Athens Olympics opened — the first Summer Games held in Greece since 1896. Auto skill complete ✅ — The greeter shared today's date and a fun fact about the 2004 Athens Olympics. ⏸ Skill pending approval: chain-manual Reply yes to approve or no to cancel.
U
you9:02 AM
yes
🤖
OE Bot9:02 AM
The user approved! Building on the earlier greeting about today's date and the Athens Olympics — Manual approval complete ✅

Reject the skill

Reply no instead of yes when the bot asks for approval:

# your-channel
U
you9:05 AM
no
🤖
OE Bot9:05 AM
⏹ Skill cancelled.

Both yes and approve approve the pending skill. Both no and cancel reject it. The bot tracks the pending skill per channel — you do not need to pass any ID manually.


OE Runtime — Direct Downloads

Commands Reference

Type in SlackWhat it does
run <skill-name>Run a named skill — triggers its full pipeline automatically
yes / approveApprove the pending manual skill and run it
no / cancelReject and discard the pending manual skill
skillsList all available skills in your project
helpShow all supported commands
Any plain messageRoutes to the default: true skill

Slack intercepts messages starting with / as Slack slash commands — they never reach your bot. Always type commands without the slash: run chain-test, yes, no, help.

How It Works

  1. Auto skills fire immediately — the output of each skill flows forward as context. All auto-skill results are bundled into the bot's reply in Slack.
  2. Manual skills pause. The server stores the pending skill in memory and appends an approval prompt to the bot's message.
  3. When you reply yes, the server runs the next skill with the previous output as context and posts the result to Slack.
  4. When you reply no, the skill is discarded and the bot confirms cancellation.

Pending skills are held in memory. If the server restarts, any skill waiting for approval is lost — you will need to run the agent again. Each channel can have at most one pending skill at a time.

Human-in-the-loop AI, right inside Slack

Download OE Runtime and start running approval workflows from your Slack workspace — no code, no backend, no dashboard.

Get OE Runtime →