>

MCP technical details

MCP technical details

Protocol-level reference for anyone integrating directly. Not needed to just use Subsig through Claude.

Protocol-level reference for anyone integrating directly. If you only want to use Subsig through Claude, Agents and MCPs covers everything you need.

Auth & requests

Two auth paths

Client

How it authenticates

Local · stdio (Claude Code, Cursor)

Your sk_live_… key is set once as the SUBSIG_API_KEY environment variable. Checked for shape on first use; no separate sign-in.

Hosted · HTTP (Claude.ai, other web clients)

Standard OAuth authorize flow. What the user sees is the “Connect to Subsig” screen: a single field for the same API key, validated against the account, then exchanged for an access token good for 365 days.

Every response carries

Field

Meaning

request_id

Unique per call. Include it when reporting an issue.

rate_limit

{ limit, remaining, reset, retry_after } for the per-minute ceiling below.

pagination

List endpoints only: { limit, has_more, next_cursor }. Pass next_cursor back as cursor for the next page. A cursor is only valid for the tool and filters that produced it.

Multi-workspace accounts

A key has one anchor workspace, used when organisation_uuid is omitted, plus an explicit list of others it can reach. Call list_workspaces to get the full list, then pass organisation_uuid on any other tool to target a specific one.

Dates and providers

Every date_from and date_to pair is an absolute calendar date in YYYY-MM-DD, never a relative shorthand, and read as a plain day on the server’s own clock — not UTC, not the caller’s timezone. Left out, most tools default to the last 30 days. Provider values are openai, perplexity, and google_ai_overviews.

Plan limits

The MCP server has no entitlement system of its own. It forwards your organisation’s own API key on every backend call, so these come straight from your plan.

Plan

Requests / min

Records / call

History

MCP requests / month

Free

10

10

6 mo

0 (no access)

Starter

30

50

6 mo

2,000

Pro

60

100

12 mo

8,000

Advanced

120

200

24 mo

15,000

Requests per minute and records per call are the general Public API entitlement, shared with any other integration on the same key. The monthly MCP figure sits on top of that, resets on the 1st of the calendar month, and applies to MCP tool calls only.

Tools: full request/response reference

13 tools over one backend surface. Every example below is a real captured response, not hand-written. All 13 are read-only.

list_workspaces

Lists the workspaces this key can access, flagging which is primary.

Arguments

Returns

None

workspaces[] { uuid, name, is_primary }

{
  "workspaces": [
    { "uuid": "f5860bb7-...", "name": "Acme Notes", "is_primary": true }
  ]
}

list_ai_visibility_topics

Topics prompts are grouped under, with active prompt counts.

Arguments

Returns

cursor, limit, organisation_uuid — all optional

topics[] { id, name, description, active_prompt_count }

{
  "topics": [
    { "id": 1, "name": "Pricing questions", "description": "Prompts about pricing and plans", "active_prompt_count": 1 }
  ]
}

list_ai_visibility_prompts

Tracked prompts, optionally filtered to one topic.

Arguments

Returns

cursor, limit, topic_id, organisation_uuid — all optional

prompts[] { id, text, topic_id, country, language, frequency, status, providers[] }

{
  "prompts": [
    { "id": 1, "text": "What is the best note-taking app for teams?", "topic_id": 1,
      "country": "US", "language": "en", "frequency": "daily", "status": "active",
      "providers": ["openai", "perplexity"] }
  ]
}

get_ai_visibility_prompt_detail

One prompt’s visibility, share of voice, and recent AI answers.

Arguments

Returns

prompt_id required. Optional name, date_from, date_to, responses_limit (1–50, default 5), organisation_uuid

{ text, brand_name, visibility_pct, sov_pct, avg_position, recent_responses[] }

{
  "prompt": {
    "id": 1, "text": "What is the best note-taking app for teams?",
    "brand_name": "Acme Notes", "visibility_pct": 52, "sov_pct": 65, "avg_position": 2.1,
    "recent_responses": [
      { "provider": "perplexity", "model": "sonar", "answer": "Acme Notes and Rival Notes are both popular choices for team note-taking.", "scheduled_at": "2026-09-03 15:20:48" }
    ]
  }
}

list_ai_visibility_brands

Every tracked brand, own and competitors, ranked by AI visibility.

Arguments

Returns

cursor, limit, organisation_uuid — all optional

brands[] { name, is_own_brand, rank, visibility_pct, sov_pct, avg_position }

{
  "brands": [
    { "name": "Acme Notes", "is_own_brand": true, "rank": 1, "visibility_pct": 52, "sov_pct": 65, "avg_position": 2.1 },
    { "name": "Rival Notes", "is_own_brand": false, "rank": 2, "visibility_pct": 28, "sov_pct": 35, "avg_position": 2.4 }
  ]
}

get_ai_visibility_overview

The account-level snapshot: your score, rank, and top competitors.

Arguments

Returns

competitors_limit (1–50, default 10), date_from, date_to (default last 30 days), provider, organisation_uuid — all optional

{ visibility_pct, sov_pct, avg_position, brand_rank, competitors[] }

{
  "overview": {
    "visibility_pct": 58.9, "sov_pct": 28.7, "avg_position": 2.7, "brand_rank": 1,
    "competitors": [
      { "name": "GitHub", "website": "github.com", "visibility_pct": 41.4, "sov_pct": 20.2, "avg_position": 2.1 },
      { "name": "Linear", "website": "linear.app", "visibility_pct": 28.4, "sov_pct": 13.9, "avg_position": 4.2 }
    ],
    "date_from": "2026-08-05", "date_to": null
  }
}

Live capture from the jira workspace, September 2026.

get_ai_visibility_brand_detail

Deep dive on one named brand, usually a competitor.

Arguments

Returns

name required. Optional date_from, date_to, organisation_uuid

{ name, is_own_brand, rank, visibility_pct, sov_pct, avg_position }

{
  "brand": {
    "name": "GitHub", "website": "github.com", "is_own_brand": false, "rank": 2,
    "visibility_pct": 41.4, "sov_pct": 20.2, "avg_position": 2.1, "date_from": "2026-08-05", "date_to": null
  }
}

get_ai_visibility_sentiment

Positive, neutral, and negative split when a brand is mentioned.

Arguments

Returns

name (defaults to own brand), date_from, date_to, provider, organisation_uuid — all optional

{ positive_count, neutral_count, negative_count, sentiment_score }

{
  "sentiment": { "name": "Acme Notes", "positive_count": 6, "neutral_count": 3, "negative_count": 1, "sentiment_score": 0.72, "date_from": "2026-08-04", "date_to": null }
}

get_ai_visibility_platforms

Visibility broken out by AI provider.

Arguments

Returns

name (defaults to own brand), date_from, date_to, organisation_uuid — all optional

{ platforms[] { provider, visibility_pct } }

{
  "platforms": {
    "name": "Acme Notes",
    "platforms": [
      { "provider": "openai", "visibility_pct": 46.7 },
      { "provider": "perplexity", "visibility_pct": 40 }
    ],
    "date_from": "2026-08-04", "date_to": null
  }
}

get_ai_visibility_citations

Which domains and URLs AI answers cite when they mention a brand.

Arguments

Returns

name (org-wide if omitted), date_from, date_to, provider, organisation_uuid — all optional

{ top_domains[], top_urls[], my_domain_contribution_pct }

{
  "citations": {
    "name": "GitHub",
    "my_domain_contribution_pct": null, "my_url_contribution_pct": null,
    "top_domains": [
      { "domain": "atlassian.com", "classification": "corporate", "citation_count": 129 },
      { "domain": "reddit.com", "classification": "ugc", "citation_count": 98 }
    ],
    "top_urls": [
      { "url": "https://monday.com/blog/rnd/bug-tracking-software/", "classification": "other", "citation_count": 31 }
    ]
  }
}

The two contribution percentages only populate on the org-wide view, meaning a call with no name. Passing a specific brand name returns null for both. Real behavior, not a bug.

get_ai_visibility_status

Whether today’s visibility checks have finished running yet.

Arguments

Returns

organisation_uuid — optional

{ ready, in_progress, executions_total, executions_completed, visibility_pct }

{
  "status": { "ready": true, "in_progress": false, "executions_total": 100, "executions_completed": 96, "visibility_pct": 20.4 }
}

list_agent_reports

Already-generated agent reports: Root Cause Analysis, Prompts Discovery, Competitive Benchmark, AI Visibility Roadmap.

Arguments

Returns

agent_type, cursor, limit, organisation_uuid — all optional

reports[] { id, agent_type, focus_topic, status, created_at }

{
  "reports": [
    { "id": 126, "agent_type": "root_cause_analysis", "focus_topic": "Citations from usepylon.com dropped by 6 in the last week", "status": "completed", "created_at": "2026-08-20T15:50:16.000000Z" }
  ]
}

get_agent_report

The full findings from one already-generated report, plus a signed download URL for its PDF or DOCX file if it has finished rendering.

Arguments

Returns

report_id required. Optional organisation_uuid

{ status, result, error_message, pdf_url, docx_url }

{
  "report": {
    "id": 1, "agent_type": "competitive_benchmark", "status": "completed",
    "result": { "summary": "Acme Notes leads Rival Notes on 2 of 3 tracked prompts this period." },
    "error_message": null, "pdf_url": null, "docx_url": null
  }
}

pdf_url and docx_url are signed, 24-hour links, populated once an export exists for that report. Both are real fields, just null when no export was generated.

Errors

Every response, success or failure, is real JSON. Never a silent empty result on a genuine problem.

Code

HTTP

Fix

unauthorized

401

Reconnect. The key is missing, wrong, revoked, or the account’s payment grace period lapsed.

rate_limit_exceeded

429

Wait for the retry_after seconds in the response, then retry.

mcp_monthly_limit_exceeded

429

Upgrade the plan, or wait for reset on the 1st of the month.

brand_not_tracked_by_ai_visibility

404

Add the brand as a tracked competitor in the dashboard first.

ai_visibility_not_enabled

403

Upgrade. The current plan doesn’t include AI Visibility.

records_per_call_exceeded

400

Lower the requested limit to the plan’s per-call maximum.

workspace_not_found

404

Call list_workspaces for a valid organisation_uuid.

invalid_cursor

400

Drop the cursor and start the list over.

prompt_not_found / report_not_found

404

The id doesn’t belong to this account.

name_required

400

Pass a brand name. This endpoint has no default.

internal_server_error

500

Transient. Retry shortly, and share the request_id if it persists.

No data yet, versus not tracked

A tracked brand with zero checks so far still returns 200 with zeroed counts and empty arrays, never an error. A brand that was never registered as an AI Visibility competitor returns 404 brand_not_tracked_by_ai_visibility instead. The two are kept distinct on purpose, so a quiet brand never looks identical to one that was never set up.

Scope & limits

  • Can’t create, edit, pause, or delete tracked prompts, competitors, or topics. Every tool is read-only.

  • Can’t trigger a new agent report; it only reads reports already generated from the dashboard.

  • Can’t change plan, billing, seats, or workspace settings.

  • Can’t look back further than the plan’s history entitlement, even if asked to.

  • Connects fine on Free, but every AI Visibility and report call is blocked. Free’s MCP quota is zero.

💡 Include the request_id from a failed response when you contact support. It points at the exact call in our logs.

Protocol-level reference for anyone integrating directly. If you only want to use Subsig through Claude, Agents and MCPs covers everything you need.

Auth & requests

Two auth paths

Client

How it authenticates

Local · stdio (Claude Code, Cursor)

Your sk_live_… key is set once as the SUBSIG_API_KEY environment variable. Checked for shape on first use; no separate sign-in.

Hosted · HTTP (Claude.ai, other web clients)

Standard OAuth authorize flow. What the user sees is the “Connect to Subsig” screen: a single field for the same API key, validated against the account, then exchanged for an access token good for 365 days.

Every response carries

Field

Meaning

request_id

Unique per call. Include it when reporting an issue.

rate_limit

{ limit, remaining, reset, retry_after } for the per-minute ceiling below.

pagination

List endpoints only: { limit, has_more, next_cursor }. Pass next_cursor back as cursor for the next page. A cursor is only valid for the tool and filters that produced it.

Multi-workspace accounts

A key has one anchor workspace, used when organisation_uuid is omitted, plus an explicit list of others it can reach. Call list_workspaces to get the full list, then pass organisation_uuid on any other tool to target a specific one.

Dates and providers

Every date_from and date_to pair is an absolute calendar date in YYYY-MM-DD, never a relative shorthand, and read as a plain day on the server’s own clock — not UTC, not the caller’s timezone. Left out, most tools default to the last 30 days. Provider values are openai, perplexity, and google_ai_overviews.

Plan limits

The MCP server has no entitlement system of its own. It forwards your organisation’s own API key on every backend call, so these come straight from your plan.

Plan

Requests / min

Records / call

History

MCP requests / month

Free

10

10

6 mo

0 (no access)

Starter

30

50

6 mo

2,000

Pro

60

100

12 mo

8,000

Advanced

120

200

24 mo

15,000

Requests per minute and records per call are the general Public API entitlement, shared with any other integration on the same key. The monthly MCP figure sits on top of that, resets on the 1st of the calendar month, and applies to MCP tool calls only.

Tools: full request/response reference

13 tools over one backend surface. Every example below is a real captured response, not hand-written. All 13 are read-only.

list_workspaces

Lists the workspaces this key can access, flagging which is primary.

Arguments

Returns

None

workspaces[] { uuid, name, is_primary }

{
  "workspaces": [
    { "uuid": "f5860bb7-...", "name": "Acme Notes", "is_primary": true }
  ]
}

list_ai_visibility_topics

Topics prompts are grouped under, with active prompt counts.

Arguments

Returns

cursor, limit, organisation_uuid — all optional

topics[] { id, name, description, active_prompt_count }

{
  "topics": [
    { "id": 1, "name": "Pricing questions", "description": "Prompts about pricing and plans", "active_prompt_count": 1 }
  ]
}

list_ai_visibility_prompts

Tracked prompts, optionally filtered to one topic.

Arguments

Returns

cursor, limit, topic_id, organisation_uuid — all optional

prompts[] { id, text, topic_id, country, language, frequency, status, providers[] }

{
  "prompts": [
    { "id": 1, "text": "What is the best note-taking app for teams?", "topic_id": 1,
      "country": "US", "language": "en", "frequency": "daily", "status": "active",
      "providers": ["openai", "perplexity"] }
  ]
}

get_ai_visibility_prompt_detail

One prompt’s visibility, share of voice, and recent AI answers.

Arguments

Returns

prompt_id required. Optional name, date_from, date_to, responses_limit (1–50, default 5), organisation_uuid

{ text, brand_name, visibility_pct, sov_pct, avg_position, recent_responses[] }

{
  "prompt": {
    "id": 1, "text": "What is the best note-taking app for teams?",
    "brand_name": "Acme Notes", "visibility_pct": 52, "sov_pct": 65, "avg_position": 2.1,
    "recent_responses": [
      { "provider": "perplexity", "model": "sonar", "answer": "Acme Notes and Rival Notes are both popular choices for team note-taking.", "scheduled_at": "2026-09-03 15:20:48" }
    ]
  }
}

list_ai_visibility_brands

Every tracked brand, own and competitors, ranked by AI visibility.

Arguments

Returns

cursor, limit, organisation_uuid — all optional

brands[] { name, is_own_brand, rank, visibility_pct, sov_pct, avg_position }

{
  "brands": [
    { "name": "Acme Notes", "is_own_brand": true, "rank": 1, "visibility_pct": 52, "sov_pct": 65, "avg_position": 2.1 },
    { "name": "Rival Notes", "is_own_brand": false, "rank": 2, "visibility_pct": 28, "sov_pct": 35, "avg_position": 2.4 }
  ]
}

get_ai_visibility_overview

The account-level snapshot: your score, rank, and top competitors.

Arguments

Returns

competitors_limit (1–50, default 10), date_from, date_to (default last 30 days), provider, organisation_uuid — all optional

{ visibility_pct, sov_pct, avg_position, brand_rank, competitors[] }

{
  "overview": {
    "visibility_pct": 58.9, "sov_pct": 28.7, "avg_position": 2.7, "brand_rank": 1,
    "competitors": [
      { "name": "GitHub", "website": "github.com", "visibility_pct": 41.4, "sov_pct": 20.2, "avg_position": 2.1 },
      { "name": "Linear", "website": "linear.app", "visibility_pct": 28.4, "sov_pct": 13.9, "avg_position": 4.2 }
    ],
    "date_from": "2026-08-05", "date_to": null
  }
}

Live capture from the jira workspace, September 2026.

get_ai_visibility_brand_detail

Deep dive on one named brand, usually a competitor.

Arguments

Returns

name required. Optional date_from, date_to, organisation_uuid

{ name, is_own_brand, rank, visibility_pct, sov_pct, avg_position }

{
  "brand": {
    "name": "GitHub", "website": "github.com", "is_own_brand": false, "rank": 2,
    "visibility_pct": 41.4, "sov_pct": 20.2, "avg_position": 2.1, "date_from": "2026-08-05", "date_to": null
  }
}

get_ai_visibility_sentiment

Positive, neutral, and negative split when a brand is mentioned.

Arguments

Returns

name (defaults to own brand), date_from, date_to, provider, organisation_uuid — all optional

{ positive_count, neutral_count, negative_count, sentiment_score }

{
  "sentiment": { "name": "Acme Notes", "positive_count": 6, "neutral_count": 3, "negative_count": 1, "sentiment_score": 0.72, "date_from": "2026-08-04", "date_to": null }
}

get_ai_visibility_platforms

Visibility broken out by AI provider.

Arguments

Returns

name (defaults to own brand), date_from, date_to, organisation_uuid — all optional

{ platforms[] { provider, visibility_pct } }

{
  "platforms": {
    "name": "Acme Notes",
    "platforms": [
      { "provider": "openai", "visibility_pct": 46.7 },
      { "provider": "perplexity", "visibility_pct": 40 }
    ],
    "date_from": "2026-08-04", "date_to": null
  }
}

get_ai_visibility_citations

Which domains and URLs AI answers cite when they mention a brand.

Arguments

Returns

name (org-wide if omitted), date_from, date_to, provider, organisation_uuid — all optional

{ top_domains[], top_urls[], my_domain_contribution_pct }

{
  "citations": {
    "name": "GitHub",
    "my_domain_contribution_pct": null, "my_url_contribution_pct": null,
    "top_domains": [
      { "domain": "atlassian.com", "classification": "corporate", "citation_count": 129 },
      { "domain": "reddit.com", "classification": "ugc", "citation_count": 98 }
    ],
    "top_urls": [
      { "url": "https://monday.com/blog/rnd/bug-tracking-software/", "classification": "other", "citation_count": 31 }
    ]
  }
}

The two contribution percentages only populate on the org-wide view, meaning a call with no name. Passing a specific brand name returns null for both. Real behavior, not a bug.

get_ai_visibility_status

Whether today’s visibility checks have finished running yet.

Arguments

Returns

organisation_uuid — optional

{ ready, in_progress, executions_total, executions_completed, visibility_pct }

{
  "status": { "ready": true, "in_progress": false, "executions_total": 100, "executions_completed": 96, "visibility_pct": 20.4 }
}

list_agent_reports

Already-generated agent reports: Root Cause Analysis, Prompts Discovery, Competitive Benchmark, AI Visibility Roadmap.

Arguments

Returns

agent_type, cursor, limit, organisation_uuid — all optional

reports[] { id, agent_type, focus_topic, status, created_at }

{
  "reports": [
    { "id": 126, "agent_type": "root_cause_analysis", "focus_topic": "Citations from usepylon.com dropped by 6 in the last week", "status": "completed", "created_at": "2026-08-20T15:50:16.000000Z" }
  ]
}

get_agent_report

The full findings from one already-generated report, plus a signed download URL for its PDF or DOCX file if it has finished rendering.

Arguments

Returns

report_id required. Optional organisation_uuid

{ status, result, error_message, pdf_url, docx_url }

{
  "report": {
    "id": 1, "agent_type": "competitive_benchmark", "status": "completed",
    "result": { "summary": "Acme Notes leads Rival Notes on 2 of 3 tracked prompts this period." },
    "error_message": null, "pdf_url": null, "docx_url": null
  }
}

pdf_url and docx_url are signed, 24-hour links, populated once an export exists for that report. Both are real fields, just null when no export was generated.

Errors

Every response, success or failure, is real JSON. Never a silent empty result on a genuine problem.

Code

HTTP

Fix

unauthorized

401

Reconnect. The key is missing, wrong, revoked, or the account’s payment grace period lapsed.

rate_limit_exceeded

429

Wait for the retry_after seconds in the response, then retry.

mcp_monthly_limit_exceeded

429

Upgrade the plan, or wait for reset on the 1st of the month.

brand_not_tracked_by_ai_visibility

404

Add the brand as a tracked competitor in the dashboard first.

ai_visibility_not_enabled

403

Upgrade. The current plan doesn’t include AI Visibility.

records_per_call_exceeded

400

Lower the requested limit to the plan’s per-call maximum.

workspace_not_found

404

Call list_workspaces for a valid organisation_uuid.

invalid_cursor

400

Drop the cursor and start the list over.

prompt_not_found / report_not_found

404

The id doesn’t belong to this account.

name_required

400

Pass a brand name. This endpoint has no default.

internal_server_error

500

Transient. Retry shortly, and share the request_id if it persists.

No data yet, versus not tracked

A tracked brand with zero checks so far still returns 200 with zeroed counts and empty arrays, never an error. A brand that was never registered as an AI Visibility competitor returns 404 brand_not_tracked_by_ai_visibility instead. The two are kept distinct on purpose, so a quiet brand never looks identical to one that was never set up.

Scope & limits

  • Can’t create, edit, pause, or delete tracked prompts, competitors, or topics. Every tool is read-only.

  • Can’t trigger a new agent report; it only reads reports already generated from the dashboard.

  • Can’t change plan, billing, seats, or workspace settings.

  • Can’t look back further than the plan’s history entitlement, even if asked to.

  • Connects fine on Free, but every AI Visibility and report call is blocked. Free’s MCP quota is zero.

💡 Include the request_id from a failed response when you contact support. It points at the exact call in our logs.

Protocol-level reference for anyone integrating directly. If you only want to use Subsig through Claude, Agents and MCPs covers everything you need.

Auth & requests

Two auth paths

Client

How it authenticates

Local · stdio (Claude Code, Cursor)

Your sk_live_… key is set once as the SUBSIG_API_KEY environment variable. Checked for shape on first use; no separate sign-in.

Hosted · HTTP (Claude.ai, other web clients)

Standard OAuth authorize flow. What the user sees is the “Connect to Subsig” screen: a single field for the same API key, validated against the account, then exchanged for an access token good for 365 days.

Every response carries

Field

Meaning

request_id

Unique per call. Include it when reporting an issue.

rate_limit

{ limit, remaining, reset, retry_after } for the per-minute ceiling below.

pagination

List endpoints only: { limit, has_more, next_cursor }. Pass next_cursor back as cursor for the next page. A cursor is only valid for the tool and filters that produced it.

Multi-workspace accounts

A key has one anchor workspace, used when organisation_uuid is omitted, plus an explicit list of others it can reach. Call list_workspaces to get the full list, then pass organisation_uuid on any other tool to target a specific one.

Dates and providers

Every date_from and date_to pair is an absolute calendar date in YYYY-MM-DD, never a relative shorthand, and read as a plain day on the server’s own clock — not UTC, not the caller’s timezone. Left out, most tools default to the last 30 days. Provider values are openai, perplexity, and google_ai_overviews.

Plan limits

The MCP server has no entitlement system of its own. It forwards your organisation’s own API key on every backend call, so these come straight from your plan.

Plan

Requests / min

Records / call

History

MCP requests / month

Free

10

10

6 mo

0 (no access)

Starter

30

50

6 mo

2,000

Pro

60

100

12 mo

8,000

Advanced

120

200

24 mo

15,000

Requests per minute and records per call are the general Public API entitlement, shared with any other integration on the same key. The monthly MCP figure sits on top of that, resets on the 1st of the calendar month, and applies to MCP tool calls only.

Tools: full request/response reference

13 tools over one backend surface. Every example below is a real captured response, not hand-written. All 13 are read-only.

list_workspaces

Lists the workspaces this key can access, flagging which is primary.

Arguments

Returns

None

workspaces[] { uuid, name, is_primary }

{
  "workspaces": [
    { "uuid": "f5860bb7-...", "name": "Acme Notes", "is_primary": true }
  ]
}

list_ai_visibility_topics

Topics prompts are grouped under, with active prompt counts.

Arguments

Returns

cursor, limit, organisation_uuid — all optional

topics[] { id, name, description, active_prompt_count }

{
  "topics": [
    { "id": 1, "name": "Pricing questions", "description": "Prompts about pricing and plans", "active_prompt_count": 1 }
  ]
}

list_ai_visibility_prompts

Tracked prompts, optionally filtered to one topic.

Arguments

Returns

cursor, limit, topic_id, organisation_uuid — all optional

prompts[] { id, text, topic_id, country, language, frequency, status, providers[] }

{
  "prompts": [
    { "id": 1, "text": "What is the best note-taking app for teams?", "topic_id": 1,
      "country": "US", "language": "en", "frequency": "daily", "status": "active",
      "providers": ["openai", "perplexity"] }
  ]
}

get_ai_visibility_prompt_detail

One prompt’s visibility, share of voice, and recent AI answers.

Arguments

Returns

prompt_id required. Optional name, date_from, date_to, responses_limit (1–50, default 5), organisation_uuid

{ text, brand_name, visibility_pct, sov_pct, avg_position, recent_responses[] }

{
  "prompt": {
    "id": 1, "text": "What is the best note-taking app for teams?",
    "brand_name": "Acme Notes", "visibility_pct": 52, "sov_pct": 65, "avg_position": 2.1,
    "recent_responses": [
      { "provider": "perplexity", "model": "sonar", "answer": "Acme Notes and Rival Notes are both popular choices for team note-taking.", "scheduled_at": "2026-09-03 15:20:48" }
    ]
  }
}

list_ai_visibility_brands

Every tracked brand, own and competitors, ranked by AI visibility.

Arguments

Returns

cursor, limit, organisation_uuid — all optional

brands[] { name, is_own_brand, rank, visibility_pct, sov_pct, avg_position }

{
  "brands": [
    { "name": "Acme Notes", "is_own_brand": true, "rank": 1, "visibility_pct": 52, "sov_pct": 65, "avg_position": 2.1 },
    { "name": "Rival Notes", "is_own_brand": false, "rank": 2, "visibility_pct": 28, "sov_pct": 35, "avg_position": 2.4 }
  ]
}

get_ai_visibility_overview

The account-level snapshot: your score, rank, and top competitors.

Arguments

Returns

competitors_limit (1–50, default 10), date_from, date_to (default last 30 days), provider, organisation_uuid — all optional

{ visibility_pct, sov_pct, avg_position, brand_rank, competitors[] }

{
  "overview": {
    "visibility_pct": 58.9, "sov_pct": 28.7, "avg_position": 2.7, "brand_rank": 1,
    "competitors": [
      { "name": "GitHub", "website": "github.com", "visibility_pct": 41.4, "sov_pct": 20.2, "avg_position": 2.1 },
      { "name": "Linear", "website": "linear.app", "visibility_pct": 28.4, "sov_pct": 13.9, "avg_position": 4.2 }
    ],
    "date_from": "2026-08-05", "date_to": null
  }
}

Live capture from the jira workspace, September 2026.

get_ai_visibility_brand_detail

Deep dive on one named brand, usually a competitor.

Arguments

Returns

name required. Optional date_from, date_to, organisation_uuid

{ name, is_own_brand, rank, visibility_pct, sov_pct, avg_position }

{
  "brand": {
    "name": "GitHub", "website": "github.com", "is_own_brand": false, "rank": 2,
    "visibility_pct": 41.4, "sov_pct": 20.2, "avg_position": 2.1, "date_from": "2026-08-05", "date_to": null
  }
}

get_ai_visibility_sentiment

Positive, neutral, and negative split when a brand is mentioned.

Arguments

Returns

name (defaults to own brand), date_from, date_to, provider, organisation_uuid — all optional

{ positive_count, neutral_count, negative_count, sentiment_score }

{
  "sentiment": { "name": "Acme Notes", "positive_count": 6, "neutral_count": 3, "negative_count": 1, "sentiment_score": 0.72, "date_from": "2026-08-04", "date_to": null }
}

get_ai_visibility_platforms

Visibility broken out by AI provider.

Arguments

Returns

name (defaults to own brand), date_from, date_to, organisation_uuid — all optional

{ platforms[] { provider, visibility_pct } }

{
  "platforms": {
    "name": "Acme Notes",
    "platforms": [
      { "provider": "openai", "visibility_pct": 46.7 },
      { "provider": "perplexity", "visibility_pct": 40 }
    ],
    "date_from": "2026-08-04", "date_to": null
  }
}

get_ai_visibility_citations

Which domains and URLs AI answers cite when they mention a brand.

Arguments

Returns

name (org-wide if omitted), date_from, date_to, provider, organisation_uuid — all optional

{ top_domains[], top_urls[], my_domain_contribution_pct }

{
  "citations": {
    "name": "GitHub",
    "my_domain_contribution_pct": null, "my_url_contribution_pct": null,
    "top_domains": [
      { "domain": "atlassian.com", "classification": "corporate", "citation_count": 129 },
      { "domain": "reddit.com", "classification": "ugc", "citation_count": 98 }
    ],
    "top_urls": [
      { "url": "https://monday.com/blog/rnd/bug-tracking-software/", "classification": "other", "citation_count": 31 }
    ]
  }
}

The two contribution percentages only populate on the org-wide view, meaning a call with no name. Passing a specific brand name returns null for both. Real behavior, not a bug.

get_ai_visibility_status

Whether today’s visibility checks have finished running yet.

Arguments

Returns

organisation_uuid — optional

{ ready, in_progress, executions_total, executions_completed, visibility_pct }

{
  "status": { "ready": true, "in_progress": false, "executions_total": 100, "executions_completed": 96, "visibility_pct": 20.4 }
}

list_agent_reports

Already-generated agent reports: Root Cause Analysis, Prompts Discovery, Competitive Benchmark, AI Visibility Roadmap.

Arguments

Returns

agent_type, cursor, limit, organisation_uuid — all optional

reports[] { id, agent_type, focus_topic, status, created_at }

{
  "reports": [
    { "id": 126, "agent_type": "root_cause_analysis", "focus_topic": "Citations from usepylon.com dropped by 6 in the last week", "status": "completed", "created_at": "2026-08-20T15:50:16.000000Z" }
  ]
}

get_agent_report

The full findings from one already-generated report, plus a signed download URL for its PDF or DOCX file if it has finished rendering.

Arguments

Returns

report_id required. Optional organisation_uuid

{ status, result, error_message, pdf_url, docx_url }

{
  "report": {
    "id": 1, "agent_type": "competitive_benchmark", "status": "completed",
    "result": { "summary": "Acme Notes leads Rival Notes on 2 of 3 tracked prompts this period." },
    "error_message": null, "pdf_url": null, "docx_url": null
  }
}

pdf_url and docx_url are signed, 24-hour links, populated once an export exists for that report. Both are real fields, just null when no export was generated.

Errors

Every response, success or failure, is real JSON. Never a silent empty result on a genuine problem.

Code

HTTP

Fix

unauthorized

401

Reconnect. The key is missing, wrong, revoked, or the account’s payment grace period lapsed.

rate_limit_exceeded

429

Wait for the retry_after seconds in the response, then retry.

mcp_monthly_limit_exceeded

429

Upgrade the plan, or wait for reset on the 1st of the month.

brand_not_tracked_by_ai_visibility

404

Add the brand as a tracked competitor in the dashboard first.

ai_visibility_not_enabled

403

Upgrade. The current plan doesn’t include AI Visibility.

records_per_call_exceeded

400

Lower the requested limit to the plan’s per-call maximum.

workspace_not_found

404

Call list_workspaces for a valid organisation_uuid.

invalid_cursor

400

Drop the cursor and start the list over.

prompt_not_found / report_not_found

404

The id doesn’t belong to this account.

name_required

400

Pass a brand name. This endpoint has no default.

internal_server_error

500

Transient. Retry shortly, and share the request_id if it persists.

No data yet, versus not tracked

A tracked brand with zero checks so far still returns 200 with zeroed counts and empty arrays, never an error. A brand that was never registered as an AI Visibility competitor returns 404 brand_not_tracked_by_ai_visibility instead. The two are kept distinct on purpose, so a quiet brand never looks identical to one that was never set up.

Scope & limits

  • Can’t create, edit, pause, or delete tracked prompts, competitors, or topics. Every tool is read-only.

  • Can’t trigger a new agent report; it only reads reports already generated from the dashboard.

  • Can’t change plan, billing, seats, or workspace settings.

  • Can’t look back further than the plan’s history entitlement, even if asked to.

  • Connects fine on Free, but every AI Visibility and report call is blocked. Free’s MCP quota is zero.

💡 Include the request_id from a failed response when you contact support. It points at the exact call in our logs.