Skip to main content
Glama
osherai

AgencyAnalytics MCP Server

by osherai

AgencyAnalytics MCP Server

A Python Model Context Protocol (MCP) server for AgencyAnalytics that enables AI assistants to manage campaigns, users, backlinks, keywords, and SEO rankings through natural language.

Works with: Claude Desktop, Claude Code, Cursor, Windsurf, Cline, Continue, Zed, and any MCP-compatible client.

Brought to you by Osher Digital - Specialist AI consultants helping businesses harness the power of artificial intelligence.

Features

  • 21 Tools covering the full AgencyAnalytics API surface

  • Campaign Management - Create, read, update, and delete campaigns (clients)

  • User Management - Full CRUD for platform users with role and access control

  • Backlink Tracking - Manage custom backlinks per campaign with domain/page authority

  • SEO Rankings - Pull keyword-level and campaign-level ranking data across Google, Google Mobile, Google Places, and Bing

  • Keyword Monitoring - Read tracked keywords per campaign

  • Competitor Tracking - Add competitor URLs to campaigns for rank comparison

  • SSO Login Grants - Generate one-time login tokens for client portal access

  • Tag Management - Create organizational tags

Related MCP server: SurfRank MCP Server

Prerequisites

  • Python 3.10+

  • uv (recommended) or pip

  • An AgencyAnalytics account on a Premier plan (API access required)

  • An API key (Admin users only)

Getting Your API Key

  1. Log in to AgencyAnalytics as an Admin user

  2. Go to Admin Settings > Company Details

  3. Your API key is at the bottom right of the page

Note: Only account Admin users can access the API key. API access is only available on Premier plans. The API key does not expire.

Installation

1. Clone the Repository

git clone https://github.com/osherai/mcp-agencyanalytics-python.git
cd mcp-agencyanalytics-python

2. Install Dependencies

Using uv (recommended):

uv venv && uv pip install -e .

Or using pip:

python -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate
pip install -e .

3. Configure Credentials

Copy the example environment file and add your API key:

cp .env.example .env

Edit .env:

AGENCYANALYTICS_API_KEY=your_api_key_here

4. Test the Connection

uv run agencyanalytics-mcp

The server should start without errors (it will wait for input on stdin).

Client Configuration

This MCP server works with any MCP-compatible client. Below are setup instructions for popular clients.

Note: Replace /path/to/mcp-agencyanalytics-python with your actual installation path in all examples below.


Claude Desktop

Add to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "agencyanalytics": {
      "command": "/path/to/mcp-agencyanalytics-python/.venv/bin/python",
      "args": ["-m", "agencyanalytics_mcp.server"],
      "cwd": "/path/to/mcp-agencyanalytics-python"
    }
  }
}

Restart Claude Desktop (fully quit and reopen) for changes to take effect.


Claude Code (CLI)

Add the server using the Claude Code CLI:

claude mcp add agencyanalytics \
  -e AGENCYANALYTICS_API_KEY=your_api_key_here \
  -- /path/to/mcp-agencyanalytics-python/.venv/bin/python -m agencyanalytics_mcp.server

Or add to your ~/.claude/settings.json:

{
  "mcpServers": {
    "agencyanalytics": {
      "command": "/path/to/mcp-agencyanalytics-python/.venv/bin/python",
      "args": ["-m", "agencyanalytics_mcp.server"],
      "cwd": "/path/to/mcp-agencyanalytics-python"
    }
  }
}

Cursor

Add to your Cursor MCP configuration:

macOS: ~/.cursor/mcp.json Windows: %USERPROFILE%\.cursor\mcp.json

{
  "mcpServers": {
    "agencyanalytics": {
      "command": "/path/to/mcp-agencyanalytics-python/.venv/bin/python",
      "args": ["-m", "agencyanalytics_mcp.server"],
      "cwd": "/path/to/mcp-agencyanalytics-python"
    }
  }
}

Restart Cursor for changes to take effect.


Windsurf (Codeium)

Add to your Windsurf MCP configuration:

macOS: ~/.codeium/windsurf/mcp_config.json Windows: %USERPROFILE%\.codeium\windsurf\mcp_config.json

{
  "mcpServers": {
    "agencyanalytics": {
      "command": "/path/to/mcp-agencyanalytics-python/.venv/bin/python",
      "args": ["-m", "agencyanalytics_mcp.server"],
      "cwd": "/path/to/mcp-agencyanalytics-python"
    }
  }
}

Restart Windsurf for changes to take effect.


VS Code with Cline Extension

Add to your Cline MCP settings:

macOS: ~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json Windows: %APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json

{
  "mcpServers": {
    "agencyanalytics": {
      "command": "/path/to/mcp-agencyanalytics-python/.venv/bin/python",
      "args": ["-m", "agencyanalytics_mcp.server"],
      "cwd": "/path/to/mcp-agencyanalytics-python"
    }
  }
}

VS Code with Continue Extension

Add to your Continue configuration at ~/.continue/config.json:

{
  "experimental": {
    "modelContextProtocolServers": [
      {
        "transport": {
          "type": "stdio",
          "command": "/path/to/mcp-agencyanalytics-python/.venv/bin/python",
          "args": ["-m", "agencyanalytics_mcp.server"],
          "cwd": "/path/to/mcp-agencyanalytics-python"
        }
      }
    ]
  }
}

Zed Editor

Add to your Zed settings at ~/.config/zed/settings.json:

{
  "context_servers": {
    "agencyanalytics": {
      "command": {
        "path": "/path/to/mcp-agencyanalytics-python/.venv/bin/python",
        "args": ["-m", "agencyanalytics_mcp.server"]
      },
      "settings": {}
    }
  }
}

Example Queries

Once configured, you can ask natural language questions about your AgencyAnalytics data:

  • "List all my campaigns"

  • "Show me the keyword rankings for campaign 123"

  • "Create a new client user for jane@acme.com"

  • "What backlinks do we have for the Acme Corp campaign?"

  • "Generate an SSO login link for user 456"

  • "Add competitor example.com to campaign 123"

Tools Reference

Campaign Tools

Campaigns are called "Clients" in the AgencyAnalytics UI (renamed February 2025), but the API still uses the term "campaign".

list_campaigns

List campaigns with pagination.

Parameter

Type

Required

Default

Description

offset

integer

No

0

Pagination offset

limit

integer

No

50

Max results per page

get_campaign

Get a single campaign by ID.

Parameter

Type

Required

Description

campaign_id

integer

Yes

The campaign ID

create_campaign

Create a new campaign.

Parameter

Type

Required

Description

url

string

Yes

Website URL for the campaign

company

string

Yes

Company/client name

update_campaign

Update an existing campaign.

Parameter

Type

Required

Description

campaign_id

integer

Yes

The campaign ID to update

url

string

No

New website URL

company

string

No

New company name

delete_campaign

Delete a campaign by ID.

Parameter

Type

Required

Description

campaign_id

integer

Yes

The campaign ID to delete


User Tools

list_users

List all platform users with pagination.

Parameter

Type

Required

Default

Description

offset

integer

No

0

Pagination offset

limit

integer

No

50

Max results per page

Returned fields: id, date_created, date_modified, email, username, first_name, last_name, role, campaign_access, status, account_id, campaign_id

get_user

Get a single user by ID.

Parameter

Type

Required

Description

user_id

integer

Yes

The user ID

create_user

Create a new user.

Parameter

Type

Required

Default

Description

email

string

Yes

-

User email address

first_name

string

Yes

-

First name

last_name

string

Yes

-

Last name

role

string

No

client

User role

campaign_access

string

No

restricted

restricted or all

campaign_id

integer

No

-

Campaign to grant access to

update_user

Update an existing user.

Parameter

Type

Required

Description

user_id

integer

Yes

The user ID to update

email

string

No

New email

first_name

string

No

New first name

last_name

string

No

New last name

role

string

No

New role

campaign_access

string

No

New access level

delete_user

Delete a user by ID.

Parameter

Type

Required

Description

user_id

integer

Yes

The user ID to delete


List backlinks with optional campaign filtering.

Parameter

Type

Required

Default

Description

campaign_id

integer

No

-

Filter by campaign

offset

integer

No

0

Pagination offset

limit

integer

No

50

Max results per page

Returned fields: id, title, status, date_created, date_published, url, link_type, target_anchor, target_url, notes, campaign_id, domain_authority, page_authority

Create a new backlink.

Parameter

Type

Required

Description

campaign_id

integer

Yes

Campaign to associate with

title

string

Yes

Backlink title

url

string

Yes

Page URL where link appears

target_url

string

Yes

URL the link points to

target_anchor

string

No

Anchor text

link_type

string

No

Type of link

status

string

No

Backlink status

notes

string

No

Additional notes

Update an existing backlink.

Parameter

Type

Required

Description

backlink_id

integer

Yes

The backlink ID to update

title

string

No

New title

url

string

No

New page URL

target_url

string

No

New target URL

target_anchor

string

No

New anchor text

status

string

No

New status

notes

string

No

New notes

Delete a backlink by ID.

Parameter

Type

Required

Description

backlink_id

integer

Yes

The backlink ID to delete


Keyword & Ranking Tools

list_keywords

List tracked keywords for a campaign. Keywords can only be queried one campaign at a time.

Parameter

Type

Required

Default

Description

campaign_id

integer

Yes

-

The campaign ID

offset

integer

No

0

Pagination offset

limit

integer

No

50

Max results per page

get_keyword_rankings

Get keyword-level ranking data for a campaign. Returns positions across Google, Google Mobile, Google Places, and Bing with change tracking, SERP URLs, and monthly search volume.

Parameter

Type

Required

Default

Description

campaign_id

integer

Yes

-

The campaign ID

offset

integer

No

0

Pagination offset

limit

integer

No

50

Max results per page

Returned fields include: keywordId, keywordPhrase, googleRanking, googleRankingChange, googleRankingUrl, googleMobileRanking, googleMobileRankingChange, googlePlacesRanking, bingRanking, bingRankingChange, localMonthlySearches, and more.

get_campaign_rankings

Get aggregate campaign ranking data over time. Returns historical trends with ranking distribution (positions 1-3, 4-10, 11-20, 21-50, 51+) and competitor data.

Parameter

Type

Required

Default

Description

campaign_id

integer

Yes

-

The campaign ID

offset

integer

No

0

Pagination offset

limit

integer

No

50

Max results per page


Other Tools

create_competitor

Add a competitor URL to a campaign for rank comparison.

Parameter

Type

Required

Description

campaign_id

integer

Yes

Campaign to add competitor to

url

string

Yes

Competitor website URL

create_tag

Create an organizational tag.

Parameter

Type

Required

Description

name

string

Yes

Tag name

create_login_grant

Generate a one-time SSO login URL for a user. The token allows logging into AgencyAnalytics without a password. Useful for embedding reports or building custom login pages.

Parameter

Type

Required

Description

user_id

integer

Yes

User to generate login token for

Returns: token, login_url, time, user_id, origin_user_id

Architecture

How the AgencyAnalytics API Works

Unlike traditional REST APIs, the AgencyAnalytics API uses a single POST endpoint (https://apirequest.app/query) for all operations. Every request includes a JSON body specifying:

  • provider - Always "agency-analytics-v2"

  • asset - The resource type (campaign, user, backlink, keyword, etc.)

  • operation - The action (create, read, update, delete)

  • fields - Which fields to return (for read operations)

  • rows - Data for create/update/delete operations

  • offset / limit - Pagination

Authentication uses HTTP Basic Auth with an empty username and your API key as the password.

API Assets and Supported Operations

Asset

Create

Read

Update

Delete

Notes

campaign

Yes

Yes

Yes

Yes

Called "Client" in UI since Feb 2025

user

Yes

Yes

Yes

Yes

Platform users with roles

backlink

Yes

Yes

Yes

Yes

Custom backlink tracking

keyword

-

Yes

-

-

Read only; requires campaign_id

keyword-rankings

-

Yes

-

-

Read only; ranking feed data

campaign-rankings

-

Yes

-

-

Read only; aggregate ranking feed

competitor

Yes

-

-

-

Create only

tag

Yes

-

-

-

Create only

login-grant

Yes

-

-

-

Create only; SSO tokens

API Limitations

The AgencyAnalytics API is designed for platform management and SEO data retrieval. It does not provide access to:

  • Third-party integration data (Google Ads, Facebook Ads, GA4, social media, etc.)

  • Report generation or export

  • Dashboard/widget data

  • PPC, email marketing, or eCommerce metrics

While AgencyAnalytics connects to 90+ integrations in its UI, none of that data is exposed through the API.

Request Lifecycle

MCP Tool Call
  -> AgencyAnalyticsClient._build_payload()  (construct JSON body)
  -> AgencyAnalyticsClient._request()         (POST to https://apirequest.app/query)
  -> Parse response { metadata, data }
  -> format_response()                        (JSON with summary)
  -> Return to MCP client

Project Structure

mcp-agencyanalytics-python/
├── pyproject.toml                  # Project config, dependencies, entry point
├── .env.example                    # Environment variables template
├── .gitignore                      # Python/IDE/OS ignores
├── README.md                       # This file
├── src/
│   └── agencyanalytics_mcp/
│       ├── __init__.py             # Package version
│       ├── server.py               # MCP server with 21 tool definitions
│       ├── config.py               # Dataclass config loaded from environment
│       └── client.py               # AgencyAnalytics API client wrapper
└── tests/
    ├── __init__.py
    ├── conftest.py                 # Shared pytest fixtures
    ├── test_config.py              # Configuration tests
    ├── test_client.py              # API client tests
    └── test_server.py              # MCP tool tests

Key Design Decisions

  • Lazy client initialization - The API client is created on first use and cached globally, avoiding unnecessary auth on startup

  • Synchronous HTTP - Uses httpx.Client (sync) since the AgencyAnalytics API is a single endpoint with no parallelism benefit

  • Error strings - Tools return "ERROR: ..." strings rather than raising exceptions, following MCP conventions for graceful error handling

  • JSON responses - All tool responses use json.dumps(data, indent=2, default=str) for consistent, readable output

Environment Variables

Variable

Required

Default

Description

AGENCYANALYTICS_API_KEY

Yes

-

Your AgencyAnalytics API key (Admin Settings > Company Details)

AGENCYANALYTICS_BASE_URL

No

https://apirequest.app/query

API endpoint URL (override for testing)

Testing

Running Tests

# Install dev dependencies
uv pip install -e ".[dev]"

# Run all tests
uv run pytest

# Run with verbose output
uv run pytest -v

# Run a specific test file
uv run pytest tests/test_client.py

# Run a specific test class
uv run pytest tests/test_server.py::TestListCampaigns

Test Structure

tests/
├── conftest.py         # Fixtures: sample_config, sample_campaign, sample_user,
│                       #   sample_backlink, sample_keyword_ranking, sample_api_response
├── test_config.py      # Tests for environment loading and validation (5 tests)
├── test_client.py      # Tests for auth headers, payload building, HTTP requests,
│                       #   and client methods (15 tests)
└── test_server.py      # Tests for each MCP tool with mocked client (14 tests)

All tests use unittest.mock to mock the API client. No real API calls are made during testing.

Troubleshooting

"Missing required environment variable: AGENCYANALYTICS_API_KEY"

Ensure your .env file exists in the project root and contains your API key:

AGENCYANALYTICS_API_KEY=your_api_key_here

"Authentication failed. Check your API key."

  1. Verify your API key is correct (Admin Settings > Company Details)

  2. Confirm your account is on a Premier plan with API access

  3. Ensure you are an Admin user

"API error" responses

The AgencyAnalytics API may return errors for:

  • Invalid asset names or operations

  • Missing required fields in create/update operations

  • Invalid filter values (e.g., non-existent campaign IDs)

  • Rate limiting (specific limits are not publicly disclosed)

MCP server not appearing in your client

  1. Ensure the config file path is correct for your client (see Client Configuration section)

  2. Verify the Python path in the config points to the .venv directory

  3. Fully quit and restart your client application

  4. Check your client's logs for error messages

  5. Test the server manually:

    cd /path/to/mcp-agencyanalytics-python
    .venv/bin/python -m agencyanalytics_mcp.server

    The server should start without errors (it will wait for input on stdin)

Keywords returning empty results

Keywords can only be queried one campaign at a time. You must provide a campaign_id:

list_keywords(campaign_id=123)

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository

  2. Create your feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'Add some amazing feature')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments


About Osher Digital

This project is maintained by Osher Digital, specialist AI consultants based in Australia. We help businesses integrate AI solutions to streamline operations and drive growth.

Need help with AI integration? Get in touch

Disclaimer

This is an unofficial, community-maintained project. It is not affiliated with, officially maintained, or endorsed by AgencyAnalytics.

Available Tools

20 tools
create_campaignA

Create a new campaign (client) in AgencyAnalytics.

Args: url: The website URL for the campaign company: The company/client name

Returns: JSON object with created campaign data

Examples: - create_campaign(url="https://example.com", company="Acme Corp")

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
companyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that it creates a campaign and returns a JSON object, and gives an example. However, it omits behavioral details such as potential errors, idempotency, or authentication requirements. This is adequate but not rich.

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?

The description is well-structured with a summary line, Args, Returns, and Examples sections. Every sentence provides useful information, and there is no redundancy or fluff. It is appropriately sized for the tool's complexity.

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 simple create tool with two parameters, the description is nearly complete: it specifies the arguments, return type, and an example. Given that an output schema exists, return details are not needed. The only minor gap is ambiguity around 'campaign (client)' and lack of edge-case handling, but overall it is sufficient.

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?

The input schema has 0% description coverage, only providing titles 'Url' and 'Company'. The description compensates fully by explaining 'url: The website URL for the campaign' and 'company: The company/client name', and also provides a concrete example. This adds clear 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?

The description clearly states 'Create a new campaign (client) in AgencyAnalytics' with a specific verb and resource, distinguishing it from sibling tools like update_campaign, delete_campaign, and get_campaign. The parenthetical '(client)' adds useful context.

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 description provides an example call and clearly indicates the action (create new campaign), so when to use it is implied. However, it does not explicitly mention alternatives or when not to use it (e.g., for updating existing campaigns use update_campaign).

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

create_competitorA

Add a competitor to a campaign.

Args: campaign_id: The campaign ID to add the competitor to url: The competitor website URL

Returns: JSON object with created competitor data

Examples: - create_competitor(campaign_id=123, url="https://competitor.com")

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
campaign_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

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

There are no annotations, so the description must disclose behavioral traits. It states a return value and provides an example, but it does not mention potential side effects, error conditions, idempotency, or required permissions. For a mutating create operation, this is a significant transparency 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?

The description is structured with a summary line, Args, Returns, and an Example, with no fluff. Every line adds value, and the summary is front-loaded. It is appropriately sized for a simple two-parameter tool.

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 simple two-parameter create tool with an output schema, the description covers the purpose, parameters, return type, and usage example. It lacks usage guidance and behavioral caveats, but the low complexity keeps the gaps modest. The output schema exists, so the return format is sufficiently specified.

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 input schema provides only types and titles with 0% description coverage. The description compensates by explicitly defining campaign_id as 'The campaign ID to add the competitor to' and url as 'The competitor website URL,' along with a concrete example. This adds meaningful semantics beyond the bare 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 opens with 'Add a competitor to a campaign,' which clearly identifies the action (add) and the resource (competitor to a campaign), distinguishing it from sibling tools like create_backlink or create_tag. The specific verb and resource make the purpose unambiguous.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, no exclusions, and no context about prerequisites. It merely states the action and parameters, leaving usage decisions to the agent.

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

create_login_grantA

Generate an SSO login token for a user.

Creates a one-time login URL that can be used to log a user into AgencyAnalytics without requiring their password. Useful for embedding reports or creating custom login pages.

Args: user_id: The user ID to generate a login token for

Returns: JSON object with login token, URL, and expiration info

Examples: - create_login_grant(user_id=456) - Generate SSO link for user 456

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses key behaviors: creates a one-time URL, no password required, and returns expiration info. It does not mention potential permissions or whether existing tokens are invalidated, but for a token generator this is reasonably transparent.

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 well-structured with a summary, args, returns, and example. It is mostly concise, though the Args section largely repeats schema information, making it slightly redundant. Still, the front-loaded summary and example add 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?

Given the tool's simplicity (one parameter) and the presence of an output schema, the description is complete: it explains the purpose, usage context, parameter, return value, and provides an example. No critical information is missing for correct invocation.

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 0%, so the description must compensate. It states 'user_id: The user ID to generate a login token for', which clarifies the parameter's role but adds little beyond the parameter name. It lacks context on how to obtain a valid user_id or any constraints, so it only partially compensates.

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 clearly states the specific action ('Generate an SSO login token') and the resource ('for a user'), with a one-line summary that distinguishes it from sibling user management tools. The verb is specific and the scope 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?

The description provides clear context on when to use it ('Useful for embedding reports or creating custom login pages'), but does not explicitly state when not to use it or name alternatives. This is sufficient for a unique tool but lacks explicit exclusions.

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

create_tagA

Create a new tag in AgencyAnalytics.

Args: name: The tag name

Returns: JSON object with created tag data

Examples: - create_tag(name="priority") - Create a "priority" tag

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations, the description carries the full burden for behavioral disclosure. It only states that a tag is created and a JSON object returned, which is obvious from the operation type. It omits details about error handling, idempotency, or permissions, leaving significant gaps.

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?

The description is compact, using short sections for Args, Returns, and Examples. Every line provides useful, scan-friendly information with no redundancy or fluff.

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?

The tool is simple with one required parameter, and the description covers purpose, parameter, and an example. Since an output schema exists, the Returns section is a bonus. The main omission is usage guidance, but for a straightforward create operation, the description is largely sufficient.

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

Parameters2/5

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

The input schema already defines 'name' as a required string. The description's Args section simply restates 'The tag name' without adding constraints, naming rules, or valid value examples beyond the 'priority' example. This does not compensate for the 0% schema description coverage.

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 clearly states the action ('Create') and the resource ('a new tag in AgencyAnalytics'), which distinguishes it from sibling tools like create_campaign or create_user. The example reinforces the intended function.

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 description implies this tool is for creating tags when needed but provides no explicit guidance on when to choose it over alternatives or exclusions. The example shows a basic call, but there is no discussion of prerequisites or contexts where it should not be used.

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

create_userA

Create a new user in AgencyAnalytics.

Args: email: User email address first_name: User first name last_name: User last name role: User role (default: 'client') campaign_access: Access level - 'restricted' or 'all' (default: 'restricted') campaign_id: Campaign ID to grant access to (for restricted users)

Returns: JSON object with created user data

Examples: - create_user(email="john@example.com", first_name="John", last_name="Doe") - create_user(email="jane@acme.com", first_name="Jane", last_name="Smith", campaign_id=123)

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoclient
emailYes
last_nameYes
first_nameYes
campaign_idNo
campaign_accessNorestricted

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It explains the creation behavior, defaults for role and campaign_access, and the campaign_id dependency, but it omits potential side effects such as invitation emails, duplicate user checks, or required permissions.

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?

The description is well-structured with an action statement, Args section, Returns, and Examples. It is compact and free of redundant content, with each element serving a clear purpose for invocation.

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 6 parameters, 3 required, and no annotations, the description covers all parameters, defaults, return type, and usage examples. It is complete enough for an agent to select and invoke the tool correctly, especially given the presence of an output schema.

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?

The input schema has 0% description coverage, but the description fully compensates by explaining every parameter: email, first_name, last_name, role (with default), campaign_access (allowed values and default), and campaign_id (tied to restricted access). The examples illustrate typical parameter combinations, adding valuable 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?

The description opens with 'Create a new user in AgencyAnalytics,' clearly specifying the action and resource. It distinguishes itself from sibling tools like update_user, list_users, and delete_user by using the 'create' verb with the 'user' resource.

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 description implies usage for adding a new user through its examples and parameter details, but it does not explicitly state when to use this tool over alternatives. There are no exclusions or clear 'use this when' guidance, leaving the context partially implicit.

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

delete_campaignA

Delete a campaign (client) from AgencyAnalytics.

Args: campaign_id: The campaign ID to delete

Returns: JSON object with deletion result

Examples: - delete_campaign(campaign_id=123) - Delete campaign 123

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It only says 'Delete a campaign' and mentions a return value, but fails to warn that deletion is permanent, irreversible, or that it may affect related data. This is a significant gap for a destructive action.

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?

The description is concise and well-structured with a clear main line, followed by Args, Returns, and Examples sections. Every element serves a purpose with no unnecessary filler.

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

Completeness3/5

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

For a simple delete operation with one parameter and an output schema, the description is mostly complete, covering what is passed and what is returned. However, it lacks important contextual details about the deletion's permanence or side effects, and it does not differentiate usage from sibling delete tools, making it minimally viable but with clear gaps.

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 0%, but the description compensates by explaining the single parameter: 'campaign_id: The campaign ID to delete.' It also provides a concrete example (delete_campaign(campaign_id=123)), making the parameter's purpose clear beyond the schema's basic integer type.

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 clearly states the action: 'Delete a campaign (client) from AgencyAnalytics.' It identifies the specific resource (campaign/client) and the platform, which distinguishes it from sibling delete tools like delete_user and delete_backlink.

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 description does not explicitly state when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. The usage is implied by the tool's name and straightforward purpose, but no explicit guidance is provided.

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

delete_userA

Delete a user from AgencyAnalytics.

Args: user_id: The user ID to delete

Returns: JSON object with deletion result

Examples: - delete_user(user_id=456) - Delete user 456

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose side effects. It only states the deletion action and that a JSON object is returned; it does not mention permanence, required permissions, cascading effects, or reversibility—critical for a destructive operation.

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?

The description is compact and well-structured with a clear purpose, Args, Returns, and an Example. Every line adds value, and the format makes it easy to parse.

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

Completeness3/5

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

For a simple deletion tool with an output schema (per context signals), the description is mostly adequate. However, it lacks warnings about destructive consequences or prerequisites, which are important for safe invocation.

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 schema provides only a type and title for user_id, but the description's Args section explains 'The user ID to delete,' adding necessary semantic meaning. The parameter is simple and sufficiently documented.

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 opens with 'Delete a user from AgencyAnalytics,' clearly specifying the action and resource. It distinguishes from sibling tools like create_user, update_user, list_users, and get_user.

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?

Clear context for use: you call this to delete a user. However, it does not provide explicit exclusionary guidance or mention alternative approaches (e.g., deactivation via update_user), though the purpose is unambiguous.

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

get_campaignA

Get a single campaign (client) by ID.

Retrieves detailed information about a specific campaign.

Args: campaign_id: The AgencyAnalytics campaign ID

Returns: JSON object with campaign details

Examples: - get_campaign(campaign_id=123) - Get campaign with ID 123

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses that the tool retrieves detailed information and returns a JSON object, which is helpful. Yet it does not mention error behavior (e.g., missing campaign), permissions, or rate limits. For a simple read operation, this is sufficient but has clear gaps.

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 mostly concise and front-loaded, with the key purpose in the first line. The Args/Returns/Examples structure is clean. A minor redundancy exists between the first two sentences ('Get a single campaign' vs 'Retrieves detailed information'), but it's not excessive.

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?

The tool is simple (one required parameter, no nested objects) and the description explains purpose, parameter, return type, and gives an example. Since an output schema exists (though not shown), full return value documentation is not required. The main missing context is error handling and connection to sibling tools, but for its complexity this is nearly complete.

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 schema only provides the type (integer) and requirement; the description's Args section explains that campaign_id is 'The AgencyAnalytics campaign ID,' adding semantic meaning. Given the single parameter, this compensates well for the 0% schema description coverage.

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?

The description clearly states a specific verb ('Get') and resource ('campaign' or 'client') with a scope ('by ID'). It distinguishes from list_campaigns implicitly ('single' vs listing), but does not explicitly contrast with sibling tools, so it doesn't earn a 5.

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 description implies use when you need one specific campaign by ID, and the example shows direct usage. However, it offers no explicit guidance on when not to use it or mention alternatives like list_campaigns for discovering IDs. Usage context is adequate but not fully articulated.

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

get_campaign_rankingsA

Get aggregate campaign ranking data over time.

Retrieves historical ranking trends for a campaign including average positions, ranking distribution (1-3, 4-10, 11-20, etc.), and changes across Google, Google Mobile, Google Places, and Bing.

Args: campaign_id: The campaign ID (required) offset: Pagination offset (default: 0) limit: Maximum number of results (default: 50)

Returns: JSON array of campaign ranking snapshots over time with distribution breakdowns and competitor data

Examples: - get_campaign_rankings(campaign_id=123) - Get ranking trends - get_campaign_rankings(campaign_id=123, limit=30) - Get last 30 data points

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
campaign_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the return format, data granularity, and search engines covered, and provides examples. It does not explicitly state that it is read-only or mention authentication/rate limits, but the verb 'get' and narrative imply no side effects.

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?

The description is well-structured with a clear summary, Args, Returns, and Examples sections. It is appropriately sized with no filler or redundant content, and every section adds 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?

For a simple read-only retrieval tool with an output schema, the description covers purpose, parameters, return structure, and examples. It lacks explicit time-range behavior, but the schema does not include a time-range parameter, so this is complete for the defined interface.

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 description coverage is 0%, so the description must compensate. The Args section thoroughly explains campaign_id as required, offset as pagination with default 0, and limit as max results with default 50, adding meaning beyond the raw schema. Examples further illustrate parameter usage.

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 clearly states that the tool retrieves historical ranking trends for a campaign, specifying key details like average positions, distribution buckets, and search engines. This distinguishes it from sibling tools such as get_keyword_rankings by focusing on aggregate campaign-level data.

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 description implies usage for campaign-level historical rankings but never explicitly mentions alternatives like get_keyword_rankings or states when not to use this tool. The context is clear but excludes no alternatives, so guidance is only implied.

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

get_keyword_rankingsA

Get keyword rankings for a campaign.

Retrieves detailed keyword ranking data including Google, Google Mobile, Google Places, and Bing rankings with change tracking.

Args: campaign_id: The campaign ID (required) offset: Pagination offset (default: 0) limit: Maximum number of results (default: 50)

Returns: JSON array of keyword rankings with search engine positions, ranking changes, SERP URLs, and search volume data

Examples: - get_keyword_rankings(campaign_id=123) - Get rankings for campaign 123 - get_keyword_rankings(campaign_id=123, limit=100) - Get more rankings

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
campaign_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

The description discloses the return format (JSON array with SERP URLs and search volume) and pagination parameters, adding some behavioral context. However, with no annotations, it does not explicitly state read-only semantics, nor does it explain the 'change tracking' behavior or any potential limitations in detail.

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?

The description is well-structured with Args, Returns, and Examples sections. It is concise, front-loaded with the main purpose, and every section earns its place, with examples adding practical clarity.

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?

The description covers the core purpose, all parameters, and return values, and is supported by an output schema. However, it lacks differentiation from similar sibling tools and does not elaborate on the 'change tracking' aspect, which somewhat limits completeness for a tool with no annotations.

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 description provides clear explanations for all three parameters, including the required campaign_id and the pagination semantics for offset and limit. Since the schema has zero description coverage, this compensation is essential and well executed, though the 'default' values simply repeat schema information.

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?

The description clearly states that the tool retrieves keyword rankings for a campaign, listing specific data types (Google, Google Mobile, Google Places, Bing) and change tracking. However, it does not distinguish itself from the sibling tool get_campaign_rankings, which may serve a similar purpose.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as list_keywords or get_campaign_rankings. There are no explicit use cases, preconditions, or exclusions, leaving the agent without context for tool selection.

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

get_userA

Get a single user by ID.

Retrieves detailed information about a specific user including their role, status, and campaign access.

Args: user_id: The AgencyAnalytics user ID

Returns: JSON object with user details

Examples: - get_user(user_id=456) - Get user with ID 456

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses that the tool 'Retrieves detailed information' and describes included fields and a JSON return format. However, it does not mention error handling (e.g., 404 for missing user), authentication requirements, or rate limits, leaving some behavioral gaps.

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 well-structured with a lead sentence, explanatory paragraph, Args/Returns sections, and an example. It is concise, though the first two sentences are slightly redundant ('Get a single user by ID' and 'Retrieves detailed information about a specific user').

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?

This is a simple one-parameter read tool with an output schema available. The description covers purpose, parameter meaning, return format, and an example. It is fully adequate for an agent to decide when to use it and how to call it 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 schema provides only the parameter name and type (integer), with 0% description coverage. The description's Args section explains 'user_id: The AgencyAnalytics user ID' and provides an example (456), adding the domain meaning that the schema lacks. This effectively compensates for the low coverage.

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 clearly states 'Get a single user by ID' and elaborates with 'Retrieves detailed information about a specific user including their role, status, and campaign access.' This distinguishes it from sibling tools like list_users (multiple users) and update_user/delete_user (mutations), using a specific verb, resource, and scope.

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 description clearly implies the tool should be used when you have a user ID and need detailed info on that single user. It provides clear context but does not explicitly mention alternatives like list_users or state when not to use this tool, so it lacks explicit exclusions.

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

list_campaignsA

List campaigns (clients) from AgencyAnalytics.

Retrieves campaigns with pagination. Note: "Campaign" in the API corresponds to "Client" in the AgencyAnalytics UI (renamed Feb 2025).

Args: offset: Pagination offset (default: 0) limit: Maximum number of results (default: 50)

Returns: JSON array of campaigns with metadata

Examples: - list_campaigns() - Get first 50 campaigns - list_campaigns(offset=50, limit=50) - Get next page of campaigns

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses pagination behavior, default offset/limit values, and the notable API/UI naming difference. It also states the return format as a JSON array, exceeding what a minimal list description would offer, though it omits details like error handling or rate limits.

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

Conciseness4/5

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

The description is well-structured with sections for purpose, note, args, returns, and examples. Every section adds value, though the examples are somewhat redundant with the parameter definitions. It is efficient and clear, but not as ultra-terse as a two-sentence description.

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?

Given that an output schema exists and the tool has only two parameters, the description covers everything needed: the operation, pagination semantics, defaults, and examples. It leaves no significant conceptual gaps, making it fully complete for this tool's complexity.

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?

The input schema provides no descriptions for limit and offset, so the description's Args section is essential. It clearly defines both parameters with defaults and provides usage examples, fully compensating for the 0% schema coverage.

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 opens with 'List campaigns (clients) from AgencyAnalytics,' providing a specific verb and resource, and clarifies the API/UI naming difference (Campaign = Client). This distinctly positions it against sibling tools like get_campaign, create_campaign, and delete_campaign.

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 description implies usage through the 'List' verb and pagination examples, but it does not explicitly state when to use list_campaigns versus get_campaign or other alternatives. No exclusions or comparative guidance is provided, so it remains at the 'implied usage' level.

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

list_keywordsA

List keywords for a campaign.

Retrieves keywords tracked for a specific campaign. Keywords can only be queried one campaign at a time.

Args: campaign_id: The campaign ID (required) offset: Pagination offset (default: 0) limit: Maximum number of results (default: 50)

Returns: JSON array of keywords with metadata

Examples: - list_keywords(campaign_id=123) - Get keywords for campaign 123 - list_keywords(campaign_id=123, limit=100) - Get more keywords

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
campaign_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It does state a key constraint (one campaign at a time) and mentions pagination defaults, but it does not disclose whether the operation is read-only (though 'List' implies it), error behavior for invalid campaign IDs, or any authentication/rate-limit details. This is adequate but not comprehensive.

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?

The description is well-structured with a brief purpose statement, an Args section, a Returns line, and Examples. Every section adds value, the examples are concise, and there is no redundant filler.

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?

Given the tool's simplicity (3 params, 1 required) and the existence of an output schema, the description is quite complete. It covers purpose, parameter meanings, a usage constraint, and examples. Minor gaps remain regarding error handling and explicit safety assurances, but these are not critical for a simple list operation.

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 0% because the schema lacks property descriptions. The description compensates by providing semantic meaning for each parameter: campaign_id as 'The campaign ID (required)', offset as 'Pagination offset (default: 0)', and limit as 'Maximum number of results (default: 50)'. This goes beyond the schema's structural info (types, defaults, required) and includes a practical example.

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 uses the specific verb 'List' with the resource 'keywords for a campaign', clearly distinguishing it from sibling tools like list_campaigns, list_users, and list_backlinks. It also states the scope ('for a campaign') and the constraint of one campaign at a time, making the purpose 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?

The description provides clear context on when to use the tool ('List keywords for a campaign', 'Keywords can only be queried one campaign at a time') and includes examples showing typical usage. However, it does not explicitly mention alternatives or when not to use this tool, though the sibling tool names imply distinctions.

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

list_usersA

List users from AgencyAnalytics.

Retrieves all platform users with their details and roles.

Args: offset: Pagination offset (default: 0) limit: Maximum number of results (default: 50)

Returns: JSON array of users with metadata

Examples: - list_users() - Get first 50 users - list_users(limit=100) - Get up to 100 users

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains pagination via offset and limit, and notes the return type (JSON array with metadata). It does not disclose permissions, rate limits, or any filtering constraints, which are relevant but not critical for a simple read operation.

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?

The description is well-structured: a one-line summary, a clarifying sentence, then Args, Returns, and Examples. Each section serves a purpose and is front-loaded with the main functionality. No superfluous text.

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 straightforward list tool with two pagination parameters, the description covers purpose, parameter semantics, return type, and usage examples. The existence of an output schema reduces the need to detail return structure, and the description provides enough context for correct invocation.

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?

The schema has zero descriptions for parameters, so the description compensates by clearly explaining offset as 'Pagination offset' and limit as 'Maximum number of results,' including defaults and example calls. This adds concrete meaning beyond the bare schema properties.

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 clearly states the tool 'List users from AgencyAnalytics' and elaborates with 'Retrieves all platform users with their details and roles.' It uses a specific verb (list/retrieves) and resource (users), and differentiates from sibling tools like get_user by indicating the scope (all users vs. presumably a single user).

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 description provides clear context that this tool is for listing all users, with examples showing default and custom usage. However, it does not explicitly mention when not to use it or name alternative tools like get_user, so it lacks explicit exclusions/alternatives.

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

update_campaignA

Update an existing campaign (client).

Args: campaign_id: The campaign ID to update url: New website URL (optional) company: New company name (optional)

Returns: JSON object with update result

Examples: - update_campaign(campaign_id=123, company="New Name") - update_campaign(campaign_id=123, url="https://new-site.com")

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
companyNo
campaign_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It only mentions that it returns a JSON object with update result. As a mutation tool, it does not disclose potential side effects, required permissions, or reversibility of changes. This is a significant transparency 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?

The description is concise and well-structured, with a brief purpose statement followed by Args, Returns, and Examples sections. Every sentence earns its place, and the format is front-loaded and efficient.

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?

Despite missing usage guidelines and behavioral details, the description provides purpose, parameter semantics, and examples for a simple 3-parameter update tool. The output schema exists, so the return value note is sufficient. Overall, it is fairly complete for the tool's complexity.

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 schema has 0% description coverage, so the description carries the burden of parameter semantics. The Args section clearly explains campaign_id as the ID to update, url as the new website URL, and company as the new company name, adding meaningful context beyond the raw 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 starts with 'Update an existing campaign (client),' which clearly states the action (update) and the resource (campaign). It also distinguishes from sibling tools like create_campaign and delete_campaign by specifying 'existing,' leaving no ambiguity about what this tool does.

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 description implies usage through the word 'existing' and the nature of the tool, but it does not explicitly state when to use this tool vs alternatives. It lacks any reference to sibling tools such as get_campaign, create_campaign, or delete_campaign, so the guidance is only implicit.

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

update_userA

Update an existing user.

Args: user_id: The user ID to update email: New email address (optional) first_name: New first name (optional) last_name: New last name (optional) role: New role (optional) campaign_access: New access level (optional)

Returns: JSON object with update result

Examples: - update_user(user_id=456, first_name="Jane") - update_user(user_id=456, role="admin")

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNo
emailNo
user_idYes
last_nameNo
first_nameNo
campaign_accessNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions that a JSON object with update result is returned, but it does not disclose whether the update is partial (only specified fields), what happens if the user does not exist, permission requirements, or any side effects. This is a significant transparency gap for a mutation 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?

The description is well-structured with a clear heading, Args list, Returns line, and Examples. It is concise—no redundant prose—and every section earns its place. The examples are practical and illustrative without unnecessary verbosity.

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

Completeness3/5

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

Given an output schema exists, the tool does not need to explain return structure in deep detail, and it does mention the return type. However, with six parameters, zero schema descriptions, and no annotations, the description should provide more context on error handling, partial update semantics, and valid enumerations. It is a minimum viable description but not fully complete.

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?

The schema has 0% description coverage, so the description is the only source of parameter meaning. It lists all six parameters with brief explanations (e.g., 'New email address (optional)'), which adds some value beyond the raw schema. However, it lacks details such as valid role values, format for campaign_access, or constraints, making the semantics only minimally useful.

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 clearly states 'Update an existing user.' with a specific verb and resource. It lists the fields that can be updated, distinguishing it from sibling tools like create_user, delete_user, and get_user. The purpose is unmistakable.

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 phrase 'existing user' implies the tool is for modifying already-created users, providing some implicit guidance. However, there is no explicit mention of when to use this versus alternatives (e.g., create_user for new users, update_campaign for campaigns), nor any exclusions or prerequisites.

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. Dates show when Glama detected each change.

  1. 20 tool updatesv0.1.0
    • First observedcreate_backlink
    • First observedcreate_campaign
    • First observedcreate_competitor
    • First observedcreate_login_grant
    • First observedcreate_tag
    • First observedcreate_user
    • First observeddelete_backlink
    • First observeddelete_campaign
    • First observeddelete_user
    • First observedget_campaign
    • First observedget_campaign_rankings
    • First observedget_keyword_rankings
    • First observedget_user
    • First observedlist_backlinks
    • First observedlist_campaigns
    • First observedlist_keywords
    • First observedlist_users
    • First observedupdate_backlink
    • First observedupdate_campaign
    • First observedupdate_user

TDQS

A3.8/5.0
Disambiguation5/5

Each tool targets a distinct resource and action (users, campaigns, backlinks, keywords, rankings, competitors, tags, login grants). The only potentially overlapping pair (get_keyword_rankings vs get_campaign_rankings) is clearly distinguished by descriptions referring to keyword-level vs aggregate historical data.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (list_, get_, create_, update_, delete_) with clear resource names. No mixed conventions or vague verbs.

Tool Count3/5

At 20 tools, the set leans heavy. While each tool has a clear purpose, the number exceeds the typical well-scoped range and includes several one-off operations (create_tag, create_competitor, create_login_grant) that could suggest either missing related operations or a broader scope than necessary.

Completeness3/5

Full CRUD exists for users and campaigns, and backlinks have create/update/delete/list. However, keywords only support listing, competitors only support creation, and tags only support creation. Notable gaps in managing core SEO entities make the surface feel incomplete.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Connects AI assistants to SE Ranking's SEO and project management APIs to enable natural language queries for keyword research, backlink analysis, and technical audits. It supports comprehensive tasks including competitive analysis, domain traffic tracking, and AI search visibility monitoring.
    100
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to access SurfRank's AI visibility analytics platform through 24 tools. It allows agents to run AI-visibility reports, research keywords, track competitors, and manage projects directly from chat interfaces.
    24
    19
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Connects AI assistants to SEO APIs for backlinks analysis, keyword research, and traffic analysis.
    16
    28
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Integrates with the Babbar.tech SEO API to enable AI assistants to perform advanced SEO analysis, competitor research, backlink auditing, and content gap identification.
    2
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/osherai/mcp-agencyanalytics-python'

If you have feedback or need assistance with the MCP directory API, please join our Discord server