MCP App Store
by KeenEthics

Overview

Track traditional and AI search visibility, create and optimize content, and act on daily recommendations from Surfer directly in Claude. Automate your content workflow: find your best opportunities to fix content gaps, get an outreach list of sources most cited by LLMs, generate content briefs and full pages in your brand voice, auto-optimize existing content, and run custom reports. All of Surfer’s live data in one conversation, just a few simple prompts away. Use Surfer to: 1. Track AI search visibility: “Show top 10 sources for the prompts I'm tracking that don't mention my brand.” 2. Get daily recommendations: “Give me a list of the top five Recommendations that will increase my LLM visibility.” 3. Create and optimize content: “Create a Content Editor for “[keyword]”, show me the outline, and once I approve it, generate the article.” 4. Update underperforming articles: “Here's our current blog post on [topic]. Create a new Content Editor for its main keyword “[keyword]” and list the optimization gaps.” 5. Automate reporting: How did our AI visibility change since last month, per platform? Where's our mention gap compared to competitors? And more.

Tools

ai_article__generate

ChatGPT
Start AI Article generation for a completed Content Editor. An AI Article is a full draft Surfer generates for a completed Content Editor, inheriting its template, voice, custom instructions, and target word count. Its state runs new → generating_outline → writing → completed, or failed. With manual_outline, it pauses at waiting_for_user_input for outline review before writing. The job runs asynchronously and returns the article in generating_outline state. Poll ai_article__get for the state. When writing completes, the article replaces the Content Editor's document content. Enterprise and some older plans consume an AI Article credit per successful request; other plans include AI Articles in the Content Editor. Emits progress notifications when the client requests them.

ai_article__get

ChatGPT
Get one AI Article by id. An AI Article is a full draft Surfer generates for a completed Content Editor, inheriting its template, voice, custom instructions, and target word count. Its state runs new → generating_outline → writing → completed, or failed. With manual_outline, it pauses at waiting_for_user_input for outline review before writing.

ai_article__get_outline

ChatGPT
Get the outline of a Content Editor's active AI Article as Markdown. Available once the article has an outline: in waiting_for_user_input, writing, completed, or failed state. Errors while the article is new or generating_outline. The response is the outline text itself.

ai_article__list

ChatGPT
List the AI Articles of a Content Editor. An AI Article is a full draft Surfer generates for a completed Content Editor, inheriting its template, voice, custom instructions, and target word count. Its state runs new → generating_outline → writing → completed, or failed. With manual_outline, it pauses at waiting_for_user_input for outline review before writing.

ai_article__submit_outline

ChatGPT
Submit an edited outline as Markdown for a Content Editor's active AI Article and resume generation. Valid only while the article is waiting_for_user_input. Writing then continues asynchronously to completed, and the finished article replaces the Content Editor's document content. Poll ai_article__get for the state. Emits progress notifications when the client requests them.

ai_search_guidelines__get

ChatGPT
Get the AI Search (AIO) guidelines status for a Content Editor: the AI Search score (0–100 or null), the status, facts_count, and what the score is made of. facts_coverage reports the share of facts the content covers and lists which ones. introduction reports whether the introduction satisfies each of its four aspects. The facts themselves are returned by ai_search_guidelines__list_facts. facts_count populates only when status is completed. Returns an error while the editor is scheduled, executing, or failed. This is the AI Search counterpart to seo_guidelines__get.

ai_search_guidelines__list_facts

ChatGPT
List the AI Search (AIO) facts for a Content Editor: items gathered from the SERP and the major AI engines (Google AI Overviews and AI Mode, Gemini, OpenAI, Perplexity) for the editor's main keyword and location. Each fact carries sources, each with its url and a cited_by list of where the URL was found (serp, ai_mode, ai_overviews, gemini, openai, perplexity). meta.status reflects the analysis lifecycle; data is empty until status is completed. ai_search_guidelines__get returns the AI Search score and its breakdown without the facts.

ai_tracker__get

ChatGPT
Get one AI Tracker project by id. An AI Tracker project tracks how AI models mention your brand and competitors across prompts and topics — how often and in what position each brand appears, what your mention gap is, which sources get cited. The models are: ai_mode, ai_overviews, openai, perplexity, and gemini. Reports refresh one time each day. The refreshed_at field shows when the last refresh ran. The disabled_at field is null while the project is active. A project with disabled_at set is no longer refreshed. The response also contains latest_run_status, the report status for each model in model_statuses, and the report day in model_statuses_date. These three fields are null until the first report completes.

ai_tracker__get_mention_gap

ChatGPT
Get the mention gap for an AI Tracker project. Each count is a number of different source URLs that the project's AI answers cite in the window. base_brand.total counts the sources that mention the tracked brand. For each competitor, total counts the sources that mention that competitor. shared_total counts the sources that mention both the competitor and the tracked brand. total minus shared_total gives the sources that cite the competitor but not the tracked brand. The competitors are sorted by shared_total, highest first. Ties sort by brand_name in alphabetical order. The range parameter sets the date window: 7d, 30d, or 90d. The default is 7d. The window ends on the last day that has a complete report. The model parameter defaults to all. If you omit competitors, the tool uses the project's top 3 competitors by mention count. A requested competitor that the answers never mention gets a row with total 0 and shared_total 0. Brand names that contain commas are not supported.

ai_tracker__get_summary

ChatGPT
Get the AI visibility metrics for an AI Tracker project. The response contains one row for each AI model family, plus one all row that combines all model families. Each row contains mention_rate, average_position, and presence_score. mention_rate is the percentage of AI answers that mention the brand, from 0 to 100. average_position is the average rank of the brand in those answers, where rank 1 is first. presence_score is a visibility index from 0 to 100. The range parameter sets the date window: 7d, 30d, or 90d. The default is 7d. The window ends on the last day that has a complete report. A metric is null when no report covers the window.

ai_tracker__get_time_series

ChatGPT
Get the daily AI visibility metrics for one AI model family of an AI Tracker project. Each day contains mention_rate, average_position, and presence_score. The days are sorted from oldest to newest. Days without reports are not included, so the series can contain fewer days than the window. mention_rate is the percentage of AI answers that mention the brand, from 0 to 100. average_position is the average rank of the brand in those answers, where rank 1 is first. presence_score is a visibility index from 0 to 100. The range parameter sets the date window: 7d, 30d, or 90d. The default is 7d. The window ends on the last day that has a complete report. The model parameter defaults to all, which combines all model families.

ai_tracker__list

ChatGPT
List the workspace's AI Tracker projects. An AI Tracker project tracks how AI models mention your brand and competitors across prompts and topics — how often and in what position each brand appears, what your mention gap is, which sources get cited. The models are: ai_mode, ai_overviews, openai, perplexity, and gemini. Reports refresh one time each day. The refreshed_at field shows when the last refresh ran. The disabled_at field is null while the project is active. A project with disabled_at set is no longer refreshed. Each entry contains the brand, the locale, the prompt count, refreshed_at, and disabled_at.

ai_tracker__list_brands

ChatGPT
List the brands that the AI answers mention for the project's prompts. The list is sorted by presence_score, highest first. The list contains only brands that the answers mention in the window. This includes the tracked brand only when the answers mention it. Each row contains presence_score, average_position, and mention_rate. mention_rate is the percentage of AI answers that mention the brand, from 0 to 100. average_position is the average rank of the brand in those answers, where rank 1 is first. presence_score is a visibility index from 0 to 100. The range parameter sets the date window: 7d, 30d, or 90d. The default is 7d. The window ends on the last day that has a complete report. The model parameter defaults to all. The server sorts the rows and returns one page. The page starts at offset (default 0) and contains a maximum of limit rows (default 20, maximum 100). The meta.total field holds the full row count.

ai_tracker__list_prompts

ChatGPT
List the tracked prompts of an AI Tracker project, grouped by topic. Each prompt contains mention_rate, average_position, presence_score, and its top brands. Each prompt lists a maximum of 5 brands. mention_rate is the percentage of AI answers that mention the brand, from 0 to 100. average_position is the average rank of the brand in those answers, where rank 1 is first. presence_score is a visibility index from 0 to 100. The range parameter sets the date window: 7d, 30d, or 90d. The default is 7d. The window ends on the last day that has a complete report. The model parameter defaults to all. meta.total is the number of topics.

ai_tracker__list_sources

ChatGPT
List the sources that the AI answers cite for an AI Tracker project. The list is sorted by references_count, highest first. With group_by domain, the default, each row is one domain with urls_count and combined mention_counts. The domain is an origin with a scheme, for example https://www.reddit.com. With group_by url, each row is one URL with a mentioned flag. The range parameter sets the date window: 7d, 30d, or 90d. The default is 7d. The window ends on the last day that has a complete report. The model parameter defaults to all. The server sorts the rows and returns one page. The page starts at offset (default 0) and contains a maximum of limit rows (default 20, maximum 100). The meta.total field holds the full row count.

auto_optimize__get

ChatGPT
Get the current state of an Auto-Optimize job. An Auto-Optimize job edits the title, headings, and section bodies of a completed Content Editor to cover missing terms and facts, raising both the SEO and AI Search scores. Every change is applied to the document immediately, with no separate review step. A completed job reports a result of optimized (changes applied) or nothing_to_optimize (no changes needed).

auto_optimize__run

ChatGPT
Start an Auto-Optimize job for a completed Content Editor. An Auto-Optimize job edits the title, headings, and section bodies of a completed Content Editor to cover missing terms and facts, raising both the SEO and AI Search scores. Every change is applied to the document immediately, with no separate review step. A completed job reports a result of optimized (changes applied) or nothing_to_optimize (no changes needed). The job runs asynchronously and is returned in executing state. Poll auto_optimize__get for the outcome. Each run counts toward your plan's Auto-Optimize allowance. Emits progress notifications when the client requests them.

brand__get

ChatGPT
Get a workspace's brand knowledge. Brand knowledge is a workspace's brand profile: name, the brand's site url, and free-form markdown knowledge gathered by workspace setup. Brand is a singleton — one per workspace, with no brand id. gathering_data_status (scheduled, completed, or failed) says whether knowledge gathering finished. Returns 404 if the workspace has no brand.

brand__update

ChatGPT
Update a workspace's brand knowledge. Brand knowledge is a workspace's brand profile: name, the brand's site url, and free-form markdown knowledge gathered by workspace setup. Brand is a singleton — one per workspace, with no brand id. Only provided fields change. url and gathering_data_status are never writable.

content__get

ChatGPT
Get the Content Editor document body. format selects the representation returned: markdown (default) or html. Available only when the editor's state is completed. The response is the document text itself.

content__update

ChatGPT
Replace the entire Content Editor document body with content, interpreted as format (markdown default, or html). Available only when the editor's state is completed. The body is sanitized and re-serialized server-side, so re-fetch with content__get to read the stored form. Triggers an asynchronous Content Score recalculation; pair with content_score__get for edit-and-rescore loops.

content_editor__create

ChatGPT
Create a Content Editor for a main_keyword. Generation is asynchronous. With progress notifications the call blocks until the editor is completed or failed, or returns the latest pending state once the wait cap elapses; without them it returns immediately in scheduled state, its SERP-derived fields settle later, and you poll content_editor__get for the outcome. Each successful request consumes one Content Editor credit. With import_content_url the editor skips outline generation and its outline stays null; a keyword-only editor gets one, but its outline.status can still be scheduled when the editor reaches completed, so check it via content_editor__get before reading the outline. When neither surfer_template nor custom_template_id is set, analysis may preselect one — the workspace default template if set, otherwise a choice inferred from the SERP — or leave the editor with none.

content_editor__get

ChatGPT
Get one Content Editor by id within a workspace. A Content Editor is a document built from SERP analysis of a main_keyword plus optional secondary_keywords. It reports its content score, generation state, and the status of its AI article, outline, SEO guidelines, and AI Search guidelines. The detail adds the editable fields a list item omits: custom_instructions, notes, meta_title, and meta_description.

content_editor__list

ChatGPT
List Content Editors. A Content Editor is a document built from SERP analysis of a main_keyword plus optional secondary_keywords. It reports its content score, generation state, and the status of its AI article, outline, SEO guidelines, and AI Search guidelines. Results cover at most 90 days. Without date filters, that is the last 90 days. List items are summaries; content_editor__get returns the full detail (sub-resource statuses, permalinks, error, and editable fields).

content_editor__update

ChatGPT
Update a Content Editor in completed state. Only provided fields change. custom_template_id: null is rejected unless surfer_template is set, since an editor cannot return to having no template.

content_score__get

ChatGPT
Get a Content Editor's content score: seo, ai_search, and the unified total, each with a score (0–100 or null) and a status. A calculating status means a recalculation is running; the subscores also carry calculated_at. For the guidelines behind the SEO score, use seo_guidelines__get.

content_template__create

ChatGPT
Create a content template in a workspace. reference_text is the reusable reference content. Set default: true to make it the workspace default. Returns the created template.

content_template__delete

ChatGPT
Delete a workspace content template by id, permanently removing the template and its reference_text. Deleting a template still referenced by an editor succeeds and leaves that editor's custom_template_id dangling, so content_template__get on it returns not_found.

content_template__get

ChatGPT
Get one of a workspace's content templates by id. A content template is reusable reference content a Content Editor can be created from; its id goes in custom_template_id. The detail adds the reference_text body that a list item omits.

content_template__list

ChatGPT
List a workspace's own content templates. A content template is reusable reference content a Content Editor can be created from. Its id goes in custom_template_id. At most one template is the workspace default; a workspace can have none, and deleting the default does not promote another. For Surfer's built-in presets, use surfer_content_template__list.

content_template__update

ChatGPT
Update a workspace content template by id. Only provided fields change. Setting default: true makes it the workspace default.

custom_voice__create

ChatGPT
Create a custom voice in a workspace. reference_text is the writing sample its style is learned from. Set default: true to make it the workspace default. Returns the created voice.

custom_voice__delete

ChatGPT
Delete a workspace custom voice by id, permanently removing the voice and its reference_text.

custom_voice__get

ChatGPT
Get one of a workspace's custom voices by id. A custom voice is a saved writing style AI generation can apply; its id goes in custom_voice_id. The detail adds the reference_text body that a list item omits.

custom_voice__list

ChatGPT
List a workspace's custom voices. A custom voice is a saved writing style AI generation can apply. Its id goes in custom_voice_id. At most one voice is the workspace default; a workspace can have none, and deleting the default does not promote another.

custom_voice__update

ChatGPT
Update a workspace custom voice by id. Only provided fields change. Setting default: true makes it the workspace default.

gsc__query

ChatGPT
Query clicks, impressions, CTR, and position using an active workspace's saved GSC connection. Results are always current. Each call returns one page in Google's own order: clicks descending (arbitrary ties), or date ascending when grouped by date. Ranking by impressions, CTR, or position requires the complete result set: page with offset until meta.next_offset is null, then sort the rows yourself. When a property is too large to page through, narrow it with filters or a shorter date range rather than ranking a partial set. Google may omit rows. Limited to 60 requests/minute per organization; shared Google quotas may delay GSC refreshes. No retries or partial results on failure; follow quota-error guidance.

outline__get

ChatGPT
Get the SERP-derived structural outline of a Content Editor as Markdown headings. Returns a conflict error while the editor is not completed, or not_found when the outline row is missing. On a completed editor the response is empty only while the outline is pending or after it has failed; poll outline.status on content_editor__get to tell which.

outline__regenerate

ChatGPT
Regenerate the outline of a completed Content Editor from the SERP competitors, applying the editor's template, custom instructions, and brand knowledge. Runs asynchronously and returns the executing state; outline.status on content_editor__get reports completion, then outline__get returns the new outline. Returns a conflict when a regeneration is already in progress.

recommendation__list

ChatGPT
List a workspace's recommendations. Recommendations are a workspace's suggested next SEO actions, read live from the same sources the product UI shows. optimize items are Content Audit pages worth re-optimizing, carrying page_url, keyword, and current_position/previous_position. write items are topical-map content ideas worth writing, carrying main_keyword, search_volume, and avg_difficulty (the raw stored value; the UI shows it divided by 100). Items already being worked on stay listed — content_editor_id marks that coverage on both types, while optimization_status and content_score are optimize-only; content_score is the linked Content Editor draft's score and is null until optimization starts. reasons carries insight-type codes on legacy write items and is null otherwise. To act on an optimize item, open its Content Editor: use content_editor_id when set, or call recommendation__optimize when optimization_status is not_started — that opens the page's own editor, keeping Content Audit progress tracking connected. To act on a write item, call content_editor__create with its main_keyword and location. score orders items within a type but is not comparable across types. meta.content_audit_configured and meta.topical_maps_configured say whether each source exists. The product's Mentions recommendations (AI Tracker) are not included yet. Optionally filter to one type with type, sort with sort / order (sort=score requires type; inserted_at for newest or oldest first; by default optimize items come before write items, each block score-descending), and cap items per type with limit (default 25; raise it to fetch deeper). Paginated with page and page_size; meta.total counts all items matching the filter and limit.

recommendation__optimize

ChatGPT
Open the Content Editor for an optimize recommendation — the same action as the product UI's Optimize button. The editor stays connected to Content Audit, so the page's optimization progress tracks in the product. Charges one Content Editor credit unless the page's editor was already paid for. Returns the refreshed optimize item with content_editor_id set; edit it with the content tools. Items whose editor is already open fail with a conflict; pages whose editor is still being prepared fail with a retryable error.

seo_guidelines__get

ChatGPT
Get the SEO Guidelines brief for a Content Editor: the score, status, and structure targets (word count, heading/paragraph/image/character counts), the SERP competitors with their included flag, the recommended terms, and the topics_and_questions. The main keyword is the first term. The SEO Content Score counts a term by presence; a term's serp_usage is how often the ranking competitors use it, scaled to this draft — a suggestion, not a goal, and no input to the score. terms_scope included (default) returns the included terms; all returns every extracted term. terms_total is the term count before scoping. Available only when the editor's guidelines status is completed.

seo_guidelines__get_terms_coverage

ChatGPT
How many times each recommended term occurs in a completed Content Editor's current text, for the working set of terms: the main keyword plus the terms marked included. used_count counts occurrences anywhere in the document and in_headings_count is the subset inside headings. serp_usage is how often the ranking competitors use the term, scaled to this draft's word count. null when the term has none. Read used_count against it: 0 means absent, below min means under-used, above max means over-used. Link text does not count toward either number and image alt text does, matching what the Content Editor shows a writer — this is a different measurement from the SEO Content Score, so a term can read as unused here and still score. heading marks a term recommended for a heading. Use seo_guidelines__get with terms_scope all to see the terms outside the working set.

seo_guidelines__load_more_competitors

ChatGPT
Schedule loading of additional SERP competitors for a completed Content Editor. Available only when the brief's can_load_more_competitors is true. Runs asynchronously and returns immediately with state executing; poll seo_guidelines__get and wait for load_more_status to return to idle for the new competitors.

seo_guidelines__update_competitors

ChatGPT
Set included on SEO Guidelines competitors of a completed Content Editor and recalculate the guidelines from the new selection. Competitors are matched by url; each url must be unique and at least one is required. Returns the updated competitors list.

seo_guidelines__update_structure

ChatGPT
Update the user-controllable structural guidelines of a completed Content Editor. Sets, or with null clears, the word_count override, and selects the guidelines_baseline scoring anchor (word_count or character_count). Each entry in guidelines sets or clears the value_override for one factor (character_count, headings_count, paragraph_count, img_count); competitor-derived avg/max/min are read-only and factors omitted from the list are left untouched. At least one of guidelines_baseline, word_count, or guidelines must be present. Returns the updated structure.

seo_guidelines__update_terms

ChatGPT
Set included and heading on SEO Guidelines terms of a completed Content Editor. included keeps a term in the editor's working set; heading marks it for a heading — excluding a term clears its heading, and a heading is always included. These flags do not affect the SEO Content Score. Terms not already prominent or custom are created as custom terms (max 500); the main keyword cannot be updated. Returns the terms named in the request; meta.total is the editor's total term count.

seo_guidelines__update_topics_and_questions

ChatGPT
Toggle included on SEO Guidelines topics and questions of a completed Content Editor. An unknown item with included: true is created as a custom topic; with included: false it is ignored. Total topics is capped at 500. Returns the topics named in the request; meta.total is the editor's total topic count.

skill__get

ChatGPT
Get one skill playbook: the full step-by-step instructions for that workflow, as markdown. The response is the document text itself.

skill__list

ChatGPT
List the skills this server ships. A skill is a markdown playbook for one multi-step Surfer workflow — acting on a workspace's recommendations, writing an article, optimizing existing content, building an outline or a content brief, or managing content templates — written to be executed with this server's tools. Each entry carries the skill name and a description of when it applies.

surfer_content_template__list

ChatGPT
List Surfer's built-in content template presets, such as blog post, listicle, or product description. A preset is read-only reference content a Content Editor can be created from. Its id goes in surfer_template. For the workspace's own templates, use content_template__list.

workspace__activate

ChatGPT
Activate a workspace that has reached ready_for_activation state, moving it to active. Required before content tools can use the workspace. The acting user must be an organization owner or admin with an active subscription.

workspace__create

ChatGPT
Create a branded workspace from a brand website URL. A workspace is a brand or site you manage in Surfer, with its own Search Console property, type, location, and state. Creation starts asynchronous setup: it also creates the workspace's brand and runs an LLM brand-knowledge analysis on url, silently skipped for plans without the brand_knowledge entitlement. All current organization owners/admins become members of the new workspace, not just the caller. The acting user must be an organization owner or admin with an active subscription. The response returns the workspace in processing state; poll workspace__get for the outcome. Setup ends in ready_for_activation (call workspace__activate to make it active) or failed. Emits progress notifications when the client requests them.

workspace__get

ChatGPT
Get one workspace by id, in any state — unlike other tools, which require an active workspace. This is the poll target for workspace__create.

workspace__list

ChatGPT
List the workspaces the signed-in user belongs to. Workspaces in their organization that they are not a member of are not listed and cannot be reached. A workspace is a brand or site you manage in Surfer, with its own Search Console property, type, location, and state. Only active workspaces can be operated on. Results are paginated; meta.total_pages tells whether further pages exist.

ai_article__generate

Claude

ai_article__get

Claude

ai_article__get_outline

Claude

ai_article__list

Claude

ai_article__submit_outline

Claude

ai_search_guidelines__get

Claude

ai_search_guidelines__list_facts

Claude

ai_tracker__get

Claude

ai_tracker__get_mention_gap

Claude

ai_tracker__get_summary

Claude

ai_tracker__get_time_series

Claude

ai_tracker__list

Claude

ai_tracker__list_brands

Claude

ai_tracker__list_prompts

Claude

ai_tracker__list_sources

Claude

auto_optimize__get

Claude

auto_optimize__run

Claude

brand__get

Claude

brand__update

Claude

content__get

Claude

content__update

Claude

content_editor__create

Claude

content_editor__get

Claude

content_editor__list

Claude

content_editor__update

Claude

content_score__get

Claude

content_template__create

Claude

content_template__delete

Claude

content_template__get

Claude

content_template__list

Claude

content_template__update

Claude

custom_voice__create

Claude

custom_voice__delete

Claude

custom_voice__get

Claude

custom_voice__list

Claude

custom_voice__update

Claude

outline__get

Claude

outline__regenerate

Claude

recommendation__list

Claude

recommendation__optimize

Claude

seo_guidelines__get

Claude

seo_guidelines__get_terms_coverage

Claude

seo_guidelines__load_more_competitors

Claude

seo_guidelines__update_competitors

Claude

seo_guidelines__update_structure

Claude

seo_guidelines__update_terms

Claude

seo_guidelines__update_topics_and_questions

Claude

skill__get

Claude

skill__list

Claude

surfer_content_template__list

Claude

workspace__activate

Claude

workspace__create

Claude

workspace__get

Claude

workspace__list

Claude

Similar Apps