Skip to main content
Glama
nmontoro44

Slack Feedback MCP Server

by nmontoro44
README.md
# Slack Feedback MCP Server

MCP server for collecting product feedback from Bryan and others in the StartupOS Slack workspace.

## What It Does

This MCP server provides three tools for Claude Code:

1. **get_stakeholder_feedback** - Pull messages from Bryan (and others) with flexible date filtering
2. **get_thread_context** - Retrieve full conversation threads
3. **search_feedback** - Search feedback by keywords

## Setup Instructions

### Step 1: Create the Slack Channel

1. In your StartupOS Slack workspace, create a new channel: `#bryan-product-feedback`
2. Invite Bryan to the channel
3. Get the channel ID:
   - Right-click the channel name
   - Select "View channel details"
   - Scroll to the bottom and copy the Channel ID (starts with C...)

### Step 2: Get Bryan's User ID

1. Click on Bryan's profile in Slack
2. Click "More" → "Copy member ID"
3. Save this ID (starts with U...)

### Step 3: Create the Slack App

1. Go to https://api.slack.com/apps
2. Click "Create New App" → "From scratch"
3. Name: "Feedback Collector MCP"
4. Workspace: StartupOS
5. Click "Create App"

### Step 4: Configure Bot Permissions

1. In your app settings, go to "OAuth & Permissions"
2. Scroll to "Scopes" → "Bot Token Scopes"
3. Add these scopes:
   - `channels:history` - Read messages in public channels
   - `channels:read` - View basic channel info
   - `groups:history` - Read messages in private channels
   - `groups:read` - View basic private channel info
   - `users:read` - Get user info
   - `search:read` - Search messages

### Step 5: Install to Workspace

1. Scroll to the top of "OAuth & Permissions"
2. Click "Install to Workspace"
3. Click "Allow"
4. Copy the "Bot User OAuth Token" (starts with `xoxb-`)

### Step 6: Add Bot to Channel

1. Go to the `#bryan-product-feedback` channel in Slack
2. Type: `/invite @Feedback Collector MCP`
3. Press Enter

### Step 7: Deploy to Railway

#### Option A: Deploy from GitHub (Recommended)

1. Push this code to a GitHub repository
2. Go to https://railway.app and sign up with GitHub
3. Click "New Project" → "Deploy from GitHub repo"
4. Select your repository
5. Railway will auto-detect the Node.js project

#### Option B: Deploy via CLI

```bash
npm install -g @railway/cli
railway login
railway init
railway up
```

### Step 8: Set Environment Variables in Railway

In your Railway project dashboard:

1. Go to the "Variables" tab
2. Add these variables:
   - `SLACK_BOT_TOKEN` = your xoxb- token from Step 5
   - `SLACK_BRYAN_USER_ID` = Bryan's user ID from Step 2
   - `FEEDBACK_CHANNEL_ID` = channel ID from Step 1
   - `PORT` = 3000

3. Save and redeploy if needed

### Step 9: Get Your Railway URL

After deployment, Railway assigns you a public URL like:
```
https://slack-feedback-mcp-production-xxxx.up.railway.app
```

Copy this URL.

### Step 10: Configure Claude Code

Add to your Claude Code MCP settings file:

**Location**: `~/.claude/settings.json` or project `.mcp.json`

```json
{
  "mcpServers": {
    "slack-feedback": {
      "type": "sse",
      "url": "https://YOUR-RAILWAY-URL.up.railway.app/sse"
    }
  }
}
```

Replace `YOUR-RAILWAY-URL` with your actual Railway URL.

## Testing

Restart Claude Code and try:

- "Pull feedback from Bryan from the last 48 hours"
- "Search for feedback mentioning 'authentication'"
- "Get the full thread for this message" (when you have a thread_ts)

## Available Tools

### get_stakeholder_feedback

Pull messages from the feedback channel with date filtering.

**Parameters:**
- `time_range` (optional): "last 48 hours", "last 7 days", "today", "this week", etc.
- `stakeholder` (optional): "bryan" or "all" (default: "all")
- `channel_id` (optional): Specific channel to search

**Example:**
```
Pull Bryan's feedback from the last 2 days
```

### get_thread_context

Get full conversation thread including all replies.

**Parameters:**
- `channel_id` (required): Channel ID
- `thread_ts` (required): Parent message timestamp

**Example:**
```
Get the full thread for message ts: 1234567890.123456 in channel C0XXXXXXXXX
```

### search_feedback

Search Bryan's messages by keyword.

**Parameters:**
- `query` (required): Search keywords
- `time_range` (optional): Time range filter

**Example:**
```
Search Bryan's feedback for "login flow" from the last month
```

## Local Development

1. Copy `.env.example` to `.env`
2. Fill in your values
3. Run:

```bash
npm run dev
```

Server runs on `http://localhost:3000`

## Security Notes

- Never commit `.env` or tokens to git
- Slack bot token only has read permissions
- Railway environment variables are encrypted at rest

## Troubleshooting

**"Channel not found" error:**
- Make sure you invited the bot to the channel (`/invite @Feedback Collector MCP`)
- Verify the channel ID is correct

**"Not authorized" error:**
- Check that all required scopes are added in the Slack app settings
- Reinstall the app to workspace after adding scopes

**No messages returned:**
- Verify Bryan's user ID is correct
- Check that there are actually messages in the time range
- Try a longer time range like "last 30 days"

## Future Enhancements

The codebase is structured to support Claude-powered summarization and categorization of feedback. To enable this:

1. Add `ANTHROPIC_API_KEY` environment variable
2. Uncomment summarization logic in the tools
3. Add `@anthropic-ai/sdk` dependency

For now, raw messages are returned for maximum flexibility.