You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
description: Set up automated workflows between Slack and HubSpot using MCP servers in Claude Desktop. Turn emoji reactions into CRM updates with this step-by-step guide.
If your team lives in Slack, HubSpot, and an internal ops portal, every task turns into tool-switching: copy a link from Slack, search for the right record in HubSpot, then re-enter the same details into an internal system. It's slow, error-prone, and breaks the flow of work.
11
-
The problem is that often you need both external systems (Slack and HubSpot) and internal tools (often bespoke and hard to change) to move deals forward. Connecting them reliably is a challenge, and getting dev time to polish internal workflows can be difficult.
13
+
The problem is that often you need both external systems (Slack and HubSpot) and internal tools (likely bespoke and hard to change) to move deals forward. Connecting them reliably is a challenge, and getting dev time to polish internal workflows can be difficult.
12
14
13
-
There's a simpler solution however: use MCP servers to connect all your tools so you can handle everything through Claude conversations. With MCP in Claude Desktop, you connect Slack, HubSpot, and your internal tool in one place so Claude can orchestrate the steps for you. In this guide, you'll see how to turn a Slack signal (like a ‼️ reaction) into a HubSpot update, and optionally kick off a simple internal request, all without leaving Claude Desktop.
15
+
There's a simpler solution: using MCP servers to connect all your tools so you can handle everything through Claude conversations. With MCP in Claude Desktop, you can connect Slack, HubSpot, and your internal tool in one place, so Claude can orchestrate the steps for you. In this guide, you'll learn how to turn a Slack signal (like a ‼️ reaction) into a HubSpot update, and optionally kick off a simple internal request, all without leaving Claude Desktop.
14
16
15
17

16
18
17
-
18
19
## What are we building?
19
20
20
-
We're building an account management workflow that connects Slack, HubSpot, and a simple internal SalesOps API through MCP servers. Reps can ask Claude to find signal in Slack, update HubSpot, and create a small internal request, all in one conversation.
21
+
We're building an account management workflow that connects Slack, HubSpot, and a simple internal SalesOps API through MCP servers. Reps can ask Claude to find messages with a specific signal in Slack, update HubSpot, and create a small internal request, all in one conversation.
21
22
22
23
You'll set up three MCP servers:
23
24
24
-
- A Slack MCP server to find conversations
25
-
- A HubSpot MCP server to update contacts and tasks
26
-
- An internal API MCP server to create small, auditable SalesOps requests
25
+
- A Slack MCP server for finding conversations
26
+
- A HubSpot MCP server for updating contacts and tasks
27
+
- An internal API MCP server for creating small, auditable SalesOps requests
27
28
28
29

29
30
30
31
## Prerequisites
31
32
32
-
- Slack and HubSpot MCP servers installed. Follow these guides to connect each service individually.
33
-
-[MCP Use Case: Connect Slack](/mcp/using-mcp/mcp-server-providers/slack)
34
-
-[MCP Use Case: Connect HubSpot](/mcp/using-mcp/mcp-server-providers/hubspot)
35
-
- An MCP client like [Claude Desktop](https://claude.ai/download)
33
+
Before you begin, you need to install the Slack and HubSpot MCP servers in an MCP client like [Claude Desktop](https://claude.ai/download).
36
34
37
-
##Setting up HubSpot and Slack
35
+
### Set up the HubSpot and Slack integrations
38
36
39
37
Follow these guides to add both servers to Claude Desktop:
40
38
41
39
-[MCP Use Case: Connect Slack](/mcp/using-mcp/mcp-server-providers/slack)
42
40
-[MCP Use Case: Connect HubSpot](/mcp/using-mcp/mcp-server-providers/hubspot)
43
41
44
-
### Testing the flow
42
+
### Test the flow
45
43
46
-
Let's imagine that your team shares lead updates in a Slack channel called `#leads` and marks urgent ones with the ‼️ emoji. You want Claude to add a "Schedule call ASAP" note to those contacts in HubSpot.
44
+
Let's imagine that your team shares lead updates in a Slack channel called `#leads` and marks urgent messages with the ‼️ emoji. You want Claude to add a "Schedule call ASAP" note to the corresponding lead contacts in HubSpot.
47
45
48
46

49
47
@@ -55,118 +53,126 @@ In the #leads Slack channel, find the messages marked with :bangbang: emoji reac
55
53
56
54
Claude will:
57
55
58
-
1. Search the #leads channel for messages with ‼️ reactions.
59
-
2. Parse contact information from those messages.
60
-
3. Look up matching contacts in HubSpot.
61
-
4. Add a priority note to each contact record.
56
+
- Search the `#leads` channel for messages with ‼️ reactions.
57
+
- Parse contact information from those messages.
58
+
- Look up matching contacts in HubSpot.
59
+
- Add a priority note to each contact record.
62
60
63
61

64
62
65
-
The contacts in HubSpot will now have a "schedule call ASAP" note added to their records.
63
+
Once Claude has performed those actions, the contacts in HubSpot will have a "Schedule call ASAP" note added to their records.
66
64
67
65

68
66
69
-
Now at this point, you could stop here and manually make account changes for each customer. However, we can take this a step further and use [Gram](https://getgram.ai) to create a SalesOps MCP server that can be used to let Claude interact with our internal account management system.
67
+
At this point, you could stop and manually make account changes for each customer, or you could take the integration a step further and use [Gram](https://getgram.ai) to create a SalesOps MCP server that lets Claude interact with your internal account management system.
70
68
71
69
## Creating the SalesOps MCP server
72
70
73
-
Once Slack and HubSpot are working smoothly, you can bring your internal tool into the same flow. For this guide, our internal tool is a lightweight service called "SalesOps Bridge" that accepts simple requests like upgrade changes, trial extensions, or temporary feature grants. The service persists requests in SQLite, exposes a read-only `GET /requests` endpoint for dashboards, and ships with a small UI at `http://localhost:3080/` so you can inspect new requests as Claude creates them.
71
+
Once the Slack and HubSpot integration is working smoothly, you can add your internal tool to the same account management flow.
72
+
73
+
For this guide, we'll use a lightweight service called SalesOps Bridge as our internal tool. SalesOps Bridge accepts simple requests (like upgrade changes, trial extensions, and temporary feature grants), persists the requests in SQLite, and exposes a read-only `GET /requests` endpoint for dashboards. It ships with a small UI at `http://localhost:3080/`, so we can inspect new requests as Claude creates them.
74
74
75
75
### Install and run SalesOps Bridge (locally)
76
76
77
-
You can run the example service included in our example repository. You can find it at `https://github.com/ritza-co/salesops-taskmaster-tool`.
77
+
- Clone the [SalesOps Bridge repo](https://github.com/ritza-co/salesops-taskmaster-tool).
78
78
79
-
After cloning the repo, navigate to the `salesops-taskmaster-tool` directory and run the following commands:
79
+
- Navigate to the `salesops-taskmaster-tool` directory and run the following commands:
80
80
81
-
```bash
82
-
cp .env.template .env
83
-
# Edit .env to set AUTH_TOKEN, this can be any string if you're using it for demo purposes
84
-
npm install
85
-
npm run start
86
-
```
81
+
```bash
82
+
cp .env.template .env
83
+
# Edit .env to set AUTH_TOKEN, this can be any string if you're using it for demo purposes
84
+
npm install
85
+
npm run start
86
+
```
87
87
88
-
You can now check the health of the service by running a curl request to the health endpoint.
88
+
- Check the health of the service by running a curl request to the health endpoint:
89
89
90
-
```bash
91
-
curl http://localhost:3080/health
92
-
```
90
+
```bash
91
+
curl http://localhost:3080/health
92
+
```
93
93
94
-
The API exposes an OpenAPI document at `openapi.yaml` within the repository which we'll use to generate an MCP server on Gram.
94
+
The API exposes an OpenAPI document at `openapi.yaml` within the repository. We'll use this OpenAPI document to generate an MCP server on Gram.
95
95
96
96
### Expose your local service with ngrok
97
97
98
-
If you want to test in the Gram playground, you'll need to expose your local service using ngrok.
98
+
If you want to test in the Gram playground, you need to expose your local service using ngrok.
99
99
100
-
1. Install ngrok:
100
+
- Install ngrok:
101
101
102
-
```bash
103
-
brew install ngrok
104
-
```
102
+
```bash
103
+
brew install ngrok
104
+
```
105
105
106
-
Or download from [ngrok.com](https://ngrok.com/download).
106
+
Alternatively, download it from [ngrok.com](https://ngrok.com/download).
107
107
108
-
2. In a new terminal window, start ngrok to expose port 3080:
108
+
- In a new terminal window, start ngrok to expose port 3080:
109
109
110
-
```bash
111
-
ngrok http 3080
112
-
```
110
+
```bash
111
+
ngrok http 3080
112
+
```
113
113
114
-
3. Copy the HTTPS forwarding URL from the ngrok output (it will look like `https://abcd1234.ngrok.app`).
114
+
- Copy the HTTPS forwarding URL from the ngrok output (it will look like `https://abcd1234.ngrok.app`).
115
115
116
-
4. Update the server URL in `openapi.yaml`. Open the file and replace the placeholder on line 9 with your ngrok URL:
116
+
- Update the server URL in `openapi.yaml`. Open the file and replace the placeholder on line 9 with your ngrok URL:
117
117
118
-
```yaml
119
-
servers:
120
-
- url: https://YOUR-NGROK-URL.ngrok.app
121
-
```
118
+
```yaml
119
+
servers:
120
+
- url: https://YOUR-NGROK-URL.ngrok.app
121
+
```
122
122
123
123
Keep the ngrok terminal running while you test with Gram.
124
124
125
125
### Create the MCP server on Gram
126
126
127
-
Let's walk through the process of creating an MCP server on Gram. You can watch the video below for a quick walkthrough. Alternatively, for a more detailed walkthrough, see the [Gram docs](https://docs.getgram.ai/gram-quickstart).
127
+
The following video walks you through the process of creating an MCP server on Gram. Follow each of the steps, referring to the [Gram quickstart guide](https://docs.getgram.ai/gram-quickstart) as necessary, to create a SalesOps MCP server:
128
128
129
-

129
+

130
130
131
-
132
-
1. Import your OpenAPI spec into Gram and generate a toolset.
133
-
2. Fill in your environment variables in the toolset.
134
-
3. You can test the toolset within the Gram Playground.
131
+
- Import the SalesOps OpenAPI document into Gram and generate a toolset.
132
+
- Fill in your environment variables in the toolset.
133
+
- Test the toolset in the Gram Playground.
135
134
136
135
### Install the MCP server in Claude Desktop
137
136
138
-
First, create a Gram API key. In Gram, navigate to **Settings** in the sidebar, click **NEW API KEY**, select the consumer option, then click **CREATE**. Copy the API key.
137
+
First, create a Gram API key:
139
138
140
-
Next, get your MCP configuration. Navigate to **Toolsets** in the sidebar, select your SalesOps toolset, then go to the **MCP** tab. Click the **ENABLE** button, scroll down to the managed authentication section, and copy that configuration.
139
+
- In Gram, navigate to **Settings** in the sidebar, click **New API Key**, select the consumer option, and click **Create**. Copy the API key.
141
140
142
-

141
+
Next, you need to get your MCP configuration and add it to Claude Desktop.
143
142
144
-
In Claude Desktop, go to **Settings → Developer → Edit Config** and add an entry. Replace placeholders with your Gram server slug and API key. (`GET /requests` does not require auth, so Claude can read the dashboard without prompting for approval, while write actions will still require the bearer token you provide.)
143
+
- Navigate to **Toolsets** in the Gram sidebar, select your SalesOps toolset, and open the **MCP** tab.
144
+
- Click the **Enable** button, scroll down to the **Managed Authentication** section, and copy the configuration code.

147
+
148
+
- In Claude Desktop, go to **Settings → Developer → Edit Config** and add the following entry, replacing the placeholder values with your Gram server slug and API key:
**Note:**`GET /requests` does not require auth, so Claude can read the dashboard without prompting for approval but still requires your bearer token to perform write actions.
166
172
167
173
## The complete account management workflow
168
174
169
-
Your `claude_desktop_config.json` might look like this:
175
+
Your `claude_desktop_config.json`should look something like this:
170
176
171
177
```json
172
178
{
@@ -206,28 +212,28 @@ Your `claude_desktop_config.json` might look like this:
206
212
}
207
213
```
208
214
209
-
To test the complete workflow, open Claude Desktop and send an example prompt like:
215
+
-To test the complete workflow, open Claude Desktop and send an example prompt similar to the following:
210
216
211
-
```txt
212
-
Find the :bangbang: thread in #leads about Acme. Summarize who asked, what's needed, and timing with the Slack link. Then use HubSpot to add a note and a task due tomorrow at 10:00. Finally, create an internal upgrade request via SalesOps Bridge for +10 seats effective the first of next month, including the Slack thread URL and HubSpot ID.
213
-
```
217
+
```txt
218
+
Find the :bangbang: thread in #leads about Acme. Summarize who asked, what's needed, and timing with the Slack link. Then use HubSpot to add a note and a task due tomorrow at 10:00. Finally, create an internal upgrade request via SalesOps Bridge for +10 seats effective the first of next month, including the Slack thread URL and HubSpot ID.
219
+
```
214
220
215
-

221
+

216
222
217
-
After Claude confirms the request ID, you can verify it by visiting the SalesOps Bridge dashboard at `http://localhost:3080/`.
223
+
- When Claude confirms the request ID, you can verify it by visiting the SalesOps Bridge dashboard at `http://localhost:3080/`.
218
224
219
-

225
+

220
226
221
227
## Final thoughts
222
228
223
-
You've built an account management workflow that connects Slack, HubSpot, and a simple internal API through MCP servers. Gram hosted the internal API integration without custom server code or infrastructure.
229
+
You've built an account management workflow that connects Slack, HubSpot, and a simple internal API through MCP servers.
224
230
225
-
The internal API can represent any system with an OpenAPI document. You can adapt this for:
231
+
Because Gram allows you to host API integrations (like the SalesOps Bridge service) without custom server code or infrastructure, you can easily substitute the internal service for any system with an OpenAPI document. Consider how you could adapt this guide for different use cases, such as:
226
232
227
233
-**Discount approvals:** Capture context from Slack and add CRM notes, then create an approval request internally.
228
234
-**Trial extensions:** Log the request in HubSpot and create a short extension via the internal tool.
229
235
-**Feature flags:** Record the change in HubSpot and file a time-boxed feature grant internally.
230
236
231
-
For sensitive actions, prefer propose-then-confirm flows so you can review tool calls before execution.
237
+
For sensitive actions, we recommend using propose-then-confirm flows so that you can review tool calls before execution.
232
238
233
-
For more information on MCP servers and how to host them blazingly fast, check out our [guide on deploying remote MCP servers](/mcp/using-mcp/remote-servers).
239
+
To learn more about MCP servers and how to host them blazingly fast, visit our guide to [deploying remote MCP servers](/mcp/using-mcp/remote-servers).
0 commit comments