はじめに
こんにちは!第一開発事業部の岡田です。
今回は、TypeScriptのフレームワークである「FastMCP」を使って、AIコーディングエディタの「Cursor」と「Slack」を連携させてみました。
きっかけは、最近よく耳にする「MCP」と、まだ触れたことのない「AIコーディングエディタ」に同時に触れられる、一石二鳥のテーマだと思ったからです。また、普段AIを使って開発する際、投げた質問や回答を整理できていないまま進めていくと「あの時何で詰まってたっけ?」と忘れがちになることがあります。そんな時に要約や進捗を必要に応じて社内連絡ツールのSlackにDM通知できれば、後で振り返りやすくなり理解が進むのではないかと考えました。
MCPとは?
MCPとは「Model Context Protocol」の略です。
簡単にいうと、AIに色々な道具やツールを繋げて使えるようにするための技術のことです。
AIがMCPサーバーを経由して、各種外部サービス(Slack、Googleカレンダーなど)やデータベース、PC内のデータ等と連携することで、AIをより便利に使うことができます。
開発の流れ
前提条件:Node.jsがインストールされていること
- プロジェクトの初期化と依存関係のインストール
- 設定ファイルの準備(tsconfig.jsonの設定)
- Slack側の設定(OAuthトークンの取得)
- FastMCPサーバーの実装
- Cursor側の設定(作成したMCPサーバーをCursorに認識させる)
- プロンプト入力(疎通確認)
フォルダ構成
my-mcp-server/
├── .env
├── .gitignore
├── package.json
├── package-lock.json
├── tsconfig.json
├── src/
│ └── index.ts
└── node_modules/ (依存パッケージ)
検証
1.プロジェクトの初期化と依存関係のインストール
npm init -y npm install fastmcp typescript zod @types/node npm install -D tsx npm install dotenv @slack/web-api
2.設定ファイルの準備(tsconfig.jsonの設定)
npx tsc --init
3.Slack側の設定(OAuthトークンの取得)
Slack API: Applicationsにアクセスし、「Create New App」からアプリ名とワークスペースを指定します。
その後、アプリに権限を付与し、ワークスペースにインストールすると、OAuthトークンが発行されます。
注)アプリはワークスペース全体で利用できるため、必要最小限の権限を付与するように注意する必要があります。
今回は自分が作成したBotからのダイレクトメッセージ(DM)という形でメッセージを受け取りたいため、chat:write(メッセージを送信する権限)とim:write(他のメンバーにDMを行う権限)
これら2つの権限を付与しました。
アプリの設定を変えたい時(権限の追加、スラッシュコマンド追加、ボットの名前変更など)は設定を変更した後にワークスペースに再インストールすることで変更可能です。
DMの送信には発行されたxoxb-から始まるOAuthトークンと個人のSlackメンバーIDが必要になるため、.env/に記述しておきます。
4.MCPサーバーの実装
それではSlackにメッセージを送信する仕様にしていきます。MCPサーバーの実装には標準SDKを用いる手法もありますが、今回、FastMCPを使ったことによってわずかなコードでMCPサーバーを簡単に作成することができました。具体的な実装の核となるのは addTool()メソッド です。ここに「ツールの名前」や「AIがいつそれを使うべきかという説明(用途)」を定義するだけで、AIが自律的に判断して実行できる『道具』を簡単に作成することができます。
import path from "path";
import { fileURLToPath } from "url";
import dotenv from "dotenv";
// 自分の居場所(src/index.ts)から見た「絶対パス」で .env を探す設定
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
dotenv.config({ path: path.resolve(__dirname, "../.env") });
import { FastMCP } from "fastmcp";
import { z } from "zod";
import { WebClient } from "@slack/web-api";
// Slackクライアントの初期化
const slack = new WebClient(process.env.SLACK_BOT_TOKEN);
const server = new FastMCP({
name: "Cursor-Slack-Bridge",
version: "1.0.0"
});
// ツール:要約をSlackのDMに送る
server.addTool({
name: "send_summary_to_dm",
description: "現在の開発内容の要約をSlack DMに送信します。宛先を省略すると開発者本人に届きます。",
parameters: z.object({
// .optional() をつけることで、AIがIDを入力しなくても良くなります
memberId: z.string().describe("送信先のID(省略可)").optional(),
summary: z.string().describe("要約テキスト"),
}),
execute: async ({ memberId, summary }) => {
// memberIdが空なら .env から読み込む。それも空ならエラー。
const targetId = memberId || process.env.MY_SLACK_MEMBER_ID;
if (!targetId) {
return "❌ エラー: 送信先のIDが指定されておらず、.envにも設定されていません。";
}
try {
await slack.chat.postMessage({
channel: targetId,
text: `💡 *Cursor 開発サマリー*\n\n${summary}`,
});
return `✅ Slack(${targetId})に送信しました!`;
} catch (error: any) {
return `❌ 送信失敗: ${error.message}`;
}
},
});
server.start();
5.Cursor側の設定(作成したMCPサーバーをCursorに認識させる)
MCPサーバーをCursorに登録する方法として手順は以下の通りです。
⚙️設定→Tools & MCP→Add a Custom MCP Server→mcp.jsonが開く
→実行コマンド、ファイルの置き場所の指定を行う


保存後、もう一度設定画面を見て、追加したMCPサーバーが緑色の「Running」状態になっていれば正常に登録されています。
6.プロンプト入力(疎通確認)
試しにチャット欄に「これまでの内容を要約してSlackに送って」このようなプロンプトを入力したところ。。。
(会話モードがAgentの場合だとSlackに送れますが、Askだと跳ね返されるようです)

DMが届くことを確認できました!!

毎回、Runのボタンを押すのが面倒な場合は、MCP ToolをAllowlistに追加しておくことによって自動実行され通知が飛ぶようになるので便利です。

おわりに
今回、初めてMCPとAIコーディングエディタに触れたことで、各種外部サービスと連携させた業務の効率化や、AIをより便利に使えることを実感できました。また、「これできるかも?」と思ったことを形にしやすいツールや技術がものすごく増えており、開発が楽しく感じられました。今後は、より詳細な部分に焦点を当て、MCPの深い理解や新たな開発手法のインプットを進めていきたいと思いました。