AgencyAnalytics MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AgencyAnalytics MCP Servershow me my top performing campaigns"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Log in to AgencyAnalytics as an Admin user
Go to Admin Settings > Company Details
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-python2. 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 .envEdit .env:
AGENCYANALYTICS_API_KEY=your_api_key_here4. Test the Connection
uv run agencyanalytics-mcpThe 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-pythonwith 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.serverOr 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 |
| integer | No | 0 | Pagination offset |
| integer | No | 50 | Max results per page |
get_campaign
Get a single campaign by ID.
Parameter | Type | Required | Description |
| integer | Yes | The campaign ID |
create_campaign
Create a new campaign.
Parameter | Type | Required | Description |
| string | Yes | Website URL for the campaign |
| string | Yes | Company/client name |
update_campaign
Update an existing campaign.
Parameter | Type | Required | Description |
| integer | Yes | The campaign ID to update |
| string | No | New website URL |
| string | No | New company name |
delete_campaign
Delete a campaign by ID.
Parameter | Type | Required | Description |
| integer | Yes | The campaign ID to delete |
User Tools
list_users
List all platform users with pagination.
Parameter | Type | Required | Default | Description |
| integer | No | 0 | Pagination offset |
| 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 |
| integer | Yes | The user ID |
create_user
Create a new user.
Parameter | Type | Required | Default | Description |
| string | Yes | - | User email address |
| string | Yes | - | First name |
| string | Yes | - | Last name |
| string | No |
| User role |
| string | No |
|
|
| integer | No | - | Campaign to grant access to |
update_user
Update an existing user.
Parameter | Type | Required | Description |
| integer | Yes | The user ID to update |
| string | No | New email |
| string | No | New first name |
| string | No | New last name |
| string | No | New role |
| string | No | New access level |
delete_user
Delete a user by ID.
Parameter | Type | Required | Description |
| integer | Yes | The user ID to delete |
Backlink Tools
list_backlinks
List backlinks with optional campaign filtering.
Parameter | Type | Required | Default | Description |
| integer | No | - | Filter by campaign |
| integer | No | 0 | Pagination offset |
| 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_backlink
Create a new backlink.
Parameter | Type | Required | Description |
| integer | Yes | Campaign to associate with |
| string | Yes | Backlink title |
| string | Yes | Page URL where link appears |
| string | Yes | URL the link points to |
| string | No | Anchor text |
| string | No | Type of link |
| string | No | Backlink status |
| string | No | Additional notes |
update_backlink
Update an existing backlink.
Parameter | Type | Required | Description |
| integer | Yes | The backlink ID to update |
| string | No | New title |
| string | No | New page URL |
| string | No | New target URL |
| string | No | New anchor text |
| string | No | New status |
| string | No | New notes |
delete_backlink
Delete a backlink by ID.
Parameter | Type | Required | Description |
| 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 |
| integer | Yes | - | The campaign ID |
| integer | No | 0 | Pagination offset |
| 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 |
| integer | Yes | - | The campaign ID |
| integer | No | 0 | Pagination offset |
| 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 |
| integer | Yes | - | The campaign ID |
| integer | No | 0 | Pagination offset |
| 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 |
| integer | Yes | Campaign to add competitor to |
| string | Yes | Competitor website URL |
create_tag
Create an organizational tag.
Parameter | Type | Required | Description |
| 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 |
| 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 operationsoffset/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 |
| Yes | Yes | Yes | Yes | Called "Client" in UI since Feb 2025 |
| Yes | Yes | Yes | Yes | Platform users with roles |
| Yes | Yes | Yes | Yes | Custom backlink tracking |
| - | Yes | - | - | Read only; requires |
| - | Yes | - | - | Read only; ranking feed data |
| - | Yes | - | - | Read only; aggregate ranking feed |
| Yes | - | - | - | Create only |
| Yes | - | - | - | Create only |
| 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 clientProject 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 testsKey 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 benefitError strings - Tools return
"ERROR: ..."strings rather than raising exceptions, following MCP conventions for graceful error handlingJSON responses - All tool responses use
json.dumps(data, indent=2, default=str)for consistent, readable output
Environment Variables
Variable | Required | Default | Description |
| Yes | - | Your AgencyAnalytics API key (Admin Settings > Company Details) |
| No |
| 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::TestListCampaignsTest 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."
Verify your API key is correct (Admin Settings > Company Details)
Confirm your account is on a Premier plan with API access
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
Ensure the config file path is correct for your client (see Client Configuration section)
Verify the Python path in the config points to the
.venvdirectoryFully quit and restart your client application
Check your client's logs for error messages
Test the server manually:
cd /path/to/mcp-agencyanalytics-python .venv/bin/python -m agencyanalytics_mcp.serverThe 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.
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'Add some amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
AgencyAnalytics for their API
Model Context Protocol for the MCP specification
Anthropic for Claude and the MCP Python SDK
The teams behind Cursor, Windsurf, Cline, Continue, and Zed for MCP support
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 toolscreate_backlinkA
Create a new backlink in AgencyAnalytics.
Args: campaign_id: The campaign to associate the backlink with title: Backlink title url: The page URL where the link appears target_url: The URL the link points to target_anchor: Anchor text of the link (optional) link_type: Type of link (optional) status: Backlink status (optional) notes: Additional notes (optional)
Returns: JSON object with created backlink data
Examples: - create_backlink(campaign_id=123, title="Blog Post", url="https://blog.com/post", target_url="https://client.com")
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| notes | No | ||
| title | Yes | ||
| status | No | ||
| link_type | No | ||
| target_url | Yes | ||
| campaign_id | Yes | ||
| target_anchor | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the action (create) and the return value (JSON object with created backlink data). However, it does not mention potential errors, idempotency, or permission requirements, which keeps it slightly below 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with Args, Returns, and Examples sections. It is reasonably concise for an 8-parameter tool, with the example adding practical value without excessive verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return values are covered. The description fully documents parameters and provides an example. It lacks usage context (e.g., prerequisites like the campaign existing), but is otherwise complete for a create operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description explicitly explains every parameter, e.g., 'The campaign to associate the backlink with' and 'Anchor text of the link (optional)'. This adds significant meaning beyond the raw schema, though some explanations are brief (e.g., 'Backlink title').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Create a new backlink in AgencyAnalytics' with a clear verb and resource. It distinguishes from sibling tools like delete_backlink and update_backlink by indicating creation specifically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage via the create verb, but does not explicitly state when to use it versus alternatives (e.g., update_backlink for modifying existing backlinks). There is no when/when-not guidance, but the context of creation is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| company | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| campaign_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | client | |
| Yes | |||
| last_name | Yes | ||
| first_name | Yes | ||
| campaign_id | No | ||
| campaign_access | No | restricted |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden 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.
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.
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.
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.
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.
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_backlinkB
Delete a backlink from AgencyAnalytics.
Args: backlink_id: The backlink ID to delete
Returns: JSON object with deletion result
Examples: - delete_backlink(backlink_id=789) - Delete backlink 789
| Name | Required | Description | Default |
|---|---|---|---|
| backlink_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions that the tool returns a JSON object but does not disclose that deletion is permanent, whether the operation is destructive, or any authorization requirements. For a delete tool, this is a significant transparency gap beyond what the tool name already implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with clearly labeled sections for Args, Returns, and Examples. Every sentence contributes useful information without redundancy. The front-loaded main clause immediately communicates the tool's purpose, and the example is particularly helpful for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete tool, the description covers the essential invocation details: purpose, argument, return type, and an example. The output schema further documents the return structure. However, it lacks contextual guidance about side effects and safety, which is critical for deletion tools. It is adequate but has clear gaps in operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for the parameter. It restates the parameter name ('the backlink ID to delete') and provides an example (backlink_id=789) that clarifies the expected numeric format. However, it does not explain where the ID comes from or how to validate it, relying on the schema's title 'Backlink Id' for basic comprehension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Delete a backlink from AgencyAnalytics', which clearly specifies the verb, resource, and scope. It distinguishes the tool from siblings like delete_user, update_backlink, and list_backlinks, making the intended action unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool compared to alternatives. It does not mention any prerequisites (e.g., obtaining the backlink ID via list_backlinks) or exclusions (e.g., use update_backlink to modify instead). The only implied use case is deletion, which is generic for any delete operation.
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
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| campaign_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| campaign_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_backlinksA
List backlinks from AgencyAnalytics.
Retrieves custom backlinks with optional filtering by campaign.
Args: campaign_id: Filter by campaign ID (optional) offset: Pagination offset (default: 0) limit: Maximum number of results (default: 50)
Returns: JSON array of backlinks with metadata
Examples: - list_backlinks() - Get all backlinks - list_backlinks(campaign_id=123) - Get backlinks for campaign 123 - list_backlinks(offset=50, limit=50) - Get next page
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| campaign_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It implies read-only behavior via 'list' and 'retrieves', and describes the return format. However, it does not disclose auth needs, rate limits, or potential side effects, which are not explicitly covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a title, summary, args, returns, and examples. Every section is concise and informative, with no redundant or vague language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward list tool with optional filtering and pagination, the description covers purpose, parameters, return format, and examples. It lacks error handling or edge-case details, but these are not critical for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameter descriptions (0% coverage), but the description fully compensates by explaining campaign_id as a filter, offset for pagination, and limit for max results, plus usage examples. This adds meaning beyond the schema's types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists backlinks from AgencyAnalytics, using the specific verb 'list' and resource 'backlinks'. It distinguishes from sibling tools like list_keywords, list_campaigns, and list_users by naming the resource explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context through examples for no filter, campaign filter, and pagination. It does not explicitly mention alternatives or when not to use, but the resource-specific naming and examples make usage intuitive.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| campaign_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It 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.
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.
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.
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.
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.
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_backlinkA
Update an existing backlink.
Args: backlink_id: The backlink ID to update title: New title (optional) url: New page URL (optional) target_url: New target URL (optional) target_anchor: New anchor text (optional) status: New status (optional) notes: New notes (optional)
Returns: JSON object with update result
Examples: - update_backlink(backlink_id=789, status="active") - update_backlink(backlink_id=789, notes="Confirmed live")
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| notes | No | ||
| title | No | ||
| status | No | ||
| target_url | No | ||
| backlink_id | Yes | ||
| target_anchor | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only says 'Update an existing backlink' and lists fields, without disclosing side effects, error behavior, whether unspecified fields are preserved, or what the 'update result' contains. This is a significant 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured with a one-sentence purpose, a bulleted Args list, a Returns line, and two practical examples. Every element adds utility and there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description adequately covers the operation's scope, key parameters, and usage examples. It lacks some behavioral details (error handling, partial update behavior) but is sufficient for a straightforward update tool with optional fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides zero description coverage, but the description's Args section adds meaningful semantics for each parameter (e.g., 'New title', 'New page URL', 'New status'). This compensates well, though the explanations are terse and example coverage is limited.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Update an existing backlink', using a specific verb and resource that clearly distinguishes it from siblings like create_backlink and delete_backlink. The title and description align, making the tool's purpose immediately obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies use for modifying existing backlinks, and the optional field list supports partial updates. However, it does not explicitly state when not to use it or mention alternatives like create_backlink for new entries, so it stops 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.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| company | No | ||
| campaign_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only 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.
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.
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.
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.
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.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | ||
| No | |||
| user_id | Yes | ||
| last_name | No | ||
| first_name | No | ||
| campaign_access | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden 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.
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.
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.
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.
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.
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.
20 tool updates
v0.1.0- First observed
create_backlink - First observed
create_campaign - First observed
create_competitor - First observed
create_login_grant - First observed
create_tag - First observed
create_user - First observed
delete_backlink - First observed
delete_campaign - First observed
delete_user - First observed
get_campaign - First observed
get_campaign_rankings - First observed
get_keyword_rankings - First observed
get_user - First observed
list_backlinks - First observed
list_campaigns - First observed
list_keywords - First observed
list_users - First observed
update_backlink - First observed
update_campaign - First observed
update_user
TDQS
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.
All tools follow a consistent verb_noun pattern (list_, get_, create_, update_, delete_) with clear resource names. No mixed conventions or vague verbs.
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.
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
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
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
- VibeSEOOAuthdev.vibeseo
SEO research, audits, backlinks, GSC, and content workflow tools for AI agents.
Enables AI assistants to natively interact with the Serpzilla link-building marketplace.
Real SEO data for AI assistants: page audits, Keyword Planner volumes, Search Console history.
Related MCP Servers
- AlicenseCqualityDmaintenanceConnects 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.100Apache 2.0
- AlicenseAqualityDmaintenanceEnables 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.2419MIT
- AlicenseNot gradedqualityFmaintenanceConnects AI assistants to SEO APIs for backlinks analysis, keyword research, and traffic analysis.1628MIT

Babbar MCP Serverofficial
AlicenseNot gradedqualityDmaintenanceIntegrates with the Babbar.tech SEO API to enable AI assistants to perform advanced SEO analysis, competitor research, backlink auditing, and content gap identification.2MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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