Slack与Jira集成服务

一个全面的Slack和Jira API集成服务,提供高效的代码执行和管理功能,适用于团队协作和项目管理。

  • by besampson
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 besampson/slack-bot-mcp

使用说明

Slack和Jira MCP服务器

用于Slack和Jira API集成的综合模型上下文协议(MCP)服务器,设计用于按照 Anthropic的MCP代码执行文章.

快速开始

npm install         # Install dependencies
npm run build       # Build the project
npm start           # Start the MCP server

特性

Slack集成

  • 渠道管理:列出、搜索和管理Slack频道
  • 消息操作:发送、更新、删除和搜索邮件
  • 用户管理:获取用户配置文件、列出用户、管理状态
  • 搜索:使用查询生成器进行高级邮件搜索
  • 反应:添加和删除表情符号反应
  • 线程管理:回复和管理消息线程

Jira集成

  • 问题管理:创建、读取、更新和删除Jira问题
  • 过渡:在状态之间移动问题(打开→ 进行中→ Done)
  • 搜索:使用JQL(Jira查询语言)进行高级查询
  • 评论:为问题添加评论
  • 项目:列出并管理项目
  • 作业:将问题分配给用户

高级功能

  • 代码优先设计:作为TypeScript模块公开的工具,用于高效发现
  • 渐进呈现:仅加载所需的工具,以尽量减少令牌使用
  • 上下文效率:返回前在执行环境中处理数据
  • 隐私保护:将敏感数据保存在执行环境中
  • 状态持久性:在所有操作中保持状态
  • 批量操作:高效执行多项操作

安装

  1. 克隆存储库:
git clone https://github.com/yourusername/slack-jira-mcp-server.git
cd slack-jira-mcp-server
  1. 安装依赖项:
npm install
  1. 配置环境变量:
cp .env.example .env

编辑 .env 使用您的凭据:

对于Slack:

  • 首选 api.slack.com/apps
  • 创建新应用程序或选择现有应用程序
  • 添加所需的机器人令牌范围(见下文)
  • 将应用程序安装到工作区
  • 复制Bot用户OAuth令牌

对于Jira(可选):

  • 转到您的Jira个人资料:https://jiraent.cms.gov
  • 导航到配置文件→ 个人访问令牌
  • 创建新令牌
  • 复制令牌
  1. 构建服务器:
npm run build

配置

Slack Bot令牌范围

在“OAuth和权限”下将这些范围添加到您的Slack应用程序中:

基本要求:

  • channels:history -查看公共频道中的消息
  • channels:read -查看基本频道信息
  • chat:write -发送消息
  • users:read -查看用户资料

可选(用于完整功能):

  • reactions:read, reactions:write -管理反应
  • search:read -搜索工作区内容
  • im:history, im:read, im:write -直接消息
  • groups:history, groups:read -私人频道

Jira个人访问令牌

看 Jira快速入门指南 有关详细的设置说明。

用法

作为MCP服务器

运行服务器以连接MCP客户端:

npm start

配置您的MCP客户端以连接到服务器:

{
  "mcpServers": {
    "slack-jira": {
      "command": "node",
      "args": ["./dist/src/server.js"],
      "env": {
        "SLACK_TOKEN": "xoxb-your-token",
        "JIRA_BASE_URL": "https://jiraent.cms.gov",
        "JIRA_TOKEN": "your-jira-token"
      }
    }
  }
}

代码执行模式

服务器针对代码执行环境进行了优化。工具以文件树的形式组织:

servers/
└── slack/
    ├── channels/
    │   └── listChannels.ts
    ├── messages/
    │   ├── postMessage.ts
    │   └── getHistory.ts
    ├── users/
    │   └── getUser.ts
    ├── search/
    │   └── searchMessages.ts
    ├── workflows/
    │   └── automation.ts
    └── index.ts

示例:简单消息

import * as slack from './servers/slack';

// Send a simple message
const result = await slack.postMessage({
  channel: 'C1234567890',
  text: 'Hello from MCP!'
});

console.log(`Message sent: ${result.ts}`);

示例:频道发现

import * as slack from './servers/slack';

// Find a channel by name
const channel = await slack.getChannelByName('general');
if (channel) {
  console.log(`Found channel: ${channel.id}`);
  
  // Get recent messages
  const history = await slack.getChannelHistory({
    channel: channel.id,
    limit: 10
  });
  
  console.log(`Retrieved ${history.messages.length} messages`);
}

示例:用户搜索和DM

import * as slack from './servers/slack';

// Find user by email
const user = await slack.findUserByEmail('john@example.com');
if (user) {
  // Send a DM
  await slack.postMessage({
    channel: user.id,
    text: 'Hi! I have an update for you.'
  });
}

示例:高级搜索

import * as slack from './servers/slack';

// Build complex search query
const query = new slack.SearchQueryBuilder()
  .text('deployment')
  .inChannel('engineering')
  .after('2024-01-01')
  .from('devops-bot');

const results = await query.execute({ 
  sort: 'timestamp',
  sort_dir: 'desc',
  count: 50 
});

console.log(`Found ${results.messages?.total || 0} messages`);

示例:工作流自动化

import * as slack from './servers/slack';

// Broadcast announcement to multiple channels
const broadcast = await slack.broadcastMessage(
  ['general', 'engineering', 'product'],
  '🚀 New feature released! Check out the details in #announcements',
  { onlyIfMember: true }
);

console.log(`Sent to: ${broadcast.succeeded.join(', ')}`);

// Create activity digest
const digest = await slack.createActivityDigest('C1234567890', 24, {
  includeReactions: true,
  includeThreads: true,
  topMessagesOnly: true
});

// Post digest to summary channel
await slack.postMessage({
  channel: 'C9876543210',
  text: digest
});

示例:上下文高效数据处理

import * as slack from './servers/slack';

// Process large dataset without passing through context
const channels = await slack.listChannels({ exclude_archived: false });
const activeChannels = channels.channels
  .filter(ch => !ch.is_archived && ch.num_members > 10)
  .map(ch => ({ id: ch.id, name: ch.name, members: ch.num_members }));

// Only return summary to model
console.log(`Found ${activeChannels.length} active channels with 10+ members`);
console.log('Top 5 by member count:', activeChannels.slice(0, 5));

工具参考

渠道运作

  • listChannels() -列出所有频道
  • getChannelByName(name) -按名称查找频道
  • getPublicChannels() -仅获取公共频道
  • getMemberChannels() -Get channels机器人是的成员

消息操作

  • postMessage(input) -发送消息
  • getChannelHistory(input) -获取消息历史记录
  • sendFormattedMessage() -发送格式化消息
  • sendInteractiveMessage() -使用按钮发送消息
  • replyToThread() -回复一个帖子
  • getMessagesFromUser() -获取用户消息
  • getThreadedMessages() -获取带有回复的消息
  • getRecentMessages() -按时间获取最近的消息
  • searchChannelMessages() -在频道中搜索

用户操作

  • getUserProfile(input) -获取用户资料
  • listUsers() -列出所有用户
  • findUserByEmail(email) -通过电子邮件查找
  • findUserByDisplayName(name) -按名称查找
  • getActiveUsers() -获取未删除的用户
  • getBotUsers() -获取机器人用户
  • getAdminUsers() -获取管理员用户
  • getUserStatus(userId) -获取用户状态

搜索操作

  • searchMessages(input) -完整工作空间搜索
  • SearchQueryBuilder -构建复杂的查询
  • searchMessagesFromUser() -按用户搜索
  • searchInChannel() -在特定频道中搜索
  • searchRecentMessages() -搜索最近的邮件
  • getTrendingTopics() -分析热门话题

工作流操作

  • broadcastMessage() -发送到多个频道
  • createActivityDigest() -生成活动摘要
  • onboardNewUser() -自动化用户入职流程
  • collectFeedback() -运行反馈收集
  • analyzeTeamSentiment() -分析团队情绪

建筑

代币效率

遵循MCP代码执行模式,此服务器:

  1. 渐进式加载:通过文件系统导航发现工具
  2. 本地处理:数据过滤发生在执行环境中
  3. 选择性退货:仅将相关结果传递给模型上下文
  4. 批量操作:多个操作有效结合

安全

  • 存储在环境变量中的API令牌
  • 令牌从不暴露于模型上下文
  • Jira的承载令牌身份验证
  • Slack的Bot令牌身份验证
  • 速率限制支持

演出

  • 异步/等待所有操作
  • API调用的连接池
  • 在适当的情况下进行响应缓存
  • 对大型数据集的分页支持

故障排除

松弛问题

  1. 认证错误

    • 验证Bot用户OAuth令牌以开头 xoxb-
    • 检查令牌具有所需的作用域
    • 确保应用程序已安装到工作区
  2. 未找到频道

    • 机器人必须被邀请到私人频道
    • 尽可能使用频道ID而不是名称
    • 检查频道未存档
  3. 缺少权限

    • 查看Slack应用程序设置中的机器人令牌范围
    • 添加作用域后重新安装应用程序
    • 检查工作区管理限制

Jira问题

  1. “Jira未配置”

    • 检查 .env 有 JIRA_BASE_URL 和 JIRA_TOKEN
    • 添加环境变量后重新启动服务器
  2. “401未经授权”

    • 令牌无效或已过期
    • 生成新的个人访问令牌
  3. “403禁止”

    • 您没有此操作的权限
    • 检查您的Jira用户权限

看 Jira故障排除 了解更多详情。

发展

在发展中奔跑

npm run dev

添加新工具

  1. 在相应的目录中创建新的工具文件:
// servers/slack/category/toolName.ts
import { callMCPTool } from '../../../client.js';

export async function toolName(input: InputType): Promise<OutputType> {
  return callMCPTool<OutputType>('slack_tool_name', input);
}
  1. 添加到server.ts TOOLS数组
  2. 在executeTool函数中实现处理程序
  3. 从类别索引导出

贡献

欢迎投稿!拜托:

  1. 遵循现有代码结构
  2. 为所有参数添加TypeScript类型
  3. 包括JSDoc注释
  4. 在文档中添加示例
  5. 使用真实的Slack工作空间进行测试

许可证

麻省理工学院

致谢

根据以下模式构建 Anthropic的MCP代码执行文章 以获得最佳的令牌效率和工具组合。