金曜の夕方、来週の準備をしようとNotionを開いて手が止まったことがあります。
「今週Slackで確認したはずのタスクが、どこにも記録されていない」
Slackを遡ると、確かに火曜日に「これは対応が必要だ」と判断したメッセージがある。しかしNotionには転記されていません。当時の自分は「あとでやろう」と思い、そのまま忘れたのでしょう。よくあるパターンです。
さらに言えば、転記しようとしてNotionを開いたところ、別のページが目に入り、気づいたら30分が経っていた……ということも少なくありません。SlackとNotionの往復は、認知的な切り替えコストが想像以上に高いのです。
同じような経験をしているチームは、おそらく多いのではないでしょうか。
そこで今回、Claude Codeを使って「Slackのメッセージにスタンプ(リアクション)を押すだけで、Notionにタスクが自動登録されるボット」を自作してみました。コードを書いた経験はほぼありません。それでも想定より短時間で動作したため、つまずいた点も含めてその過程を共有します。
目次
なぜ既製のツールでは解決できなかったのか
NotionにはSlack連携機能もあり、最初はそれで試してみました。ただ、実際に使うと細かい部分で要件とのズレが出てきます。
- Slack連携のBotをチャンネルに招待すると、Botの通知がチャンネル全体に表示され、業務の妨げになる
- 公式連携では「このフォーマットで登録したい」という細かい要件に対応できない
- ZapierやMakeも検討しましたが、月額費用が継続的に発生する
- IFTTTは設定がシンプルすぎて、Notionの特定プロパティに値を入れるような細かい制御ができない
特に最初の問題は無視できないストレスでした。チームのチャンネルにBotを入れると、「○○さんがタスクを追加しました」といった通知が流れてしまいます。自分のタスク管理のために、チームの業務に支障をきたしたくはありません。
Zapierも一時期使っていましたが、無料枠では月100タスクまでです。毎日5〜6個のタスクを登録すると月末にはもう枠が残っていません。有料プランでは月2,000円以上かかります。「スタンプを押してNotionに登録するだけ」の用途にその費用は見合わないと判断しました。
「スタンプを押すだけで、バックグラウンドでNotionに登録される」——そういうツールが、既製品では見つかりませんでした。
Claude Codeで自作することにした
Claude Codeは、ターミナルから日本語でClaudeに指示を出しながら、コードの生成、ファイルの作成、実行までを一貫して処理してくれるツールです。プログラミングの知識がなくても「こういうものを作りたい」と伝えるだけで、動作するものが生成されます。
「Slackのリアクションを検知してNotionに登録するボット」は、APIさえあれば技術的には難しくないようですが、自分でコードを書くのは現実的ではありません。それであれば、Claude Codeに任せてみようと考えました。
正直なところ、最初は「途中で行き詰まり、結局エンジニアの方に依頼することになるだろう」という程度の見立てでした。
作ったものの全体像
構造はシンプルで、図にすると以下の通りです。
Slackのメッセージに ✅ スタンプを押す
↓
ボットがリアクションを検知
↓
そのメッセージの内容をNotionのデータベースに自動登録
↓
ボットがスレッドで「Notionに登録しました」と返信
これだけです。Notionに登録されるのは「本文」「投稿者」「日時」「クライアント名」の4項目。クライアント名はSlackのチャンネル名から自動で判定できるため、手動での入力は不要です。
最初は「優先度」や「カテゴリ」も自動分類させようかと思ったんですが、分類の精度が安定しなかったことと、そもそも登録時点で分類する必要がないことに気づき、シンプルな構成に振り切りました。整理はNotionの中で後から行えば十分です。
Step 1:まず何が必要かを整理してもらう
Claude Codeのターミナルを開いて、やりたいことをそのまま伝えました。

「Slackで特定のスタンプ(✅)をメッセージに押したとき、そのメッセージの内容をNotionのデータベースに自動登録するボットを作りたい。Pythonで作ってほしい。必要な準備も教えて」
すると、Claude Codeは必要な要素を一覧で提示してくれました。
ここまでで約5分です。「何から手をつければよいか分からない」という状態から、やるべきことが3つに整理されました。自分で調べた場合、技術ブログの記事を複数読んでもそれぞれ手順が異なり、かえって混乱する——という状況に陥りがちです。この時点でClaude Codeに頼った判断は正解でした。
Step 2:Slack Appの設定
Slack Appの作成はapi.slack.comから手動で行います。Claude Codeが「このURLにアクセスして、こういう設定をしてください」と手順を案内してくれるので、それに従うだけです。
ただ、ここで最初のつまずきがありました。
Claude Codeに言われた通りに[Bot Token Scopes](https://docs.slack.dev/ja-jp)(ボットに許可する操作の範囲。詳しくはSlack公式ドキュメントの「権限(スコープ)」を参照)を設定したつもりでしたが、「リアクションを読み取る権限」 を入れ忘れていて、ボットが動作しません。エラーメッセージには「missing_scope」としか表示されず、何が原因か判断できませんでしたが、そのままClaude Codeに貼り付けたところ「reactions:readの権限が必要です。Bot Token Scopesに追加してください」と即答してくれました。
そもそもスコープとは何かという知識がない状態でしたが、「どの権限が必要か」をそのまま質問すればすべて回答が返ってきます。

Step 3:コードの生成
必要な情報(Slack BotトークンとNotion APIキー)が揃ったところで、Claude Codeにコード生成を依頼しました。

印象的だったのは、Claude Codeが「ファイルを作成してよいですか?」と確認したうえで、プロジェクトフォルダにファイルを順次生成してくれる点です。.envファイル(APIキーを格納する設定ファイル)の雛形も用意され、「ここにトークンを貼り付けてください」と案内されます。
自分が行った作業はAPIキーをコピーして貼り付けただけです。コードは1行も記述していません。
参考までに、Claude Codeが生成したファイル構成と主要なコードを掲載します。使用言語はPython、フレームワークはSlack公式の`slack-bolt`です。
ファイル構成:
プロンプト例
“`
slack-notion-bot/
├── bot.py # ボット本体
├── .env # APIキーの設定ファイル
└── requirements.txt # 必要なライブラリ一覧
“`
**環境構築(Claude Codeが案内してくれたコマンド):**
プロンプト例
“`bash
pip install slack-bolt notion-client python-dotenv
“`
ボットの中核部分(bot.py から抜粋):
プロンプト例
“`python
@app.event(“reaction_added”)
def handle_reaction(event, say, client):
# ✅以外のスタンプは無視
if event[“reaction”] != “white_check_mark”:
return
# ボット自身の投稿には反応しない(無限ループ防止)
if event.get(“item_user”) == bot_user_id:
return
# スタンプが押されたメッセージの内容を取得
result = client.conversations_history(
channel=event[“item”][“channel”],
latest=event[“item”][“ts”],
limit=1,
inclusive=True
)
message = result[“messages”][0]
# Notionのデータベースに登録
notion.pages.create(
parent={“database_id”: NOTION_DATABASE_ID},
properties={
“タスク”: {“title”: [{“text”: {“content”: message[“text”]}}]},
“投稿者”: {“rich_text”: […]},
“日時”: {“date”: {“start”: timestamp}},
“クライアント”: {“select”: {“name”: channel_name}},
}
)
# スレッドに登録完了を返信
say(text=”✅ Notionに登録しました”, thread_ts=event[“item”][“ts”])
“`
コードの中身を理解する必要はありません。ポイントは、「✅のリアクションを検知→メッセージ取得→Notionに登録→スレッドに返信」という処理が、約100行程度のコードで完結しているということです。この程度の規模であれば、Claude Codeが一度の指示でほぼ完成形を生成してくれます。
Step 4:テストと修正の繰り返し
コードが生成されたら、動作確認のためにローカルで実行します。
ここが「これは形になるかもしれない」と手応えを感じた工程です。実際に起きたエラーと修正の流れを、そのまま時系列で記載します。
1回目:ライブラリが見つからない
プロンプト例
$ python bot.py
ModuleNotFoundError: No module named ‘slack_bolt’
[copy_box]
このエラーをClaude Codeに貼り付けたところ、「slack-boltがインストールされていません」と原因を特定し、以下のコマンドを提示してくれました。
pip install slack-bolt notion-client python-dotenv
プロンプト例
2回目:Socket Mode用のトークンが未設定
[copy_box]
$ python bot.py
slack_bolt.error.BoltError: A valid App-Level Token is required for Socket Mode.
再びClaude Codeに貼り付けると、「Socket Modeにはアプリレベルトークン(xapp- で始まるもの)が必要です。Slack Appの設定画面 > Basic Information > App-Level Tokens から生成してください」と案内されました。指示通りにトークンを生成して.envに追加したところ、このエラーは解消しました。
3回目:.envの変数名が不一致
プロンプト例
$ python bot.py
KeyError: ‘SLACK_APP_TOKEN’
.envファイルにはAPP_TOKEN=xapp-…と書いていましたが、コード側はSLACK_APP_TOKENを参照していました。Claude Codeに聞くと「.envの変数名をSLACK_APP_TOKENに修正してください」と即答。修正後、ボットが正常に起動しました。
プロンプト例
$ python bot.py
Bolt app is running!
この「Bolt app is running!」が表示された瞬間は、心の中で拍手していました。
ここまでの所要時間はおよそ15分です。以前の自分であれば、最初のエラーで作業を中断していたと思います。Claude Codeがエラーに対処してくれること自体は知っていましたが、実際のプロジェクトでこのサイクルがここまでスムーズに回るとは思っていませんでした。プログラミングは「最初から完璧なコードを書く」ものだという先入観がありましたが、実際には「実行→エラー→修正」の繰り返しです。その「修正」の工程をClaude Codeがほぼ即座に処理してくれるのであれば、非エンジニアでも十分に対応可能です。
Step 5:動作確認
ボットを起動した状態でSlackを開き、適当なメッセージに✅のスタンプを押してみます。

3秒ほど反応がなく、「やはり動作しないか」と思った瞬間、Notionのデータベースに行が追加されました。

さらに、Slackのスレッドにも「Notionに登録しました」という返信とNotionページへのリンクが表示されます。

自分で組み立てたものが初めて意図通りに動いた瞬間の達成感は、予想以上のものがありました。
やらかしたこと・詰まったポイント
スムーズに進んだように書きましたが、実際にはいくつかつまづいた点があります。同様の取り組みを検討されている方の参考になればと思い、そのまま共有します。
- トークンの貼り間違え
Slack Botには「Bot User OAuth Token」と「User OAuth Token」の2種類がありますが、誤ってUser OAuth Tokenの方を.envに設定してしまいました。当然動作しません。しかもエラーメッセージが「invalid_auth」としか表示されず、トークンの種類が誤っているのか権限が不足しているのか判別がつきません。
Claude Codeに「このエラーが出るんだけど」と聞いたら、「トークンが`xoxb-`で始まっているか確認してください。`xoxp-`で始まっている場合はUser Tokenです」と回答があり、即座に解決しました。「経験者にとっては自明だが、未経験者には判断しにくいポイント」を的確に教えてくれるのは、非常に助かります。
- Notionのデータベース共有設定
NotionのAPIは、対象のデータベースを「統合」と共有しないとアクセスできません。これも設定を失念していました。データベースのページで「共有」→「統合を招待」という操作が必要です。
API側は正しく動作しているのにNotionに何も登録されない、という状態で20分ほど原因を探りました。ログを確認したところ403エラーが出ており、それをClaude Codeに伝えるとすぐ「共有設定を確認してください」と返ってきましたが、そもそも最初はログを確認するという発想がありませんでした。
ちなみにこの「ログを確認する」という手順自体、Claude Codeに教わったものです。「動作しないのですが」と伝えたところ「ターミナルにエラーが出ていませんか?」と返され、初めてターミナルの出力を確認しました。非エンジニアの視点では、ターミナルの文字列はすべて同じに見えますが、「赤い文字やERRORという単語を探してください」と助言を受けてからは、おおよその内容が読み取れるようになりました。
- 自分のスタンプで無限ループ
ボット自身の返信メッセージに誤って✅を押してしまい、それが再びNotionに登録され、再びボットが返信する——というループが発生しました。実際には2回目の時点で気づき停止しましたが、「登録しました」というメッセージがNotionに入っているのを見て、想定外の挙動に苦笑しました。
これもClaude Codeに「ボット自身の投稿にはリアクションしても無視するようにしてほしい」と伝えたところ、3行ほどの条件分岐を追加する形で解決しました。このような「実際に運用して初めて判明する問題」をその場で修正できるのが、自作ツールの利点です。
- Socket Modeの存在を知らなかった
Slackのボットには「外部サーバーを立ててHTTPで通信する方式」と「Socket Mode(サーバーなしでSlackと直接通信できる方式)」の2つがあり、ローカル環境で動かすならSocket Modeが適切です。これもClaude Codeに教わりました。最初はHTTP方式でngrok(外部からアクセスできるようにするためのツール)を使おうとしていたのですが、「Socket Modeを使えばngrokなしで動かせますよ」と提案してくれました。
この辺りも自分で調べていたら、確実にHTTP方式の設定で行き詰まっていたと思います。
使ってみてどう変わったか
ボットを使い始めて2週間ほど経ちますが、最も大きな変化は「あとで転記しよう」という作業が消滅したことです。
以前は「確認した→後で転記しよう→翌日忘れている」を毎週の様に繰り返していましたが、現在は確認した瞬間にスタンプを押すだけで、その場でタスク化が完了します。
会議中にSlackを確認しながらでもスタンプは押せるため、「後で対応しよう」という先送りが発生しません。タスクを後回しにしがちな自分の性格にも合っています。
使い始めて気づいたのは、スタンプがそのまま「対応が必要かどうかの判断記録」としても機能するということです。Slackのメッセージ一覧を見返したとき、✅が付いているものは「Notionに登録済み=対応済みまたは対応予定」、逆に✅が付いていないメッセージは「まだ判断していないもの」とも取れるのでスタンプがそのままトリアージの記録になります。
自分のメッセージだけでなく、他のメンバーの投稿にも使えます。上司が「来週までに○○の資料をまとめておいてほしい」とチャンネルに書いた瞬間、✅を押すだけでNotionに登録完了です。もちろん上司への返信は別途テキストで行いますが、返信後に改めて転記する手間がなくなります。
先週、実際に助けられた場面がありました。金曜の夕方、複数のチャンネルで会話が動いているところに「来週頭にクライアントへ提出する資料のレビューをお願いします」というメッセージが埋もれていました。全体的にチャットのやり取りが多い日だったので見落としてもおかしくない状況でしたが、金曜時点で✅を押していたため、月曜の朝にNotionを開いた時点で対応すべきタスクとして把握できました。
Notionへの登録フォーマットを業務に合わせてカスタマイズできるのも、自作ならではです。URLが含まれるメッセージは「参考リンク」プロパティに自動格納する、スレッドの返信元メッセージも併せて登録する——こうした調整もClaude Codeに伝えるだけで対応してもらえました。
今後やりたいこと
現時点ではローカル環境で動かしているため、PCをシャットダウンするとボットも停止します。この点は改善が必要です。
次のステップとして考えているのは:
- サーバーにデプロイして常時稼働させる(Claude Codeに相談したら、Railway や Render を勧められました)
- ✅以外のスタンプにも対応させて、スタンプの種類でNotionの「優先度」を変える(🔥=急ぎ、📝=メモ程度、のように)
- 登録時に自動で期限を付ける(「来週」というワードが本文にあれば、7日後を期限に設定する…のような)
いずれもClaude Codeに頼めば対応できそうですが、着手時期は未定です。「動いているものに手を入れて壊れたらどうしよう」という不安があり、まだ踏み出せていません。
また、同僚から「SlackとGoogleカレンダーで同様の連携を実現したい」という要望を受けており、こちらもほとんど予備知識がないながらもClaude Codeと壁打ちをしながら構築してみようと思います。
制作を振り返って
初期設定を含めて半日かかったかどうか、というのが率直な感想です。自分自身が「これで動作するのか」と最も驚いていました。
一つ明確になったのは、「タスク管理ツールを作って」のような曖昧な指示では意図と異なるものが生成される、ということです。「Slackの✅リアクションを検知して、NotionのXXXデータベースにXXXというプロパティで登録して」という粒度まで具体的に伝えると、最初から意図に近い出力が得られました。
言い換えると、「何が必要か」を言語化できれば、実装はClaude Codeが担ってくれます。プログラミングのスキルではなく、要件を言語化するスキルの方が重要だという発見がありました。これは本業のマーケティングにも通じる部分があり、クライアントの「何となく良い形にしてほしい」という要望を具体的な施策に落とし込む作業と通ずるものがあります。
既製ツールで「あと少し」と感じている部分があるのであれば、Claude Codeで自作するという選択肢は意外と現実的です。特にSlackやNotionのようにAPIが公開されているサービスとの連携は、Claude Codeが得意とする領域です。
さいごに
実際に使用してみて良いと感じるのは、操作がスタンプ1つで完結する簡潔さと、チャンネルに余計な通知が流れないことで見るべき情報が整理された状態を保てる点です。チャンネルごとにクライアント名を自動付与したり、URLを専用プロパティに振り分けたりといったカスタマイズも、Claude Codeに頼めばその場で対応してもらえます。こういうものがノーコードで半日で作れるというのは、1年前なら信じなかったと思います。
「こういうツールがあれば」と思ったまま諦めていたことが、半日で形になる。そういう体験を一度すると、次から「まずはClaude Codeに相談してみよう」が自然な選択肢に入ってきます。
自社でもSlackやNotionの連携を自動化したい、Claude Codeを使った業務効率化に取り組みたいという方は、ぜひお気軽にご相談ください。ツール選定から構築・運用まで、当社の知見をもとにサポートさせていただきます。
また、malna株式会社では、未来の仲間を随時募集しています。AI × マーケティングの最前線で一緒に挑戦してみたいという方は、カジュアルに面談の時間をいただけますと幸いです。
無料相談はこちら 記事一覧はこちら- malnaのマーケティングについて
-
弊社ではメディアやSNSなど総合的な支援が可能です。
媒体ごとに違うパートナーが入ることもなくスピーディな意思決定が可能です。
ご不明点や不安な点等ございましたらお気軽にお問い合わせください。 - サービス資料はこちら 詳しく見る

