Updated Slack
This commit is contained in:
parent
4772920eee
commit
93d0ce389c
2 changed files with 4 additions and 71 deletions
|
|
@ -86,13 +86,8 @@ MCP Server for the Slack API, enabling Claude to interact with Slack workspaces.
|
||||||
- `reactions:write` - Add emoji reactions to messages
|
- `reactions:write` - Add emoji reactions to messages
|
||||||
- `users:read` - View users and their basic information
|
- `users:read` - View users and their basic information
|
||||||
|
|
||||||
3. Configure User Scopes (for search functionality):
|
|
||||||
Navigate to "OAuth & Permissions" and add this scope:
|
|
||||||
- `search:read` - Search workspace content that the user has access to
|
|
||||||
|
|
||||||
4. Install App to Workspace:
|
4. Install App to Workspace:
|
||||||
- Click "Install to Workspace" and authorize the app
|
- Click "Install to Workspace" and authorize the app
|
||||||
- Save the "User OAuth Token" that starts with `xoxp-`
|
|
||||||
- Save the "Bot User OAuth Token" that starts with `xoxb-`
|
- Save the "Bot User OAuth Token" that starts with `xoxb-`
|
||||||
|
|
||||||
5. Get your Team ID (starts with a `T`) by following [this guidance](https://slack.com/help/articles/221769328-Locate-your-Slack-URL-or-ID#find-your-workspace-or-org-id)
|
5. Get your Team ID (starts with a `T`) by following [this guidance](https://slack.com/help/articles/221769328-Locate-your-Slack-URL-or-ID#find-your-workspace-or-org-id)
|
||||||
|
|
@ -105,7 +100,6 @@ MCP Server for the Slack API, enabling Claude to interact with Slack workspaces.
|
||||||
"command": "mcp-server-slack",
|
"command": "mcp-server-slack",
|
||||||
"env": {
|
"env": {
|
||||||
"SLACK_BOT_TOKEN": "xoxb-your-bot-token",
|
"SLACK_BOT_TOKEN": "xoxb-your-bot-token",
|
||||||
"SLACK_USER_TOKEN": "xoxp-your-user-token",
|
|
||||||
"SLACK_TEAM_ID": "T01234567"
|
"SLACK_TEAM_ID": "T01234567"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,11 +41,6 @@ interface GetThreadRepliesArgs {
|
||||||
thread_ts: string;
|
thread_ts: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SearchMessagesArgs {
|
|
||||||
query: string;
|
|
||||||
count?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface GetUsersArgs {
|
interface GetUsersArgs {
|
||||||
cursor?: string;
|
cursor?: string;
|
||||||
limit?: number;
|
limit?: number;
|
||||||
|
|
@ -180,26 +175,6 @@ const getThreadRepliesTool: Tool = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const searchMessagesTool: Tool = {
|
|
||||||
name: "slack_search_messages",
|
|
||||||
description: "Search for messages across channels",
|
|
||||||
inputSchema: {
|
|
||||||
type: "object",
|
|
||||||
properties: {
|
|
||||||
query: {
|
|
||||||
type: "string",
|
|
||||||
description: "The search query",
|
|
||||||
},
|
|
||||||
count: {
|
|
||||||
type: "number",
|
|
||||||
description: "Number of results to return (default 5)",
|
|
||||||
default: 5,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
required: ["query"],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const getUsersTool: Tool = {
|
const getUsersTool: Tool = {
|
||||||
name: "slack_get_users",
|
name: "slack_get_users",
|
||||||
description:
|
description:
|
||||||
|
|
@ -237,17 +212,12 @@ const getUserProfileTool: Tool = {
|
||||||
|
|
||||||
class SlackClient {
|
class SlackClient {
|
||||||
private botHeaders: { Authorization: string; "Content-Type": string };
|
private botHeaders: { Authorization: string; "Content-Type": string };
|
||||||
private userHeaders: { Authorization: string; "Content-Type": string };
|
|
||||||
|
|
||||||
constructor(botToken: string, userToken: string) {
|
constructor(botToken: string) {
|
||||||
this.botHeaders = {
|
this.botHeaders = {
|
||||||
Authorization: `Bearer ${botToken}`,
|
Authorization: `Bearer ${botToken}`,
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
};
|
};
|
||||||
this.userHeaders = {
|
|
||||||
Authorization: `Bearer ${userToken}`,
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async getChannels(limit: number = 100, cursor?: string): Promise<any> {
|
async getChannels(limit: number = 100, cursor?: string): Promise<any> {
|
||||||
|
|
@ -350,20 +320,6 @@ class SlackClient {
|
||||||
return response.json();
|
return response.json();
|
||||||
}
|
}
|
||||||
|
|
||||||
async searchMessages(query: string, count: number = 5): Promise<any> {
|
|
||||||
const params = new URLSearchParams({
|
|
||||||
query: query,
|
|
||||||
count: count.toString(),
|
|
||||||
});
|
|
||||||
|
|
||||||
const response = await fetch(
|
|
||||||
`https://slack.com/api/search.messages?${params}`,
|
|
||||||
{ headers: this.userHeaders },
|
|
||||||
);
|
|
||||||
|
|
||||||
return response.json();
|
|
||||||
}
|
|
||||||
|
|
||||||
async getUsers(limit: number = 100, cursor?: string): Promise<any> {
|
async getUsers(limit: number = 100, cursor?: string): Promise<any> {
|
||||||
const params = new URLSearchParams({
|
const params = new URLSearchParams({
|
||||||
limit: Math.min(limit, 200).toString(),
|
limit: Math.min(limit, 200).toString(),
|
||||||
|
|
@ -398,12 +354,11 @@ class SlackClient {
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
const botToken = process.env.SLACK_BOT_TOKEN;
|
const botToken = process.env.SLACK_BOT_TOKEN;
|
||||||
const userToken = process.env.SLACK_USER_TOKEN;
|
|
||||||
const teamId = process.env.SLACK_TEAM_ID;
|
const teamId = process.env.SLACK_TEAM_ID;
|
||||||
|
|
||||||
if (!botToken || !userToken || !teamId) {
|
if (!botToken || !teamId) {
|
||||||
console.error(
|
console.error(
|
||||||
"Please set SLACK_BOT_TOKEN, SLACK_USER_TOKEN, and SLACK_TEAM_ID environment variables",
|
"Please set SLACK_BOT_TOKEN and SLACK_TEAM_ID environment variables",
|
||||||
);
|
);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
@ -421,7 +376,7 @@ async function main() {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
const slackClient = new SlackClient(botToken, userToken);
|
const slackClient = new SlackClient(botToken);
|
||||||
|
|
||||||
server.setRequestHandler(
|
server.setRequestHandler(
|
||||||
CallToolRequestSchema,
|
CallToolRequestSchema,
|
||||||
|
|
@ -528,21 +483,6 @@ async function main() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
case "slack_search_messages": {
|
|
||||||
const args = request.params
|
|
||||||
.arguments as unknown as SearchMessagesArgs;
|
|
||||||
if (!args.query) {
|
|
||||||
throw new Error("Missing required argument: query");
|
|
||||||
}
|
|
||||||
const response = await slackClient.searchMessages(
|
|
||||||
args.query,
|
|
||||||
args.count,
|
|
||||||
);
|
|
||||||
return {
|
|
||||||
content: [{ type: "text", text: JSON.stringify(response) }],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
case "slack_get_users": {
|
case "slack_get_users": {
|
||||||
const args = request.params.arguments as unknown as GetUsersArgs;
|
const args = request.params.arguments as unknown as GetUsersArgs;
|
||||||
const response = await slackClient.getUsers(
|
const response = await slackClient.getUsers(
|
||||||
|
|
@ -595,7 +535,6 @@ async function main() {
|
||||||
addReactionTool,
|
addReactionTool,
|
||||||
getChannelHistoryTool,
|
getChannelHistoryTool,
|
||||||
getThreadRepliesTool,
|
getThreadRepliesTool,
|
||||||
searchMessagesTool,
|
|
||||||
getUsersTool,
|
getUsersTool,
|
||||||
getUserProfileTool,
|
getUserProfileTool,
|
||||||
],
|
],
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue