Shopify SEO Expert: Digital Darts
Server Details
All-in-one Shopify SEO. Rank on Google and in AI search. Find what's broken and fix it in chat.
- Status
- Healthy
- Uptime
- 10.6% over 44 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Score is being calculated.
Available Tools
26 toolsapply_link_titlesApply link titlesDestructiveIdempotentInspect
Fill in the title attribute on internal links for up to 50 pages, using each target page's own title (the same job as the app's Link titles tab). Preview with preview_link_titles first and get the merchant's go-ahead. Runs in the background, so follow it with get_job_status.
| Name | Required | Description | Default |
|---|---|---|---|
| resourceIds | Yes | From preview_link_titles | |
| allowDuplicate | No | Allow a title that just repeats the link text (normally skipped) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| jobId | No | Pass to get_job_status |
| total | No | Pages queued |
| message | Yes |
create_redirectCreate redirectIdempotentInspect
Create a Shopify URL redirect. Preferred: pass brokenLinkId (from list_broken_links, internal links only) plus target, which also marks the broken link fixed. Or pass path + target directly. Targets must be an existing page on the store (or '/'); redirects into another 404 are refused.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Broken path, e.g. /products/old-handle (when no brokenLinkId) | |
| target | Yes | Where to send visitors, e.g. /products/new-handle or / | |
| brokenLinkId | No | Fix this broken link (preferred) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| path | Yes | |
| target | Yes | The target that was requested |
| created | Yes | False when the path already had a redirect and nothing changed |
| message | Yes | What to tell the merchant |
| existingTarget | No | Where the path already redirected; present only when created is false |
| existingTargetUnknown | No | A redirect existed but Shopify didn't reveal its target |
flatten_redirect_chainFlatten a redirect chainDestructiveIdempotentInspect
Point a chained redirect straight at its final destination, turning A → B → C into A → C. Takes a chainId from list_redirect_chains. A loop is refused (there's nothing sane to point at), as is a final destination that would itself 404.
| Name | Required | Description | Default |
|---|---|---|---|
| chainId | Yes | From list_redirect_chains |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| path | Yes | |
| target | Yes | The final destination it now points at |
| message | Yes |
get_backlinksGet backlinksRead-onlyIdempotentInspect
The store's backlink profile snapshot (total backlinks, referring domains, rank) plus the top referring domains. Data comes from the app's monthly refresh; if no snapshot exists yet the merchant should open the Backlinks tab in SEO Expert once.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Referring domains to return, 1 to 25. The profile totals cover every backlink regardless. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | Present when available is false |
| profile | No | Snapshot totals: backlinks, referring domains, rank |
| available | Yes | |
| topDomains | No | |
| backlinksUrl | No | Present when available is false |
| totalDomains | No |
get_imageView an imageRead-onlyIdempotentInspect
Fetch ONE image (by image id from get_resource) so you can actually see it. Call this before writing alt text, because alt text guessed from the product title describes the product rather than the picture. Returns the image itself, downscaled.
| Name | Required | Description | Default |
|---|---|---|---|
| imageId | Yes | Image id from get_resource. A Shopify media gid or the image URL also resolves. |
get_indexing_statusGet indexing statusRead-onlyIdempotentInspect
Which of the store's pages are appearing in Google and which aren't, from Search Console: counts, the pages themselves, and the trend. 'Not appearing' means Google reported no impressions for that page over the window. That is a strong signal but not proof the page is unindexed, so use inspect_url for the definitive per-page check. Cached for a day; pass refresh to recompute.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Pages to list in each group, 1 to 50. The counts and trend cover every page regardless. | |
| refresh | No | Recompute instead of reading cache |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| fixUrl | No | |
| window | No | |
| history | No | |
| message | No | Present when connected is false |
| summary | No | |
| appearing | No | |
| checkedAt | No | |
| connected | Yes | |
| connectUrl | No | Present when connected is false |
| notAppearing | No |
get_job_statusGet job statusRead-onlyIdempotentInspect
Progress of the store's background work: SEO audits, link scans, and bulk jobs (meta, alt text, link fixes, link titles). Pass a jobId from run_audit / run_link_scan / apply_link_titles, or a kind to get its latest run. Call this instead of guessing whether queued work has finished. An audit appears here once a worker picks it up, which is normally within seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Return the latest run of this kind instead of one job. Use when you don't have a jobId. 'bulk' matches the most recent bulk job of ANY kind, so it can return image compression or a link job rather than the meta or alt run you meant. | |
| jobId | No | From the tool that queued the work |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| recent | No | |
| tasksUrl | No |
get_page_seoLook up page SEORead-onlyIdempotentInspect
Look up a storefront URL (product/collection/page/blog/article) and return the matched resource's SEO fields plus its open audit issues and store-level issues. Use the returned resource id with update_meta_tags.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full storefront URL, e.g. https://example.com/products/foo |
Output Schema
| Name | Required | Description |
|---|---|---|
| issues | Yes | |
| matched | Yes | Whether the URL mapped to a synced resource |
| resource | Yes | |
| lastAuditAt | No | |
| storeIssues | Yes | Store-level issues (no single page) |
get_resourceGet resource SEO detailRead-onlyIdempotentInspect
Full SEO detail for one resource by id (from list_resources / get_page_seo): SEO title/description, meta score, and every image with its alt text (image ids feed update_image_alt).
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Id from list_resources or get_page_seo. A Shopify gid, numeric id or handle also resolves. |
Output Schema
| Name | Required | Description |
|---|---|---|
| images | Yes | |
| editUrl | Yes | Admin deep link to the meta-tags editor |
| resource | Yes |
get_search_performanceGet Google Search performanceRead-onlyIdempotentInspect
Google Search Console data for the connected property: 'overview' (daily clicks/impressions/CTR/position totals vs the previous period), 'queries' (top search queries), or 'pages' (top pages). Data lags ~3 days by Google's design. Requires the merchant to have connected Google in the app.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of the reporting window in days. Anything other than 7, 28 or 90 falls back to 28. The window ends about 3 days ago, which is Google's own reporting lag. | |
| limit | No | Rows to return for the 'queries' and 'pages' panels, 1 to 50. Ignored for 'overview'. | |
| panel | No | Which view: 'overview' for whole-window totals compared with the previous period (no per-day series), 'queries' for the top search terms, 'pages' for the top URLs. | overview |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | |
| note | No | |
| rows | No | queries/pages panels |
| panel | No | |
| totals | No | overview panel: clicks/impressions/ctr/position |
| window | No | The date range the data covers |
| message | No | Present when connected is false |
| connected | Yes | |
| connectUrl | No | Present when connected is false |
get_seo_summaryGet SEO summaryRead-onlyIdempotentInspect
Overall SEO health of the store: health score (0-100), open audit issue counts by severity (critical/warning/info), and last audit time. Start here to understand where the store stands.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| openCounts | Yes | |
| healthScore | Yes | 0-100; null before the first audit |
| lastAuditAt | Yes | |
| healthScoreAt | No |
inspect_urlInspect a URL in GoogleRead-onlyIdempotentInspect
Definitive index check for ONE page, straight from Google's URL Inspection API: indexed or not, coverage state, verdict, last crawl, and whether Google chose a different canonical. Slower than get_indexing_status because it makes a live call per URL, so use it to confirm a specific page rather than to sweep the store. Needs owner-level access to the Search Console property; anything less comes back unavailable with an explanation.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full storefront URL on this store |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| demo | No | Synthesized demo data, not a live Google answer |
| indexed | No | |
| message | No | |
| verdict | No | |
| available | No | False when Google refused the inspection |
| connected | Yes | |
| connectUrl | No | |
| coverageState | No | |
| lastCrawlTime | No | |
| canonicalMismatch | No |
list_broken_linksList broken linksRead-onlyIdempotentInspect
Open broken links found by the content-graph link scanner. Internal ones can be fixed with create_redirect (pass the brokenLinkId). External ones must be edited in the source content. Paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| limit | No | Links per page, 1 to 50. Larger values are clamped, not rejected. | |
| linkType | No | Only links of this kind. 'internal' points back at this store and can be fixed with create_redirect; 'external' points off-site and needs replace_link. Omit for both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| links | Yes | |
| total | Yes | |
| fixUrl | Yes | Admin deep link to the broken-links page |
| pageCount | Yes |
list_redirect_chainsList redirect chainsRead-onlyIdempotentInspect
Redirects that point at another redirect (A → B → C), which wastes crawl budget and slows visitors down. Each row carries the path, the hops, the final destination, whether it loops, and where the store's own content links into it. Fix one with flatten_redirect_chain. Paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| limit | No | Chains per page, 1 to 50. Larger values are clamped, not rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| total | Yes | |
| chains | Yes | |
| fixUrl | Yes | |
| pageCount | Yes |
list_resourcesList store contentRead-onlyIdempotentInspect
List the store's synced content (products, collections, pages, blogs, articles) with SEO fields and meta score (0-100). Filters combine, so several can be set at once. Draft and archived items are left out unless includeUnpublished is true, because they don't render on the storefront and SEO work on them is wasted. Sorted worst score first. Paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| type | No | Only this content type. Omit for every type. | |
| limit | No | Items per page, 1 to 50. Larger values are clamped, not rejected. | |
| search | No | Case-insensitive match on the item's title. | |
| maxScore | No | Only items scoring at or below this meta score (0-100). 50 is a reasonable 'needs work' cut-off. | |
| missingAlt | No | Set true for only the items carrying at least one image with no alt text. false is ignored, not inverted. | |
| missingMetaTitle | No | Set true for only the items with no SEO title. false is ignored, not inverted. | |
| includeUnpublished | No | Include draft and archived items (they don't render on the storefront) | |
| missingMetaDescription | No | Set true for only the items with no meta description. false is ignored, not inverted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| total | Yes | |
| pageCount | Yes | |
| resources | Yes |
list_seo_issuesList SEO issuesRead-onlyIdempotentInspect
List open SEO audit issues, optionally filtered by severity (critical|warning|info) or ruleId. Each issue includes a fixUrl deep link into the SEO Expert app where the merchant can fix it. Paginated (page, limit ≤ 50).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| limit | No | Issues per page, 1 to 50. Larger values are clamped, not rejected. | |
| ruleId | No | Filter to one audit rule id | |
| severity | No | Only issues at this severity. Omit for all three, which returns critical first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| total | Yes | |
| issues | Yes | |
| pageCount | Yes |
preview_link_replacementPreview a link replacementRead-onlyIdempotentInspect
Where a broken link actually appears in the store's content, before anything is edited: the pages, the occurrence counts, and any navigation menus containing it (menus belong to Shopify's menu editor and can't be rewritten here). Read-only. Run this before replace_link and show the merchant what would change.
| Name | Required | Description | Default |
|---|---|---|---|
| brokenLinkId | Yes | From list_broken_links |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| menus | Yes | Menus containing the link, which the app cannot rewrite |
| resources | Yes | |
| totalOccurrences | Yes |
preview_link_titlesPreview link titlesRead-onlyIdempotentInspect
Internal links in the store's content that have no title attribute, with the title the app would fill in for each (taken from the target page's own title). Read-only. Pass resourceIds to inspect specific pages, or omit them to walk the pages the audit has flagged. Feed the resourceIds into apply_link_titles.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Ignored when resourceIds is supplied. | |
| limit | No | How many flagged pages to walk, 1 to 50. Larger values are clamped, not rejected. Ignored when resourceIds is supplied. | |
| resourceIds | No | Omit to use the pages the audit flagged | |
| allowDuplicate | No | Allow a title that just repeats the link text (normally skipped) |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| tally | Yes | What apply_link_titles would do across these pages |
| total | No | |
| fixUrl | No | |
| pageCount | No | |
| resources | Yes |
replace_linkReplace a broken linkDestructiveInspect
Edit a broken link's href in the store's content so it points somewhere that works. This is the fix for an EXTERNAL broken link (a redirect can't help there) and the better fix for an internal one when the right page exists. Preview with preview_link_replacement first and get the merchant's go-ahead. Navigation menus can't be rewritten by the app.
| Name | Required | Description | Default |
|---|---|---|---|
| newHref | Yes | The URL or path the link should point at | |
| brokenLinkId | Yes | From list_broken_links |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| message | Yes | |
| failures | No | |
| remaining | Yes | Pages the time budget did not reach. Greater than zero means the fix is INCOMPLETE — call this tool again with the same arguments to continue. |
| resourcesChanged | Yes | |
| occurrencesReplaced | Yes |
run_auditRun SEO auditInspect
Queue a fresh SEO audit of the whole store (same limit as the in-app button: one per day). The audit runs in the background, so call get_seo_summary a few minutes later for the updated score.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| message | Yes |
run_link_scanRun a link scanInspect
Scan the store's content for broken links (same limit as the in-app button: one per day). list_broken_links reports what the LAST scan found, so run this first when the merchant has just changed content or asks whether something is still broken. Runs in the background, so follow it with get_job_status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| jobId | No | Pass to get_job_status |
| message | Yes |
unhide_resourceUnhide from search enginesDestructiveIdempotentInspect
Remove Shopify's 'hidden from search engines' flag (the seo.hidden metafield) from one page, so it can be indexed and appears in the sitemap again. list_resources reports seoHidden, and a page that should rank but is hidden is one of the highest-value fixes there is. Only do this when the merchant confirms the page SHOULD be public.
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Id of the page to unhide, from list_resources (check its seoHidden field) or get_page_seo. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| message | Yes | |
| seoHidden | Yes | |
| resourceId | Yes |
update_image_altUpdate image alt textDestructiveIdempotentInspect
Set the alt text for ONE image (by image id from get_resource). Writes to Shopify immediately. Good alt text describes the image for screen readers in ≤ 125 characters, with no 'image of' and no keyword stuffing. Empty string clears.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | Yes | What the image actually shows, in ≤ 125 characters. Empty string clears the alt text. | |
| imageId | Yes | Image id from get_resource. Call get_image first to see what it shows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| altText | No | |
| missingAltCount | No | Remaining images without alt on the resource |
update_image_alt_bulkUpdate alt text in bulkDestructiveIdempotentInspect
Set alt text for up to 50 images in one call (image ids from get_resource). Writes to Shopify immediately; items succeed or fail independently and failures are reported per id. View every image with get_image BEFORE writing its alt, because alt text guessed from a product title describes the product rather than the picture. Same rules as update_image_alt: describe the image in ≤ 125 characters, no "image of", no keyword stuffing, empty string clears.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | One entry per image, up to 50. Entries are applied independently, so one bad id does not void the rest. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when every item succeeded |
| failed | Yes | |
| results | Yes | |
| updated | Yes | |
| missingAltRemaining | Yes | Images still missing alt text across the store |
update_meta_tagsUpdate meta tagsDestructiveIdempotentInspect
Set the SEO title and/or meta description for ONE resource (by resourceId from list_resources / get_page_seo). Writes to Shopify immediately. Guidance: titles ≤ 60 characters, descriptions 120-160 characters, front-load the keyword, no keyword stuffing. Pass an empty string to clear a field. Fields the merchant hand-edited in the app are respected as locked against templates, and this call marks edited fields as manual.
| Name | Required | Description | Default |
|---|---|---|---|
| seoTitle | No | Omit to leave unchanged; empty string clears | |
| resourceId | Yes | Id of the item to update, from list_resources or get_page_seo. | |
| seoDescription | No | Omit to leave unchanged; empty string clears |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| seoTitle | No | |
| metaScore | No | |
| seoDescription | No |
update_meta_tags_bulkUpdate meta tags in bulkDestructiveIdempotentInspect
Set SEO titles and/or meta descriptions for up to 50 resources in one call (resource ids from list_resources). Writes to Shopify immediately; items succeed or fail independently and failures are reported per id. Same rules as update_meta_tags: titles ≤ 60 characters, descriptions 120-160 characters, front-load the keyword, no keyword stuffing, empty string clears. Write UNIQUE copy per page, because reusing one title across items defeats the point.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | One entry per item to update, up to 50. Entries are applied independently, so one bad id does not void the rest. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when every item succeeded |
| failed | Yes | |
| results | Yes | |
| updated | Yes |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
26 tool updates
- First observed
apply_link_titles - First observed
create_redirect - First observed
flatten_redirect_chain - First observed
get_backlinks - First observed
get_image - First observed
get_indexing_status - First observed
get_job_status - First observed
get_page_seo - First observed
get_resource - First observed
get_search_performance - First observed
get_seo_summary - First observed
inspect_url - First observed
list_broken_links - First observed
list_redirect_chains - First observed
list_resources - First observed
list_seo_issues - First observed
preview_link_replacement - First observed
preview_link_titles - First observed
replace_link - First observed
run_audit - First observed
run_link_scan - First observed
unhide_resource - First observed
update_image_alt - First observed
update_image_alt_bulk - First observed
update_meta_tags - First observed
update_meta_tags_bulk
Publisher details
- Operator
- Digital Darts · Publisher source
- Operator website
- https://www.digitaldarts.com.au/
- Vendor relationship
- First-party
- Trust center
- Not available
- Restrictions
- Requires a Shopify store with the SEO Expert: Digital Darts app installed on the Pro plan. One OAuth grant per store; no regional limits. · Publisher source
Related MCP Connectors
Grow sales on Google and beyond. Fix your Shopify product feeds and optimize every field in chat.
Finds why Google and AI cannot read your site, gives the exact fix, applies it once you approve.
- VouchedOAuthcom.vouchedhq
SEO data your AI can cite: Search Console, GA4, keywords, backlinks, SERPs and AI visibility.
Query your SEO data in plain language: rankings, audits, backlinks, competitors and AI visibility.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables GEO auditing and optimization for Shopify stores, including GEO score, AI readiness checks, and actionable recommendations.30 npmMIT
- FlicenseNot gradedqualityDmaintenanceAudits any website for SEO issues, providing scored health checks, schema validation, and performance analysis through AI assistants.-
- AlicenseNot gradedqualityDmaintenanceEnables querying Google Search Console and Google Analytics 4 through natural language, with tools for SEO analysis like anomaly detection, cannibalization detection, and opportunity scoring.13 npm1MIT
- AlicenseNot gradedqualityDmaintenanceAI search intelligence + Ahrefs-class SEO suite as 59 MCP tools. Track your brand across ChatGPT, Google AI Overview, Gemini, Claude, and Perplexity with persona-anchored Brand Radar dispatches.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.