@jginorio/sprout-social-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +194 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +406 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Platea
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Sprout Social MCP Server
|
|
2
|
+
|
|
3
|
+
A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for the [Sprout Social API](https://api.sproutsocial.com/docs/). It lets AI assistants (Claude, Cursor, Devin, etc.) access your Sprout Social data — analytics, publishing, messages, listening, and more — through a standardized interface.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Prerequisites
|
|
8
|
+
|
|
9
|
+
- Node.js 18+
|
|
10
|
+
- A Sprout Social API token ([how to create one](https://api.sproutsocial.com/docs/#using-api-tokens))
|
|
11
|
+
- Your Sprout Social Customer ID ([how to find it](https://api.sproutsocial.com/docs/#get-client-customer-id))
|
|
12
|
+
|
|
13
|
+
### Running via npx
|
|
14
|
+
|
|
15
|
+
No installation required:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
SPROUT_SOCIAL_API_KEY=your-token \
|
|
19
|
+
SPROUT_SOCIAL_CUSTOMER_ID=your-customer-id \
|
|
20
|
+
npx sprout-social-mcp
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Configuration with Claude Desktop
|
|
24
|
+
|
|
25
|
+
Add to your `claude_desktop_config.json`:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"mcpServers": {
|
|
30
|
+
"sprout-social": {
|
|
31
|
+
"command": "npx",
|
|
32
|
+
"args": ["-y", "sprout-social-mcp"],
|
|
33
|
+
"env": {
|
|
34
|
+
"SPROUT_SOCIAL_API_KEY": "your-api-token",
|
|
35
|
+
"SPROUT_SOCIAL_CUSTOMER_ID": "your-customer-id"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Configuration with Cursor
|
|
43
|
+
|
|
44
|
+
Add to your `.cursor/mcp.json`:
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"mcpServers": {
|
|
49
|
+
"sprout-social": {
|
|
50
|
+
"command": "npx",
|
|
51
|
+
"args": ["-y", "sprout-social-mcp"],
|
|
52
|
+
"env": {
|
|
53
|
+
"SPROUT_SOCIAL_API_KEY": "your-api-token",
|
|
54
|
+
"SPROUT_SOCIAL_CUSTOMER_ID": "your-customer-id"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Configuration with VS Code (GitHub Copilot)
|
|
62
|
+
|
|
63
|
+
Add to your `.vscode/mcp.json`:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"servers": {
|
|
68
|
+
"sprout-social": {
|
|
69
|
+
"command": "npx",
|
|
70
|
+
"args": ["-y", "sprout-social-mcp"],
|
|
71
|
+
"env": {
|
|
72
|
+
"SPROUT_SOCIAL_API_KEY": "your-api-token",
|
|
73
|
+
"SPROUT_SOCIAL_CUSTOMER_ID": "your-customer-id"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Configuration with Devin
|
|
81
|
+
|
|
82
|
+
In Devin's MCP settings, add a new server:
|
|
83
|
+
|
|
84
|
+
- **Name:** `sprout-social`
|
|
85
|
+
- **Command:** `npx -y sprout-social-mcp`
|
|
86
|
+
- **Environment Variables:**
|
|
87
|
+
- `SPROUT_SOCIAL_API_KEY` → your API token
|
|
88
|
+
- `SPROUT_SOCIAL_CUSTOMER_ID` → your customer ID
|
|
89
|
+
|
|
90
|
+
## Environment Variables
|
|
91
|
+
|
|
92
|
+
| Variable | Required | Description |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| `SPROUT_SOCIAL_API_KEY` | Yes | Your Sprout Social API token |
|
|
95
|
+
| `SPROUT_SOCIAL_CUSTOMER_ID` | Yes | Your Sprout Social customer ID |
|
|
96
|
+
|
|
97
|
+
## Available Tools
|
|
98
|
+
|
|
99
|
+
### Customer Metadata
|
|
100
|
+
|
|
101
|
+
| Tool | Description |
|
|
102
|
+
|---|---|
|
|
103
|
+
| `get_client` | Get your Sprout Social customer IDs and names |
|
|
104
|
+
| `get_profiles` | List all connected social profiles |
|
|
105
|
+
| `get_groups` | List all groups |
|
|
106
|
+
| `get_tags` | List all tags |
|
|
107
|
+
| `get_users` | List all users |
|
|
108
|
+
| `get_topics` | List all listening topics |
|
|
109
|
+
| `get_teams` | List all teams |
|
|
110
|
+
| `get_case_queues` | List all case queues |
|
|
111
|
+
|
|
112
|
+
### Analytics
|
|
113
|
+
|
|
114
|
+
| Tool | Description |
|
|
115
|
+
|---|---|
|
|
116
|
+
| `get_profile_analytics` | Profile-level analytics (impressions, engagements, etc.) for a date range |
|
|
117
|
+
| `get_post_analytics` | Post-level analytics with pagination. Supports impressions, engagements, reactions, video views |
|
|
118
|
+
|
|
119
|
+
### Messages
|
|
120
|
+
|
|
121
|
+
| Tool | Description |
|
|
122
|
+
|---|---|
|
|
123
|
+
| `get_messages` | Retrieve inbox messages with filtering and cursor-based pagination |
|
|
124
|
+
|
|
125
|
+
### Listening
|
|
126
|
+
|
|
127
|
+
| Tool | Description |
|
|
128
|
+
|---|---|
|
|
129
|
+
| `get_listening_topic_metrics` | Get metrics for a listening topic |
|
|
130
|
+
| `get_listening_topic_messages` | Get messages from a listening topic |
|
|
131
|
+
|
|
132
|
+
### Publishing
|
|
133
|
+
|
|
134
|
+
| Tool | Description |
|
|
135
|
+
|---|---|
|
|
136
|
+
| `create_publishing_post` | Create a new post to be published at a scheduled time |
|
|
137
|
+
| `get_publishing_post` | Retrieve details of a specific publishing post |
|
|
138
|
+
|
|
139
|
+
### Media
|
|
140
|
+
|
|
141
|
+
| Tool | Description |
|
|
142
|
+
|---|---|
|
|
143
|
+
| `upload_media` | Upload media via URL for use in publishing posts |
|
|
144
|
+
|
|
145
|
+
### Cases
|
|
146
|
+
|
|
147
|
+
| Tool | Description |
|
|
148
|
+
|---|---|
|
|
149
|
+
| `get_cases` | Retrieve customer cases/inquiries with filters for priority, time range, etc. |
|
|
150
|
+
|
|
151
|
+
## Usage Tips
|
|
152
|
+
|
|
153
|
+
### Post Analytics Pagination
|
|
154
|
+
|
|
155
|
+
The Sprout Social API paginates post analytics. Always check `paging.total_pages` in the response and request all pages:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
Ask: "Get all Instagram post analytics for last week"
|
|
159
|
+
→ Tool calls get_post_analytics with page=1, then page=2, etc.
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Valid Post-Level Metrics
|
|
163
|
+
|
|
164
|
+
- `lifetime.impressions` — total views
|
|
165
|
+
- `lifetime.engagements` — total engagement (likes, comments, shares, saves)
|
|
166
|
+
- `lifetime.reactions` — reactions only
|
|
167
|
+
- `lifetime.video_views` — video view count
|
|
168
|
+
|
|
169
|
+
**Invalid metrics** (will cause errors): `lifetime.comments`, `lifetime.shares`, `lifetime.reach`
|
|
170
|
+
|
|
171
|
+
### Finding Profile IDs
|
|
172
|
+
|
|
173
|
+
Use `get_profiles` first to discover your `customer_profile_id` values, then pass them to analytics or publishing tools.
|
|
174
|
+
|
|
175
|
+
## Development
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
git clone https://github.com/jginorio/sprout-social-mcp.git
|
|
179
|
+
cd sprout-social-mcp
|
|
180
|
+
npm install
|
|
181
|
+
npm run build
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
To test locally:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
SPROUT_SOCIAL_API_KEY=your-token \
|
|
188
|
+
SPROUT_SOCIAL_CUSTOMER_ID=your-customer-id \
|
|
189
|
+
node dist/index.js
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## License
|
|
193
|
+
|
|
194
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const SPROUT_API_BASE = "https://api.sproutsocial.com";
|
|
8
|
+
function getConfig() {
|
|
9
|
+
const apiKey = process.env.SPROUT_SOCIAL_API_KEY;
|
|
10
|
+
if (!apiKey) {
|
|
11
|
+
throw new Error("SPROUT_SOCIAL_API_KEY environment variable is required. " +
|
|
12
|
+
"Set it to your Sprout Social API token.");
|
|
13
|
+
}
|
|
14
|
+
const customerId = process.env.SPROUT_SOCIAL_CUSTOMER_ID;
|
|
15
|
+
if (!customerId) {
|
|
16
|
+
throw new Error("SPROUT_SOCIAL_CUSTOMER_ID environment variable is required. " +
|
|
17
|
+
"Set it to your Sprout Social customer ID.");
|
|
18
|
+
}
|
|
19
|
+
return { apiKey, customerId };
|
|
20
|
+
}
|
|
21
|
+
async function sproutRequest(method, path, body) {
|
|
22
|
+
const { apiKey, customerId } = getConfig();
|
|
23
|
+
const url = `${SPROUT_API_BASE}/v1/${customerId}${path}`;
|
|
24
|
+
const headers = {
|
|
25
|
+
Authorization: `Bearer ${apiKey}`,
|
|
26
|
+
Accept: "application/json",
|
|
27
|
+
};
|
|
28
|
+
const options = { method, headers };
|
|
29
|
+
if (body) {
|
|
30
|
+
headers["Content-Type"] = "application/json";
|
|
31
|
+
options.body = JSON.stringify(body);
|
|
32
|
+
}
|
|
33
|
+
const response = await fetch(url, options);
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
const errorText = await response.text();
|
|
36
|
+
throw new Error(`Sprout Social API error (${response.status}): ${errorText}`);
|
|
37
|
+
}
|
|
38
|
+
return response.json();
|
|
39
|
+
}
|
|
40
|
+
async function sproutMetadataRequest(path) {
|
|
41
|
+
const { apiKey } = getConfig();
|
|
42
|
+
const url = `${SPROUT_API_BASE}/v1${path}`;
|
|
43
|
+
const response = await fetch(url, {
|
|
44
|
+
method: "GET",
|
|
45
|
+
headers: {
|
|
46
|
+
Authorization: `Bearer ${apiKey}`,
|
|
47
|
+
Accept: "application/json",
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
const errorText = await response.text();
|
|
52
|
+
throw new Error(`Sprout Social API error (${response.status}): ${errorText}`);
|
|
53
|
+
}
|
|
54
|
+
return response.json();
|
|
55
|
+
}
|
|
56
|
+
const server = new mcp_js_1.McpServer({
|
|
57
|
+
name: "Sprout Social MCP",
|
|
58
|
+
version: "1.0.0",
|
|
59
|
+
});
|
|
60
|
+
// ─── Customer Metadata Tools ────────────────────────────────────────────────
|
|
61
|
+
server.tool("get_client", "Get your Sprout Social customer IDs and names.", {}, async () => {
|
|
62
|
+
const data = await sproutMetadataRequest("/metadata/client");
|
|
63
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
64
|
+
});
|
|
65
|
+
server.tool("get_profiles", "List all social profiles connected to your Sprout Social account.", {}, async () => {
|
|
66
|
+
const data = await sproutRequest("GET", "/metadata/customer");
|
|
67
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
68
|
+
});
|
|
69
|
+
server.tool("get_groups", "List all groups in your Sprout Social account.", {}, async () => {
|
|
70
|
+
const data = await sproutRequest("GET", "/metadata/customer/groups");
|
|
71
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
72
|
+
});
|
|
73
|
+
server.tool("get_tags", "List all tags in your Sprout Social account.", {}, async () => {
|
|
74
|
+
const data = await sproutRequest("GET", "/metadata/customer/tags");
|
|
75
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
76
|
+
});
|
|
77
|
+
server.tool("get_users", "List all users in your Sprout Social account.", {}, async () => {
|
|
78
|
+
const data = await sproutRequest("GET", "/metadata/customer/users");
|
|
79
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
80
|
+
});
|
|
81
|
+
server.tool("get_topics", "List all listening topics in your Sprout Social account.", {}, async () => {
|
|
82
|
+
const data = await sproutRequest("GET", "/metadata/customer/topics");
|
|
83
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
84
|
+
});
|
|
85
|
+
server.tool("get_teams", "List all teams in your Sprout Social account.", {}, async () => {
|
|
86
|
+
const data = await sproutRequest("GET", "/metadata/customer/teams");
|
|
87
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
88
|
+
});
|
|
89
|
+
server.tool("get_case_queues", "List all case queues in your Sprout Social account.", {}, async () => {
|
|
90
|
+
const data = await sproutRequest("GET", "/metadata/customer/queues");
|
|
91
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
92
|
+
});
|
|
93
|
+
// ─── Analytics Tools ────────────────────────────────────────────────────────
|
|
94
|
+
server.tool("get_profile_analytics", "Get owned profile-level analytics (impressions, engagements, etc.) for one or more profiles over a reporting period. " +
|
|
95
|
+
"Requires a reporting_period filter in the format 'YYYY-MM-DD...YYYY-MM-DD' (max 1 year span).", {
|
|
96
|
+
profile_ids: zod_1.z
|
|
97
|
+
.array(zod_1.z.string())
|
|
98
|
+
.describe("Array of customer_profile_id values to query. Use get_profiles to discover available IDs."),
|
|
99
|
+
metrics: zod_1.z
|
|
100
|
+
.array(zod_1.z.string())
|
|
101
|
+
.describe("Metrics to retrieve, e.g. ['impressions', 'engagements', 'reactions', 'post_link_clicks']. " +
|
|
102
|
+
"Available metrics depend on profile type."),
|
|
103
|
+
reporting_period_start: zod_1.z
|
|
104
|
+
.string()
|
|
105
|
+
.describe("Start date in YYYY-MM-DD format."),
|
|
106
|
+
reporting_period_end: zod_1.z
|
|
107
|
+
.string()
|
|
108
|
+
.describe("End date in YYYY-MM-DD format."),
|
|
109
|
+
page: zod_1.z
|
|
110
|
+
.number()
|
|
111
|
+
.optional()
|
|
112
|
+
.describe("Page number for paginated results (default: 1)."),
|
|
113
|
+
}, async ({ profile_ids, metrics, reporting_period_start, reporting_period_end, page }) => {
|
|
114
|
+
const body = {
|
|
115
|
+
filters: [
|
|
116
|
+
`customer_profile_id.eq(${profile_ids.join(", ")})`,
|
|
117
|
+
`reporting_period.in(${reporting_period_start}...${reporting_period_end})`,
|
|
118
|
+
],
|
|
119
|
+
metrics,
|
|
120
|
+
};
|
|
121
|
+
if (page)
|
|
122
|
+
body.page = page;
|
|
123
|
+
const data = await sproutRequest("POST", "/analytics/profiles", body);
|
|
124
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
125
|
+
});
|
|
126
|
+
server.tool("get_post_analytics", "Get post-level analytics (impressions, engagements, etc.) for posts within a date range. " +
|
|
127
|
+
"Supports pagination — always check paging.total_pages in the response and pull all pages. " +
|
|
128
|
+
"IMPORTANT: The page parameter must be in the request body, not as a URL query parameter.", {
|
|
129
|
+
profile_ids: zod_1.z
|
|
130
|
+
.array(zod_1.z.string())
|
|
131
|
+
.describe("Array of customer_profile_id values to filter posts by."),
|
|
132
|
+
metrics: zod_1.z
|
|
133
|
+
.array(zod_1.z.string())
|
|
134
|
+
.describe("Metrics to retrieve. Valid options: 'lifetime.impressions', 'lifetime.engagements', " +
|
|
135
|
+
"'lifetime.reactions', 'lifetime.video_views'. " +
|
|
136
|
+
"Do NOT request: 'lifetime.comments', 'lifetime.shares', 'lifetime.reach' (these are invalid)."),
|
|
137
|
+
created_time_start: zod_1.z
|
|
138
|
+
.string()
|
|
139
|
+
.describe("Start of the date range in ISO 8601 format (e.g. '2026-03-23T00:00:00')."),
|
|
140
|
+
created_time_end: zod_1.z
|
|
141
|
+
.string()
|
|
142
|
+
.describe("End of the date range in ISO 8601 format (e.g. '2026-03-30T00:00:00')."),
|
|
143
|
+
fields: zod_1.z
|
|
144
|
+
.array(zod_1.z.string())
|
|
145
|
+
.optional()
|
|
146
|
+
.describe("Additional fields to include. Valid: 'created_time', 'perma_link', 'text', 'post_type'. " +
|
|
147
|
+
"Defaults to all if omitted."),
|
|
148
|
+
page: zod_1.z
|
|
149
|
+
.number()
|
|
150
|
+
.optional()
|
|
151
|
+
.describe("Page number (default: 1). Must be in request body, NOT URL."),
|
|
152
|
+
}, async ({ profile_ids, metrics, created_time_start, created_time_end, fields, page }) => {
|
|
153
|
+
const body = {
|
|
154
|
+
filters: [
|
|
155
|
+
`customer_profile_id.eq(${profile_ids.join(", ")})`,
|
|
156
|
+
`created_time.in(${created_time_start}..${created_time_end})`,
|
|
157
|
+
],
|
|
158
|
+
metrics,
|
|
159
|
+
};
|
|
160
|
+
if (fields && fields.length > 0) {
|
|
161
|
+
body.fields = fields;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
body.fields = ["created_time", "perma_link", "text", "post_type"];
|
|
165
|
+
}
|
|
166
|
+
if (page)
|
|
167
|
+
body.page = page;
|
|
168
|
+
const data = await sproutRequest("POST", "/analytics/posts", body);
|
|
169
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
170
|
+
});
|
|
171
|
+
// ─── Messages Tool ──────────────────────────────────────────────────────────
|
|
172
|
+
server.tool("get_messages", "Retrieve messages from your Sprout Social inbox. Supports cursor-based pagination. " +
|
|
173
|
+
"Messages include those received by and sent from your profiles.", {
|
|
174
|
+
profile_ids: zod_1.z
|
|
175
|
+
.array(zod_1.z.string())
|
|
176
|
+
.describe("Array of customer_profile_id values to filter messages by."),
|
|
177
|
+
created_time_start: zod_1.z
|
|
178
|
+
.string()
|
|
179
|
+
.optional()
|
|
180
|
+
.describe("Filter messages created after this ISO 8601 datetime."),
|
|
181
|
+
created_time_end: zod_1.z
|
|
182
|
+
.string()
|
|
183
|
+
.optional()
|
|
184
|
+
.describe("Filter messages created before this ISO 8601 datetime."),
|
|
185
|
+
fields: zod_1.z
|
|
186
|
+
.array(zod_1.z.string())
|
|
187
|
+
.optional()
|
|
188
|
+
.describe("Fields to return. Refer to Sprout API docs for valid message fields."),
|
|
189
|
+
sort: zod_1.z
|
|
190
|
+
.array(zod_1.z.string())
|
|
191
|
+
.optional()
|
|
192
|
+
.describe("Sort order, e.g. ['created_time:desc']."),
|
|
193
|
+
limit: zod_1.z
|
|
194
|
+
.number()
|
|
195
|
+
.optional()
|
|
196
|
+
.describe("Maximum number of messages to return per page."),
|
|
197
|
+
}, async ({ profile_ids, created_time_start, created_time_end, fields, sort, limit }) => {
|
|
198
|
+
const filters = [
|
|
199
|
+
`customer_profile_id.eq(${profile_ids.join(", ")})`,
|
|
200
|
+
];
|
|
201
|
+
if (created_time_start && created_time_end) {
|
|
202
|
+
filters.push(`created_time.in(${created_time_start}..${created_time_end})`);
|
|
203
|
+
}
|
|
204
|
+
const body = { filters };
|
|
205
|
+
if (fields)
|
|
206
|
+
body.fields = fields;
|
|
207
|
+
if (sort)
|
|
208
|
+
body.sort = sort;
|
|
209
|
+
if (limit)
|
|
210
|
+
body.limit = limit;
|
|
211
|
+
const data = await sproutRequest("POST", "/messages", body);
|
|
212
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
213
|
+
});
|
|
214
|
+
// ─── Listening Tools ────────────────────────────────────────────────────────
|
|
215
|
+
server.tool("get_listening_topic_metrics", "Get metrics for a specific listening topic (e.g. volume, sentiment, engagement). " +
|
|
216
|
+
"Use get_topics first to discover available topic IDs.", {
|
|
217
|
+
topic_id: zod_1.z.string().describe("The listening topic ID."),
|
|
218
|
+
metrics: zod_1.z
|
|
219
|
+
.array(zod_1.z.string())
|
|
220
|
+
.describe("Metrics to retrieve for the topic. Refer to Sprout API docs for valid topic metrics."),
|
|
221
|
+
filters: zod_1.z
|
|
222
|
+
.array(zod_1.z.string())
|
|
223
|
+
.optional()
|
|
224
|
+
.describe("Additional filter expressions."),
|
|
225
|
+
page: zod_1.z
|
|
226
|
+
.number()
|
|
227
|
+
.optional()
|
|
228
|
+
.describe("Page number for paginated results."),
|
|
229
|
+
}, async ({ topic_id, metrics, filters, page }) => {
|
|
230
|
+
const body = { metrics };
|
|
231
|
+
if (filters)
|
|
232
|
+
body.filters = filters;
|
|
233
|
+
if (page)
|
|
234
|
+
body.page = page;
|
|
235
|
+
const data = await sproutRequest("POST", `/listening/topics/${topic_id}/metrics`, body);
|
|
236
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
237
|
+
});
|
|
238
|
+
server.tool("get_listening_topic_messages", "Get messages found within a specific listening topic. " +
|
|
239
|
+
"Use get_topics first to discover available topic IDs.", {
|
|
240
|
+
topic_id: zod_1.z.string().describe("The listening topic ID."),
|
|
241
|
+
filters: zod_1.z
|
|
242
|
+
.array(zod_1.z.string())
|
|
243
|
+
.optional()
|
|
244
|
+
.describe("Filter expressions for the messages query."),
|
|
245
|
+
fields: zod_1.z
|
|
246
|
+
.array(zod_1.z.string())
|
|
247
|
+
.optional()
|
|
248
|
+
.describe("Fields to return for each message."),
|
|
249
|
+
sort: zod_1.z
|
|
250
|
+
.array(zod_1.z.string())
|
|
251
|
+
.optional()
|
|
252
|
+
.describe("Sort order for results."),
|
|
253
|
+
limit: zod_1.z.number().optional().describe("Maximum messages per page."),
|
|
254
|
+
page: zod_1.z.number().optional().describe("Page number."),
|
|
255
|
+
}, async ({ topic_id, filters, fields, sort, limit, page }) => {
|
|
256
|
+
const body = {};
|
|
257
|
+
if (filters)
|
|
258
|
+
body.filters = filters;
|
|
259
|
+
if (fields)
|
|
260
|
+
body.fields = fields;
|
|
261
|
+
if (sort)
|
|
262
|
+
body.sort = sort;
|
|
263
|
+
if (limit)
|
|
264
|
+
body.limit = limit;
|
|
265
|
+
if (page)
|
|
266
|
+
body.page = page;
|
|
267
|
+
const data = await sproutRequest("POST", `/listening/topics/${topic_id}/messages`, body);
|
|
268
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
269
|
+
});
|
|
270
|
+
// ─── Publishing Tools ───────────────────────────────────────────────────────
|
|
271
|
+
server.tool("create_publishing_post", "Create a new publishing post in Sprout Social to be published at a future time. " +
|
|
272
|
+
"The post will appear in Sprout's publishing calendar.", {
|
|
273
|
+
profile_ids: zod_1.z
|
|
274
|
+
.array(zod_1.z.string())
|
|
275
|
+
.describe("Array of customer_profile_id values the post will be published to."),
|
|
276
|
+
text: zod_1.z.string().describe("The text content of the post."),
|
|
277
|
+
scheduled_time: zod_1.z
|
|
278
|
+
.string()
|
|
279
|
+
.describe("ISO 8601 datetime when the post should be published (e.g. '2026-06-30T18:00:00Z')."),
|
|
280
|
+
media_ids: zod_1.z
|
|
281
|
+
.array(zod_1.z.string())
|
|
282
|
+
.optional()
|
|
283
|
+
.describe("Array of media IDs (from upload_media) to attach to the post."),
|
|
284
|
+
is_draft: zod_1.z
|
|
285
|
+
.boolean()
|
|
286
|
+
.optional()
|
|
287
|
+
.describe("If true, creates the post as a draft (default: false)."),
|
|
288
|
+
tags: zod_1.z
|
|
289
|
+
.array(zod_1.z.string())
|
|
290
|
+
.optional()
|
|
291
|
+
.describe("Array of tag IDs to apply to the post."),
|
|
292
|
+
}, async ({ profile_ids, text, scheduled_time, media_ids, is_draft, tags }) => {
|
|
293
|
+
const entries = profile_ids.map((profileId) => {
|
|
294
|
+
const entry = {
|
|
295
|
+
customer_profile_id: profileId,
|
|
296
|
+
text,
|
|
297
|
+
scheduled_time,
|
|
298
|
+
is_draft: is_draft ?? false,
|
|
299
|
+
};
|
|
300
|
+
if (media_ids && media_ids.length > 0) {
|
|
301
|
+
entry.media = media_ids.map((id) => ({ id }));
|
|
302
|
+
}
|
|
303
|
+
if (tags && tags.length > 0) {
|
|
304
|
+
entry.tags = tags;
|
|
305
|
+
}
|
|
306
|
+
return entry;
|
|
307
|
+
});
|
|
308
|
+
const data = await sproutRequest("POST", "/publishing/posts", {
|
|
309
|
+
entries,
|
|
310
|
+
});
|
|
311
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
312
|
+
});
|
|
313
|
+
server.tool("get_publishing_post", "Retrieve details of a specific publishing post by its ID.", {
|
|
314
|
+
publishing_post_id: zod_1.z
|
|
315
|
+
.string()
|
|
316
|
+
.describe("The unique ID of the publishing post to retrieve."),
|
|
317
|
+
}, async ({ publishing_post_id }) => {
|
|
318
|
+
const data = await sproutRequest("GET", `/publishing/posts/${publishing_post_id}`);
|
|
319
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
320
|
+
});
|
|
321
|
+
// ─── Media Upload Tool ──────────────────────────────────────────────────────
|
|
322
|
+
server.tool("upload_media", "Upload media (image/video) to Sprout Social for use in publishing posts. " +
|
|
323
|
+
"Provide either a public URL to the media file. Returns a media ID to use with create_publishing_post.", {
|
|
324
|
+
media_url: zod_1.z
|
|
325
|
+
.string()
|
|
326
|
+
.describe("A public HTTP/HTTPS URL of the media file to upload."),
|
|
327
|
+
}, async ({ media_url }) => {
|
|
328
|
+
const { apiKey, customerId } = getConfig();
|
|
329
|
+
const url = `${SPROUT_API_BASE}/v1/${customerId}/media`;
|
|
330
|
+
const formData = new FormData();
|
|
331
|
+
formData.append("media_url", media_url);
|
|
332
|
+
const response = await fetch(url, {
|
|
333
|
+
method: "POST",
|
|
334
|
+
headers: {
|
|
335
|
+
Authorization: `Bearer ${apiKey}`,
|
|
336
|
+
},
|
|
337
|
+
body: formData,
|
|
338
|
+
});
|
|
339
|
+
if (!response.ok) {
|
|
340
|
+
const errorText = await response.text();
|
|
341
|
+
throw new Error(`Sprout Social media upload error (${response.status}): ${errorText}`);
|
|
342
|
+
}
|
|
343
|
+
const data = await response.json();
|
|
344
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
345
|
+
});
|
|
346
|
+
// ─── Cases Tool ─────────────────────────────────────────────────────────────
|
|
347
|
+
server.tool("get_cases", "Retrieve cases (customer inquiries/issues) from Sprout Social. " +
|
|
348
|
+
"Cases represent customer interactions that may require action by a social care agent.", {
|
|
349
|
+
updated_time_start: zod_1.z
|
|
350
|
+
.string()
|
|
351
|
+
.optional()
|
|
352
|
+
.describe("Filter by updated time start (YYYY-MM-DD format)."),
|
|
353
|
+
updated_time_end: zod_1.z
|
|
354
|
+
.string()
|
|
355
|
+
.optional()
|
|
356
|
+
.describe("Filter by updated time end (YYYY-MM-DD format)."),
|
|
357
|
+
priority: zod_1.z
|
|
358
|
+
.array(zod_1.z.string())
|
|
359
|
+
.optional()
|
|
360
|
+
.describe("Filter by priority. Valid values: 'HIGH', 'MEDIUM', 'LOW', 'UNDEFINED'."),
|
|
361
|
+
limit: zod_1.z.number().optional().describe("Maximum cases to return per page."),
|
|
362
|
+
sort: zod_1.z
|
|
363
|
+
.array(zod_1.z.string())
|
|
364
|
+
.optional()
|
|
365
|
+
.describe("Sort order, e.g. ['created_time:asc']."),
|
|
366
|
+
timezone: zod_1.z
|
|
367
|
+
.string()
|
|
368
|
+
.optional()
|
|
369
|
+
.describe("Timezone for date filters (e.g. 'America/Chicago'). Defaults to UTC."),
|
|
370
|
+
page_cursor: zod_1.z
|
|
371
|
+
.string()
|
|
372
|
+
.optional()
|
|
373
|
+
.describe("Cursor for pagination (from previous response)."),
|
|
374
|
+
}, async ({ updated_time_start, updated_time_end, priority, limit, sort, timezone, page_cursor }) => {
|
|
375
|
+
const filters = [];
|
|
376
|
+
if (updated_time_start && updated_time_end) {
|
|
377
|
+
filters.push(`updated_time.in(${updated_time_start}...${updated_time_end})`);
|
|
378
|
+
}
|
|
379
|
+
if (priority && priority.length > 0) {
|
|
380
|
+
filters.push(`priority.eq(${priority.join(", ")})`);
|
|
381
|
+
}
|
|
382
|
+
const body = {};
|
|
383
|
+
if (filters.length > 0)
|
|
384
|
+
body.filters = filters;
|
|
385
|
+
if (limit)
|
|
386
|
+
body.limit = limit;
|
|
387
|
+
if (sort)
|
|
388
|
+
body.sort = sort;
|
|
389
|
+
if (timezone)
|
|
390
|
+
body.timezone = timezone;
|
|
391
|
+
if (page_cursor)
|
|
392
|
+
body.page_cursor = page_cursor;
|
|
393
|
+
const data = await sproutRequest("POST", "/cases/filter", body);
|
|
394
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
395
|
+
});
|
|
396
|
+
// ─── Start Server ───────────────────────────────────────────────────────────
|
|
397
|
+
async function main() {
|
|
398
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
399
|
+
await server.connect(transport);
|
|
400
|
+
console.error("Sprout Social MCP server running on stdio");
|
|
401
|
+
}
|
|
402
|
+
main().catch((error) => {
|
|
403
|
+
console.error("Fatal error:", error);
|
|
404
|
+
process.exit(1);
|
|
405
|
+
});
|
|
406
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jginorio/sprout-social-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A Model Context Protocol (MCP) server for the Sprout Social API. Provides tools for social media analytics, post management, publishing, and more.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"sprout-social-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"start": "node dist/index.js",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"lint": "tsc --noEmit"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"mcp",
|
|
18
|
+
"model-context-protocol",
|
|
19
|
+
"sprout-social",
|
|
20
|
+
"social-media",
|
|
21
|
+
"analytics",
|
|
22
|
+
"ai",
|
|
23
|
+
"llm"
|
|
24
|
+
],
|
|
25
|
+
"author": "Jaime Ginorio",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
29
|
+
"zod": "^3.23.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^20.0.0",
|
|
33
|
+
"typescript": "^5.5.0"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18.0.0"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"README.md",
|
|
41
|
+
"LICENSE"
|
|
42
|
+
]
|
|
43
|
+
}
|