本投稿は TECOTEC Advent Calendar 2025 の15日目の記事です。
DX本部 システム開発第二事業部の陳です。 iOS、Androidの開発リーダーを務めています。
この記事では、FastMCP と Slackアプリ開発向けライブラリのBolt を利用して、Gemini CLIでSlackを操作する方法を簡単に説明します。
将来的にはワークフローを生成AIで構築し、Gemini CLIを主体としてSlackを操作できればと考えています。

記事の大まかな流れは、以下となります。
FastMCPでSlack APIを利用する際に必要なトークンと環境設定についての説明
FastMCPの環境構築(pythonの環境構築)
Slack APIを組み入れたFastMCPのソースコード
Gemini CLIへFastMCPを導入および、MCPツールの実演
順を追って手順を見ていきましょう。
Slack APIの環境設定
今回は、Slack APIの使い方は主題ではないので、詳しい説明は割愛します。 初めての方は公式Documentの入門ガイドの閲覧をお願いします。
Bolt用のToken取得
FastMCPでBoltを利用するにあたり、3つのトークンを取得する必要があります。 Slack APIでは様々なトークンが設定されており混乱を招くので、下記に明示します。
サインシークレット(.env:SLACK_SIGN_SECRET)
Settings -> Basic Information -> Signing Secret

ボットトークン(.env:SLACK_BOT_TOKEN)
Settings -> Install App

アプリトークン(.env:SLACK_APP_TOKEN)
Settings -> Basic Information -> App-Level Tokens

その他設定
Socket Modeの有効化
Settings -> Socket Mode
Enable Socket Mode を有効化してください。
Event Subscriptionの有効化
Features -> Event Subscriptions
Enable Events を有効化してください。
Bot Token Scopesの設定
Features -> OAuth & Permissions
必要性に応じてスコープを追加してください。 今回は chat:write を利用します。
FastMCPの環境構築(Python環境の構築)
Python開発環境はuvを利用してください。
パッケージ管理と仮想環境構築を一元化するためにuvを利用していますが、使い方は主題ではないので、詳しい説明は割愛します。
初めての方は公式Documentもしくは、他サイトの入門ガイドの閲覧をお願いします。
プロジェクトを作成してください。
$ uv init -p 3.10 slack_mcp $ cd slack_mcp
関連パッケージをインストールしてください。
$ uv add fastmcp python-dotenv aiohttp slack-bolt
起動を確認してください。
$ source .venv/bin/activate $ uv run main.py
FastMCPのソースコード
各処理の詳細はコメントを読んでください。
# main.py import os import logging import asyncio from dotenv import load_dotenv from slack_bolt.async_app import AsyncApp from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler from fastmcp import FastMCP from contextlib import asynccontextmanager logging.basicConfig(level=logging.INFO) load_dotenv() slack_app = AsyncApp(token=os.getenv("SLACK_BOT_TOKEN"), signing_secret=os.getenv("SLACK_SIGN_SECRET")) """メッセージイベントを格納します""" msg_queue = asyncio.Queue(maxsize=50) @slack_app.event("message") async def handle_message_events(body, logger, ack): """ Slackからメッセージイベントを監視し、メッセージ投稿があった場合、msg_queueに格納します。 """ await ack() logger.info(body) await msg_queue.put(body) pass @asynccontextmanager async def server_lifespan(server: FastMCP): """ MCP始動時に、SlackのSocketに非同期で接続します。※非同期ではない場合、MCPに干渉します。 """ slack_handler = AsyncSocketModeHandler( slack_app, os.getenv("SLACK_APP_TOKEN")) asyncio.create_task(slack_handler.start_async()) yield mcp = FastMCP("Slack Mcp Demo", lifespan=server_lifespan) @mcp.tool() async def read_slack_messages(): """ キューに溜まっている、Slackのイベントを全て取り出します。 """ messages = [] while not msg_queue.empty(): msg = await msg_queue.get() messages.append(msg) msg_queue.task_done() if not messages: return [{"status": "新着メッセージはありません"}] return messages @mcp.tool() async def slack_message( channel_id: str, text: str ): """ Slackにメッセージを送信します。 """ try: await slack_app.client.chat_postMessage( channel=channel_id, text=text ) return f"Message Send" except Exception as e: raise f"Message Send" if __name__ == "__main__": mcp.run()
Gemini CLIへのFastMCP導入
FastMCPで、Gemini CLIの設定(.gemini/setting.json)を作成してください。
$ fastmcp install gemini-cli main.py
FastMCPを実行したフォルダ階層で、Gemini CLIを起動してください。
$ gemini
プロンプトでMCPのツールを確認してください。

確認が終わりましたら、早速試してみましょう。
Slackを起動し、Slack APIを導入したチャンネルにメッセージを投稿してください。

Gemini CLIに戻り、メッセージ取得のプロンプトを入力してください。
> slackから受信した最新メッセージを表示してください
Socketで受信したイベント情報とともに、Slackのメッセージが返信されます。

Gemini CLIからSlackに返信してもらいましょう。
> channelにGemini CLIからの挨拶を返信してください

Slackに戻り、Gemini CLIから返信されていることを確認してください。

Gemini CLIから投稿されているはずです。 簡単ですが、以上になります。
まとめ
Slackに返信する簡単なサービスでも、サーバー構築からデータ加工など非常に手間が必要となりますが、 生成AIと組み合わせることで、一部実装が省略され、より柔軟に対応できるようになります。
Gemini CLIにはターミナルを操作する機能があり、従来対応できなかった高度な作業を無料(ローカル環境)できるなど様々な活用が考えられます。
今後の開発において、専門性とともに手段を問わない構想力(AI活用)が重要だと考えております。 使われる(AIと競う)技術者ではなく、使う方の技術者として意識してキャリアアップしていくことが課題と考えています。
テコテックの採用活動について
テコテックでは新卒採用、中途採用共に積極的に募集をしています。
採用サイトにて会社の雰囲気や福利厚生、募集内容をご確認いただけます。
ご興味を持っていただけましたら是非ご覧ください。
tecotec.co.jp