Skip to main content
Glama
a-g-e-n-t-s

Slack Message Sender

by a-g-e-n-t-s
README.md
# MCP_Slack_Server

MCP Server that provides Slack message sending capabilities for Claude Desktop and KADI agents.

## Overview

This server is part of the KADI Slack bot architecture. It:
1. Provides stateless message sending tools
2. Resolves channel names to IDs automatically
3. Supports both direct messages and thread replies
4. Works with Claude Desktop and Agent_TypeScript via KADI broker

## Architecture

```
Claude Desktop / Agent_TypeScript
              ↓
      KADI Broker (MCP Upstream)
              ↓
    MCP_Slack_Server (this project)
              ↓
      Slack Web API
              ↓
         Slack Channel
```

## Installation

```bash
cd C:\p4\Personal\SD\MCP_Slack_Server
npm install
```

## Configuration

Create `.env` file:

```env
SLACK_BOT_TOKEN=xoxb-your-bot-token
MCP_LOG_LEVEL=info
```

### Required Slack Scopes

- `chat:write` - Send messages to channels
- `chat:write.public` - Send messages to public channels without joining
- `channels:read` - List and resolve channel names
- `groups:read` - Access private channels (if needed)

## Usage

### Development Mode
```bash
npm run dev
```

### Production Mode
```bash
npm run build
npm start
```

### As MCP Upstream (via KADI Broker)

Add to `kadi-broker/mcp-upstreams.json`:

```json
{
  "id": "slack-server",
  "name": "Slack Message Sender",
  "type": "stdio",
  "prefix": "slack",
  "networks": ["global", "slack"],
  "stdio": {
    "command": "node",
    "args": ["C:/p4/Personal/SD/MCP_Slack_Server/dist/index.js"],
    "env": {
      "SLACK_BOT_TOKEN": "xoxb-..."
    }
  }
}
```

## Tools

### `send_message`

Send a message to a Slack channel.

**Input:**
```json
{
  "channel": "#general",  // or "C09T6RU41HP"
  "text": "Hello from Claude!",
  "thread_ts": "1234567890.123456"  // optional
}
```

**Output:**
```json
{
  "success": true,
  "message": "Message sent successfully",
  "timestamp": "1234567890.123456",
  "channel": "C09T6RU41HP"
}
```

### `send_reply`

Reply to a message in a thread.

**Input:**
```json
{
  "channel": "C09T6RU41HP",
  "thread_ts": "1234567890.123456",
  "text": "This is a threaded reply"
}
```

**Output:**
```json
{
  "success": true,
  "message": "Reply sent successfully",
  "timestamp": "1234567890.654321",
  "channel": "C09T6RU41HP",
  "thread_ts": "1234567890.123456"
}
```

## Integration Examples

### From Claude Desktop

```
Send a message to #general saying "Hello team!"
```

### From Agent_TypeScript

```typescript
await client.getBrokerProtocol().invokeTool({
  targetAgent: 'slack-server',
  toolName: 'slack_send_message',
  toolInput: {
    channel: '#general',
    text: 'Hello from Agent_TypeScript!'
  },
  timeout: 10000
});
```

### Reply to Slack Mention

```typescript
// After getting mention from MCP_Slack_Client
const mention = mentions[0];

await client.getBrokerProtocol().invokeTool({
  targetAgent: 'slack-server',
  toolName: 'slack_send_reply',
  toolInput: {
    channel: mention.channel,
    thread_ts: mention.thread_ts,
    text: claudeResponse
  },
  timeout: 10000
});
```

## License

MIT

TDQS

A3.6/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct purposes: one sends a new message or starts a thread, the other replies within a thread. No ambiguity.

Naming Consistency5/5

Both tools follow a consistent 'send_' prefix and verb_noun pattern ('send_message', 'send_reply'), making the naming predictable.

Tool Count3/5

With only 2 tools, the server is very focused. While this is appropriate for a minimal message sender, it feels slightly thin for general Slack interaction.

Completeness3/5

The tool set covers sending and replying, but lacks other common Slack operations (e.g., reading, editing, deleting messages), leaving notable gaps.

Maintenance

ActivityStale
ResponsivenessNo issues