Source profileQuality 87/100

vellum-ai/vellum-assistant/skills/slack/SKILL.md

slack

Read, send, and manage Slack messages via the Web API

Source repository stars
1,002
Declared platforms
0
Static risk flags
1
Last source update
2026-08-04
Source checked
2026-08-04

Decision brief

What it does—and where it fits

Use these scripts to resolve Slack channel and user names to IDs. Results are cached locally so repeated lookups are free (no API calls).

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/vellum-ai/vellum-assistant --skill "skills/slack"
    Safe inspection promptEditorial

    Inspect the Agent Skill "slack" from https://github.com/vellum-ai/vellum-assistant/blob/32b93fb5c0f5e77d2a15e2f214d3726208c9d208/skills/slack/SKILL.md at commit 32b93fb5c0f5e77d2a15e2f214d3726208c9d208. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Step 1: Get an upload URL

      assistant oauth request --provider slackchannel \ -X POST \ -d '{"filename":"notes.txt","length":42}' \ /files.getUploadURLExternal --json

      assistant oauth request --provider slackchannel \ -X POST \ -d '{"filename":"notes.txt","length":42}' \ /files.getUploadURLExternal --json
    2. 02

      Step 2: Upload file content to the returned uploadurl (use curl directly)

      Review the “Step 2: Upload file content to the returned uploadurl (use curl directly)” section in the pinned source before continuing.

      Review and apply the “Step 2: Upload file content to the returned uploadurl (use curl directly)” source section.
    3. 03

      Step 3: Complete the upload

      assistant oauth request --provider slackchannel \ -X POST \ -d '{"files":[{"id":"FILEID","title":"Meeting Notes"}],"channelid":"C0123456789"}' \ /files.completeUploadExternal --json bash assistant oauth request --provider slackchannel \ "/search.messages?query=project+launch+in%…

      For rich content (digests, reports, formatted summaries): use chat.postMessage with blocks via assistant oauth request --provider slackchannelFor short alerts: assistant notifications send via bash is fine -- it lets the notification router pick the best channelFor scheduled tasks: always include an explicit Slack API call to deliver results, otherwise output only lives in the conversation log
    4. 04

      Typical Workflow

      1. Resolve the channel: bun skills/slack/scripts/slack-resolve.ts channel general to get the channel ID. 2. Call the API: Use assistant oauth request --provider slackchannel with that ID for the actual operation (send, read, react, etc.). 3. For DMs: Use bun skills/slack/scripts…

      Resolve the channel: bun skills/slack/scripts/slack-resolve.ts channel general to get the channel ID.Call the API: Use assistant oauth request --provider slackchannel with that ID for the actual operation (send, read, react, etc.).For DMs: Use bun skills/slack/scripts/slack-resolve.ts user to get the user ID, then conversations.open to get the DM channel ID, then chat.postMessage to send the message.
    5. 05

      Resolution Scripts

      Use these scripts to resolve Slack channel and user names to IDs. Results are cached locally so repeated lookups are free (no API calls).

      Success: { "ok": true, "data": { "id": "C...", "name": "general", ... } }Failure: { "ok": false, "error": "..." }Use these scripts to resolve Slack channel and user names to IDs. Results are cached locally so repeated lookups are free (no API calls).

    Permission review

    Static risk signals and limitations

    Network access

    medium · line 99

    The documentation includes network, browsing, or remote request actions.

    # Step 2: Upload file content to the returned upload_url (use curl directly)

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score87/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars1,002SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    vellum-ai/vellum-assistant
    Skill path
    skills/slack/SKILL.md
    Commit
    32b93fb5c0f5e77d2a15e2f214d3726208c9d208
    License
    MIT
    Collected
    2026-08-04
    Default branch
    main
    View the original SKILL.md

    You help users interact with their Slack workspace. All Slack operations use the Slack Web API directly via assistant oauth request --provider slack_channel -- there are no dedicated Slack tools. Use relative Slack API method paths such as /chat.postMessage; the provider supplies the Slack host.

    Resolution Scripts

    Use these scripts to resolve Slack channel and user names to IDs. Results are cached locally so repeated lookups are free (no API calls).

    CommandDescription
    bun skills/slack/scripts/slack-resolve.ts channel <name>Resolve a channel name to its ID
    bun skills/slack/scripts/slack-resolve.ts user <name-or-email>Resolve a user display name or email to their ID
    bun skills/slack/scripts/slack-resolve.ts channels [--refresh]List all cached channels, or refresh the cache

    All scripts return JSON:

    • Success: { "ok": true, "data": { "id": "C...", "name": "general", ... } }
    • Failure: { "ok": false, "error": "..." }

    The cache is stored locally under $VELLUM_WORKSPACE_DIR/data/slack-skill/. On first use the script fetches all channels/users from Slack and caches them. Subsequent lookups read from the cache with no API calls. Pass --refresh to force a refresh.

    Making Slack API Calls

    Use assistant oauth request --provider slack_channel to call any Slack Web API method. Auth is handled transparently -- the provider injects the bot token automatically. Pass relative method paths; do not include a host.

    General pattern:

    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{"channel":"C123","text":"Hello world"}' \
      /chat.postMessage --json
    

    The model knows the full Slack API from training data. Refer to https://api.slack.com/methods for the complete list of available endpoints.

    Send a message

    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{"channel":"C0123456789","text":"Hello from the assistant!"}' \
      /chat.postMessage --json
    

    Read channel history

    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{"channel":"C0123456789","limit":20}' \
      /conversations.history --json
    

    Read thread replies

    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{"channel":"C0123456789","ts":"1716000000.000001"}' \
      /conversations.replies --json
    

    Add a reaction

    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{"channel":"C0123456789","timestamp":"1716000000.000001","name":"thumbsup"}' \
      /reactions.add --json
    

    Send with blocks (rich formatting)

    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{
        "channel":"C0123456789",
        "text":"Fallback text",
        "blocks":[
          {"type":"header","text":{"type":"plain_text","text":"Weekly Update"}},
          {"type":"section","text":{"type":"mrkdwn","text":"*Project Alpha*: on track\n*Project Beta*: needs review"}}
        ]
      }' \
      /chat.postMessage --json
    

    Upload a file

    File uploads use a multi-step flow: get an upload URL, upload the file, then complete the upload.

    # Step 1: Get an upload URL
    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{"filename":"notes.txt","length":42}' \
      /files.getUploadURLExternal --json
    
    # Step 2: Upload file content to the returned upload_url (use curl directly)
    # Step 3: Complete the upload
    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{"files":[{"id":"FILE_ID","title":"Meeting Notes"}],"channel_id":"C0123456789"}' \
      /files.completeUploadExternal --json
    

    Search messages

    assistant oauth request --provider slack_channel \
      "/search.messages?query=project+launch+in%3A%23general" --json
    

    Open a DM

    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{"users":"U0123456789"}' \
      /conversations.open --json
    

    Typical Workflow

    1. Resolve the channel: bun skills/slack/scripts/slack-resolve.ts channel general to get the channel ID.
    2. Call the API: Use assistant oauth request --provider slack_channel with that ID for the actual operation (send, read, react, etc.).
    3. For DMs: Use bun skills/slack/scripts/slack-resolve.ts user <name> to get the user ID, then conversations.open to get the DM channel ID, then chat.postMessage to send the message.

    User Resolution

    When you need to send a DM or look up a Slack user by name, check contacts first to avoid redundant API calls:

    1. Before calling the resolve script: Use contact_search with query: "<name>" and channel_type: "slack". If a matching contact has externalUserId (Slack user ID) and externalChatId (DM channel ID), skip the API lookups and use those IDs directly with chat.postMessage via assistant oauth request --provider slack_channel.

      When contact_search returns notes for the recipient, use them to inform the message's tone, formality, and content. Contact notes capture relationship context and communication preferences that should shape how you write to this person.

    2. After resolving via script: When you had to use slack-resolve.ts user or conversations.open to resolve a user, save the contact with contact_upsert so you can find them by name next time. External Slack IDs (user ID, DM channel ID) are cached automatically by the messaging layer and should not be passed through contact_upsert.

    Privacy Rules

    Channel privacy must be respected at all times:

    • Check is_private on each channel before sharing content elsewhere
    • Private channel content must NEVER be shared to other channels, DMs, or external destinations
    • If the user asks to share private channel content, explain why you can't and offer alternatives (summarize the topic without quoting, ask the user to share manually)
    • Public channel content can be shared with attribution ("From #channel: ...")
    • Always confirm with the user before sending content to any destination

    Threading

    When responding to messages from Slack channels, replies should be threaded. Pass thread_ts to chat.postMessage to reply in a thread rather than posting a new top-level message:

    assistant oauth request --provider slack_channel \
      -X POST \
      -d '{"channel":"C0123456789","text":"Replying in thread","thread_ts":"1716000000.000001"}' \
      /chat.postMessage --json
    

    Connection

    Before making any Slack API calls, verify that Slack is connected. If not connected, load the slack-app-setup skill (skill_load with skill: "slack-app-setup") and follow its guided flow. Do NOT improvise setup instructions -- the slack-app-setup skill is the single source of truth. Slack uses Socket Mode and does not require redirect URLs or any OAuth flow.

    Error Handling

    If a Slack API call fails due to missing or invalid credentials -- for example, an error indicating that the token is missing or invalid -- do NOT attempt to fix the credentials manually. Instead, load the slack-app-setup skill (skill_load with skill: "slack-app-setup") and follow its guided flow to set up or reconnect Slack. Tell the user something like "Slack needs to be reconnected" and start the setup skill.

    Delivery Notes

    • For rich content (digests, reports, formatted summaries): use chat.postMessage with blocks via assistant oauth request --provider slack_channel
    • For short alerts: assistant notifications send via bash is fine -- it lets the notification router pick the best channel
    • For scheduled tasks: always include an explicit Slack API call to deliver results, otherwise output only lives in the conversation log

    Alternatives

    Compare before choosing

    Computed 8339,896

    vercel-labs/agent-browser

    slack

    Interact with Slack workspaces using browser automation. Use when the user needs to check unread channels, navigate Slack, send messages, extract data, find information, search conversations, or automate any Slack task. Triggers include "check my Slack", "what channels have unreads", "send a message to", "search Slack for", "extract from Slack", "find who said", or any task requiring programmatic Slack interaction.

    Computed 10023,781

    alirezarezvani/claude-skills

    app-store-optimization

    App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist

    Computed 1004,922

    dotnet/skills

    migrate-vstest-to-mtp

    Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing

    Computed 9929,558

    HKUDS/Vibe-Trading

    strategy-generate

    Create, modify, and optimize quantitative trading strategies, then backtest and evaluate them.