mcpField
C
connector-slack

connector-slack

github.com/caffeinelabs生産性214.8k 回インストール6 日前に更新
リポジトリ

connector-slack について

connector-slack は、生成された slack-client パッケージを通じて Caffeine canister に Slack メッセージ機能を追加する実験的なスキルです。設定したベアラートークンでアプリまたは指定ユーザーとして投稿できますが、レスポンスのデコードは実装済みで、実環境では未検証です。

主な機能

  1. 01chatPostMessage によるメッセージ投稿
  2. 02ボットまたはユーザートークンの選択
  3. 03管理者限定セッターによるトークン保存
  4. 04slack-client 経由の認証リクエスト
  5. 05メッセージ関連モジュールの生成 API

活用シーン

  1. 01Slack チャンネルへのアプリ通知
  2. 02指定ユーザーとしてのメッセージ送信
  3. 03Caffeine canister への Slack メッセージ機能追加
  4. 04ワークスペース管理者向けのトークンアクセス設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/caffeinelabs/skills --skill connector-slack

インストール後、Claude Code で/connector-slackを入力して読み込まれたか確認します。

詳細

Slack コネクター(実験的)

Caffeine キャニスターから Slack ワークスペースにメッセージを投稿します。

⚠️ 実験的([email protected])。 実際の Slack 環境で検証済み: リクエスト経路 — 実際の chat.postMessage による投稿を確認済みです(以前のクエリとフォームの不具合は解決済みです。POST パラメーターは application/x-www-form-urlencoded の本文に含めます)。 0.1.0 で実装済みですが、実際の環境ではまだ検証していません: 成功レスポンスのデコード({"ok":true,…} → 成功スキーマ)と、{"ok":false} エラーエンベロープのルーティング(それぞれの動作については既知の制限を参照してください)。そのため、レスポンス側のコードは完成していますが、動作は未検証です。diagnostics が有効なので、デコードに失敗すると Slack の生の本文が表示されます。デコード済みの成功レスポンスを実際の環境で一度確認するまでは、Slack を完全にサポートされたプラットフォーム機能として紹介しないでください。判定基準はバージョン番号ではなく、この確認です。

オーケストレーターのルーティングに関する注意事項

ユーザー、仕様、または以前のタスクで Slack、チャンネルへの投稿、Slack ワークスペースへの通知に言及している場合は、このスキルを読み込んでください。生成された slack-client パッケージが推奨される方法です。https://slack.com/api/* への生の ic.http_request は、認証、パーセントエンコーディング、JSON 解析を手作業で再実装するアンチパターンです。

意図 → 機能の対応関係:

ユーザーの意図機能
アプリとして Slack チャンネルにメッセージを投稿するボットトークン(xoxb-)を使った slack-client の chatPostMessage
Slack に特定の個人として投稿するユーザートークン(xoxp-)を使った slack-client の chatPostMessage

コードを生成する前に、トークンの選択肢をプロンプトを送ったユーザーに伝えてください(ボットかユーザーか。1 行のルールとトレードオフについては認証モデルを参照してください)。また、トークンの入手先も案内してください。トークンを貼り付けないと先へ進めないため、これを早めに伝えることで、初回使用時に行き詰まるアプリを避けられます。

トークンは人が作成する必要があるものなので、バックエンドがコンパイルできただけではビルドは完了しません。アプリ自体が管理者にトークンの入手方法を案内し、貼り付ける場所を用意した時点で完了です。手順についてはボットトークンの取得、チェックする項目についてはリクエストするスコープ、チャンネル ID についてはチャンネルの指定、必ず含めるページについてはフロントエンドを参照してください。完了メッセージでもこれらの手順を繰り返してください。チャットはアプリよりも長く残らず、管理者の記憶にも残らないためです。

この生成対象の範囲は、メッセージングコアの chat、conversations、users、files、reactions、pins の各ファミリー(API モジュール 10 個)です。モジュールごとの内訳については利用可能な API サーフェスを参照してください。 その他の Slack メソッドは、仕様が再生成されるまで対象外です。

認証モデル — ボットトークン(xoxb-)またはユーザートークン(xoxp-)

どちらもベアラー認証情報で、クライアントは同じように扱いますが、ワークスペース上で誰が操作しているように見えるかが異なります。コードを書く前に、どちらを使うかプロンプトを送ったユーザーに確認し、トレードオフを伝えてください。Slack 上でアプリがどう表示されるかが変わり、再インストールしないと後から切り替えられないためです。

ユーザーがメッセージを次のように表示したい場合…トークン伝えるべき影響
アプリ自体として(投稿にはアプリ名と APP バッジが表示されます)xoxb- (デフォルト — こちらを推奨)ワークスペース全体で使える、従業員に依存しない認証情報です。ボットは投稿先の各チャンネルに招待する必要があります(/invite @YourApp)。招待しないと Slack は not_in_channel を返します。参加していないプライベートチャンネルや DM は閲覧できません。
特定の個人として(投稿にはその人の名前とアバターが表示されます)xoxp-すべての操作がその人に帰属し、その人の操作として監査されます。その人がアクセスできる場所には、チャンネルへの招待なしでアクセスできます。その人がワークスペースを離れるか、アプリを取り消すと使えなくなります。一部のユーザー専用 API(例:search.messages)で必要です。

「アプリから通知やアラートを投稿したい」という依頼なら、xoxb- を使います。xoxp- を選ぶのは、ユーザーが明示的に人間から送信されたように見せたい場合、またはユーザー専用 API が必要な場合に限ります。どちらを選んだか、その理由とあわせて伝えてください。

ボットトークンの取得(xoxb-)
  1. https://api.slack.com/apps → Create New App → From scratch を選択し、ワークスペースを選びます。
  2. OAuth & Permissions → Scopes → Bot Token Scopes:ビルドで必要なスコープを追加します。最低限 chat:write が必要です。その他のスコープについては、以下の 要求するスコープ を参照してください。後から追加すると再インストールが必要になるため、今のうちにリストを確定してください。
  3. Install to Workspace → 認可し、xoxb- で始まる Bot User OAuth Token をコピーします。
  4. Slack で、対象の各チャンネルにアプリを招待します:/invite @YourApp。これを省略することが、最もよくある初回エラー(not_in_channel)の原因です。
要求するスコープ

上記のステップ 2 で、アプリにできることが決まります。管理者が必要なスコープを推測することはできないため、ビルドで実際に使う機能から導き出し、設定 UI にはそれらだけを正確に表示してください(フロントエンド を参照)。ボットトークンのスコープ:

アプリに必要な機能…ボットスコープ
ボットが招待されているチャンネルに投稿するchat:write
招待なしですべてのパブリックチャンネルに投稿するchat:write.public
チャンネル名を ID に解決する、パブリックチャンネルを一覧表示するchannels:read
ボットが参加しているプライベートチャンネルを一覧表示するgroups:read
メッセージを読み取る(conversationsHistory / conversationsReplies)channels:history、プライベートチャンネルには groups:history も必要
ユーザーを一覧表示する/検索するusers:read、usersLookupByEmail には users:read.email も必要
人に DM を送る(conversationsOpen → chatPostMessage)im:write
絵文字リアクションを追加するreactions:write
メッセージをピン留めするpins:write
ファイルをアップロードする/読み取るfiles:write、files:read

⚠️ 後からスコープを追加すると、トークンは無効になります。 Slack では、スコープを変更するたびに再インストールが必要です。再インストールすると新しい xoxb- が発行されます。古いトークンは既存のスコープでは引き続き機能しますが、新しいスコープは追加されません。そのため、管理者が新しいトークンを貼り付けるまで、アプリは missing_scope エラーで失敗します。最初にスコープのリストを確定し、設定ページは一度きりではなく、何度でも貼り付けられるようにしてください。

ユーザートークンの取得(xoxp-)
  1. 同じアプリで OAuth & Permissions → Scopes → User Token Scopes(ボットスコープとは別のリスト)を開き、たとえば chat:write、search:read を追加します。
  2. Install to Workspace(アプリがすでに存在する場合は Reinstall)を選択して認可します。トークンはAllow をクリックした人を表します。
  3. xoxp- で始まる User OAuth Token をコピーします。

この手順では、管理者が指定する単一の xoxp- をサポートしています。これは同じセッターを通り、同じ config.auth を使います。ここで対象外なのはユーザーごとの OAuth、つまり各エンドユーザーが自身のアカウントを認可する方式です。これにはリダイレクト、コード交換、更新の一連のフローが必要ですが、Slack 用のヘルパーはまだありません。独自に実装しようとしないでください。

トークンを canister に渡す

どちらの種類のトークンでも、ワークスペース管理者が管理者権限で制限されたセッターを通じて canister に貼り付けます。制限には AccessControl.hasPermission(state, caller, #admin) を使用します。トークンを保持するのは canister のみで、フロントエンドに返すことは決してありません。

⚠️ 最初に呼び出した人が所有権を取得する方式で、セッターを制限してはいけません。 IC では、認証されていないすべての呼び出し元が同じ匿名 principal です。そのため、匿名の呼び出しが先に所有権を取得すると、すべての匿名呼び出し元が caller == owner のチェックを通過し、ワークスペースのトークンを上書きできます。以下の例のように、認可コンポーネントの #admin 権限を使用してください。

その後、canister は config.auth = ?#bearer(token) を通じてのみクライアントにトークンを渡します。すべてのメソッドはこれを Authorization: Bearer … ヘッダーに変換します。トークンを引数に取るメソッドはなく、認証情報を URL に含めるメソッドもないため、ログに記録されるクエリ文字列から漏洩することはありません。

Outcall はすでにレプリケーションされません

defaultConfig には is_replicated = ?false が設定されているため、レコード更新でこれを引き継いだものは、そのまま正しい状態です。覚えておくことも、追加することもありません。

?true や null に上書きしないでください。レプリケーションされた outcall はサブネット内のすべてのノードからリクエストを繰り返します。Slack の場合、レプリカごとにメッセージが1回ずつ投稿され(重複は約13件)、Authorization: Bearer xoxb-…/xoxp-… ヘッダーがすべてのノードから送信されます。また、Slack の応答にはリクエストごとに異なる ts が含まれるため、いずれにしてもコンセンサスは失敗します。

バックエンド

依存関係を追加する

以下のレシピの管理者向けゲートには、クライアントとともに認可コンポーネントが必要です。

mops add [email protected]
mops add [email protected]

生成される関数は ChatApi.chatPostMessage(config, channel, asUser, attachments, blocks, iconEmoji, iconUrl, linkNames, mrkdwn, parse, replyBroadcast, text, threadTs, unfurlLinks, unfurlMedia, username) です。使用しないオプションには、空文字列/false を渡してください。トークンは引数ではありません。config.auth だけを経由します(上記の 認証モデル を参照)。これはクライアントのすべてのメソッドに当てはまります。

import AccessControl "mo:caffeineai-authorization/access-control";
import MixinAuthorization "mo:caffeineai-authorization/MixinAuthorization";
import MixinSlackConfig "mixins/slack-config";
import MixinSlackMessaging "mixins/slack-messaging";

actor {
  let accessControlState : AccessControl.AccessControlState;
  include MixinAuthorization(accessControlState, null);

  // Admin-held Slack token, `xoxb-…` or `xoxp-…` — never returned to the frontend.
  let slackConfig : { var token : Text };
  include MixinSlackConfig(accessControlState, slackConfig);
  include MixinSlackMessaging(slackConfig);
};

マイグレーションチェーンの先頭:

import AccessControl "mo:caffeineai-authorization/access-control";

module {
  type NewActor = {
    accessControlState : AccessControl.AccessControlState;
    slackConfig : { var token : Text };
  };

  public func migration(_old : {}) : NewActor {
    {
      accessControlState = AccessControl.initState();
      slackConfig = { var token = "" };
    };
  };
};
import AccessControl "mo:caffeineai-authorization/access-control";
import Runtime "mo:core/Runtime";

mixin (
  accessControlState : AccessControl.AccessControlState,
  slackConfig : { var token : Text },
) {
  public query func isSlackConfigured() : async Bool {
    slackConfig.token.size() > 0;
  };

  // Admin-only; accepts either token flavour. NOTE: `#admin` — never a
  // first-caller-claims-ownership check,
  // which the shared anonymous principal would defeat.
  public shared ({ caller }) func setSlackToken(token : Text) : async () {
    if (not AccessControl.hasPermission(accessControlState, caller, #admin)) {
      Runtime.trap("Unauthorized: Only admins can set the Slack token");
    };
    slackConfig.token := token;
  };
};
import Principal "mo:core/Principal";
import Runtime "mo:core/Runtime";
import { chatPostMessage } "mo:slack-client/Apis/ChatApi";
import { defaultConfig; type Config } "mo:slack-client/Config";

mixin (slackConfig : { var token : Text }) {
  // Token rides `config.auth`; `defaultConfig` is already non-replicated.
  func slackClientConfig(token : Text) : Config {
    {
      defaultConfig with
      auth = ?#bearer(token);
      max_response_bytes = ?(1_000_000 : Nat64);
    };
  };

  // Post `text` to `channel` (channel ID like "C012AB3CD" or "#general").
  // Returns the posted message timestamp (`ts`).
  public shared ({ caller }) func postSlackMessage(channel : Text, text : Text) : async Text {
    if (caller.isAnonymous()) Runtime.trap("Sign in to post to Slack");
    if (slackConfig.token.size() == 0) {
      Runtime.trap("Slack is not configured (an admin must set the token)");
    };
    let res = await* chatPostMessage(
      slackClientConfig(slackConfig.token), // token rides config.auth — never a URL param
      channel,
      "", // asUser
      "", // attachments
      "", // blocks
      "", // iconEmoji
      "", // iconUrl
      false, // linkNames
      true, // mrkdwn
      "", // parse
      false, // replyBroadcast
      text, // text
      "", // threadTs
      false, // unfurlLinks
      false, // unfurlMedia
      "", // username
    );
    res.ts;
  };
};

チャンネルの指定 — ID と、ボットが参加していること

chatPostMessage の最初の引数は チャンネル ID です。パブリックまたはプライベートチャンネルは C…、DM は D…、旧式のグループは G… です。#general のような名前でも パブリック チャンネルなら引き続き解決できますが、非推奨で、プライベートチャンネルでは機能しません。ID を使って保存し、名前をハードコードしないでください。

人間が ID を確認する場所(完了メッセージだけでなく、UI にもこの手順を記載してください):

  • チャンネルを開き、ヘッダーにある名前をクリック → 概要 タブ → パネルの下部に ID(C012AB3CD)が表示されます。コピーボタンもあります。
  • または、サイドバーにあるチャンネルを右クリック → リンクをコピー → …/archives/C012AB3CD の最後のパス要素が ID です。

Canister が ID を取得する方法: ConversationsApi.conversationsList を使い、name で照合します(channels:read が必要です)。一度解決したら、安定した変数に ID をキャッシュしてください。投稿のたびに解決しないでください。outcall とサイクルが倍増します。

ボットはチャンネルに参加している必要があります。参加していない場合、chatPostMessage は not_in_channel を返します。これは初回に最もよく発生する失敗です。対処方法を、推奨順に3つ示します。

  1. 管理者が対象チャンネルで /invite @YourApp を実行する。
  2. chat:write.public を付与する。招待なしで、ボットが任意の パブリック チャンネルに投稿できるようになります。
  3. conversationsJoin を呼び出す(パブリックチャンネルのみ。channels:join が必要です)。

個人に DM を送る方法: usersLookupByEmail(users:read.email が必要)または usersList でユーザー ID を取得し、conversationsOpen を呼び出して、返された D… チャンネルに投稿します。im:write が必要です。

利用可能な API サーフェス

このドロップには 10 個の API モジュール/約 140 個の操作が含まれています。実行時に検証済みなのは chatPostMessage のみです(既知の制限を参照)。残りは同じ仕様から生成され、型チェックも通っていますが、レスポンスのデコードは未検証として扱ってください。

モジュール用途代表的な関数
ChatApi投稿、編集、削除、パーマリンクchatPostMessage、chatUpdate、chatDelete、chatPostEphemeral、chatScheduleMessage、chatGetPermalink
ChatScheduledMessagesApiスケジュール済みメッセージのキューchatScheduledMessagesList
ConversationsApiチャンネル:一覧、読み取り、メンバーシップ、ライフサイクルconversationsList、conversationsHistory、conversationsReplies、conversationsInfo、conversationsOpen、conversationsJoin、conversationsInvite、conversationsCreate
UsersApiディレクトリ検索、プレゼンスusersList、usersInfo、usersLookupByEmail、usersConversations、usersGetPresence
UsersProfileApiプロフィールフィールドusersProfileGet、usersProfileSet
ReactionsApi絵文字リアクションreactionsAdd、reactionsRemove、reactionsList
PinsApiピン留めされたメッセージpinsAdd、pinsRemove、pinsList
FilesApiファイルの一覧/メタデータ/共有filesList、filesInfo、filesDelete
FilesCommentsApiファイルのコメントfilesCommentsDelete
FilesRemoteApi外部ファイルのレジストリfilesRemoteAdd、filesRemoteInfo、filesRemoteList

バイナリーのアップロード/ダウンロードは、このクライアントからは利用できません(マルチパートボディは、生成された JSON/フォームのサーフェスの対象外です)。外部 URL にあるファイルを登録する filesRemoteAdd が、サポートされている代替手段です。

フロントエンド

Slack には OAuth コールバックは不要です。認証情報は管理者が貼り付ける有効期間の長いトークンであるため、リダイレクト URI も /connect/slack ルートも、ユーザーごとのハンドシェイクもありません。これらを構築しないでください。Slack ビルドで必ず実装すべきなのは、管理者がトークンを取得して入力できるページです。これらは提案ではなく受け入れ基準であり、満たさないビルドは未完成ではなく、壊れています。

  • トークンページが存在し、アクセス可能であること。 トークンを入力するページのない「Slack に投稿」機能は使えません。ログイン済みの管理者は、ナビゲーションまたは未設定時のプロンプトから /settings/slack にアクセスできる必要があります。
  • トークンの生成手順が UI に表示されていること。 エージェントのチャット返信だけに記載してはいけません。管理者はチャットがなくなった数週間後に、このページに戻ってくることがあります。
  • 正確なスコープ一覧が表示されていること。 管理者がこのアプリに必要なスコープを推測することはできません。ビルドで実際に使用するスコープを表示してください(リクエストするスコープ)。
  1. ログインフロー — 必須。 setSlackToken は #admin を条件としているため、アプリでは匿名ではない呼び出し元が必要です。ログイン、useInternetIdentity/useActor の配線、および管理者ロールのゲートは、extension-authorization から取り入れてください。

  2. 管理者設定ページ — /settings/slack(管理者のみアクセス可能)。必須項目:

    • 入力欄の上に「Slack ボットトークンの取得方法」パネルを配置し、所要時間約5分の初回セットアップとして、次の手順を番号付きで表示します(エージェントの完了メッセージにも、これらを一字一句そのまま記載する必要があります)。
      1. https://api.slack.com/apps を開く → Create New App → From scratch → 名前を付け、ワークスペースを選択します。
      2. OAuth & Permissions → Scopes → Bot Token Scopes → このページに記載されているスコープを追加します。
      3. Install to Workspace → Allow → Bot User OAuth Token をコピーします(xoxb- で始まります)。
      4. 下に貼り付けて保存します。
      5. Slack で、アプリが投稿する各チャンネルで /invite @YourApp を実行します。 https://api.slack.com/apps を開く便利なリンクも含めます。
    • スコープ一覧はコピー可能なテキストとして表示します。このビルドで使用するスコープだけを正確に表示し、表全体は表示しません。
    • setSlackToken(token) にバインドされたパスワード入力欄を1つ設けます。Enter キーで送信し、成功時に入力欄をクリアします。また、スコープ変更時には再インストールと新しいトークンが必要になるため、一度きりのフォームにせず、再度貼り付けられるようにします。
    • isSlackConfigured()(Bool)に基づいて、「設定済み」/「未設定」のステータスを表示します。トークンは、末尾を伏せ字にしたものも含め、決して表示しません。
    • アプリが固定チャンネルに投稿する場合、そのチャンネルの ID もこのページに配置します。設定ミックスインを { var token : Text; var channel : Text } に拡張し、管理者のみ実行できる setSlackChannel を設けます。また、「チャンネル ID の確認方法」のヒント(チャンネルの指定を参照)をフィールドの横に表示します。ユーザーに、由来の説明なしに生の ID を入力させてはいけません。
    • ページにアクセスできるようにします。 isCallerAdmin が true の場合は共通 Layout のナビゲーションからこのページにリンクし、そうでない場合はリンクを表示しません。リンクはこのページ内ではなく、ナビゲーションの定義箇所に追加します。
  3. 空状態での案内。 isSlackConfigured() が false の場合、「Slack に送信」ボタンを機能しない状態で表示してはいけません。管理者には /settings/slack への「Slack を設定」リンクを表示し、管理者以外には説明を表示します。例:「Slack はまだ設定されていません。管理者が Settings でワークスペーストークンを追加する必要があります。」

  4. Slack のエラーを翻訳します。 論理的な失敗は、Slack 独自の error 文字列をメッセージに含む rejected な呼び出しとして返されます(既知の制限を参照)。少なくとも次の3つは、生のエラーを表示するのではなく、対処方法を表示します。

    • not_in_channel → 「アプリをチャンネルに招待してください:/invite @YourApp」
    • invalid_auth / not_authed → 「Slack トークンが無効です。Settings で新しいトークンを貼り付けてください」(管理者にはリンクを表示します)
    • channel_not_found → 「チャンネル ID を確認してください」(確認方法のヒントも表示します)
    • missing_scope → 「アプリに別の Slack スコープが必要です。スコープを追加して再インストールし、新しいトークンを貼り付けてください」

推奨ルート構成:

/                →  Main UI (any signed-in user; empty-state when unconfigured)
/settings/slack  →  Admin token + default channel (admin-only)
# No /connect/slack: Slack uses a pasted long-lived token, not a redirect flow.

composer が Caffeine ユーザーに伝えるべきこと

人間が Slack アプリを作成してトークンを貼り付けるまで、このアプリは動作しません。そのため、composer の完了メッセージは成果物の一部であり、単なる要約ではありません。必ず次の順序で含めてください。

  1. トークンが必要であることと、誰が入力するか — サインイン後、ナビゲーションからアクセスできる /settings/slack で管理者が入力します。
  2. Frontend の項目 2 にある5 つの番号付き手順をそのまま記載します。https://api.slack.com/apps でアプリを作成し、ボットのスコープを追加し、Install to Workspace を実行して、xoxb-… トークンをコピーして貼り付け、各対象チャンネルで /invite @YourApp を実行します。
  3. Scopes to request にあるこのビルドで必要なスコープの正確なリスト — 説明ではなく、ユーザーが Slack のスコープ選択画面にそのままコピーできるテキストとして記載します。
  4. チャンネル ID の確認方法 — チャンネルを指定する必要がある場合は、Addressing a channel にある About タブとリンクのコピー手順を記載します。
  5. 失敗時の対応をそれぞれ 1 行で記載します。not_in_channel → アプリを招待する;invalid_auth → トークンを貼り直す;channel_not_found → ID を確認する;missing_scope → スコープを追加して再インストールし、新しいトークンを貼り付ける。

「Settings で Slack を設定してください」と簡略化したり、Slack のドキュメントへのリンクに置き換えたりしないでください。ユーザーはビルドの途中で、Slack アプリのダッシュボードをまだ見たことがない可能性が非常に高く、composer を見ています。設定ページのパネルと同じ表現を使い、両者に食い違いが生じないようにしてください。

既知の制限事項(実験的)

  • {"ok": false} は拒否された呼び出しとして報告されます。 Slack は論理エラー(トークン不正、スコープ不足、チャンネルが見つからないなど)を、HTTP 200 で {"ok": false, "error": "…"} として通知します。0.1.0 以降、クライアントはこれを検出してエラーパスに渡すため、デコード失敗ではなく、not_authed、invalid_auth、channel_not_found など、Slack 独自の error 文字列が拒否メッセージに表示されます。拒否された呼び出しとして処理してください:try { … } catch (e) { Error.message(e) }。if (res.ok) … は記述しないでください。返された値はすでにデコード済みなので、ここでの ok は常に true となり、このチェックは無効なコードです。これらを #ok/#err の戻り値にすると、すべてのメソッドのシグネチャが変わるため、その対応はメジャーリリースまで保留されます。
  • 到達性(IPv4)— プロキシは不要です。 slack.com は IPv4 のみをサポートしているため、以前は IC HTTPS アウトコールから到達できませんでした。2025-08-04 以降、IC はまず直接(IPv6)接続を試し、失敗した場合は IC が管理する SOCKS プロキシ経由で自動的に再試行するため、IPv4 のみをサポートするホストでも動作します。config.baseUrl はデフォルトの https://slack.com/api のままにしてください。TLS セッションはノードと Slack の間でエンドツーエンドで確立されるため、プロキシから見えるのは暗号文のみです。フォールバック経由では多少レイテンシーが増えることを想定してください(レプリケーションされないアウトコールも低速な経路です — 上記を参照)。
  • 認証はすべてのメソッドでヘッダーベースです。 トークンは Authorization: Bearer ヘッダーのみで送信され、URL には含まれません。そのため、ログに記録されるクエリー文字列に残ることはなく、メソッドの引数にもなりません。
  • 実行時検証は一部のみです。 リクエストの形式は実際の Slack に対して検証済みです(投稿が実際に届きます)。成功レスポンスのデコードは、まだ実行時に確認されていません。diagnostics が有効なので、デコードに失敗した場合は Slack の生のレスポンス本文が表示されます。スキーマは、アーカイブされた(約 2020 年の)仕様リビジョンからも生成されています。

関連情報

  • mops add [email protected] — 生成された Slack Web API バインディングです。
  • Slack Web API reference — すべてのメソッド、そのスコープ、エラー文字列を確認できます。
  • chat.postMessage — 実行時に検証済みの唯一のパスであり、channel/text/blocks のセマンティクスを確認できます。
  • Slack token types — bot(xoxb-)と user(xoxp-)の違い、および再インストールによる影響を確認できます。
  • Slack app management — 管理者がアプリを作成し、スコープを設定して、ワークスペースにインストールする場所です。
  • extension-authorization — 必須の前提条件です。Internet Identity のログイン、useInternetIdentity/useActor の配線、トークン設定に必要な #admin ロールゲートについて説明します。

コメント