Sprout Social MCP Server
This server acts as a Model Context Protocol (MCP) interface, enabling AI assistants to interact with Sprout Social data for analytics, publishing, messaging, social listening, media management, and customer cases.
Customer Metadata: Retrieve customer IDs, social profiles, groups, tags, users, teams, listening topics, and case queues.
Analytics: Get profile-level metrics (impressions, engagements) and post-level metrics (impressions, engagements, reactions, video views) for specific date ranges, with pagination support.
Messages: Fetch inbox messages with filtering by profile, date range, and cursor-based pagination.
Social Listening: Access metrics (volume, sentiment, engagement) and messages for specific listening topics.
Publishing: Create and schedule posts to one or more social profiles, with support for drafts, tags, and media attachments. Retrieve details of existing posts by ID.
Media Management: Upload images or videos via a public URL for use in publishing posts.
Case Management: Retrieve customer cases/inquiries with filters for priority, time range, and pagination.
Prerequisites: Requires a Sprout Social API Key and Customer ID. Compatible with AI assistants such as Claude Desktop, Cursor, Devin, and VS Code (GitHub Copilot).
Allows managing Facebook profiles, posts, and analytics (impressions, engagements, reactions, etc.) through the Sprout Social API.
Allows managing Instagram profiles, posts, and analytics (impressions, engagements, reactions, video views, etc.) through the Sprout Social API.
Allows managing TikTok profiles, posts, and analytics (impressions, engagements, reactions, video views, etc.) through the Sprout Social API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Sprout Social MCP Serverget my Instagram analytics for last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Sprout Social MCP Server
Note: This is an unofficial, community-built MCP server to use while Sprout Social works on releasing their official one.
A Model Context Protocol (MCP) server for the Sprout Social API. It lets AI assistants (Claude, Cursor, Devin, etc.) access your Sprout Social data — analytics, publishing, messages, listening, and more — through a standardized interface.
Quick Start
Prerequisites
Node.js 18+
A Sprout Social API token (how to create one)
Your Sprout Social Customer ID (how to find it)
Running via npx
No installation required:
SPROUT_SOCIAL_API_KEY=your-token \
SPROUT_SOCIAL_CUSTOMER_ID=your-customer-id \
npx sprout-social-mcpConfiguration with Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"sprout-social": {
"command": "npx",
"args": ["-y", "sprout-social-mcp"],
"env": {
"SPROUT_SOCIAL_API_KEY": "your-api-token",
"SPROUT_SOCIAL_CUSTOMER_ID": "your-customer-id"
}
}
}
}Configuration with Cursor
Add to your .cursor/mcp.json:
{
"mcpServers": {
"sprout-social": {
"command": "npx",
"args": ["-y", "sprout-social-mcp"],
"env": {
"SPROUT_SOCIAL_API_KEY": "your-api-token",
"SPROUT_SOCIAL_CUSTOMER_ID": "your-customer-id"
}
}
}
}Configuration with VS Code (GitHub Copilot)
Add to your .vscode/mcp.json:
{
"servers": {
"sprout-social": {
"command": "npx",
"args": ["-y", "sprout-social-mcp"],
"env": {
"SPROUT_SOCIAL_API_KEY": "your-api-token",
"SPROUT_SOCIAL_CUSTOMER_ID": "your-customer-id"
}
}
}
}Configuration with Devin
In Devin's MCP settings, add a new server:
Name:
sprout-socialCommand:
npx -y sprout-social-mcpEnvironment Variables:
SPROUT_SOCIAL_API_KEY→ your API tokenSPROUT_SOCIAL_CUSTOMER_ID→ your customer ID
Related MCP server: sprout-mcp
Environment Variables
Variable | Required | Description |
| Yes | Your Sprout Social API token |
| If the token sees more than one customer | Your Sprout Social customer ID. Optional when the token has access to exactly one customer — the server reads it from |
Available Tools
Customer Metadata
Tool | Description |
| Get your Sprout Social customer IDs and names |
| List all connected social profiles |
| List all groups |
| List tags, with optional filters for active status, group, type, or name |
| List all users |
| List all listening topics |
| List all teams |
| List all case queues |
Analytics
Tool | Description |
| Profile-level analytics (impressions, engagements, etc.) for a date range |
| Post-level analytics with pagination. Supports impressions, engagements, reactions, video views, and tag filters |
| Tag Performance Report-style rollup: automatically pull tagged posts and aggregate lifetime metrics by tag |
Messages
Tool | Description |
| Retrieve inbox messages with filtering and cursor-based pagination |
Listening
Tool | Description |
| Get metrics for a listening topic |
| Get messages from a listening topic |
Publishing
Tool | Description |
| Create a new post to be published at a scheduled time |
| Retrieve details of a specific publishing post |
Media
Tool | Description |
| Upload media via URL for use in publishing posts |
Cases
Tool | Description |
| Retrieve customer cases/inquiries with filters for priority, time range, etc. |
Usage Tips
Post Analytics Pagination
The Sprout Social API paginates post analytics (50 posts per page). get_post_analytics can follow that for you:
all_pages: true— fetch pages automatically (default capmax_pages: 40) and return one combineddataarray.paging.truncatedis true if more pages remain.page— fetch a single page yourself.guid_cursor— walk past the ~10k page-number cap. Pass the lastguid(orpaging.next_guid_cursor) and keep going until a page is empty. Combine withall_pagesto follow the cursor automatically.
sort (e.g. ['lifetime.impressions:desc']) and timezone (ICANN name for the date filter; response times stay UTC) are also supported. Cursor mode always sorts by guid:asc. Requests retry on 429/5xx and pause briefly between pages.
Ask: "Get all Instagram post analytics for last week"
→ get_post_analytics with all_pages=true
Ask: "Top posts by impressions last month"
→ get_post_analytics with sort=['lifetime.impressions:desc']Valid Post-Level Metrics
All platforms (Instagram, Facebook, LinkedIn, TikTok, etc.):
lifetime.impressions— total viewslifetime.engagements— total engagement (likes, comments, shares, saves)lifetime.reactions— reactions onlylifetime.video_views— video view countlifetime.saves— saves/bookmarkslifetime.comments_count— comment countlifetime.post_shares_count— share count
Facebook only:
lifetime.post_link_clicks— clicks on links in the postlifetime.post_content_clicks— total clicks on post contentlifetime.post_content_clicks_other— other content clicks
Platform limitations:
Reach (
lifetime.reach) is NOT available at the post level — only at the profile level viaget_profile_analytics. This is a Sprout Social API limitation.Click metrics are only available for Facebook posts. For Instagram, the API silently ignores them (no error, but no data returned).
Invalid metrics (will cause errors): lifetime.comments, lifetime.shares, lifetime.reach
Tag Performance (replaces exporting a tag report)
Sprout has no dedicated tag-analytics endpoint. Tag data lives on posts (internal.tags.id) and can be combined with post metrics to reproduce the Tag Performance Report.
get_tag_performance does that automatically:
Resolves tag names/IDs via
get_tagsmetadataPages through tagged posts in the date range
Aggregates lifetime metrics per tag (impressions, engagements, engagement rate, reactions, comments, shares, saves, video views, Facebook link clicks)
Returns top posts for each tag, and optionally a per-network breakdown
Ask: "How did the campaign and launch tags perform on Instagram last month?"
→ get_profiles (for Instagram customer_profile_id)
→ get_tag_performance with tag_names ["campaign", "launch"]Behavior notes:
A post with multiple tags contributes its full lifetime metrics to each tag — the same method Sprout uses in the Tag Performance Report.
If
tag_ids/tag_namesare omitted, every tagged post in the window is rolled up.Ambiguous tag names return candidate IDs instead of guessing. Use
get_tags(search,active_only,group_id) to pick the right ID.Stories often inflate post counts and dilute engagement rate. Pass
exclude_post_types: ["INSTAGRAM_STORY"]when you want feed/reel performance only.Responses set
truncated: trueifmax_pagesstopped before all post pages were fetched (50 posts per page).
You can also filter raw posts without aggregating:
get_post_analytics(..., tag_ids: ["12345"], tagged_only: true)The filter uses internal.tags.id.eq(...) / internal.tags.id.exists(true) on the Posts Analytics API. tag_id.eq(...) is not valid on that endpoint.
Finding Profile IDs
Use get_profiles first to discover your customer_profile_id values, then pass them to analytics or publishing tools.
Development
git clone https://github.com/jginorio/sprout-social-mcp.git
cd sprout-social-mcp
npm install
npm run build
npm testTo test locally:
SPROUT_SOCIAL_API_KEY=your-token \
SPROUT_SOCIAL_CUSTOMER_ID=your-customer-id \
node dist/index.jsLicense
MIT
Available Tools
18 toolscreate_publishing_postA
Create a new publishing post in Sprout Social to be published at a future time. The post will appear in Sprout's publishing calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Array of tag IDs to apply to the post. | |
| text | Yes | The text content of the post. | |
| is_draft | No | If true, creates the post as a draft (default: false). | |
| media_ids | No | Array of media IDs (from upload_media) to attach to the post. | |
| profile_ids | Yes | Array of customer_profile_id values the post will be published to. | |
| scheduled_time | Yes | ISO 8601 datetime when the post should be published (e.g. '2026-06-30T18:00:00Z'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that the post is scheduled for a future time and appears in a calendar, but omits behavioral traits like authentication requirements, rate limits, idempotency, or whether the operation is reversible (e.g., can be deleted). Partial but insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences succinctly convey purpose and key context without filler. The description is front-loaded with the primary action and resource. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters (3 required), no output schema, and sibling tools including 'get_publishing_post', the description is minimally complete. It explains the tool's purpose and scheduling nature but does not describe the return value (e.g., post ID) or explicitly tie to 'upload_media' despite the parameter reference. Adequate but with gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter. The description adds only minor context ('future time' aligns with scheduled_time) but does not clarify parameter meaning beyond what's in schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Create a new publishing post', the resource ('a publishing post in Sprout Social'), and key context ('to be published at a future time', 'appear in Sprout's publishing calendar'). It effectively distinguishes from the sibling tool 'get_publishing_post', which retrieves existing posts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for scheduling future posts but does not explicitly state when to use this tool versus alternatives (e.g., for immediate posting, if supported). It also lacks guidance on prerequisites, such as needing to upload media first via 'upload_media' (referenced in schema).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_case_queuesA
List all case queues in your Sprout Social account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral traits. It only states 'List all case queues', implying a read operation, but omits details like pagination, rate limits, or error responses. The minimal information does not suffice for a listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, short sentence that communicates the tool's function without any unnecessary words. It is perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description is a minimal viable statement. However, for a listing tool, it would benefit from indicating whether results are paginated or what fields are returned, making it only moderately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the input schema defines nothing. The description adds no parameter semantics, but the baseline for 0 params is 4, as no additional parameter information is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'case queues', specifying the scope 'in your Sprout Social account'. This makes the tool's purpose unambiguous and distinguishes it from sibling tools like get_cases or get_groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There are many getter siblings (e.g., get_cases, get_groups), but no conditions or exclusions are mentioned, leaving the agent to guess the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_casesB
Retrieve cases (customer inquiries/issues) from Sprout Social. Cases represent customer interactions that may require action by a social care agent.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order, e.g. ['created_time:asc']. | |
| limit | No | Maximum cases to return per page. | |
| priority | No | Filter by priority. Valid values: 'HIGH', 'MEDIUM', 'LOW', 'UNDEFINED'. | |
| timezone | No | Timezone for date filters (e.g. 'America/Chicago'). Defaults to UTC. | |
| page_cursor | No | Cursor for pagination (from previous response). | |
| updated_time_end | No | Filter by updated time end (YYYY-MM-DD format). | |
| updated_time_start | No | Filter by updated time start (YYYY-MM-DD format). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'Retrieve cases,' implying a read operation, but does not disclose any behavioral traits such as idempotency, rate limits, or what happens if filters are omitted. This is minimal transparency for a tool with no structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with only two sentences, front-loading the action and defining the resource. Every word serves a purpose, and there is no unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description should explain what the response contains (e.g., fields, structure, pagination). It does not mention that results are paginated, even though the schema includes a 'page_cursor' parameter. The tool's context is incomplete for a retrieval endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 7 parameters adequately. The description adds no additional meaning beyond the schema, such as explaining how parameters interact or recommended usage, but it does not contradict the schema. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves cases, defining them as customer inquiries/issues from Sprout Social. It uses a specific verb ('Retrieve') and resource ('cases'), and while it doesn't explicitly differentiate from siblings, the distinct resource name 'cases' among tools like 'get_messages' and 'get_users' makes the purpose self-evident.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. No when-to-use, when-not-to-use, or prerequisite information is provided. The description only states the basic function, leaving the agent without context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_clientB
Get your Sprout Social customer IDs and names.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description only mentions return of IDs/names. No details on authentication, rate limits, or side effects. As a read operation, safety is implied but not explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no unnecessary words, front-loaded with action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple parameterless tool, but lacks details on pagination, filtering, or ordering. Among many similar sibling tools, more context would be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema, but description adds meaning by specifying what is returned (customer IDs and names), fulfilling the baseline for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool retrieves 'Sprout Social customer IDs and names' (verb and resource), but does not differentiate from similar sibling tools like get_cases or get_profiles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs. alternatives. Agent receives no context about when get_client is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_groupsA
List all groups in your Sprout Social account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It only states 'List all groups' without specifying pagination, rate limits, or data format. A read operation is implied, but details are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that is front-loaded with the key information. No unnecessary words, earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool, the description is minimal but arguably sufficient. However, it lacks details on output structure or any limitations (e.g., pagination), which could affect completeness given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters with 100% coverage, so the baseline is 4. The description does not need to add parameter meaning since there are none, and it does not detract.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (List), the resource (all groups), and the scope (in your Sprout Social account), making it easy for an agent to understand the tool's purpose. It distinguishes well from sibling tools like get_profiles or get_cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. For example, it does not mention that get_groups is for listing all groups with no filters, while other tools might offer filtering or additional options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listening_topic_messagesA
Get messages found within a specific listening topic. Use get_topics first to discover available topic IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number. | |
| sort | No | Sort order for results. | |
| limit | No | Maximum messages per page. | |
| fields | No | Fields to return for each message. | |
| filters | No | Filter expressions for the messages query. | |
| topic_id | Yes | The listening topic ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states the basic operation without mentioning read-only nature, authentication needs, rate limits, or error behavior. The description lacks details on side effects or safety, making it insufficient for an agent to assess behavioral implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no unnecessary words. It front-loads the purpose and follows with a key usage hint, achieving maximum conciseness while conveying essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 parameters and no output schema or annotations, the description is too brief. It omits important context such as return format (list of messages), pagination behavior, default field sets, and error handling. The prerequisite is useful but insufficient for full understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds no additional meaning beyond the schema's parameter descriptions, which already explain each parameter's purpose. No extra context like formatting or examples is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves messages for a specific listening topic, using the verb 'Get' and specifying the resource 'messages within a specific listening topic'. It also distinguishes from siblings like get_messages (general) and get_listening_topic_metrics (metrics) by focusing on messages tied to a topic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear prerequisite ('Use get_topics first to discover available topic IDs'), guiding users to obtain the required topic_id. It implies this tool is for known topics, but does not explicitly exclude alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listening_topic_metricsA
Get metrics for a specific listening topic (e.g. volume, sentiment, engagement). Use get_topics first to discover available topic IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for paginated results. | |
| filters | No | Additional filter expressions. | |
| metrics | Yes | Metrics to retrieve for the topic. Refer to Sprout API docs for valid topic metrics. | |
| topic_id | Yes | The listening topic ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only hints at the return type (metrics) but omits details like read-only nature, pagination behavior, error scenarios, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: one sentence for purpose plus a one-sentence usage tip. No filler, perfectly front-loaded with essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately explains what the tool does and a prerequisite, but given the number of parameters and absence of output schema, more details on filters, pagination, and response format would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, baseline is 3. The description adds concrete examples for 'metrics' (volume, sentiment, engagement) and suggests a workflow, which goes beyond the schema's generic reference to API docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves metrics for a specific listening topic, with examples like volume and sentiment. It distinguishes itself by suggesting get_topics first, avoiding confusion with siblings like get_listening_topic_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to use get_topics first to get topic IDs, providing a clear prerequisite. Lacks when-not-to-use or alternatives, but the guidance is direct and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messagesA
Retrieve messages from your Sprout Social inbox. Supports cursor-based pagination. Messages include those received by and sent from your profiles.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order, e.g. ['created_time:desc']. | |
| limit | No | Maximum number of messages to return per page. | |
| fields | No | Fields to return. Refer to Sprout API docs for valid message fields. | |
| profile_ids | Yes | Array of customer_profile_id values to filter messages by. | |
| created_time_end | No | Filter messages created before this ISO 8601 datetime. | |
| created_time_start | No | Filter messages created after this ISO 8601 datetime. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notes cursor-based pagination but lacks details on auth requirements, rate limits, or side effects. As a retrieval tool, it is likely read-only, but without annotations, the description does not sufficiently disclose behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and contains no redundant words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 parameters, no output schema, and no annotations, the description is basic. It covers purpose and pagination but lacks details on return format, errors, or usage context. Minimum viable but with gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented. The description adds context about cursor-based pagination but does not elaborate on parameter specifics beyond the schema. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves messages from the Sprout Social inbox, specifying both received and sent messages. It distinguishes itself from sibling tools like get_cases and get_listening_topic_messages by focusing on inbox messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for inbox messages but does not explicitly guide when to use versus alternatives or when not to use it. No exclusions or alternative tools are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_analyticsA
Get post-level analytics (impressions, engagements, etc.) for posts within a date range. Supports filtering by Sprout tags via tag_ids or tagged_only. Responses include internal.tags.id by default so posts can be grouped by tag. Supports sort (e.g. lifetime.impressions:desc), timezone, page, all_pages auto-pagination, and guid_cursor for walking past the ~10k page cap. For a Tag Performance Report-style rollup, prefer get_tag_performance. IMPORTANT: The page parameter must be in the request body, not as a URL query parameter.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1). Must be in request body, NOT URL. Ignored when all_pages is true unless starting a page walk. | |
| sort | No | Sort expressions, e.g. ['lifetime.impressions:desc'] or ['created_time:asc']. Ignored when guid_cursor is set (cursor mode always sorts by guid:asc). | |
| limit | No | Results per page (default 50, max 50 for posts). | |
| fields | No | Additional fields to include. Valid: 'created_time', 'perma_link', 'text', 'post_type', 'network', 'customer_profile_id', 'guid', 'internal.tags.id'. Defaults to those fields if omitted. | |
| metrics | Yes | Metrics to retrieve. All platforms: 'lifetime.impressions', 'lifetime.engagements', 'lifetime.reactions', 'lifetime.video_views', 'lifetime.saves', 'lifetime.comments_count', 'lifetime.post_shares_count'. Facebook only: 'lifetime.post_link_clicks', 'lifetime.post_content_clicks', 'lifetime.post_content_clicks_other'. Instagram: click metrics are NOT available (silently ignored by the API). INVALID (will error): 'lifetime.reach', 'lifetime.comments', 'lifetime.shares'. | |
| tag_ids | No | Only return posts that have at least one of these Sprout tag IDs. Use get_tags to discover IDs. Filter uses internal.tags.id.eq(...). | |
| timezone | No | ICANN timezone for the created_time filter (e.g. 'America/New_York'). Response timestamps stay in UTC. | |
| all_pages | No | If true, follow pagination automatically and return every post up to max_pages. Uses page numbers, or guid_cursor walks when guid_cursor is provided. | |
| max_pages | No | Cap on pages fetched when all_pages is true (default 40, 50 posts per page). | |
| guid_cursor | No | Last post guid from a previous page. Uses guid.gt(...) so you can walk past the ~10k page-number cap. Pass the last guid from the prior response and keep calling until an empty page. | |
| profile_ids | Yes | Array of customer_profile_id values to filter posts by. | |
| tagged_only | No | If true, only return posts that have at least one tag. Ignored when tag_ids is provided. | |
| created_time_end | Yes | End of the date range in ISO 8601 format (e.g. '2026-03-30T00:00:00'). | |
| created_time_start | Yes | Start of the date range in ISO 8601 format (e.g. '2026-03-23T00:00:00'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full responsibility. It transparently explains ignored parameters, invalid metrics, the ~10k pagination cap, timezone behavior, and the fact that Instagram click metrics are silently ignored.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with every sentence contributing useful operational detail. The 'IMPORTANT' note draws attention to a critical requirement without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description thoroughly covers request semantics, pagination, filtering, and alternatives. It does not describe the response shape beyond mentioning that internal.tags.id is included by default, but given the absence of an output schema, the description is still largely complete for invoking the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100% and detailed, but the description adds important behavioral meaning beyond the schema: body-vs-URL placement, ignored sort when guid_cursor is set, default fields, invalid metric names, and pagination semantics. This significantly helps an agent choose and populate parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves post-level analytics with a specific resource (posts) and scope (date range). It also differentiates from get_tag_performance by calling out that a Tag Performance rollup should use that alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance for the pagination parameter placement, the special behavior of guid_cursor, and references get_tag_performance as a preferred alternative for rollup-style queries. It doesn't explicitly contrast with every sibling like get_profile_analytics or get_messages, but the core usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profile_analyticsA
Get owned profile-level analytics (impressions, engagements, etc.) for one or more profiles over a reporting period. Requires a reporting_period filter in the format 'YYYY-MM-DD...YYYY-MM-DD' (max 1 year span).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for paginated results (default: 1). | |
| metrics | Yes | Metrics to retrieve, e.g. ['impressions', 'engagements', 'reactions', 'post_link_clicks']. Available metrics depend on profile type. | |
| profile_ids | Yes | Array of customer_profile_id values to query. Use get_profiles to discover available IDs. | |
| reporting_period_end | Yes | End date in YYYY-MM-DD format. | |
| reporting_period_start | Yes | Start date in YYYY-MM-DD format. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It identifies the tool as a read operation (retrieving analytics) and specifies the date format constraint. However, it does not mention pagination behavior (despite a page parameter), authentication requirements, rate limits, or what occurs if data is unavailable. The description is adequate but leaves several behavioral aspects unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two sentences: the first clearly states the purpose, and the second adds a critical parameter constraint. It is front-loaded and concise, with no redundant information. Every word contributes to clarity and utility.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core functionality and key parameter constraint, but it lacks details about the return structure (e.g., whether results are aggregated per profile, per day, or how pagination works). Given that there is no output schema, the description should provide more guidance on what the agent can expect in the response. Overall, it is adequate for a simple query tool but incomplete in explaining output format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter already has a description. The description adds value by clarifying the date format requirement ('YYYY-MM-DD...YYYY-MM-DD') and the 1-year maximum span, which are not explicitly in the schema. It also references get_profiles for discovering profile IDs. This supplementary information justifies a score above the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get'), resource ('profile-level analytics'), and scope ('owned profiles', 'one or more', 'over a reporting period'). It mentions specific metrics like impressions and engagements, distinguishing it from sibling tools like get_post_analytics (which focuses on individual posts) and get_listening_topic_metrics (which covers listening topics).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a specific usage requirement: the reporting period must be in 'YYYY-MM-DD...YYYY-MM-DD' format with a maximum 1-year span. It also cross-references get_profiles for discovering profile IDs. However, it lacks explicit when-not-to-use guidance or comparison to alternatives, though the context of siblings implies the tool is for profile-level analytics rather than post or listening metrics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profilesA
List all social profiles connected to your Sprout Social account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It only states it lists profiles, but does not disclose read-only nature, authentication requirements, or behavior when no profiles exist. Minimal transparency beyond purpose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no extraneous content. Front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so description should indicate what is returned (e.g., list of profile IDs/names). It does not, leaving ambiguity. However, for a simple list with no parameters, it is partially adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so baseline applies. The description adds no parameter info, which is acceptable as schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' and clearly identifies the resource 'social profiles connected to your Sprout Social account', distinguishing it from siblings like get_users or get_client.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as get_profiles or other list tools. The description provides no context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_publishing_postB
Retrieve details of a specific publishing post by its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| publishing_post_id | Yes | The unique ID of the publishing post to retrieve. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description must fully disclose behavioral traits, but it only says 'retrieve details'. It does not state what happens with invalid IDs, rate limits, or whether the operation is read-only (implied but not explicit).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 12 words, concise and front-loaded with the key action and resource. No superfluous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description should clarify what 'details' entails, but it does not. The agent has no indication of the response structure or content, making it incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter 'publishing_post_id' is clearly described in the schema. The tool description adds no extra meaning beyond what the schema already provides, meeting the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'retrieve' and the resource 'publishing post', and specifies retrieval by ID. It distinguishes this tool from siblings like 'create_publishing_post' (create vs retrieve) and other get_* tools (different resources).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool over alternatives is provided. The description does not mention prerequisites, exclusions, or related tools, leaving the agent to infer usage from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tag_performanceA
Automatically pull Tag Performance Report-style analytics: fetch tagged posts in a date range, resolve tag names, and aggregate lifetime metrics by tag (and optionally by network). Replaces exporting a tag report from Sprout for post insights. Use get_tags first if you need to discover tag names/IDs. If tag_ids and tag_names are omitted, every tagged post in the window is rolled up. A post with multiple tags contributes its full metrics to each tag. Pages through the Posts Analytics API automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | No | Post metrics to aggregate. Defaults to impressions, engagements, reactions, video views, saves, comments, shares, and Facebook post link clicks. INVALID: 'lifetime.reach', 'lifetime.comments', 'lifetime.shares'. | |
| sort_by | No | Sort tags and top posts by this metric (default: lifetime.impressions). | |
| tag_ids | No | Optional Sprout tag IDs to include. Combined with tag_names. Use get_tags to look these up. | |
| max_pages | No | Max Posts Analytics pages to fetch (50 posts per page). Default 40. Response sets truncated=true if more pages remain. | |
| tag_names | No | Optional tag names to resolve (case-insensitive exact match, then unique substring). Ambiguous names are returned as an error listing candidates. | |
| profile_ids | Yes | Array of customer_profile_id values to include. Use get_profiles to discover IDs. | |
| created_time_end | Yes | End of the published-date range in ISO 8601 format (e.g. '2026-08-31T23:59:59'). | |
| group_by_network | No | If true, also break each tag down by social network. | |
| top_posts_per_tag | No | How many top posts to include per tag (default: 5). | |
| created_time_start | Yes | Start of the published-date range in ISO 8601 format (e.g. '2026-08-01T00:00:00'). | |
| exclude_post_types | No | Post types to drop before aggregation, e.g. ['INSTAGRAM_STORY']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses pagination ('Pages through the Posts Analytics API automatically'), multi-tag handling ('A post with multiple tags contributes its full metrics to each tag'), and error behavior for ambiguous names ('returned as an error listing candidates'). It does not explicitly describe the output structure (e.g., return of tag aggregates and top posts), which is a minor gap given the absence of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the main purpose, then adds usage hints and behavioral notes. It avoids filler and is efficiently worded, though the length is warranted given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters and no output schema, the description explains the aggregation logic, pagination, and tag resolution, but does not explicitly state the response shape (e.g., that it includes top posts per tag, despite the top_posts_per_tag parameter). Given the tool's complexity, a clearer statement of return value would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already documented. The description adds contextual guidance like using get_tags for tag_ids, and clarifies the roll-up behavior when tags are omitted, but does not add significant meaning beyond the schema for individual parameters. The baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('pull') and resource ('Tag Performance Report-style analytics'), specifying that it fetches tagged posts, resolves tag names, and aggregates lifetime metrics by tag, with optional network breakdown. This distinguishes it from siblings like get_post_analytics (raw posts) and get_profile_analytics (profile-level) and gives a concrete use case ('Replaces exporting a tag report from Sprout').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit preconditions: 'Use get_tags first if you need to discover tag names/IDs' and explains the default behavior when tag_ids/tag_names are omitted ('every tagged post in the window is rolled up'). It does not explicitly state when NOT to use this tool vs alternatives, but the aggregation purpose is clear enough to infer the intended use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tagsA
List message/post tags in your Sprout Social account. Optionally filter by active status, group, type (LABEL or CAMPAIGN), or name search. Use these tag_id values with get_tag_performance and get_post_analytics.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by tag type. | |
| search | No | Case-insensitive substring match against the tag name. | |
| group_id | No | Only return tags available in this group ID. | |
| active_only | No | If true, return only active (non-archived) tags. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'List' clearly implies a read-only operation with no side effects, but the description does not mention pagination, ordering, rate limits, or any other behavioral specifics. It is not misleading, but it adds minimal behavioral context beyond the verb.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler. The purpose and filter options are front-loaded, and the downstream usage note is concise. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with 4 optional parameters and no output schema, the description covers the essential invocation details. It states what it does, what filters are available, and how the output is consumed. It lacks details on response shape or pagination, but those are not critical for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the filter options (active status, group, type, name search) but adds no extra semantics beyond what the schema already provides. It does not clarify parameter combinations or default behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List message/post tags in your Sprout Social account.' It also lists the key filter dimensions (active status, group, type, name search), making the tool's purpose unambiguous and distinct from sibling list tools like get_topics or get_groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a downstream usage hint ('Use these tag_id values with get_tag_performance and get_post_analytics'), but it does not explicitly state when to choose this tool over alternatives or when not to use it. There is no exclusion or comparison to siblings, leaving selection partially to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_teamsA
List all teams in your Sprout Social account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Description only says 'List all teams' implying read-only, but lacks details on pagination, rate limits, or side effects. Minimal behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, to the point, no wasted words. Perfectly concise for a simple list operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no output schema, and a straightforward purpose, the description is mostly complete. Missing response format or potential size limits, but acceptable for a simple list-all tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema, baseline 4. Description adds no param info, but none is needed. The tool requires no inputs beyond implicit authentication.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List all teams in your Sprout Social account.' It uses a specific verb ('list') and resource ('teams'), and the tool name is distinct among siblings with no other team-related getter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when or when not to use this tool. It is implied for listing all teams, but no alternatives or prerequisites are mentioned. Could be improved by noting it's for viewing all teams without filtering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topicsA
List all listening topics in your Sprout Social account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description implies a read-only operation by using 'list', which is appropriate. However, with no annotations, it does not disclose potential limitations (e.g., no pagination details, no hint about what happens if no topics exist). The description is minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that gets straight to the point. Every word serves a purpose, and it is appropriately front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does not clarify what fields or format the returned topics will have (e.g., IDs, names). This information is useful for downstream tools, so the description is incomplete for an agent to fully understand the tool's output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100%. Per guidelines, the baseline for 0 parameters is 4. The description adds minimal context by specifying 'in your Sprout Social account', but this is not about parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all listening topics' with a specific verb and resource. It distinguishes itself from sibling tools like get_listening_topic_messages and get_listening_topic_metrics, which operate on messages and metrics rather than the topics themselves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus its siblings. For instance, an agent should know to call this first to get topic IDs before using get_listening_topic_messages, but the description lacks such context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usersA
List all users in your Sprout Social account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior, but it only states the basic function. It does not mention authorization, rate limits, pagination, or what happens if the account has no users.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no unnecessary words. It is front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, no-parameter list tool, the description is mostly complete. However, it lacks details about the output (e.g., what user fields are returned), which would be helpful given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and schema coverage is 100% (trivially). According to guidelines, 0 parameters sets a baseline of 4, and the description adds no extra parameter info needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'all users in your Sprout Social account', which is specific and distinct from sibling tools that list other entities like cases, groups, or clients.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like get_cases or get_groups. There is no mention of prerequisites, contexts, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_mediaB
Upload media (image/video) to Sprout Social for use in publishing posts. Provide either a public URL to the media file. Returns a media ID to use with create_publishing_post.
| Name | Required | Description | Default |
|---|---|---|---|
| media_url | Yes | A public HTTP/HTTPS URL of the media file to upload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. Mentions return value (media ID) but omits side effects, rate limits, size constraints, or authentication needs. Minimal behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. Could front-load purpose more effectively, but structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter upload tool, description covers basic action and return value. Missing details on file size, formats beyond image/video, and authentication, but still adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameter semantics. Description adds 'public URL' confirmation and 'either' hint but no additional context beyond schema. Baseline 3 as schema does most work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb (upload), resource (media), and format (image/video) for use in publishing posts. Does not explicitly differentiate from siblings, but no other upload tools exist in the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage when wanting to upload media for publishing, but lacks explicit when-not-to-use or alternative tools. No prerequisites or context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v1.0.3- Changed
get_post_analytics10 fields changed- added
Input schema / properties / all_pagesAdded value: +{ + "description": "If true, follow pagination automatically and return every post up to max_pages. Uses page numbers, or guid_cursor walks when guid_cursor is provided.", + "type": "boolean" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Additional fields to include. Valid: 'created_time', 'perma_link', 'text', 'post_type'. Defaults to all if omitted."New value: +"Additional fields to include. Valid: 'created_time', 'perma_link', 'text', 'post_type', 'network', 'customer_profile_id', 'guid', 'internal.tags.id'. Defaults to those fields if omitted." - added
Input schema / properties / guid_cursorAdded value: +{ + "description": "Last post guid from a previous page. Uses guid.gt(...) so you can walk past the ~10k page-number cap. Pass the last guid from the prior response and keep calling until an empty page.", + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Results per page (default 50, max 50 for posts).", + "type": "number" +} - added
Input schema / properties / max_pagesAdded value: +{ + "description": "Cap on pages fetched when all_pages is true (default 40, 50 posts per page).", + "type": "number" +} - changed
Input schema / properties / page / descriptionPrevious value: -"Page number (default: 1). Must be in request body, NOT URL."New value: +"Page number (default: 1). Must be in request body, NOT URL. Ignored when all_pages is true unless starting a page walk." - added
Input schema / properties / sortAdded value: +{ + "description": "Sort expressions, e.g. ['lifetime.impressions:desc'] or ['created_time:asc']. Ignored when guid_cursor is set (cursor mode always sorts by guid:asc).", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / tag_idsAdded value: +{ + "description": "Only return posts that have at least one of these Sprout tag IDs. Use get_tags to discover IDs. Filter uses internal.tags.id.eq(...).", + "items": { + "type": [ + "string", + "number" + ] + }, + "type": "array" +} - added
Input schema / properties / tagged_onlyAdded value: +{ + "description": "If true, only return posts that have at least one tag. Ignored when tag_ids is provided.", + "type": "boolean" +} - added
Input schema / properties / timezoneAdded value: +{ + "description": "ICANN timezone for the created_time filter (e.g. 'America/New_York'). Response timestamps stay in UTC.", + "type": "string" +}
- Added
get_tag_performance - Changed
get_tags5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / active_onlyAdded value: +{ + "description": "If true, return only active (non-archived) tags.", + "type": "boolean" +} - added
Input schema / properties / group_idAdded value: +{ + "description": "Only return tags available in this group ID.", + "type": "string" +} - added
Input schema / properties / searchAdded value: +{ + "description": "Case-insensitive substring match against the tag name.", + "type": "string" +} - added
Input schema / properties / typeAdded value: +{ + "description": "Filter by tag type.", + "enum": [ + "LABEL", + "CAMPAIGN" + ], + "type": "string" +}
1 tool update
v1.0.1- Changed
get_post_analytics1 field changed- changed
Input schema / properties / metrics / descriptionPrevious value: -"Metrics to retrieve. Valid options: 'lifetime.impressions', 'lifetime.engagements', 'lifetime.reactions', 'lifetime.video_views'. Do NOT request: 'lifetime.comments', 'lifetime.shares', 'lifetime.reach' (these are invalid)."New value: +"Metrics to retrieve. All platforms: 'lifetime.impressions', 'lifetime.engagements', 'lifetime.reactions', 'lifetime.video_views', 'lifetime.saves', 'lifetime.comments_count', 'lifetime.post_shares_count'. Facebook only: 'lifetime.post_link_clicks', 'lifetime.post_content_clicks', 'lifetime.post_content_clicks_other'. Instagram: click metrics are NOT available (silently ignored by the API). INVALID (will error): 'lifetime.reach', 'lifetime.comments', 'lifetime.shares'."
17 tool updates
v1.0.0- First observed
create_publishing_post - First observed
get_case_queues - First observed
get_cases - First observed
get_client - First observed
get_groups - First observed
get_listening_topic_messages - First observed
get_listening_topic_metrics - First observed
get_messages - First observed
get_post_analytics - First observed
get_profile_analytics - First observed
get_profiles - First observed
get_publishing_post - First observed
get_tags - First observed
get_teams - First observed
get_topics - First observed
get_users - First observed
upload_media
TDQS
Scored across 18 tools
Most tools are clearly distinct by resource (clients, profiles, groups, users, topics, teams, cases, tags, messages, posts, media). However, get_post_analytics and get_tag_performance both deal with post analytics and could be confused, though descriptions clarify their different aggregation purposes.
The vast majority follow a consistent get_<resource> or create_/upload_ verb_noun pattern. Minor deviations like get_listening_topic_messages vs get_messages and get_profile_analytics vs get_post_analytics are still readable and consistent in style.
18 tools is on the higher end but appropriate for a broad social media management platform covering analytics, publishing, listening, and care. Each tool maps to a distinct functional area, though a few could be consolidated.
The surface covers core read operations across major Sprout Social domains plus publishing creation and media upload. Gaps include no update/delete for publishing posts, no case management actions, and no profile management, but the main analytics and listening workflows are well covered.
Maintenance
Related MCP Connectors
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Connect any AI agent to 11+ social platforms: schedule, publish & track posts via hosted MCP.
Related MCP Servers
- FlicenseDqualityDmaintenanceAn MCP server that allows AI assistants to interact with the ServiceTitan API, requiring client credentials for authentication.4-
- FlicenseAqualityDmaintenanceAn MCP server that integrates the Sprout Social Public API with Claude and other MCP clients. It allows users to manage social profiles, track analytics for posts and profiles, and schedule social media content.11-
- AlicenseAqualityDmaintenanceMCP server that enables AI assistants to query Parse.ly analytics for top posts, authors, tags, referrers, content search, and social shares.68 npm1MIT
- AlicenseNot gradedqualityDmaintenanceA unified MCP server that gives AI assistants direct access to Google Analytics 4, Google Search Console, Google Ads and Google Merchant Center data using OAuth2 user credentials.MIT