Docs · MCP

MCP server

Connect Huginnova to Claude, ChatGPT, Cursor or any client that speaks the Model Context Protocol. Your assistant can then answer "why does ChatGPT recommend my competitor?" from your real data, and act on it: 32 tools, the same data as the app and the API.

Connect

The server URL is http://localhost:3000/api/mcp (Streamable HTTP). Apps that support signing in (ChatGPT, Claude) connect without a key; the rest use an API key.

ChatGPT, Claude (web, desktop and mobile) and other apps that sign in

Add a custom connector with the server URL. The app opens a page where you sign in, pick the workspace and choose read-only or read and changes. No key to copy.

  • Claude: Customize → Connectors → + Add → Add custom connector, paste the URL and continue. On Team and Enterprise, an owner adds it in Organization settings → Connectors and everyone clicks Connect.
  • ChatGPT: Settings → Apps & Connectors → Advanced settings → turn on Developer mode, then Create, paste the URL and choose OAuth.
  • Disconnect it from the app, or for everyone in Integrations → API & automations → Connected apps.

With an API key (Claude Code, Cursor, VS Code, Claude Desktop): create one in Integrations → API & automations and use it in your client:

Claude Code

claude mcp add --transport http huginnova http://localhost:3000/api/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"

Cursor · .cursor/mcp.json

{
  "mcpServers": {
    "huginnova": {
      "url": "http://localhost:3000/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

VS Code · .vscode/mcp.json

{
  "servers": {
    "huginnova": {
      "type": "http",
      "url": "http://localhost:3000/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Claude Desktop · claude_desktop_config.json

{
  "mcpServers": {
    "huginnova": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "http://localhost:3000/api/mcp",
        "--header",
        "Authorization:${AUTH}"
      ],
      "env": {
        "AUTH": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Authentication

Two ways, both as Authorization: Bearer …: an OAuth connection (apps that sign in) or an API key. Read-only connections and keys can use every read tool; full access also allows the change tools. The MCP server is included in every plan. Limit: 120 requests a minute per connection or key.

OAuth, for developers

OAuth 2.1 as the MCP authorization spec describes it. A request without a token gets a 401 whose WWW-Authenticate header points to the protected resource metadata; from there, the authorization server metadata at /.well-known/oauth-authorization-server. Apps identify themselves with a Client ID Metadata Document (an https client_id) or register with Dynamic Client Registration. Authorization code with PKCE (S256) only, and the resource must be the MCP server URL. Scopes: read and write (the person can grant less than asked). Access tokens last an hour; refresh tokens rotate on every use, and reusing an old one closes the connection.

Tools

Every tool takes a project_id from list_projects, except list_projects and list_alerts. * required.

Brands and competitors

  • list_projectsread

    The brands in the workspace, with their market and engines.

  • get_visibilityread

    Visibility, share of voice, citations, position and sentiment vs competitors; change, per engine and trend.

    project_id*daysengine

  • list_competitorsread

    Tracked competitors with their websites.

    project_id*

  • get_brand_recognitionread

    Whether ChatGPT and Gemini know you as a brand.

    project_id*

Prompts and answers

  • list_promptsread

    Tracked prompts, where you lose most first.

    project_id*dayslimitcursor

  • get_prompt_suggestionsread

    Suggested questions: real demand, gaps on your site, competitors, AI searches.

    project_id*limitcursor

  • search_answersread

    AI answers as a filterable summary list.

    project_id*engineprompt_idsinceuntilmentions_brandcompetitor_idlimitcursor

  • get_answerread

    One AI answer in full, with every brand and source.

    project_id*answer_id*

Sources

  • top_sourcesread

    The domains AI cites most, and whose they are.

    project_id*days

  • top_pagesread

    The exact pages AI cites most.

    project_id*dayslimitcursor

  • get_source_gapsread

    Sites AI cites where you're missing.

    project_id*dayslimitcursor

What to do

  • get_action_planread

    Prioritized actions with why and how.

    project_id*statuslimitcursor

  • get_geo_opportunitiesread

    Questions an article would win.

    project_id*limitcursor

  • list_articlesread

    GEO Writer articles and whether they're published.

    project_id*limitcursor

  • get_articleread

    One article in full: analysis, markdown and JSON-LD.

    project_id*article_id*

  • get_outreachread

    Prepared emails to get mentioned on cited sites.

    project_id*limitcursor

Perception, site and traffic

  • get_reputationread

    How AI describes you: scores, strengths, weaknesses, wrong claims.

    project_id*

  • get_site_readinessread

    Whether AI crawlers can read your site, and what to fix.

    project_id*

  • get_signalsread

    AI searches behind your prompts, shopping, ads, local results, Reddit and YouTube.

    project_id*days

  • get_ai_trafficread

    Visits from AI assistants and AI crawler activity.

    project_id*days

  • list_alertsread

    Alerts after each update.

    project_idunread_onlylimitcursor

Changes (full access)

  • add_promptschange

    Track new questions.

    project_id*prompts*tags

  • add_suggested_promptchange

    Track a suggested question.

    project_id*suggestion_id*

  • dismiss_suggested_promptchange

    Stop suggesting a question.

    project_id*suggestion_id*

  • set_prompt_activechange

    Pause or resume a prompt.

    project_id*prompt_id*active*

  • add_competitorchange

    Track a competitor.

    project_id*name*website

  • remove_competitorremoves

    Stop tracking a competitor.

    project_id*competitor_id*

  • set_action_statuschange

    Mark an action done (or another status).

    project_id*action_id*status*

  • mark_alerts_readchange

    Mark alerts read.

    alert_idproject_id

Prompts

Ready-made questions your client shows in its menu ("/" in Claude), in your workspace's language. Brand and competitor names autocomplete as you type; the brand is optional if you track only one.

  • weekly_report

    Weekly AI visibility report: where you stand, what changed and why, priorities.

  • what_to_do_this_week

    What to do this week: the three changes most likely to get you into more AI answers.

  • why_competitor_wins

    Why a competitor wins: the real answers and sources behind it, and what to change.

How results work

Pages. Lists return items, total and next_cursor. Pass next_cursor back as cursor for the next page; it's null on the last one. Newest-first lists (answers, alerts) use the row's date and id, so new rows arriving while you page never repeat or skip any.

Summaries and detail. search_answers returns a short summary per answer (engine, prompt, date, brands named and positions, domains cited, the passage about you). Read one in full with get_answer; articles work the same way with list_articles and get_article.

Rates. Visibility, citation and similar rates are shares of answers from 0 to 1, with a 95% confidence interval. Small samples are uncertain: changes are marked as significant or not.

Format. Each result is returned as JSON text and as structuredContent. Errors you can fix (a bad argument, a plan limit, something not found) come back as tool errors with the reason.

Example questions

  • “How visible is my brand in AI answers this month, and against whom?”
  • “Why does ChatGPT recommend my main competitor and not us? Show me the answers.”
  • “Which sites should I get mentioned on first, and what do they say?”
  • “What changed since last week, and what should I do about it?”
  • “Add these five questions to the prompts I track.”
  • “Mark the structured-data fix as done.”

Security

Connections and keys belong to one workspace and only see its data. The server never starts paid work (collections, articles, emails): those stay in the app. Disconnect an app or revoke a key in Integrations at any time; it stops working immediately, and a person who leaves the workspace loses the apps they connected.