使用说明
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模块公开的工具,用于高效发现
- 渐进呈现:仅加载所需的工具,以尽量减少令牌使用
- 上下文效率:返回前在执行环境中处理数据
- 隐私保护:将敏感数据保存在执行环境中
- 状态持久性:在所有操作中保持状态
- 批量操作:高效执行多项操作
安装
- 克隆存储库:
git clone https://github.com/yourusername/slack-jira-mcp-server.git
cd slack-jira-mcp-server
- 安装依赖项:
npm install
- 配置环境变量:
cp .env.example .env
编辑 .env 使用您的凭据:
对于Slack:
- 首选 api.slack.com/apps
- 创建新应用程序或选择现有应用程序
- 添加所需的机器人令牌范围(见下文)
- 将应用程序安装到工作区
- 复制Bot用户OAuth令牌
对于Jira(可选):
- 转到您的Jira个人资料:https://jiraent.cms.gov
- 导航到配置文件→ 个人访问令牌
- 创建新令牌
- 复制令牌
- 构建服务器:
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代码执行模式,此服务器:
- 渐进式加载:通过文件系统导航发现工具
- 本地处理:数据过滤发生在执行环境中
- 选择性退货:仅将相关结果传递给模型上下文
- 批量操作:多个操作有效结合
安全
- 存储在环境变量中的API令牌
- 令牌从不暴露于模型上下文
- Jira的承载令牌身份验证
- Slack的Bot令牌身份验证
- 速率限制支持
演出
- 异步/等待所有操作
- API调用的连接池
- 在适当的情况下进行响应缓存
- 对大型数据集的分页支持
故障排除
松弛问题
-
认证错误
- 验证Bot用户OAuth令牌以开头
xoxb- - 检查令牌具有所需的作用域
- 确保应用程序已安装到工作区
- 验证Bot用户OAuth令牌以开头
-
未找到频道
- 机器人必须被邀请到私人频道
- 尽可能使用频道ID而不是名称
- 检查频道未存档
-
缺少权限
- 查看Slack应用程序设置中的机器人令牌范围
- 添加作用域后重新安装应用程序
- 检查工作区管理限制
Jira问题
-
“Jira未配置”
- 检查
.env有JIRA_BASE_URL和JIRA_TOKEN - 添加环境变量后重新启动服务器
- 检查
-
“401未经授权”
- 令牌无效或已过期
- 生成新的个人访问令牌
-
“403禁止”
- 您没有此操作的权限
- 检查您的Jira用户权限
看 Jira故障排除 了解更多详情。
发展
在发展中奔跑
npm run dev
添加新工具
- 在相应的目录中创建新的工具文件:
// 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);
}
- 添加到server.ts TOOLS数组
- 在executeTool函数中实现处理程序
- 从类别索引导出
贡献
欢迎投稿!拜托:
- 遵循现有代码结构
- 为所有参数添加TypeScript类型
- 包括JSDoc注释
- 在文档中添加示例
- 使用真实的Slack工作空间进行测试
许可证
麻省理工学院
致谢
根据以下模式构建 Anthropic的MCP代码执行文章 以获得最佳的令牌效率和工具组合。
