SEO Expert: Digital Darts
Owner verifiedREMOTE · SEO.DIGITALDARTS.COM.AU
All-in-one Shopify SEO. Rank on Google and in AI search. Find what's broken and fix it in chat.
Available components
Last scanned (5 hours ago)
Scores higher than 98% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Marketing and SEO
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security94
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability75
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 4074 tokens (~150/item across 27 items; 27 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management97
- Stability observed for 29 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 98% of tool parameters carry a description.Partial
- Structured output schemas are declared (96% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 28 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Checks we ran (13)
- TLS certificate
- Authorization
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 3 Nov 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “list_resources” rewrote its description, which is the text the model reads security
- “list_resources” reworded the description of “includeUnpublished” cosmetic
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 30 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- New tool “fix_broken_links”, which the server declares destructive security
- Tool “get_job_status” rewrote its description, which is the text the model reads security
- Tool “list_broken_links” rewrote its description, which is the text the model reads security
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.
- 24 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://seo.digitaldarts.com.au/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=seo.digitaldarts.com.au | CN=YE2,O=Let's Encrypt,C=US | 31 Oct 2026 | 29 Jan 2027 | ECDSA 256 | ECDSA-SHA384 | 6731d47e71e816f7af1fe8cd57419b2590f |
| SANs: seo.digitaldarts.com.au | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of seo.digitaldarts.com.au. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| au. | DS published | 26642 | 8 | Verified |
| com.au. | DS published | 14185 | 8 | Verified |
| digitaldarts.com.au. | No DS | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On connection |
| HTTP status | 401 |
WWW-Authenticate challenge Bearer resource_metadata="https://seo.digitaldarts.com.au/.well-known/oauth-protected-resource/mcp"
Bearer resource_metadata="https://seo.digitaldarts.com.au/.well-known/oauth-protected-resource/mcp" | Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| content-security-policy | default-src 'self'; base-uri 'self'; frame-ancestors 'none'; object-src 'none'; img-src 'self' data: https:; font-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self' 'nonce-a3vpU6OZ+2QQjCs4Kl13vg=='; connect-src 'self'; form-action 'self' |
| x-content-type-options | nosniff |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(), geolocation=(), payment=(), usb=(), browsing-topics=() |
| www-authenticate | Bearer resource_metadata="https://seo.digitaldarts.com.au/.well-known/oauth-protected-resource/mcp" |
Protected resource metadata
| Document | https://seo.digitaldarts.com.au/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://seo.digitaldarts.com.au/mcp |
| Authorisation server | https://seo.digitaldarts.com.au |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://seo.digitaldarts.com.au/mcp | Verified | 200 | |
| http (plaintext) | http://seo.digitaldarts.com.au/mcp | HTTPS enforced | 301 | https://seo.digitaldarts.com.au/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
apply_link_titles Apply link titles ~103
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 | Type | Req | Description |
|---|---|---|---|
| allowDuplicate | boolean | – | Allow a title that just repeats the link text (normally skipped) |
| resourceIds | array | yes | From preview_link_titles |
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | – | Pass to get_job_status |
| message | string | yes | – |
| ok | boolean | yes | – |
| total | integer | – | Pages queued |
No examples provided.
create_redirect Create redirect ~131
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 | Type | Req | Description |
|---|---|---|---|
| brokenLinkId | string | – | Fix this broken link (preferred) |
| path | string | – | Broken path, e.g. /products/old-handle (when no brokenLinkId) |
| target | string | yes | Where to send visitors, e.g. /products/new-handle or / |
| Name | Type | Req | Description |
|---|---|---|---|
| created | boolean | yes | False when the path already had a redirect and nothing changed |
| existingTarget | string | – | Where the path already redirected; present only when created is false |
| existingTargetUnknown | boolean | – | A redirect existed but Shopify didn't reveal its target |
| message | string | yes | What to tell the merchant |
| ok | boolean | yes | – |
| path | string | yes | – |
| target | string | yes | The target that was requested |
No examples provided.
fix_broken_links Fix broken links in bulk ~170
Fix up to 100 broken links in one call, each its own way: "redirect" sends the old URL to a live page on this store (internal links only), "replace" points the link in the content at a new URL, "remove" takes the link out of the content and keeps its text or image, "dismiss" hides it from the list and changes nothing on the store. Use it when the merchant gives a list of old and new URLs, or wants a set of links handled the same way; for a single link, use create_redirect or replace_link. Show the merchant what will change and get their go-ahead first. One job runs per store at a time, in the background, so follow it with get_job_status.
| Name | Type | Req | Description |
|---|---|---|---|
| fixes | array | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | – | Pass to get_job_status |
| message | string | yes | – |
| ok | boolean | yes | – |
| queued | integer | yes | Fixes the job will run |
| rejected | array | yes | Fixes that were not queued, each with why |
No examples provided.
flatten_redirect_chain Flatten a redirect chain ~77
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 | Type | Req | Description |
|---|---|---|---|
| chainId | string | yes | From list_redirect_chains |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | – |
| ok | boolean | yes | – |
| path | string | yes | – |
| target | string | yes | The final destination it now points at |
No examples provided.
get_backlinks Get backlinks ~83
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 | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Referring domains to return, 1 to 25. The profile totals cover every backlink regardless. |
| Name | Type | Req | Description |
|---|---|---|---|
| available | boolean | yes | – |
| backlinksUrl | string | – | Present when available is false |
| message | string | – | Present when available is false |
| profile | object | – | Snapshot totals: backlinks, referring domains, rank |
| topDomains | array | – | – |
| totalDomains | integer | – | – |
No examples provided.
get_image View an image ~81
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 | Type | Req | Description |
|---|---|---|---|
| imageId | string | yes | Image id from get_resource. A Shopify media gid or the image URL also resolves. |
No output schema declared.
No examples provided.
get_indexing_status Get indexing status ~131
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 | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Pages to list in each group, 1 to 50. The counts and trend cover every page regardless. |
| refresh | boolean | – | Recompute instead of reading cache |
| Name | Type | Req | Description |
|---|---|---|---|
| appearing | array | – | – |
| checkedAt | string | – | – |
| connectUrl | string | – | Present when connected is false |
| connected | boolean | yes | – |
| fixUrl | string | – | – |
| history | array | – | – |
| message | string | – | Present when connected is false |
| notAppearing | array | – | – |
| note | string | – | – |
| summary | object | – | – |
| window | object | – | – |
No examples provided.
get_job_status Get job status ~172
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 / fix_broken_links, 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 | Type | Req | Description |
|---|---|---|---|
| jobId | string | – | From the tool that queued the work |
| kind | string | – | 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 th… |
| Name | Type | Req | Description |
|---|---|---|---|
| job | object|null | yes | – |
| recent | array | – | – |
| tasksUrl | string | – | – |
No examples provided.
get_page_seo Look up page SEO ~71
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 | Type | Req | Description |
|---|---|---|---|
| url | string | yes | Full storefront URL, e.g. https://example.com/products/foo |
| Name | Type | Req | Description |
|---|---|---|---|
| issues | array | yes | – |
| lastAuditAt | string|null | – | – |
| matched | boolean | yes | Whether the URL mapped to a synced resource |
| resource | object|null | yes | – |
| storeIssues | array | yes | Store-level issues (no single page) |
No examples provided.
get_resource Get resource SEO detail ~77
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 | Type | Req | Description |
|---|---|---|---|
| resourceId | string | yes | Id from list_resources or get_page_seo. A Shopify gid, numeric id or handle also resolves. |
| Name | Type | Req | Description |
|---|---|---|---|
| editUrl | string | yes | Admin deep link to the meta-tags editor |
| images | array | yes | – |
| resource | object | yes | – |
No examples provided.
get_search_performance Get Google Search performance ~197
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 | Type | Req | Description |
|---|---|---|---|
| days | integer | – | 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 | integer | – | Rows to return for the 'queries' and 'pages' panels, 1 to 50. Ignored for 'overview'. |
| panel | string | – | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| connectUrl | string | – | Present when connected is false |
| connected | boolean | yes | – |
| days | integer | – | – |
| message | string | – | Present when connected is false |
| note | string | – | – |
| panel | string | – | – |
| rows | array | – | queries/pages panels |
| totals | object | – | overview panel: clicks/impressions/ctr/position |
| window | object | – | The date range the data covers |
No examples provided.
get_seo_summary Get SEO summary ~50
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| healthScore | integer|null | yes | 0-100; null before the first audit |
| healthScoreAt | string|null | – | – |
| lastAuditAt | string|null | yes | – |
| openCounts | object | yes | – |
No examples provided.
inspect_url Inspect a URL in Google ~106
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 | Type | Req | Description |
|---|---|---|---|
| url | string | yes | Full storefront URL on this store |
| Name | Type | Req | Description |
|---|---|---|---|
| available | boolean | – | False when Google refused the inspection |
| canonicalMismatch | boolean | – | – |
| connectUrl | string | – | – |
| connected | boolean | yes | – |
| coverageState | string|null | – | – |
| demo | boolean | – | Synthesized demo data, not a live Google answer |
| indexed | boolean | – | – |
| lastCrawlTime | string|null | – | – |
| message | string | – | – |
| url | string | – | – |
| verdict | string|null | – | – |
No examples provided.
list_broken_links List broken links ~153
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. To fix many at once, or a list of old and new URLs, use fix_broken_links. Paginated.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Links per page, 1 to 50. Larger values are clamped, not rejected. |
| linkType | string | – | 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. |
| page | integer | – | 1-based page number. |
| Name | Type | Req | Description |
|---|---|---|---|
| fixUrl | string | yes | Admin deep link to the broken-links page |
| links | array | yes | – |
| page | integer | yes | – |
| pageCount | integer | yes | – |
| total | integer | yes | – |
No examples provided.
list_redirect_chains List redirect chains ~108
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 | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Chains per page, 1 to 50. Larger values are clamped, not rejected. |
| page | integer | – | 1-based page number. |
| Name | Type | Req | Description |
|---|---|---|---|
| chains | array | yes | – |
| fixUrl | string | yes | – |
| page | integer | yes | – |
| pageCount | integer | yes | – |
| total | integer | yes | – |
No examples provided.
list_resources List store content ~313
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. Items search engines never see (drafts, archived and unlisted items, and products not published to the Online Store) are left out unless includeUnpublished is true, because SEO work on them is wasted. Sorted worst score first. Paginated.
| Name | Type | Req | Description |
|---|---|---|---|
| includeUnpublished | boolean | – | Include items search engines never see: drafts, archived and unlisted items, and products not published to the Online Store |
| limit | integer | – | Items per page, 1 to 50. Larger values are clamped, not rejected. |
| maxScore | integer | – | Only items scoring at or below this meta score (0-100). 50 is a reasonable 'needs work' cut-off. |
| missingAlt | boolean | – | Set true for only the items carrying at least one image with no alt text. false is ignored, not inverted. |
| missingMetaDescription | boolean | – | Set true for only the items with no meta description. false is ignored, not inverted. |
| missingMetaTitle | boolean | – | Set true for only the items with no SEO title. false is ignored, not inverted. |
| page | integer | – | 1-based page number. |
| search | string | – | Case-insensitive match on the item's title. |
| type | string | – | Only this content type. Omit for every type. |
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | yes | – |
| pageCount | integer | yes | – |
| resources | array | yes | – |
| total | integer | yes | – |
No examples provided.
list_seo_issues List SEO issues ~136
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 | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Issues per page, 1 to 50. Larger values are clamped, not rejected. |
| page | integer | – | 1-based page number. |
| ruleId | string | – | Filter to one audit rule id |
| severity | string | – | Only issues at this severity. Omit for all three, which returns critical first. |
| Name | Type | Req | Description |
|---|---|---|---|
| issues | array | yes | – |
| page | integer | yes | – |
| pageCount | integer | yes | – |
| total | integer | yes | – |
No examples provided.
preview_link_replacement Preview a link replacement ~84
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 | Type | Req | Description |
|---|---|---|---|
| brokenLinkId | string | yes | From list_broken_links |
| Name | Type | Req | Description |
|---|---|---|---|
| menus | array | yes | Menus containing the link, which the app cannot rewrite |
| note | string | – | – |
| resources | array | yes | – |
| totalOccurrences | integer | yes | – |
No examples provided.
preview_link_titles Preview link titles ~167
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 | Type | Req | Description |
|---|---|---|---|
| allowDuplicate | boolean | – | Allow a title that just repeats the link text (normally skipped) |
| limit | integer | – | How many flagged pages to walk, 1 to 50. Larger values are clamped, not rejected. Ignored when resourceIds is supplied. |
| page | integer | – | 1-based page number. Ignored when resourceIds is supplied. |
| resourceIds | array | – | Omit to use the pages the audit flagged |
| Name | Type | Req | Description |
|---|---|---|---|
| fixUrl | string | – | – |
| page | integer | – | – |
| pageCount | integer | – | – |
| resources | array | yes | – |
| tally | object | yes | What apply_link_titles would do across these pages |
| total | integer | – | – |
No examples provided.
replace_link Replace a broken link ~113
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 | Type | Req | Description |
|---|---|---|---|
| brokenLinkId | string | yes | From list_broken_links |
| newHref | string | yes | The URL or path the link should point at |
| Name | Type | Req | Description |
|---|---|---|---|
| failures | array | – | – |
| message | string | yes | – |
| occurrencesReplaced | integer | yes | – |
| ok | boolean | yes | – |
| remaining | integer | 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 | integer | yes | – |
No examples provided.
run_audit Run SEO audit ~53
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | – |
| ok | boolean | yes | – |
No examples provided.
run_link_scan Run a link scan ~73
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | – | Pass to get_job_status |
| message | string | yes | – |
| ok | boolean | yes | – |
No examples provided.
unhide_resource Unhide from search engines ~111
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 | Type | Req | Description |
|---|---|---|---|
| resourceId | string | yes | Id of the page to unhide, from list_resources (check its seoHidden field) or get_page_seo. |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | – |
| ok | boolean | yes | – |
| resourceId | string | yes | – |
| seoHidden | boolean | yes | – |
No examples provided.
update_image_alt Update image alt text ~107
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 | Type | Req | Description |
|---|---|---|---|
| alt | string | yes | What the image actually shows, in ≤ 125 characters. Empty string clears the alt text. |
| imageId | string | yes | Image id from get_resource. Call get_image first to see what it shows. |
| Name | Type | Req | Description |
|---|---|---|---|
| altText | string|null | – | – |
| missingAltCount | integer | – | Remaining images without alt on the resource |
| ok | boolean | yes | – |
No examples provided.
update_image_alt_bulk Update alt text in bulk ~133
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 | Type | Req | Description |
|---|---|---|---|
| items | array | yes | One entry per image, up to 50. Entries are applied independently, so one bad id does not void the rest. |
| Name | Type | Req | Description |
|---|---|---|---|
| failed | integer | yes | – |
| missingAltRemaining | integer | yes | Images still missing alt text across the store |
| ok | boolean | yes | True when every item succeeded |
| results | array | yes | – |
| updated | integer | yes | – |
No examples provided.
update_meta_tags Update meta tags ~153
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 | Type | Req | Description |
|---|---|---|---|
| resourceId | string | yes | Id of the item to update, from list_resources or get_page_seo. |
| seoDescription | string | – | Omit to leave unchanged; empty string clears |
| seoTitle | string | – | Omit to leave unchanged; empty string clears |
| Name | Type | Req | Description |
|---|---|---|---|
| metaScore | integer|null | – | – |
| ok | boolean | yes | – |
| seoDescription | string|null | – | – |
| seoTitle | string|null | – | – |
No examples provided.
update_meta_tags_bulk Update meta tags in bulk ~133
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 | Type | Req | Description |
|---|---|---|---|
| items | array | yes | One entry per item to update, up to 50. Entries are applied independently, so one bad id does not void the rest. |
| Name | Type | Req | Description |
|---|---|---|---|
| failed | integer | yes | – |
| ok | boolean | yes | True when every item succeeded |
| results | array | yes | – |
| updated | integer | yes | – |
No examples provided.
How do I install the SEO Expert: Digital Darts MCP server?
SEO Expert: Digital Darts is a hosted endpoint at https://seo.digitaldarts.com.au/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · seo.digitaldarts.com.au
claude mcp add --transport http au-com-digitaldarts-seo-expert 'https://seo.digitaldarts.com.au/mcp'
What is the SEO Expert: Digital Darts MCP server?
SEO Expert: Digital Darts is an MCP server listed in the public MCP registry as au.com.digitaldarts/seo-expert. All-in-one Shopify SEO. Rank on Google and in AI search. Find what's broken and fix it in chat. This page covers its hosted endpoint (https://seo.digitaldarts.com.au/mcp). Its publisher has verified ownership with us.
Is the SEO Expert: Digital Darts MCP server safe to use?
SEO Expert: Digital Darts scores 91 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the SEO Expert: Digital Darts MCP server expose?
SEO Expert: Digital Darts exposes 27 tools: get_seo_summary, list_seo_issues, get_page_seo, list_resources, get_resource, and 22 more. Their descriptions and schemas cost roughly 3,286 tokens of context every time the server is loaded.
Does the SEO Expert: Digital Darts MCP server require authentication?
Yes. SEO Expert: Digital Darts asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the SEO Expert: Digital Darts MCP server still maintained?
SEO Expert: Digital Darts is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the SEO Expert: Digital Darts MCP server?
VerifyMCP ran 13 checks on SEO Expert: Digital Darts, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.