Skip to main content
Glama
alidade-ai

Alidade MCP

Official
by alidade-ai

Alidade MCP (local)

A local MCP server for Alidade. It forwards every tool to Alidade's hosted MCP server, and when you give it your own X API bearer token it fills in the text and metrics of X posts before your agent sees them — so one search_mentions call returns readable X posts.

Why it's local: X's terms don't let Alidade redistribute X post content, so the hosted server returns X posts as IDs. This server runs on your machine (or your own infrastructure) and fetches the content from X directly with your key; Alidade never sees your X credentials.

Without an X token it behaves exactly like the hosted server.

Setup

You need an Alidade API key (Settings → Workspace → API keys) and, optionally, an app-only bearer token from your X developer account. X bills post lookups to your X account.

Claude Desktop

Download alidade-<version>.mcpb from the latest release, open it, and enter your keys in the settings form. Keys are stored in your OS keychain.

Claude Code

claude mcp add alidade \
  -e ALIDADE_API_KEY=ald_xxxxxxxxxxxxxxxx \
  -e X_BEARER_TOKEN=xxxxxxxx \
  -- npx -y @alidade/mcp

Cursor and other clients

{
  "mcpServers": {
    "alidade": {
      "command": "npx",
      "args": ["-y", "@alidade/mcp"],
      "env": {
        "ALIDADE_API_KEY": "ald_xxxxxxxxxxxxxxxx",
        "X_BEARER_TOKEN": "xxxxxxxx"
      }
    }
  }
}

Variable

Required

Description

ALIDADE_API_KEY

yes

Your Alidade workspace API key.

X_BEARER_TOKEN

no

X app-only bearer token used to fill in X post content.

ALIDADE_MCP_URL

no

Override the upstream server (default https://api.alidade-ai.com/mcp).

In your own agent backend

If your product runs its own agent, use the package as a library and connect the returned MCP server to your agent over any MCP transport (the example uses an in-process pair):

import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
import { createProxy } from "@alidade/mcp";

const server = await createProxy({
  apiKey: process.env.ALIDADE_API_KEY!,
  xBearerToken: process.env.X_BEARER_TOKEN,
});
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
await server.connect(serverTransport);
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(clientTransport);

Or run npx @alidade/mcp as a stdio subprocess from any agent framework that supports stdio MCP servers.

If you show X content to your own users, X's Developer Agreement and Policy apply to you as the X key holder (display requirements, honoring deletions).

Related MCP server: OpenAI-Compatible MCP Gateway

How X posts are filled in

For search_mentions and semantic_search_mentions, X posts that come back without text are looked up with X's posts lookup in batches of 100. Each post's content and metrics (likes, shares = reposts + quotes, replies, views) are filled in, and a note says how many were filled. Posts deleted or made private on X stay null. If the X call fails (bad token, rate limit), the result is returned unchanged with the reason.

Development

pnpm install
pnpm check      # oxlint + tsc
pnpm test
pnpm build      # dist/cli.js (bundled) + library build
pnpm pack:mcpb  # alidade-<version>.mcpb for Claude Desktop

Releasing

Bump version in both package.json and manifest.json, commit, then tag and push:

git tag v0.1.1 && git push origin v0.1.1

The release workflow checks, tests, publishes to npm (Trusted Publishing), and creates a GitHub release with the .mcpb attached.

Available Tools

12 tools
find_entitiesFind entitiesA
Read-only

Find tracked entities (brand accounts, executives, campaigns, etc.). At least one of search, organizationId, or savedSearchId is required — there is no unfiltered listing. Entity IDs can be passed to get_analytics and search_mentions via entityIds for ad-hoc scopes.

NameRequiredDescriptionDefault
cursorNoOpaque pagination cursor from a previous response's `nextCursor`. Use the same query parameters across paged requests.
searchNoFilter entities by name (case-insensitive).
groupIdNoWith savedSearchId, filter to entities of one comparison group.
categoryNoFilter by entity category. Cannot be the only filter — combine with search, organizationId, or savedSearchId.
pageSizeNoItems per page (max 100, default 25).
savedSearchIdNoFilter to entities included in a saved search.
organizationIdNoFilter to entities of one tracked organization.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only safety, so the extra burden is low. The description still adds a real behavioral trait beyond annotations: the tool cannot be called without a filter, preventing a wasted call that would otherwise look legal from the schema. It does not describe result ordering or what happens when filters are combined, leaving a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler, and the mandatory-filter constraint is front-loaded immediately after the purpose statement so the agent cannot miss it. The downstream-usage note is a single tight clause that earns its place by enabling a follow-up call.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter, zero-required, read-only lookup with no output schema, the description covers the decisive facts an agent needs: what it returns, the filter requirement, and how to reuse IDs. It omits any hint about result shape (entity list plus nextCursor) or paging behavior, though the cursor parameter's own schema description carries that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 beats that by stating a cross-parameter constraint (the anyOf requirement) that the JSON schema does not encode at all, which is genuine meaning beyond the individual field descriptions. It does not clarify how search, category, and savedSearchId interact when combined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (find) and resource (tracked entities), and enumerates concrete entity types (brand accounts, executives, campaigns) so the agent knows what domain object comes back. It implicitly distinguishes itself from the singular get_entity sibling by describing a filtered collection search rather than an ID lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the precondition 'at least one of search, organizationId, or savedSearchId is required — there is no unfiltered listing', which is critical given the schema declares zero required parameters. It also tells the agent what to do with the results, feeding entity IDs into get_analytics and search_mentions, giving concrete downstream routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_analyticsGet analyticsA
Read-only

Aggregated analytics for a scope of entities, broken down per comparison group. Scope with exactly one of savedSearchId (recommended — its groups, platforms, date range, and keyword filters all apply) or entityIds (ad-hoc, treated as a single group); the other parameters filter or override the scope. Metrics: post-volume (post counts + share of voice), engagement (likes/shares/replies), time-series (engagement over time), themes (messaging-theme breakdown; requires taxonomy), policy-issues, policy-entities (mentioned policymakers/bills with stance), network-analysis (mentioned people/orgs/events), tone-voice (writing tone + brand voice), brand-positioning, content-breakdown (by content type), channel-presence (per-entity accounts with follower counts). Content-analysis metrics report over the analyzed-post subset, so their denominators are smaller than raw post counts.

NameRequiredDescriptionDefault
dateToNoOnly include posts published on or before this date (ISO 8601). A date-only value (`2026-01-31`) includes that whole day, UTC. Overrides the saved search's range end; its range start is kept unless `dateFrom` is also provided.
metricYesWhich analytics breakdown to fetch.
dateFromNoOnly include posts published on or after this date (ISO 8601). A date-only value (`2026-01-31`) means the start of that day, UTC. Overrides the saved search's range start; its range end is kept unless `dateTo` is also provided.
keywordsNoComma-separated keywords to filter post content by (e.g. `sustainability,net zero`). Replaces the saved search's keyword filters. Cannot be combined with `booleanQuery`.
taxonomyNoRequired for the themes metric: which messaging taxonomy to aggregate (product themes, corporate social responsibility, political campaign, or executive messaging).
timezoneNoFor time-series: IANA timezone for date bucketing (default America/New_York).
breakdownNoFor engagement and time-series: set to platform for per-platform numbers (default none).
entityIdsNoComma-separated entity IDs (max 100) for an ad-hoc scope, treated as a single comparison group. Provide either this or `savedSearchId`.
platformsNoComma-separated platforms to include. Valid values: facebook, instagram, linkedin, x, youtube, tiktok, bluesky. Overrides the saved search's platform filter. Omit to use the saved search's platforms (or all platforms for an ad-hoc scope).
granularityNoFor time-series: time bucket size (default month).
booleanQueryNoBoolean keyword query matching the app's advanced search mode (e.g. `"net zero" AND (solar OR wind)`). Syntax: AND/OR/NOT (upper case), parentheses, quoted phrases with optional proximity ("health care"~3 = up to 3 words between, any phrase length, max 20), NEAR/N (either order) and THEN/N (ordered) between terms or groups, wildcards (elect*, wom?n), fuzzy (medicaid~1, max 2). Always use explicit operators between terms. Mixing AND or NOT with OR at the same depth is an error — parenthesize to make precedence explicit ((a AND b) OR c, (a OR b) NOT c). NEAR/THEN bind tighter than AND/OR — parenthesize a proximity expression that sits next to AND/OR ((a NEAR/5 b) OR c, (a OR b) NEAR/5 c). NOT is not allowed inside NEAR/THEN; exclude outside the proximity expression. Matching is exact-token, case- and accent-insensitive (no stemming) — cover word variants with OR or a wildcard (tariff OR tariffs, tariff*). Korean attaches particles to words, so put a trailing wildcard on each Korean term (검색*). Hindi is written in Devanagari and romanized, so OR both forms ((दोस्त OR dost)); Devanagari and Tamil matching ignores vowel signs, so expect some unrelated matches. Comments are ignored by search: // to the end of the line, <<< >>> inline or across lines. Full syntax: https://docs.alidade-ai.com/search-syntax. Replaces the saved search's keyword filters. Cannot be combined with the keyword parameters.
keywordMatchNoWhether posts must match `any` (default) or `all` of `keywords`.
savedSearchIdNoID of a saved search to scope the request to. Its comparison groups, platform filter, date range, and keyword filters all apply. Only entities your workspace can access are included; a saved search with none returns 422. Provide either this or `entityIds`.
excludeKeywordsNoComma-separated keywords that matching posts must not contain (exact word/phrase match). Replaces the saved search's keyword filters. Cannot be combined with `booleanQuery`.
keywordMatchTypeNo`exact` (default) matches the exact words or phrases only; `stemmed` also matches English word variants (run/running). Applies to `keywords`.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already covering safety, the description adds non-obvious behavior: content-analysis metrics are computed over the analyzed-post subset, so their denominators are smaller than raw post counts. It also clarifies override semantics (date/keyword/platform params replace saved-search settings). It stops short of describing response shape or cost/latency characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then scoping rule, then metric list. The metric enumeration is long but each item is meaningfully distinct and helps metric selection. Minor density cost from listing all eleven families inline rather than grouping.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter analytics tool with no output schema, the description covers scoping, metric choice, per-group breakdown, and the analyzed-subset denominator caveat — enough to call it correctly. It could say more about what each result group contains, but the metric list implies the shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter is already documented in structured fields and the baseline is 3. The description reinforces the most consequential semantics — savedSearchId inherits groups/platforms/date/keyword filters, entityIds is a single ad-hoc group — but adds little that the schema descriptions do not already state at greater depth.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Aggregated analytics for a scope of entities, broken down per comparison group') and enumerates the eleven metric families so an agent knows the full output surface. It is clearly distinguishable from siblings like search_mentions (raw posts) or get_saved_search (scope definition) because it is the aggregation endpoint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly prescribes scoping: 'exactly one of savedSearchId (recommended ...) or entityIds (ad-hoc, treated as a single group); the other parameters filter or override the scope,' and notes 'themes ... requires taxonomy.' It does not name sibling alternatives (e.g. use search_mentions when raw posts are needed instead of aggregates), so a 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_entityGet an entityA
Read-only

Get one tracked entity by ID: name, category, description, the organization it belongs to, and the websites on file for it (homepage, secondary site, blog, newsroom). Use it to resolve an entity ID seen in search_mentions results, a saved-search group, or channel-presence analytics. Per-channel account details come from get_analytics with the channel-presence metric.

NameRequiredDescriptionDefault
idYesEntity ID.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint already covers the safety profile, and the description goes beyond it by disclosing the returned field set and explicitly scoping out per-channel account details. No mention of behavior when the ID is unknown (error vs empty), which is the remaining gap for a single-record lookup.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the operation and return shape, then usage, then the alternative. No filler and nothing repeated from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A one-parameter read tool with annotations present and no output schema — the description compensates by enumerating the returned fields and carving out the get_analytics boundary. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter is fully documented in the schema (uuid format and pattern), so the baseline is 3. The description adds real value by telling the agent where a valid entity ID can be sourced from, which the schema cannot express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('Get one tracked entity by ID') followed by an enumeration of exactly what comes back: name, category, description, organization, and the four website slots. An agent can immediately tell this is a single-record fetch, distinct from the list-oriented find_entities sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete entry points for the ID — search_mentions results, saved-search groups, channel-presence analytics — and explicitly routes per-channel account data to get_analytics with the channel-presence metric. It stops short of saying what to do when you only have a name and no ID (i.e., use find_entities first), which is the one obvious routing decision left unaddressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_workspace_infoGet workspace infoA
Read-only

Identify the calling workspace: name, API access tier, how the call was authenticated, request rate limit, and monthly post-quota status. Useful as a first call to verify the connection works and see what access is available.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already declares the safety profile, so the description's job is to add context — which it does by disclosing the diagnostic purpose and the exact informational payload returned. It stops short of stating there are no side effects or whether the call is rate-limited itself, but the added context is meaningful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, and the payload description is front-loaded before the usage hint. Every clause carries information an agent would otherwise have to discover by calling the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must describe return values — and it does, listing five distinct fields. Combined with the annotations and the zero-parameter schema, an agent has everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain; the empty object schema is self-evident. Baseline 4 applies since nothing is left ambiguous about invocation inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (identify the calling workspace) and enumerates exactly what is returned: name, API access tier, auth method, rate limit, and monthly post-quota status. No sibling tool overlaps this self-introspection role, so an agent can select it unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names a usage context: 'Useful as a first call to verify the connection works and see what access is available.' That covers the when, but gives no exclusions or alternatives for the case where the agent already knows its workspace context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_organizationsList tracked organizationsA
Read-only

List the tracked organizations (companies, advocacy groups, legislative and government bodies, etc.) the workspace can access. Each entity returned by find_entities belongs to one of these organizations.

NameRequiredDescriptionDefault
typeNoFilter by organization type.
cursorNoOpaque pagination cursor from a previous response's `nextCursor`. Use the same query parameters across paged requests.
searchNoFilter organizations by name (case-insensitive).
pageSizeNoItems per page (max 100, default 25).

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already declares this is a non-mutating read, so the description's burden is lighter. It adds useful domain context (workspace-scoped visibility, breadth of tracked organization types) but says nothing about pagination behavior, result ordering, or what happens when the filter matches nothing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no repetition, with the scoping constraint front-loaded and the relational context second. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with full schema coverage and a readOnly annotation, the description supplies what the structure does not: what a 'tracked organization' is and how it relates to entities. A minor gap is the absence of any hint about pagination defaults or result shape, though pageSize/cursor docs partly cover this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (type, cursor, search, pageSize) are already documented in the schema with an enum and bounds. The description adds no additional meaning about parameter interaction, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('tracked organizations'), enumerates the entity categories covered, and scopes it to what 'the workspace can access'. It does not name a sibling alternative, but the second sentence clarifies the relationship to find_entities, making the role of this tool easy to place.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The note that 'each entity returned by find_entities belongs to one of these organizations' implies the intended use (resolving an entity's parent organization, or discovering available orgs before filtering). There is no explicit when-to-use/when-not or reference to alternative tools such as get_workspace_info, so guidance is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_saved_searchesList saved searchesA
Read-only

List the saved searches available to the workspace (workspace-shared plus Alidade-curated). A saved search bundles comparison groups of entities, a platform filter, a date range, and keyword filters — pass its id as savedSearchId to get_analytics or search_mentions. This is the recommended starting point for analytics questions.

NameRequiredDescriptionDefault
cursorNoOpaque pagination cursor from a previous response's `nextCursor`. Use the same query parameters across paged requests.
searchNoFilter saved searches by name (case-insensitive).
pageSizeNoItems per page (max 100, default 25).

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuine context about curation scope (workspace-shared vs Alidade-curated), but says nothing about pagination behavior, result ordering, or what the workspace sees when a saved search is curated vs user-created.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: scope first, resource definition second, downstream routing third. Every clause carries information an agent needs, and the recommended-use cue is placed where it will be read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter read tool with 100% schema coverage and no output schema, the description supplies the conceptual model (what a saved search bundles) and where to go next. The only real gap is return-shape/pagination behavior, which the schema partially covers via nextCursor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (cursor, search, pageSize are all documented in-schema), so the baseline is 3. The description does not add any further meaning about how the name filter or paging interacts with the curated/workspace-shared split.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (saved searches) with explicit scope: workspace-shared plus Alidade-curated. It also defines what a saved search contains (comparison groups, platform filter, date range, keyword filters), which distinguishes it from the sibling get_saved_search (single item) and from create/update/delete_saved_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to pass the returned id as savedSearchId to get_analytics or search_mentions, and declares itself "the recommended starting point for analytics questions." That names the alternatives and the condition that selects them, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_mentionsSearch mentionsA
Read-only

The individual posts behind the analytics numbers, with Alidade's content-analysis labels attached, newest first by default. Takes the same scope parameters as get_analytics, plus optional label filters (policyIssue, policySubissue, productTheme, csrTheme, campaignTheme, brandPositioning, mentionedEntity) that take arrays of label values matching the labels in get_analytics breakdowns: any value within a filter matches, and all filters must match. Requires the mentions API tier, and every returned post counts against the workspace's monthly post quota — keep pageSize small (default 25) and only paginate when needed. Posts from platform x omit text and engagement metrics per X API terms (Alidade's identifiers and analysis labels are still included); the result lists their X post IDs for lookup with an X API tool.

NameRequiredDescriptionDefault
sortNoSort order by post date (default newest).
cursorNoOpaque pagination cursor from a previous response's `nextCursor`. Use the same query parameters across paged requests.
dateToNoOnly include posts published on or before this date (ISO 8601). A date-only value (`2026-01-31`) includes that whole day, UTC. Overrides the saved search's range end; its range start is kept unless `dateFrom` is also provided.
csrThemeNoOnly include posts labeled with this corporate social responsibility theme (`analysis.csrThemes`, or `/analytics/themes` with taxonomy `csr`). Several values match a post labeled with any of them. Only analyzed posts can match.
dateFromNoOnly include posts published on or after this date (ISO 8601). A date-only value (`2026-01-31`) means the start of that day, UTC. Overrides the saved search's range start; its range end is kept unless `dateTo` is also provided.
keywordsNoComma-separated keywords to filter post content by (e.g. `sustainability,net zero`). Replaces the saved search's keyword filters. Cannot be combined with `booleanQuery`.
pageSizeNoItems per page (max 100, default 25).
entityIdsNoComma-separated entity IDs (max 100) for an ad-hoc scope, treated as a single comparison group. Provide either this or `savedSearchId`.
platformsNoComma-separated platforms to include. Valid values: facebook, instagram, linkedin, x, youtube, tiktok, bluesky. Overrides the saved search's platform filter. Omit to use the saved search's platforms (or all platforms for an ad-hoc scope).
policyIssueNoOnly include posts labeled with this policy issue (the `issue` values from `analysis.policyIssues` and `/analytics/policy-issues`). Several values match a post labeled with any of them. Only analyzed posts can match.
booleanQueryNoBoolean keyword query matching the app's advanced search mode (e.g. `"net zero" AND (solar OR wind)`). Syntax: AND/OR/NOT (upper case), parentheses, quoted phrases with optional proximity ("health care"~3 = up to 3 words between, any phrase length, max 20), NEAR/N (either order) and THEN/N (ordered) between terms or groups, wildcards (elect*, wom?n), fuzzy (medicaid~1, max 2). Always use explicit operators between terms. Mixing AND or NOT with OR at the same depth is an error — parenthesize to make precedence explicit ((a AND b) OR c, (a OR b) NOT c). NEAR/THEN bind tighter than AND/OR — parenthesize a proximity expression that sits next to AND/OR ((a NEAR/5 b) OR c, (a OR b) NEAR/5 c). NOT is not allowed inside NEAR/THEN; exclude outside the proximity expression. Matching is exact-token, case- and accent-insensitive (no stemming) — cover word variants with OR or a wildcard (tariff OR tariffs, tariff*). Korean attaches particles to words, so put a trailing wildcard on each Korean term (검색*). Hindi is written in Devanagari and romanized, so OR both forms ((दोस्त OR dost)); Devanagari and Tamil matching ignores vowel signs, so expect some unrelated matches. Comments are ignored by search: // to the end of the line, <<< >>> inline or across lines. Full syntax: https://docs.alidade-ai.com/search-syntax. Replaces the saved search's keyword filters. Cannot be combined with the keyword parameters.
keywordMatchNoWhether posts must match `any` (default) or `all` of `keywords`.
productThemeNoOnly include posts labeled with this product messaging theme (`analysis.productThemes`, or `/analytics/themes` with taxonomy `product`). Several values match a post labeled with any of them. Only analyzed posts can match.
campaignThemeNoOnly include posts labeled with this political campaign theme (`analysis.campaignThemes`, or `/analytics/themes` with taxonomy `campaign`). Several values match a post labeled with any of them. Only analyzed posts can match.
savedSearchIdNoID of a saved search to scope the request to. Its comparison groups, platform filter, date range, and keyword filters all apply. Only entities your workspace can access are included; a saved search with none returns 422. Provide either this or `entityIds`.
policySubissueNoOnly include posts labeled with this policy sub-issue (the `subissue` values from `analysis.policyIssues`, or `subissues[].name` from `/analytics/policy-issues`). Several values match a post labeled with any of them. Only analyzed posts can match.
excludeKeywordsNoComma-separated keywords that matching posts must not contain (exact word/phrase match). Replaces the saved search's keyword filters. Cannot be combined with `booleanQuery`.
mentionedEntityNoOnly include posts that mention this entity, by Wikidata ID (e.g. `Q312`), as found in `analysis.mentionedEntities` or `analysis.mentionedPolicyEntities`. Several IDs match a post mentioning any of them. Only analyzed posts can match.
brandPositioningNoOnly include posts with a brand-positioning label in this category, either polarity (`analysis.brandPositioning`). Several values match a post labeled with any of them. Only analyzed posts can match.
keywordMatchTypeNo`exact` (default) matches the exact words or phrases only; `stemmed` also matches English word variants (run/running). Applies to `keywords`.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly annotation, the description discloses quota consumption per returned post, API-tier requirements, default page size, pagination caution, and a platform-specific caveat that X posts omit text and engagement metrics while retaining identifiers and labels. These are exactly the behavioral details an agent needs before spending quota or interpreting results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with purpose and scope, then quota, filter semantics, and the X caveat. Every sentence carries operational information; however, the long parenthetical label list and nested caveats make it somewhat packed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 20-parameter, read-only search tool with no output schema, the description covers the key unknowns: quota cost, API tier, pagination behavior, filter conjunction semantics, default ordering, and platform-specific field omission with X post IDs provided for lookup. Nothing critical for correct invocation is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3. The description earns above baseline by explaining how label filters combine: any value within a filter matches, and all filters must match. It also points to get_analytics for analogous scope parameters, but individual parameter formats remain in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and scope: the individual posts behind analytics numbers, with content-analysis labels. It explicitly links and differentiates from get_analytics by describing mentions as the underlying posts, and the default ordering is stated. The only minor gap is that the sibling semantic_search_mentions is not named, but purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operational guidance: requires the mentions API tier, consumes monthly post quota, keep pageSize small, paginate only when needed, and label filters match any value within a filter and all filters across filters. It does not explicitly compare against semantic_search_mentions, so the agent must infer when to use semantic search instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

semantic_search_mentionsSemantic search mentionsA
Read-only

Find posts by meaning: embeds a natural-language query and returns the most similar posts (pure vector similarity, no keyword matching), most relevant first. Results carry the post text, metrics, and entity but not the content-analysis labels — use search_mentions for chronological listings, keyword filters, or labels. Scope with savedSearchId or entityIds like the other tools — a saved search's groups, platforms, and date range apply, but its keyword filters do not (fold important terms into query). Requires the mentions API tier, and every returned post counts against the workspace's monthly post quota — keep limit small (default 15). Posts from platform x omit text and engagement metrics per X API terms; the result lists their X post IDs for lookup with an X API tool.

NameRequiredDescriptionDefault
limitNoMaximum number of posts to return (max 100, default 15).
queryYesWhat to look for, in natural language (e.g. `criticism of the new pricing model`). Matching is by meaning, not keywords, so a descriptive phrase or sentence works better than a bare term.
dateToNoOnly include posts published on or before this date (ISO 8601). A date-only value (`2026-01-31`) includes that whole day, UTC. Overrides the saved search's range end; its range start is kept unless `dateFrom` is also provided.
dateFromNoOnly include posts published on or after this date (ISO 8601). A date-only value (`2026-01-31`) means the start of that day, UTC. Overrides the saved search's range start; its range end is kept unless `dateTo` is also provided.
entityIdsNoComma-separated entity IDs (max 100) for an ad-hoc scope, treated as a single comparison group. Provide either this or `savedSearchId`.
platformsNoComma-separated platforms to include. Valid values: facebook, instagram, linkedin, x, youtube, tiktok, bluesky. Overrides the saved search's platform filter. Omit to use the saved search's platforms (or all platforms for an ad-hoc scope).
savedSearchIdNoID of a saved search to scope the search to. Its comparison groups, platform filter, and date range apply; its keyword filters do not (fold important terms into `query`). A saved search with no entities your workspace can access returns 422. Provide either this or `entityIds`.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses critical operational traits: results are sorted most-relevant-first, returned posts omit content-analysis labels, the mentions API tier is required, every returned post counts against the monthly quota, and X platform posts omit text and metrics but include X post IDs. These details materially affect how an agent should invoke the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite covering many caveats, the description is front-loaded with purpose, then alternatives, scoping, quota, and platform caveats in a logical order. Every sentence carries actionable information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description explains what results contain (post text, metrics, entity), ordering, and what is omitted for X posts. Combined with annotations, it gives an agent everything needed to call the tool correctly, including quota and API-tier prerequisites.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already documents limit defaults, query semantics, date overrides, platform values, and savedSearchId keyword behavior. The description reinforces a few of these (keep limit small due quota, fold keywords into query) but adds little parameter-level meaning beyond the schema itself, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Find posts by meaning'), explains the mechanism (pure vector similarity, no keyword matching), and explicitly distinguishes itself from the sibling search_mentions. An agent can tell immediately what this tool does and how it differs from keyword-based alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent: use search_mentions for chronological listings, keyword filters, or labels. It also explains how to scope with savedSearchId or entityIds and warns that saved-search keyword filters do not apply, instructing the agent to fold important terms into query instead. Usage conditions and alternatives are fully covered.

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.

  1. 12 tool updatesv0.1.1
    • First observedcreate_saved_search
    • First observeddelete_saved_search
    • First observedfind_entities
    • First observedget_analytics
    • First observedget_entity
    • First observedget_saved_search
    • First observedget_workspace_info
    • First observedlist_organizations
    • First observedlist_saved_searches
    • First observedsearch_mentions
    • First observedsemantic_search_mentions
    • First observedupdate_saved_search

TDQS

A4.1/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct resource or action: saved-search CRUD, entity lookup, aggregate analytics, and mention retrieval are clearly separated. The two mention-search tools have overlapping data sources but explicitly contrast chronological/keyword search with semantic similarity, so an agent can choose confidently.

Naming Consistency4/5

Names are consistently snake_case and mostly follow verb_noun patterns (create_saved_search, get_entity, list_organizations). Minor deviations include the adjective-prefixed semantic_search_mentions and noun-heavy get_workspace_info, but the convention remains predictable.

Tool Count5/5

Twelve tools are well-scoped for a social-listening analytics server, with each tool earning its place across setup, discovery, analytics, and retrieval workflows. There is no obvious bloat or missing core operation.

Completeness4/5

The surface covers saved-search lifecycle, workspace identification, organization listing, entity find/get, aggregate analytics, and mention retrieval. Minor gaps remain: there is no get_organization detail tool, and readouts, bulletins, and chat projects are referenced but not manageable through this server, likely by design.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A remote MCP server that exposes tools from many services (X, LinkedIn, GitHub, Gmail, Notion, etc.) through a single endpoint on Cloudflare Workers, enabling unified access to third-party APIs via natural language.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides a single MCP endpoint that dynamically discovers, routes, policy-checks, and executes hundreds of MCP tools from any agent, with optional LLM-based routing.
    3 npm
    1
    Apache 2.0