Skip to main content
Glama

Rivalize MCP Server

npm License: MIT

Sourced, dated competitive intelligence for your AI assistant, over the Model Context Protocol.

What it does

This server connects Claude, Cursor or any other MCP client to Rivalize. Your assistant can tear down a competitor's positioning, pricing, ads, social presence, reviews, hiring and momentum in one call, search the Rivalize universe of tracked companies, and read the projects, reports, battlecards, timelines and evidence in your own Rivalize account. Every answer comes from data Rivalize has collected, with dates and sources, rather than from a model's memory.

The server is read-only by default. One write tool, add_competitor, is available when you opt in with RIVALIZE_MCP_ALLOW_WRITES=1.

Related MCP server: Competitive Intelligence MCP Server

Quick start

Requires Node.js 22 or newer (node --version).

  1. Create an account at rivalize.ai.

  2. Create an API key under Dashboard → Settings → API Keys. Keys start with rk_live_. A key from any plan works, including the free plan, which gets rate-limited reads.

  3. Add the server to your client using one of the blocks below.

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows), then restart Claude Desktop:

{
  "mcpServers": {
    "rivalize": {
      "command": "npx",
      "args": ["-y", "@rivalize/mcp"],
      "env": { "RIVALIZE_API_KEY": "rk_live_..." }
    }
  }
}

Claude Code

claude mcp add rivalize -e RIVALIZE_API_KEY=rk_live_... -- npx -y @rivalize/mcp

Cursor

Add to .cursor/mcp.json in your project, or ~/.cursor/mcp.json for all projects:

{
  "mcpServers": {
    "rivalize": {
      "command": "npx",
      "args": ["-y", "@rivalize/mcp"],
      "env": { "RIVALIZE_API_KEY": "rk_live_..." }
    }
  }
}

Cline

In Cline, open the MCP Servers panel, choose Configure, then Configure MCP Servers. This opens cline_mcp_settings.json. Add:

{
  "mcpServers": {
    "rivalize": {
      "command": "npx",
      "args": ["-y", "@rivalize/mcp"],
      "env": { "RIVALIZE_API_KEY": "rk_live_..." }
    }
  }
}

Save the file. The rivalize server appears with a green dot after about 10 to 15 seconds (the first start downloads the package). On Windows, if it does not start, use "command": "cmd" and "args": ["/c", "npx", "-y", "@rivalize/mcp"].

If you ask Cline to install it for you, point it at llms-install.md.

Any MCP client (stdio)

The server speaks MCP over stdin and stdout. Configure your client to launch:

Setting

Value

Command

npx

Arguments

-y @rivalize/mcp

Environment

RIVALIZE_API_KEY=rk_live_...

Transport

stdio

On Windows, some clients cannot launch npx directly because it is npx.cmd. Use cmd as the command and /c npx -y @rivalize/mcp as the arguments instead.

Tools

Thirteen read-only tools are always available. add_competitor is registered only when RIVALIZE_MCP_ALLOW_WRITES is set to 1, true or yes; without it, the tool does not exist for the client.

Tool

Access

What it does

Key arguments

teardown_competitor

read

One-call strategy teardown of a competitor as Markdown: positioning, pricing, ads, social, reviews, hiring, momentum and weaknesses to attack, with when the data was last refreshed

domain (required)

list_universe_companies

read

Search the Rivalize universe, the cross-customer dataset of tracked companies

q, category (slug), layer, limit (1-100), offset

get_universe_company

read

Full universe profile for one company: identity, pricing, features, ads, social, reviews, funding and hiring, rankings, signals, momentum

domain (required), layers

list_projects

read

The projects in your account; returns the project_id other tools take

none

list_reports

read

Your reports, newest first. Reading never generates a report

project_id, limit (1-100), offset

get_report

read

One report as Markdown, whole or one section or one competitor at a time

report_id (required), section, competitor, page

list_competitors

read

The competitors you track, with momentum score, its threat-level band and, where the API provides it, each rival's standing on your Brief

project_id, limit (1-100), offset

get_competitor_intelligence

read

Latest stored intelligence for one tracked competitor; a field is present only when it was measured

competitor_id (required)

get_battlecard

read

Cited sales battlecard for one tracked competitor. Requires a Pro plan

competitor_id (required)

get_strategic_timeline

read

Evidence-linked timeline of competitor moves across pricing, product, people, funding and content/social

project_id (required), days (30, 90, 180), competitor_id, lanes, format, page

get_competitive_landscape

read

Current or stored weekly positions of competitors by activity and strategic importance

project_id (required), week (YYYY-MM-DD), format, page

get_freshness

read

When each tracked competitor in a project was last actually observed, and how

project_id (required)

get_evidence

read

The sources behind the facts for your product or one competitor: URL, what it supports, and when it was read

project_id (required), competitor_id

add_competitor

write, opt-in

Add competitor URLs to a project. Spends credits and queues analysis

project_id (required), urls (1-10, required)

project_id and competitor_id are UUIDs from list_projects and list_competitors. Tools that read your account only ever see your own data.

Report sections

get_report takes a section so your assistant can read the part a question needs instead of the whole report:

Section

Contains

tldr, biggest-threat, blind-spots, actions

The report's headline sections (actions is what your product should do)

battlecards

The cited sales battlecards

competitors

Every competitor's section in full

pricing, momentum, app-store, strengths, weaknesses, key-findings, creators, ads, tech-stack

One topic gathered from every competitor's section

A report has only the sections it has data for; asking for any other name returns an error that lists the sections it does have. section combines with competitor, so section: "pricing" with competitor: "Acme" returns Acme's pricing. Claims the report's fabrication check removed appear as [removed — unverified], exactly as in the report.

Long responses

Every response stays under 25,000 characters, and nothing is cut silently:

  • Markdown (get_report, get_strategic_timeline, get_competitive_landscape) is split into pages at section boundaries. Each page starts with Page N of M, how much remains, and the exact call for the next page.

  • Lists (list_universe_companies, list_competitors, list_reports) return pagination.next_offset; continue from it until it is null.

  • Objects (get_universe_company, and timeline or landscape JSON) cap long arrays and record the cap in _capped. A field that still does not fit is listed in _omitted with the call that fetches it.

Example prompts

  • "Tear down linear.app." (teardown_competitor)

  • "Who are the players in AI developer tools?" (list_universe_companies)

  • "Summarize my latest report, then show me what my competitors charge." (list_reports, get_report with section: "pricing")

  • "Which of my competitors moved most this quarter, and what did they do?" (get_competitive_landscape, get_strategic_timeline)

  • "Give me sales talking points against my top competitor." (list_competitors, get_battlecard)

  • "Where does that pricing claim come from, and how fresh is it?" (get_evidence, get_freshness)

Configuration

Variable

Required

Default

Description

RIVALIZE_API_KEY

yes

none

Your Rivalize API key. Must start with rk_live_; the server exits at startup with a message if it is missing or malformed.

RIVALIZE_API_URL

no

https://rivalize.ai

Origin of the Rivalize API. A key only works on the server that issued it: leave this unset for rivalize.ai, and for a self-hosted or non-production Rivalize server set it to that server's origin, or every call returns 401.

RIVALIZE_MCP_ALLOW_WRITES

no

off

1, true or yes (any case) registers add_competitor. Any other value, or unset, keeps the server read-only.

HTTPS_PROXY / HTTP_PROXY

no

none

Route requests through a corporate proxy. Lowercase forms are also read, and HTTPS_PROXY wins when both are set. NO_PROXY is honoured. Errors name the proxy host, never its credentials.

Troubleshooting

"Connection closed"

When the server cannot start, many clients show only "Connection closed" or a failed status. The server prints the reason as the first line of its stderr, prefixed rivalize-mcp:, and most clients keep stderr in their MCP log. The usual causes:

  1. RIVALIZE_API_KEY is missing or invalid. The log reads rivalize-mcp: RIVALIZE_API_KEY is required, or says the key does not look like a Rivalize API key (it must start with rk_live_). Put the key in the server's env block and restart the client.

  2. Node.js is older than 22. Run node --version and install Node.js 22 or newer. Your client uses whichever node and npx come first on its own PATH, which can differ from your terminal's.

  3. No network access. npx downloads the package on first run, and every tool call goes to https://rivalize.ai (or RIVALIZE_API_URL). Behind a corporate proxy, set HTTPS_PROXY. A network error names the server and the cause code, such as ECONNREFUSED or ENOTFOUND.

To see the message directly, run the server in a terminal with the same key:

RIVALIZE_API_KEY=rk_live_... npx -y @rivalize/mcp

A healthy server prints rivalize-mcp-server connected via stdio to stderr and waits for input (press Ctrl+C to stop). Anything else is the reason your client could not connect.

Every call returns 401

The key was rejected by the server it was sent to, and the error names that server. Check that the key has not been revoked, and that RIVALIZE_API_URL is unset unless the key was issued by a different Rivalize server.

A tool says it needs a higher plan

Reads are available on every plan. Some capabilities, such as battlecards and full timeline or landscape history, need a higher plan; the error says which and links to rivalize.ai/pricing.

Docker

The repository includes a Dockerfile that builds the same stdio server on Node 22 and runs it as a non-root user.

docker build -t rivalize-mcp .
{
  "mcpServers": {
    "rivalize": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "RIVALIZE_API_KEY", "rivalize-mcp"],
      "env": { "RIVALIZE_API_KEY": "rk_live_..." }
    }
  }
}

Run the container with -i and without a TTY, since MCP uses stdin and stdout. -e RIVALIZE_API_KEY with no value passes the key through from the client's environment, so it never appears on the docker run command line. Add -e RIVALIZE_API_URL or -e RIVALIZE_MCP_ALLOW_WRITES the same way if you need them.

Privacy Policy

This server is a thin client for the Rivalize API.

  • What it sends, and where. Each tool call becomes an HTTPS request to the Rivalize API at https://rivalize.ai, or the origin you set in RIVALIZE_API_URL. A request carries your API key as a Bearer token, a User-Agent of rivalize-mcp/<version>, and the tool's arguments: for example a company domain, a search term, a project, report or competitor id, and, with writes enabled, the competitor URLs you add. If you set HTTPS_PROXY or HTTP_PROXY, requests go through that proxy. Nothing is sent anywhere else.

  • What it does not send. No telemetry, analytics or crash reports. It does not read files on your machine, your conversation, or other tools' output; it sees only the arguments your MCP client passes to its own tools.

  • What it stores locally. Nothing. It writes no files, keeps no cache and holds no state between runs. Your key lives in your MCP client's configuration, not in this server. Diagnostic messages go to stderr, which your MCP client may log; they never include your API key.

  • What Rivalize does with requests. The API processes them under the Rivalize Privacy Policy at rivalize.ai/privacy. Rivalize is operated by Downshift LLC, the data controller for that data. Privacy questions go to privacy@rivalize.ai.

Security

Please report vulnerabilities privately to support@rivalize.ai with "security" in the subject line, not in a public issue. Include the package version (npm view @rivalize/mcp version, or the User-Agent above), what you did, and what happened. We will acknowledge your report and keep you updated until it is resolved.

Treat your API key as a credential. Keep it in your client's env block or your shell environment, never in a shared or committed file, and revoke a leaked key under Dashboard → Settings → API Keys.

Contributing

Bug reports and feature requests are welcome at github.com/Downshift/rivalize-mcp/issues. For account and billing questions, email support@rivalize.ai.

To work on the server locally:

npm ci
npm run typecheck
npm run build      # emits dist/, which the rivalize-mcp bin runs
npm test           # offline: every API call is mocked or served by a local fixture

server.json is the MCP Registry entry. The tests validate it against the official schema (vendored in schema/) and check that its name, version and package match package.json.

Changelog

0.3.2

  • list_competitors now tells your assistant how to pick a top competitor: by the rival's standing on your Brief (brief.standing) when the API returns it, otherwise by momentum_score. threat_level is described as what it is, the band of the momentum score, and is no longer offered as a ranking.

  • When a row's standing is still being read (brief.state is deferred), list_competitors asks for the same page again, up to 4 times, 1.5 seconds apart. Against an API that returns no brief, it makes one request per call as before.

  • Clearer wording in the 401 hint for a self-hosted or non-production Rivalize server, and in the add_competitor description.

0.3.1

  • The version this repository's history starts from: thirteen read-only tools, the opt-in add_competitor write tool, responses kept under 25,000 characters with explicit paging, proxy support, and the MCP Registry entry in server.json.

License

MIT, © 2026 Downshift LLC. See LICENSE.

Available Tools

13 tools
get_battlecardGet competitor battlecardA
Read-onlyIdempotent

Get the cited sales battlecard for one tracked competitor — Why We Win, Their Weaknesses, Objection Handlers, Discovery Questions. Every claim carries citations resolving to the collected source; claims that could not be cited were WITHHELD, not asserted.

Args:

  • competitor_id (string, required): the competitor UUID (from list_competitors)

Returns JSON: { data: { status, sections_empty, sections_locked, withheld_reason?, battlecard, markdown, generated_at, intelligence_date, source, report_id?, report_date? } }.

  • status is read off the card's four sections. "ready": every section carries a cited claim. "partial": at least one section has none; sections_empty names them (sections_locked names the ones locked until the user's company profile is complete, which were not withheld). "withheld": the card exists but no section carries a claim; withheld_reason says why. Do not treat "partial" or "withheld" as a complete card.

  • "markdown" is a paste-ready cited card and states a partial or withheld card up front. source "generated" is a card generated from the dashboard's Battlecard tab; source "report" is the battlecard inside the competitor's latest report, and report_id names that report (get_report reads it in full).

  • status "not_generated": no card can be served — none generated, and the latest report has none (or only one in an older format that fails the citation contract). The user generates one from the dashboard's Battlecard tab.

Requires a Pro-plan API key (403 PLAN_REQUIRED below Pro). 404 if the competitor is not in your account (tenant isolation).

Use when: "give me sales ammo against ", "how do we win vs ", or prepping a call.

ParametersJSON Schema
NameRequiredDescriptionDefault
competitor_idYesCompetitor UUID from list_competitors

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare a safe read (readOnlyHint/idempotent/destructive=false), yet the description adds substantial behavior: the citation contract and WITHHELD-claim rule, the four status values (ready/partial/withheld/not_generated) with their meanings, Pro-plan 403 PLAN_REQUIRED, and 404 tenant isolation. This is far beyond what structured fields convey.

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-loads purpose before the args and return contract, and the verbose status enumeration earns its place given there is no output schema. It is longer than strictly necessary, but most sentences carry decision-relevant detail rather than padding.

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 fully documents the return shape (status, sections_empty/locked, withheld_reason, markdown, source/report_id) and the error paths (403, 404). Nothing an agent needs to call and interpret this tool is missing.

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% and the single parameter is already documented as 'Competitor UUID from list_competitors'. The description repeats that same hint ('from list_competitors') without adding format or sourcing detail, so the baseline 3 for fully-covered single-param tools 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?

States a specific verb+resource ('Get the cited sales battlecard for one tracked competitor') and enumerates the four content sections, so the agent knows exactly what artifact is produced. The 'cited' qualifier plus the withheld-claims clause distinguishes it from generic intelligence siblings like get_competitor_intelligence.

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?

Provides explicit trigger phrases ('give me sales ammo against <competitor>', 'how do we win vs <competitor>', prepping a call), giving clear context for selection. It does not, however, name an alternative tool or state when NOT to use it, so it stops short of full when/when-not/alternatives guidance.

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

get_competitive_landscapeGet competitive landscapeA
Read-onlyIdempotent

Get the current or stored weekly competitor positions on activity × strategic importance.

Args:

  • project_id (string, required): the project's UUID. Call list_projects first for the id.

  • week (YYYY-MM-DD, optional): a stored ISO week; omit for current positions. The json format lists stored weeks in availableWeeks.

  • format ("markdown" | "json", optional): markdown by default; json for the full structure

  • page (number, optional): 1-based page when the Markdown is over 25,000 characters; each page names the next call

Returns agent-ready Markdown by default (JSON on request) with coordinates, trailing signal counts, momentum, latest headlines, importance source, available weeks, and the honest tracking-start date. Historical weeks are never synthesized. History requires Pro; the current view remains available below Pro.

Use when: "who is the biggest moving threat?" or "who moved most this month?".

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page of a long Markdown document; every page is under 25,000 characters
weekNoStored ISO week start; omit for current positions
formatNomarkdown (default, compact, agent-ready) or json (full structure)
project_idYesProject UUID from list_projects

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover read-only/idempotent/non-destructive, so the bar is lower, and the description still adds real disclosure: history is never synthesized, stored weeks exist only for Pro accounts, the return includes an 'honest tracking-start date', and long Markdown is paginated with each page naming the next call. Return-format and gating behavior are thus visible, though rate limits and failure modes are unstated.

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

Conciseness3/5

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

Purpose and the 'Use when' trigger are front-loaded and the block structure is scannable, but the four-item Args section duplicates schema descriptions almost verbatim (week, format, page, project_id), so several lines do not earn their 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?

There is no output schema, so the description carries the return-value burden and does so reasonably: coordinates, trailing signal counts, momentum, latest headlines, importance source, available weeks, and tracking-start date. Pagination semantics are also covered, leaving only edge cases like empty/absent weeks unspecified.

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 all four parameters are already described in the schema, so the baseline of 3 applies. The Args block largely restates the schema; its only marginal additions are the cross-reference to availableWeeks and the instruction to call list_projects first for the id.

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 ('Get') plus a precisely scoped resource ('current or stored weekly competitor positions on activity × strategic importance'), which separates it from siblings like get_competitor_intelligence, get_battlecard, and get_strategic_timeline. An agent can tell what it produces without opening the schema.

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?

Explicit trigger phrases are given ('who is the biggest moving threat?', 'who moved most this month?') along with prerequisites ('Call list_projects first for the id') and a tier gate ('History requires Pro; the current view remains available below Pro'). It stops short of naming which sibling to use instead when the question is not about movement.

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

get_competitor_intelligenceGet competitor intelligenceA
Read-onlyIdempotent

Get the latest stored intelligence for one tracked competitor.

Args:

  • competitor_id (string, required): the competitor UUID (from list_competitors)

Returns JSON: { data: { competitor_name, momentum_score, intelligence, latest_snapshot, source, source_report_id, source_report_date, report } }. source says where the data comes from: "snapshot" (a stored intelligence snapshot), "report" (the competitor's latest report in your account; report holds swot, strengths, weaknesses, key_findings, tech_stack, pricing_tiers, social and reviews, and source_report_id names the report for get_report), or "none" (the competitor appears in no snapshot or report yet). Every field is present only when measured: null or absent means "not measured", not "none". Claims the report withheld as unverified are withheld here too.

Returns a 404 error if the competitor does not belong to your account (tenant isolation).

Use when: "what's the latest intel on ?" after finding its id via list_competitors. For the full narrative, get_report with competitor is richer.

ParametersJSON Schema
NameRequiredDescriptionDefault
competitor_idYesCompetitor UUID from list_competitors

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the read-only/idempotent safety profile, but the description adds real behavioral context they don't: a 404 on cross-tenant access, the meaning of null/absent fields ("not measured" vs "none"), and that unverified claims withheld in the source report are withheld here too. This materially changes how an agent interprets 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?

Front-loaded with the one-line purpose, then Args/Returns/Use-when blocks that are easy to scan. The Returns block is long but earns its space given there is no output schema; minor redundancy between the Args block and the schema.

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 carries the return contract itself and does so thoroughly: field list, source enumeration (snapshot/report/none), a pointer from source_report_id to get_report, and null semantics. An agent can correctly call and interpret this tool from the description alone.

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 competitor_id as the UUID from list_competitors, so the description's Args block largely restates it. Baseline 3 is appropriate since the schema does the heavy lifting.

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 ("get the latest stored intelligence for one tracked competitor") and scopes it to a single tracked entity. It explicitly distinguishes itself from the richer sibling by noting get_report is the fuller narrative.

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?

Gives a concrete trigger phrase ("what's the latest intel on <competitor>?"), a prerequisite (find the id via list_competitors), and names the alternative (get_report) with the condition that selects it. Nothing is left to inference.

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

get_evidenceGet evidenceA
Read-onlyIdempotent

The sources behind the facts for ONE subject: your own product (omit competitor_id) or one tracked competitor. Taken from the latest readable report in the project that analysed the subject, as the report serves it: claims the report withholds as unverified are withheld here too, and a figure the report has corrected shows the corrected value.

Args:

  • project_id (string, required): the project's UUID. Call list_projects first for the id.

  • competitor_id (string, optional): a competitor UUID from list_competitors (it must be in this project). Omit for your own product.

Returns JSON: { data: { project_id, subject: { kind ("product" | "competitor"), competitor_id, name, website }, report: { id, created_at } | null, source_count, unlinked_attributions, off_entity_withheld, sources: Source[] } }. Each Source: url, supports (what it backs: the fact, claim or section, as the report states it), kinds (attribution, page_read, press, strength_receipt, fact, battlecard, interpretation), observed_at (the date of the report run that read it) and, for press, published_at (the article's own date). unlinked_attributions counts data points the report attributed to a description rather than a URL; they are not listed, and no URL is made up for them. off_entity_withheld counts sources a web search for the subject's name returned that are not about the subject (not on its domain, and neither the URL nor any text the report keeps for it names the subject, e.g. a stock page for a similarly named company); they are not listed. With no readable report on the subject, sources is empty and note says why.

Returns a 404 error if the project is not in your account, or if competitor_id is not a competitor in this project (another account's competitor is reported exactly like one that does not exist).

Use when: "where does that come from?", "show me the sources for 's pricing", or to cite a claim.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesProject UUID from list_projects
competitor_idNoA competitor UUID from list_competitors; omit for your own product

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the read-only/idempotent/open-world safety profile, and the description adds substantial behavior beyond that: unverified claims are withheld, corrected values are shown corrected, unlinked_attributions and off_entity_withheld are counted but not listed and no URLs are invented, and an empty sources array with an explanatory note is returned when no report is readable. The 404 semantics are also spelled out, including the deliberate indistinguishability of another account's competitor.

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 the core purpose, then structured Args and Returns sections. It is long and dense, but with no output schema the return-format detail largely earns its place; a couple of parenthetical explanations (e.g. the stock-page example) could be trimmed.

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 and no nested objects, the description carries the full burden of return-value documentation and does so thoroughly: the wrapper shape, each Source field, the withheld-count semantics, and the null-report case are all covered. Nothing an agent needs to call or interpret this tool 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?

Schema coverage is 100%, so the baseline is 3; the description adds meaning beyond the schema by stating the competitor must belong to the same project and by routing the agent to list_projects and list_competitors for valid IDs, including the cross-account 404 consequence.

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 resource and scope: 'the sources behind the facts for ONE subject: your own product (omit competitor_id) or one tracked competitor.' An agent can distinguish this from get_report, get_competitor_intelligence, and get_battlecard without opening schemas, and the subject-selection mechanism is explicit.

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?

Provides explicit 'Use when' triggers ('where does that come from?', 'show me the sources for <competitor>'s pricing', citing a claim) and clarifies when to omit competitor_id. It does not name a sibling alternative for when a full report or battlecard is wanted instead, but the positive 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_freshnessGet data freshnessA
Read-onlyIdempotent

How current your Rivalize data is for one project: the date of its latest report, and for EACH tracked competitor the date Rivalize last actually observed it and how. Reading is free; this never fetches anything.

Args:

  • project_id (string, required): the project's UUID. Call list_projects first for the id.

Returns JSON: { data: { project_id, project_name, latest_report: { id, created_at, depth } | null, competitors: Competitor[], observation_kinds } }. Each Competitor: competitor_id, name, website, status ("observed" or "never_observed"), last_observed_at, last_observed_by, and observations with the newest date of each kind:

  • report_run: a report you can read analysed it and its crawl read the site (report_id names the report)

  • site_crawl: a stored crawl of its site

  • monitoring_page_capture: a monitoring check fetched one of its pages (page_type, url)

  • search_check: a monitoring search asked whether anything changed. It does not read the site, so it never sets last_observed_at. last_observed_at is the newest of report_run, site_crawl and monitoring_page_capture, and last_observed_by names which. A competitor nothing has observed is "never_observed" with null dates: no date is ever estimated or filled in, and a record's edit time is never used as an observation date. A failed crawl, a rejected report and a baseline copied from stored data are not observations.

Returns a 404 error if the project is not in your account.

Use when: "how fresh is this data?", "when did we last look at ?", or before relying on a figure, to say how old it is.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesProject UUID from list_projects

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations (which already cover readOnly/idempotent/non-destructive) by disclosing that reading is free and 'this never fetches anything,' that no date is ever estimated or backfilled, that edit times are never treated as observation dates, that failed crawls / rejected reports / baseline copies are not observations, and that a 404 is returned for out-of-account projects. This is unusually rich 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.

Conciseness4/5

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

Front-loads the purpose, then Args, then Returns, then Use-when, so an agent can extract what it needs quickly. The Returns block is lengthy, but with no output schema it earns much of its space; a few clauses (observation kind taxonomy) are dense.

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 carries the full burden and does so thoroughly: it enumerates the return shape, each competitor field, the observation-kind semantics, the status enum values, and the error behavior. Nothing an agent needs to call and interpret this 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?

Schema coverage is 100%, so the baseline is 3, but the description adds workflow value by specifying the parameter is 'the project's UUID' and instructing the agent to call list_projects first for the id. It adds a small amount of meaning beyond 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?

States a specific verb and resource ('how current your Rivalize data is for one project') and defines the exact scope: latest report date plus, per competitor, the date last observed and by what means. This is distinguishable from siblings like get_evidence or list_reports, which return content rather than freshness metadata.

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 explicit when-to-use triggers ('how fresh is this data?', 'when did we last look at <competitor>?', before relying on a figure) and a prerequisite ('Call list_projects first for the id'). It does not name an alternative tool or state when NOT to use it, keeping it just short of a 5.

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

get_reportRead a reportA
Read-onlyIdempotent

Read one competitive-intelligence report as Markdown: TL;DR, biggest threat, your blind spots, a section per competitor, and cited battlecards where the report has them.

Claims the report's fabrication check flagged are shown as "[removed — unverified]", exactly as in the report itself. Do not try to fill them in.

Args:

  • report_id (string, required): the report id (or its job id) from list_reports

  • section (string, optional): only this named section, plus the report title, date and depth, and a line naming the report's other sections. A whole report is several thousand to over a hundred thousand characters and a section is typically a sixth of it, so ask for the section your question needs. Sections: tldr, biggest-threat, blind-spots, actions (what your product should do), battlecards, competitors (every competitor's section in full); per competitor, gathered from every competitor's section: pricing, momentum, app-store, strengths, weaknesses, key-findings, creators, ads, tech-stack. A report has only the sections it has data for. A name that is not one of this report's sections is an error that lists the sections it does have; retry with one of them. Case, spaces and underscores are ignored ("Key findings" = key-findings).

  • competitor (string, optional): only the sections whose heading names this competitor (its section and its battlecard), plus the report title and date. Case-insensitive. With section, only that competitor's part of the section (e.g. section "pricing" + competitor "Notion").

  • page (number, optional): 1-based page. A report over 25,000 characters is split into pages at section boundaries; every page starts with "Page N of M", the characters that remain, the exact call for the next page, and the sections on later pages. A report that fits is returned whole, unchanged.

Without section, returns the whole report exactly as before. Returns Markdown. 404 if the report is not in your account or is not available.

Use when: "summarise my latest report" (no section, or tldr), "what do competitors charge?" (section "pricing"), "what did the report say about ?" (use competitor).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page of a long Markdown document; every page is under 25,000 characters
sectionNoReturn only this named section of the report: tldr, biggest-threat, blind-spots, competitors, battlecards, actions, pricing, momentum, app-store, strengths, weaknesses, key-findings, creators, ads, tech-stack
report_idYesReport id (or its job id) from list_reports
competitorNoReturn only the sections whose heading names this competitor

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), yet the description adds real behavioral context: fabrication-flagged claims render as '[removed — unverified]' and must not be filled in, a bad section name errors and lists available sections, paging kicks in above 25,000 chars at section boundaries with 'Page N of M' headers and a next-page call, and a 404 is returned when the report is out of scope.

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?

Information-dense and front-loaded (return format first, then args, then routing examples), and the nested arg list is easy to scan. It is nonetheless long, and a few statements restate each other (whole-report default behavior, Markdown return format) — minor redundancy rather than padding.

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?

No output schema exists, so the description carries the return contract itself: Markdown, section-per-competitor layout, citation/removal markers, page headers with remaining characters and the next-page call. Combined with the error and paging semantics, 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.

Parameters5/5

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

Schema coverage is already 100%, but the description adds meaning the schema cannot: the full section vocabulary including both whole-report sections and per-competitor gathered sections (pricing, momentum, ads, tech-stack), the interaction rule that 'section + competitor' returns only that competitor's part of the section, case/spaces/underscore normalization ('Key findings' = key-findings), and that absent sections are an error listing what exists.

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 precise verb and resource ('Read one competitive-intelligence report as Markdown') and enumerates the actual content shape (TL;DR, biggest threat, blind spots, competitor sections, battlecards). It is clearly distinguishable from sibling list_reports, which it explicitly references as the source of report_id.

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?

Ends with an explicit 'Use when:' block mapping real user questions to parameter combinations ('summarise my latest report' -> no section or tldr; 'what do competitors charge?' -> section pricing; 'what did the report say about <competitor>?' -> competitor). It also tells the agent when to narrow to a section (size: several thousand to 100k+ chars, a section ~1/6) and when to page.

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

get_strategic_timelineGet strategic timelineA
Read-onlyIdempotent

Get a receipt-linked timeline of competitor activity across Pricing, Product, People, Funding, and Content/Social lanes.

Args:

  • project_id (string, required): the project's UUID. Call list_projects first for the id.

  • days ("30" | "90" | "180", optional): history window, default 90

  • competitor_id (string, optional): isolate one competitor

  • lanes (string[], optional): only these lanes, any of pricing, product, people, funding, content-social

  • format ("markdown" | "json", optional): markdown by default (compact); json for the full structure

  • page (number, optional): 1-based page of the Markdown. A timeline over 25,000 characters is split at lane/move boundaries; each page says "Page N of M", what remains and the exact next call.

Returns agent-ready Markdown by default (JSON on request) with structured events, seven-day move clusters, tracking-since dates, and evidence URLs. History is never backfilled before Rivalize began tracking. Full history/all-competitor access requires Pro; lower plans can request one competitor for 30 days.

Use when: "what strategic moves have competitors made this quarter?" or "show the arc behind recent competitor activity".

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoHistory window; defaults to 90 days
pageNo1-based page of a long Markdown document; every page is under 25,000 characters
lanesNoOnly these lanes: pricing, product, people, funding, content-social
formatNomarkdown (default, compact, agent-ready) or json (full structure, much larger)
project_idYesProject UUID from list_projects
competitor_idNoLimit the timeline to one competitor

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds rich operational context: pagination splits at lane/move boundaries above 25,000 chars with 'Page N of M' and the exact next call, plan gating (Pro for full history/all competitors; lower plans limited to one competitor for 30 days), and the no-backfill-before-tracking limit.

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?

Well front-loaded: purpose, then Args, then Returns, then usage triggers, so the most important framing comes first. Some redundancy exists between the Args block and the schema, but each section still carries distinct value.

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?

No output schema exists, and the description compensates by describing the return shape (structured events, seven-day move clusters, tracking-since dates, evidence URLs) and format switching. Combined with the plan limits, backfill caveat, and pagination contract, an agent has everything needed to invoke and interpret it.

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 already 100%, so the schema fully documents all six parameters; the Args block largely restates them. The description adds minor nuance (markdown 'compact' vs json 'full structure') but does not meaningfully extend the enum/type information the schema already supplies. 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?

States a specific verb and resource ('Get a receipt-linked timeline of competitor activity') plus the exact lanes covered. An agent can distinguish this arc/timeline view from siblings like get_competitor_intelligence, get_battlecard, or get_freshness without opening any schema.

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?

Provides explicit trigger questions ('what strategic moves have competitors made this quarter?', 'show the arc behind recent competitor activity') and a prerequisite ('Call list_projects first for the id'). It lacks any when-not guidance or named alternatives among the many sibling intelligence tools, which keeps it short of a 5.

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

get_universe_companyGet universe companyA
Read-onlyIdempotent

Get the universe profile for one company by domain, including every populated intelligence layer (identity, pricing, features, ads, social, reviews, funding/hiring, rankings, signals, momentum).

Args:

  • domain (string, required): the company domain or any URL on it (e.g. "linear.app" or "https://linear.app/pricing"). Normalized server-side.

  • layers (string[], optional): only these layers — any of identity, pricing, features, ads, social, reviews, funding_hiring, rankings, signals, momentum. Asking for fewer layers returns more items of each.

Returns compact JSON: { data: { domain, name, primaryCategory, lastEnrichedAt, layerFreshness, identity, pricing, features, ads, socialInfluencers, reviews, fundingHiring, rankings, signals, momentum, ... } }. Long arrays (recent posts, ad creatives, sources) are capped; _capped lists kept/total for each. If a layer still does not fit, it is left out and listed in _omitted with the exact call that fetches it. The JSON is always complete and valid.

If the domain is not in the universe, says so (and, when the domain is one of your tracked competitors, points at get_competitor_intelligence / get_report instead).

Use when: "give me everything Rivalize knows about ".

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesCompany domain or a URL on it (at most 253 characters)
layersNoReturn only these layers (identity, pricing, features, ads, social, reviews, funding_hiring, rankings, signals, momentum). Default: every layer, long arrays capped.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare read-only/idempotent/open-world safety, and the description adds substantial behavior beyond them: server-side domain normalization, the inverse relationship between requested layers and items per layer, capping of long arrays with _capped kept/total counters, and _omitted layers paired with the exact call that recovers them. It also guarantees the returned JSON is always complete and valid, which matters for an open-world lookup.

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 purpose, then Args, Returns, and Use-when in a predictable order with no filler prose. The Args block partly restates the schema, but it earns its place by adding normalization and layer-tradeoff details; the length is justified by the tool's breadth.

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 carries the full burden of describing return shape and it does so concretely (top-level data keys, capping, omission protocol, validity guarantee). Combined with the domain/layer semantics and the sibling fallback, 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?

Schema description coverage is 100%, so the baseline is 3, but the description adds real semantics: domain accepts a bare domain or any URL on it and is normalized server-side, and the layers filter is described behaviorally ('asking for fewer layers returns more items of each') rather than just listed. That is genuine value above the schema's enum list.

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?

Opens with a specific verb+resource+scope ('Get the universe profile for one company by domain') and immediately enumerates the intelligence layers covered, which cleanly separates it from get_report, get_battlecard, and get_competitor_intelligence. An agent can route to it without opening a schema.

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?

The 'Use when: give me everything Rivalize knows about <domain>' line states clear usage context, and the description names fallback siblings (get_competitor_intelligence / get_report) for the not-tracked case. It stops short of an explicit when-not-to-use statement against the other sibling lookups, so it is strong but not exhaustive.

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

list_competitorsList tracked competitorsA
Read-onlyIdempotent

List the competitors tracked in YOUR Rivalize account (tenant-isolated). Answers "which competitors am I tracking?".

Args:

  • project_id (string, optional): only one project's competitors. Call list_projects first for the id.

  • limit (number, optional): page size 1-100

  • offset (number, optional): pagination offset (default 0)

Returns JSON: { data: Competitor[], pagination: { total, limit, offset, returned, next_offset } }. Each Competitor includes id, project_id, project_name, name, website, threat_level, momentum_score, and brief where the server provides it. Keep paging with offset = pagination.next_offset until it is null.

momentum_score is the rival's momentum score, and threat_level is only that score's band (critical, high, medium, low, or unknown when there is no score): it is not a second assessment, so do not rank by it.

brief, when present, is how the rival stands as your workspace's Brief shows it: brief.standing is "ahead" (the rival is ahead of you), "behind", "even" or "no_read"; brief.standing_label is the Brief's own words; brief.as_of is the date of the report it was read from; brief.state is "read", "not_in_run" (no finished report covered this rival), "no_run", "unreadable" or "deferred" (still being read: the tool asks again a few times before it answers, so a row still "deferred" means call again in a moment).

To pick the "top" or biggest competitor: rank by brief.standing when present ("ahead" first, then "even", then "behind"), otherwise by momentum_score; break ties by highest momentum_score. A rival whose brief.state is not "read" has no standing yet: say so rather than ranking it by standing.

With a competitor's id: get_competitor_intelligence (its latest intelligence), get_battlecard (sales battlecard), get_evidence with its project_id (the sources behind its facts). For what a report said about it: list_reports for the project, then get_report with competitor set to its name. For when it was last observed: get_freshness for its project.

Use when: "which competitors am I tracking?", "who is my top competitor?", or before any per-competitor read.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (1-100)
offsetNoPagination offset
project_idNoFilter competitors to this project (UUID)

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds genuinely new behavioral context beyond them — tenant isolation, the pagination protocol (offset = next_offset until null), the 'deferred' state that causes the tool to retry before answering, and the fact that threat_level is a band of momentum_score rather than an independent assessment.

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?

Well organized under Args/Returns/Use when headings and front-loaded with the core purpose, but it is long for a list tool and the brief.state enumeration is heavy detail for this surface. Some text (limit 'page size 1-100') duplicates the schema verbatim, and the decisive 'Use when' block sits last rather than up front.

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 carry the return contract, and it does: full JSON shape, the fields each Competitor carries, and how to page through results. It also pre-empts the trickiest ambiguity — how to compute a 'top' competitor and what to do when brief.state is not 'read'. Complete for the tool's call pattern.

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 100%, so baseline is 3. The description still adds meaning: project_id is not just a filter but requires calling list_projects first for the id, and offset carries an implicit default of 0. The limit text merely restates the schema's '1-100', so the gain is modest but real.

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?

Opens with a specific verb and resource plus a scope qualifier: 'List the competitors tracked in YOUR Rivalize account (tenant-isolated)', and frames the question it answers. This cleanly separates it from sibling list_universe_companies, which covers a different (untracked) population.

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?

Ends with an explicit trigger list ('which competitors am I tracking?', 'who is my top competitor?', 'before any per-competitor read') and routes to specific siblings by scenario: get_competitor_intelligence, get_battlecard, get_evidence, list_reports/get_report, get_freshness. Nothing is left to inference.

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

list_projectsList projectsA
Read-onlyIdempotent

List the projects in YOUR Rivalize account. A project is one of your products and the competitors tracked against it.

Args: none.

Returns JSON: { data: Project[] }. Each Project includes id, name, url, competitor_count, last_refreshed_at, created_at.

Use the returned project id with list_competitors, list_reports, get_strategic_timeline, get_competitive_landscape, get_freshness and get_evidence.

Use when: "what products/projects do I have?", or first, whenever another tool needs a project_id. (For "which competitors am I tracking?" use list_competitors.)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description's marginal value comes from the return contract: it enumerates the Project fields and shows how the returned id chains into six named downstream tools. It does not mention pagination or result limits, which is the only meaningful gap for a list endpoint.

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 the purpose, then returns, then usage — a sensible ordering. Nearly every line earns its place, though 'Args: none.' is redundant filler given the empty schema.

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 carries the return contract itself and does so by naming every returned field plus the id's downstream use. Combined with the explicit usage triggers, an agent has everything needed to select and call this tool correctly.

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 nothing to document beyond the explicit 'Args: none.' Baseline for a no-parameter tool is 4; there is no ambiguity for an agent to resolve.

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 ('List the projects in YOUR Rivalize account') and then defines the domain term 'project' as a product plus its tracked competitors, which disambiguates it from the similarly named list_competitors sibling. An agent can distinguish this tool without opening either schema.

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?

Gives explicit trigger phrasings ('what products/projects do I have?'), states the precedence rule ('first, whenever another tool needs a project_id'), and names the competing alternative ('For which competitors am I tracking? use list_competitors'). When-to-use, when-not, and alternatives are all present.

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

list_reportsList reportsA
Read-onlyIdempotent

List the competitive-intelligence reports in YOUR Rivalize account, newest first. Reading is free; this never generates a report.

Args:

  • project_id (string, optional): only this project's reports. Call list_projects first for the id.

  • limit (number, optional): page size 1-100 (default 20)

  • offset (number, optional): pagination offset (default 0)

Returns JSON: { data: Report[], pagination: { total, limit, offset, returned, next_offset } }. Each Report includes id, job_id, project_id, product_name, product_url, competitor_urls, status ("completed" or "unavailable"), created_at, depth ("full" for full research, "quick" for a quick check). A quick check does not buy search traffic, follower counts or the written note on each company, so those are blank in it and marked "Needs full research"; they are not findings.

Use the returned id with get_report.

Use when: "what reports do I have?" or "open my latest report on ".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (1-100, default 20)
offsetNoPagination offset
project_idNoOnly reports for this project (UUID)

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, but the description adds non-derivable facts: reads are free, it never generates a report, and quick-depth reports leave certain fields blank and 'Needs full research' rather than being findings. That last point is real interpretive context that prevents an agent from misreading the payload. It does not cover rate limits or auth scope, so not a 5.

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 purpose sentence, then clearly sectioned Args, Returns and Use when blocks. The Report field enumeration is long but justified because there is no output schema; nothing reads as filler. Slightly heavy for a list tool, keeping it from a 5.

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 carries the return-shape burden and does so: it documents the JSON envelope, pagination fields, per-report fields, status values, and the depth distinction. Combined with the 'Use when' routing, an agent has everything needed to call and interpret this tool.

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 100%, so the baseline is 3, but the description adds workflow meaning the schema lacks: project_id requires first calling list_projects for the UUID, and limit/offset are framed as page size and pagination offset with defaults restated. The uuid/format and bounds detail lives in the schema and is not duplicated.

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 ('List the competitive-intelligence reports'), adds scope ('in YOUR Rivalize account'), ordering ('newest first'), and explicitly disclaims report generation, which separates it from generation/teardown siblings. An agent can distinguish it from get_report or get_battlecard without opening a schema.

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?

Provides an explicit 'Use when' trigger with two concrete query phrasings, states the prerequisite for project_id ('Call list_projects first for the id'), and routes the follow-up ('Use the returned id with get_report'). Both the entry condition and the alternative for single-report retrieval are named.

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

list_universe_companiesList universe companiesA
Read-onlyIdempotent

List companies from the Rivalize universe — the cross-customer competitive-intelligence dataset (not your own tracked competitors; for those use list_competitors).

Search by keyword, filter by category or by which intelligence layer is populated, and paginate.

Args:

  • q (string, optional): search name/domain/description

  • category (string, optional): category SLUG, e.g. "ai-infra" (names like "AI infrastructure" do not match; each row's categories lists its slugs)

  • layer (string, optional): require a populated layer — one of identity, pricing, features, ads, social, reviews, funding_hiring, rankings

  • limit (number, optional): page size 1-100 (default 50)

  • offset (number, optional): pagination offset (default 0)

Returns compact JSON: { data: Company[], pagination: { total, limit, offset, returned, next_offset }, filters }. Each Company: domain, name, primaryCategory, categories (slugs), priorityScore, lastEnrichedAt, layers (which layers are populated), layersUpdated, description (at most 120 characters). If a page does not fit one response, fewer rows come back with _truncated, and pagination.limit/returned say how many; always continue with offset = pagination.next_offset (null when there are no more). Use get_universe_company for one company's full profile.

Use when: "who are the players in ?" or "show me universe companies matching ".

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch name/domain/description
layerNoRequire this intelligence layer to be populated
limitNoPage size (1-100)
offsetNoPagination offset
categoryNoCategory slug or name

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/openWorldHint, so safety is covered; the description goes further by disclosing truncation behaviour ('_truncated', reduced 'returned'), the pagination continuation rule (always advance with pagination.next_offset, null means done), unnamed defaults for limit/offset that the schema omits, and the slug-vs-name matching pitfall. It stops short of error/auth behaviour, but for a read-only list endpoint this is well above the annotation baseline.

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?

Purpose and sibling routing are front-loaded, then args, then return shape, then usage triggers — a clean, scannable structure. It is somewhat long and the Args block duplicates most of the schema's own parameter descriptions, though each entry carries a small increment (defaults, slug caveat) that justifies keeping it.

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, and the description fully covers the return contract: the compact JSON envelope, pagination fields, the per-Company field list including the 120-character description cap, and the truncation continuation rule. Combined with the sibling routing, an agent has everything needed to call and paginate this tool correctly.

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 100%, so the baseline is 3, and the description genuinely adds meaning on top: it warns that category values are slugs and that display names such as 'AI infrastructure' do not match, and it supplies the defaults (limit 50, offset 0) that the schema does not encode. It largely restates the q/layer parameter prose, but the slug caveat and defaults are real added value.

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 (list companies from the Rivalize universe) and immediately disambiguates it from the sibling that could be confused with it: 'not your own tracked competitors; for those use list_competitors.' An agent can pick between list_universe_companies, list_competitors, and get_universe_company without opening a schema.

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?

The description names both the exclusion condition ('not your own tracked competitors') and the replacement tool (list_competitors), plus explicit trigger phrasing ('who are the players in <category>?' / 'show me universe companies matching <keyword>') and a hand-off to get_universe_company for single-entity lookups. Nothing about when to reach for this tool is left to inference.

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

teardown_competitorTear down a competitorA
Read-onlyIdempotent

Produce a full strategy teardown of one competitor by domain — their positioning/hooks, pricing, ads (the creatives they are running), social presence, reviews, hiring, momentum, plus weaknesses to attack. Returns a ready-to-read Markdown teardown, not raw JSON.

This is the one-call competitor teardown: broader than an ad-only teardown, source-backed, and dated (it leads with when the data was last refreshed). Use it to answer "tear down " or "what is 's strategy and where are they weak?".

Args:

  • domain (string, required): the competitor's domain or any URL on it.

Returns Markdown. Ads count as active only if seen in the last 30 days; an unscored momentum is shown as not scored. If the domain is not yet in the universe, says so: when it is one of your tracked competitors it points at get_competitor_intelligence / get_report, otherwise at how to get it enriched.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesCompany domain or a URL on it (at most 253 characters)

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial behavior beyond them: output is Markdown not raw JSON, results are dated/lead with refresh time, ads count as active only if seen in the last 30 days, and unscored momentum is labeled as not scored. These are genuine operational traits the agent could not infer from annotations.

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 the core capability, then a routing sentence, args, and return/edge-case notes. It is longer than a minimal description but every block earns its place; minor density in the final caveat sentence keeps it from a 5.

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 carries the return-value burden and does so: it specifies Markdown format, freshness dating, the 30-day active-ad rule, unscored momentum handling, and the not-in-universe fallback. An agent has everything needed to call this correctly on the first try.

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% and there is a single required 'domain' param, so the schema already documents it fully. The description restates 'domain or any URL on it' and the required status, adding marginal value over the structured field. Baseline 3 applies when the schema does the heavy lifting.

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 (produce a full strategy teardown of one competitor by domain) and enumerates the exact contents (positioning/hooks, pricing, ads, social, reviews, hiring, momentum, weaknesses). It explicitly distinguishes itself from the ad-only teardown and names the sibling tools it defers to, so an agent can tell it apart without opening any schema.

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?

Gives explicit invocation phrasing ('tear down <competitor>', 'what is <competitor>'s strategy and where are they weak?') and states it is the broader one-call option vs an ad-only teardown. It also routes the not-yet-in-universe case to get_competitor_intelligence / get_report, naming concrete alternatives.

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. 13 tool updatesv0.3.2
    • First observedget_battlecard
    • First observedget_competitive_landscape
    • First observedget_competitor_intelligence
    • First observedget_evidence
    • First observedget_freshness
    • First observedget_report
    • First observedget_strategic_timeline
    • First observedget_universe_company
    • First observedlist_competitors
    • First observedlist_projects
    • First observedlist_reports
    • First observedlist_universe_companies
    • First observedteardown_competitor

TDQS

A4.4/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have clearly distinct purposes, and descriptions go out of their way to separate universe data from tracked-competitor data (list_universe_companies vs list_competitors). However, teardown_competitor, get_competitor_intelligence, get_report, and get_battlecard all surface overlapping competitor strategy/intelligence, differing mainly in depth, format, and keying (domain vs competitor_id), which could still cause misselection.

Naming Consistency5/5

All 13 tools use a consistent snake_case verb_noun pattern (list_*, get_*, teardown_competitor) with no convention mixing. The pattern is predictable and readable across the whole set.

Tool Count5/5

13 tools sit comfortably in the well-scoped 3-15 range. Each tool maps to a distinct resource or intelligence view (projects, reports, competitors, timeline, landscape, freshness, evidence, universe), so none feels redundant filler.

Completeness4/5

The surface covers the read-side of the domain well: projects, reports, competitors, universe browsing, intelligence, timelines, landscape, freshness, evidence, and battlecards. It omits write/mutation operations (adding a competitor, generating/refreshing a report), but the descriptions state these are intentionally done in the dashboard, so agents can work around it.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides structured competitive intelligence profiles and listing capabilities through natural language prompts, enabling on-demand sales collateral from a single source of truth.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to perform real-time business intelligence tasks including competitive analysis, website scoring, review analysis, and market research.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Connects NearIQ competitive intelligence to AI tools like Claude Desktop, Claude Code, Cursor, and Windsurf, enabling queries about competitors, reviews, rank tracking, and more.
    20
    MIT