How to Connect Claude to Slack via MCP with Access Controls

Register a Claude agent in Lutril, connect Slack as an MCP app, bind the integration with the right scope, and configure Claude to use it. Every tool call logged from the start.

All posts

Overview

Lutril sits between Claude and Slack as an MCP proxy. Claude calls tools through Lutril rather than holding a Slack token directly. Lutril checks that the calling agent has a binding to Slack, forwards the call, and writes an immutable record to the activity log.

The setup has four moving parts: the Slack MCP app connection (OAuth), the agent registration, the binding that grants the agent access to Slack, and the Claude configuration that points at Lutril's MCP server. This guide walks through each one.

Prerequisites

Lutril account with admin or member access
Slack workspace where you can authorize a new app
Claude Desktop or a project using the Claude API with MCP support
1Connect Slack as an MCP app

Connect Slack as an MCP app

Before any agent can call Slack tools, your workspace needs to authorize Lutril to access Slack on its behalf. This is a one-time OAuth step done by an admin.

In Lutril, go to MCP Apps. You will see the available integrations: Slack, HubSpot, Notion, Mixpanel, and others. Find the Slack card and click Connect.

You will be redirected through Slack's OAuth flow. Lutril requests these scopes:

  • channels:read : list public channels
  • channels:history : read message history in public channels
  • chat:write : post messages as the Lutril bot
  • users:read : resolve user IDs to names in activity logs

After authorization, the Slack card shows a Connected badge with the connection date. Lutril now holds the Slack credential. Individual agents do not hold it. They request access through bindings, which you add in the next step.

2Register the agent

Register the agent in the Agent Registry

Go to Agent Registry and click Register agent. Fill in the form:

Register agent
Agent name
claude-slack-assistant
Owner
your@company.com
Purpose
Reads Slack channels and posts summaries to #ai-updates
Expires at
90 days from today (max)
Tags
slack, comms

Click Register. Lutril creates the agent in draft state and generates an MCP token. This token is shown exactly once. Copy it before closing the modal.

MCP Token : copy now
agt_7fRxP2kq8m@tenant_4hJnW:sk_live_••••••••••••••••••••••••
This secret is not stored and cannot be retrieved again. Rotate it from the agent detail page if needed.

The modal also shows two configuration snippets: one for Claude Code and one for .mcp.json. Copy the one that matches your setup and keep it handy for Step 4.

3Add a Slack binding

Add a Slack binding to the agent

The agent exists but has no access to anything yet. Click into the agent row to open its detail panel, then go to the Bindings tab.

Click Add binding, select Slack from the integration dropdown, choose a scope, and confirm.

Two scope options:

Slack Slack read
List channels, read message history. No ability to post.
Slack Slack read + write
Read access plus the ability to post messages.

For a Slack assistant that reads channels and posts summaries, select read + write. The risk score on the agent updates automatically once the binding is saved.

Now activate the agent. Back in the Overview tab, click Activate. State moves from draft to active. The agent can now call Slack tools through Lutril.

4Configure Claude

Configure Claude to use Lutril

Lutril's MCP server exposes all your connected integrations as tools. You point Claude at it using the MCP token from Step 2.

For Claude Desktop, open ~/Library/Application Support/Claude/claude_desktop_config.json and add:

claude_desktop_config.jsonjson
{
  "mcpServers": {
    "lutril": {
      "command": "npx",
      "args": ["-y", "@lutril/mcp-server@latest"],
      "env": {
        "LUTRIL_MCP_TOKEN": "agt_7fRxP2kq8m@tenant_4hJnW:sk_live_..."
      }
    }
  }
}

For Claude Code or a project-level setup, use .mcp.json at the root of your project:

.mcp.jsonjson
{
  "servers": {
    "lutril": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@lutril/mcp-server@latest"],
      "env": {
        "LUTRIL_MCP_TOKEN": "${LUTRIL_MCP_TOKEN}"
      }
    }
  }
}

Keep the token in an environment variable rather than committing it directly. Restart Claude Desktop after saving the config.

5Test and monitor

Test it and check the activity log

Ask Claude something that requires Slack access. Claude will invoke the relevant tool through Lutril, and you will see the calls appear in real time under MCP Activity.

MCP Activity · Tool Calls claude-slack-assistant
Agent Tool Integration Status Duration
agt_7fRxP2
list_channels
24 channels returned
Slack Success 41 ms
agt_7fRxP2
get_messages
#general · 50 messages
Slack Success 178 ms
agt_7fRxP2
post_message
#ai-updates · summary posted
Slack Success 94 ms

Each row is expandable. Click one to see the full input parameters, response payload, and the actor that triggered the call. Every entry is immutable and exportable for compliance purposes.

If the agent attempts to use an integration it does not have a binding for, the call is blocked and an Access Request is created automatically under the Access Requests tab. An admin can approve or deny it from there, with an optional expiry date.

Managing the agent lifecycle

A few things worth knowing for ongoing management:

  • Expiry. Agents must have an expiry date (maximum 90 days). When an agent expires, it stops working and needs to be renewed explicitly. This is intentional: it forces a periodic review of whether the agent should still exist.
  • Suspension. Admins can suspend an agent immediately from the Agent Registry. All Slack access stops. Reactivation is also one click.
  • Token rotation. If the MCP token is compromised, go to the agent detail page and rotate the credential. The old token gets a 24-hour grace window, then becomes invalid.
  • Owner offboarding. If the agent's owner leaves the company, Lutril flags the agent for reassignment. Access does not silently continue under a deprovisioned user.
Agent identity
Every tool call is attributed to agt_7fRxP2 in the activity log, not a raw Slack token.
Scope enforcement
The agent can only call tools covered by its bindings. Anything outside that is blocked and logged as an access request.
Audit trail
Immutable log of every call with full context. Exportable for SOC 2 evidence.
Kill switch
Suspend the agent from the registry. Slack access stops immediately across every environment using that token.

Governed MCP access for every agent and every tool

The same setup works for HubSpot, Notion, Mixpanel, and every other MCP app Lutril supports. One agent registry, one activity log, every integration.

Get a demo See integrations