Skip to main content
Glama

Ady's Backlinks MCP

An MCP server that lets Claude scan a website (or its code) and help build real backlinks. It finds directories to list on, finds sites to pitch, writes the outreach emails, checks links are live, and tracks everything.

Works for any business, in any country, and for as many sites as you like: your own site and all your clients' sites, each saved as its own project. A dentist in Austin, a plumber in Manchester, a software company in Nashik and a real estate agency in Dubai each get their own local directories, search queries, phone format and schema.

No spam. It never auto-posts links (no comment spam, forum spam, PBNs or paid link farms). Google penalises those. It finds the right places and prepares everything; you submit and send.


Contents


Related MCP server: SEO Content Analysis MCP

What it can do

 Your site / code
       │
       ▼
 1. SCAN      →  business name, phone, address, keywords, pages, broken links
 2. AUDIT     →  a ranked "fix this first" list + ready-to-paste LocalBusiness schema
 3. FIND      →  directories to join + search queries for guest posts & resource pages
 4. QUALIFY   →  scores each prospect 0-100, finds the real contact email, picks the right email template
 5. PREPARE   →  one copy-paste kit (same name/address/phone everywhere) + outreach emails
 6. TRACK     →  todo → submitted → pitched → live
 7. VERIFY    →  is the link really there? follow or nofollow? still live next month?

Works for any business and country

About 135 built-in directories, picked automatically for the niche and country:

Type

Examples

Every business

Google Business Profile, Bing Places, Apple Business Connect, LinkedIn, Facebook, Trustpilot, Hotfrog

Local directories

US BBB, Yellow Pages, Manta · UK Yell, Thomson Local, FreeIndex · CA YellowPages.ca · AU Yellow Pages, True Local · NZ Finda · IN Justdial, Sulekha · AE Yellow Pages UAE · DE Gelbe Seiten, Das Örtliche · FR PagesJaunes · ES Páginas Amarillas · IT PagineGialle · ZA Brabys

Software, IT and agencies

Clutch, GoodFirms, DesignRush, G2, Capterra, Product Hunt, GitHub, Wellfound

Trades and home services

Checkatrade, TrustATrader (UK) · Angi, Thumbtack (US) · HomeStars (CA) · hipages (AU) · Houzz Pro, Bark

Healthcare

Zocdoc, Healthgrades (US) · Practo (IN) · RateMDs

Legal

Avvo, Justia, FindLaw (US) · Law Society (UK) · LawRato (IN)

Real estate

Zillow, Realtor.com (US) · Rightmove, Zoopla (UK) · realestate.com.au · Bayut, Property Finder (UAE) · 99acres, MagicBricks (IN)

Restaurants and food

Tripadvisor, OpenTable, Uber Eats, Yelp, DoorDash, Deliveroo, TheFork, Talabat, Zomato, Swiggy

Hotels and stays

Booking.com, Airbnb, MakeMyTrip

Beauty and fitness

Fresha, Booksy, Treatwell, Vagaro, Mindbody, ClassPass

Manufacturing / B2B

Kompass, Europages, Wer liefert was, Thomasnet, IndiaMART, TradeIndia, Alibaba

Education, events, nonprofits

Niche, GreatSchools, The Knot, Hitched, WedMeGood, Candid, GlobalGiving

Niches it understands: software, SaaS, IT, web/app development, marketing/SEO agency, design, startup, manufacturing, industrial, pharma, wholesale, restaurant, cafe, bakery, catering, salon, spa, barber, gym, yoga, hotel, resort, travel, clinic, dentist, physio, lawyer/solicitor, real estate, plumber, electrician, contractor, builder, roofer, cleaner, interior design, architect, HVAC, landscaping, school, coaching, tutor, online store, wedding, events, photographer, accountant, tax, insurance, car repair, charity/NGO. Something not on the list still works; you just get general directories plus anything you add yourself.

Countries: India, US, Canada, UK, Ireland, Australia, New Zealand, UAE, Saudi Arabia, Qatar, Singapore, Malaysia, Philippines, Indonesia, Thailand, Vietnam, Japan, Pakistan, Bangladesh, Sri Lanka, Nepal, Germany, France, Spain, Italy, Netherlands, Belgium, Switzerland, Sweden, Poland, Portugal, South Africa, Nigeria, Kenya, Egypt, Brazil and Mexico. You can type names or codes: UK, GB, United Kingdom, UAE, USA, India, IN. Each country gets the right local directories, search queries, phone format (+44 161 496 0123) and schema country code. Adding a country takes one line in backlink_mcp/countries.py.


Quick install (1 command)

You need Python 3.10 or newer and git.

macOS / Linux

git clone https://github.com/RandomKid24/adys-backlinks-mcp.git ~/adys-backlinks-mcp
cd ~/adys-backlinks-mcp
bash install.sh

Windows (PowerShell)

git clone https://github.com/RandomKid24/adys-backlinks-mcp.git $HOME\adys-backlinks-mcp
cd $HOME\adys-backlinks-mcp
powershell -ExecutionPolicy Bypass -File install.ps1

The installer:

  1. creates a private Python environment in .venv (nothing installed system-wide)

  2. installs the server

  3. adds it to Claude Desktop automatically, backing up your old config as .bak

  4. adds it to Claude Code too, if you have it

Then fully quit Claude Desktop (Mac: Cmd + Q, Windows: tray icon → Quit), reopen it, and you're done.

Mac tip: keep the folder in your home folder (~/adys-backlinks-mcp), not in Downloads, Desktop or Documents. macOS can block apps from running files there.


Manual install

git clone https://github.com/RandomKid24/adys-backlinks-mcp.git ~/adys-backlinks-mcp
cd ~/adys-backlinks-mcp

python3 -m venv .venv
source .venv/bin/activate          # Windows: .venv\Scripts\activate
pip install -e .

which backlink-mcp                 # Windows: where backlink-mcp

Copy the path that last command prints. You'll paste it into your app's config below. It looks like /Users/you/adys-backlinks-mcp/.venv/bin/backlink-mcp.


Connect it to your app

Replace /FULL/PATH/TO/ with your real path. If you used the installer, it printed this path at the end.

Claude Desktop

The installer already did this. To do it by hand, open the config file:

OS

File

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

Or open it from Claude Desktop: Settings → Developer → Edit Config.

{
  "mcpServers": {
    "backlinks": {
      "command": "/FULL/PATH/TO/adys-backlinks-mcp/.venv/bin/backlink-mcp"
    }
  }
}

On Windows the path looks like C:\\Users\\you\\adys-backlinks-mcp\\.venv\\Scripts\\backlink-mcp.exe (use double backslashes).

If you already have other servers, add "backlinks": {...} inside your existing mcpServers instead of replacing the whole file.

Save the file, fully quit Claude Desktop, and reopen it.

Claude Code

claude mcp add backlinks -- /FULL/PATH/TO/adys-backlinks-mcp/.venv/bin/backlink-mcp

Inside Claude Code, type /mcp and you should see backlinks · connected.

OpenCode / Cursor / other clients

OpenCode: add to ~/.config/opencode/opencode.json:

{
  "mcp": {
    "backlinks": {
      "type": "local",
      "command": ["/FULL/PATH/TO/adys-backlinks-mcp/.venv/bin/backlink-mcp"],
      "enabled": true
    }
  }
}

Cursor: add to ~/.cursor/mcp.json, using the same format as the Claude Desktop JSON above.

Any other MCP client works too: it's a standard stdio server. Point it at the backlink-mcp path.

claude.ai web (custom connector)

claude.ai runs in the cloud, so it can't start a program on your computer. It needs a public https:// URL. Run the server in HTTP mode and open a free Cloudflare tunnel to it.

1. Install cloudflared (one time)

brew install cloudflared          # Mac
# Windows: winget install Cloudflare.cloudflared

2. Terminal 1: start the server in HTTP mode

~/adys-backlinks-mcp/.venv/bin/backlink-mcp --http

It prints your secret path, for example:

claude.ai connector URL:  https://<your-tunnel-host>/Lvl_-h-kNDN896jX2w7yO5w7TdOQPeXN/mcp

3. Terminal 2: start the tunnel

cloudflared tunnel --url http://localhost:8787

It prints a URL like https://random-words.trycloudflare.com.

4. Add it on claude.ai

Go to Settings → Connectors → Add custom connector, then:

  • Name: backlinks

  • URL: https://random-words.trycloudflare.com/<your-secret>/mcp

  • Leave the OAuth fields empty, then click Add.

Then turn it on in a chat from the + / tools menu.

Good to know:

  • Keep both terminals open and your computer awake while you use it.

  • The trycloudflare.com URL changes every restart. For a permanent URL, use a named Cloudflare tunnel on your own domain (e.g. seo-mcp.yourdomain.com).

  • The secret in the URL is the password. Don't share it. Make a new one with backlink-mcp --http --new-token.

  • Opening the URL in a browser shows "Missing session ID". That's normal: browsers can't speak MCP. A wrong secret shows 404 instead.

  • Options: --port 8787 (default), --host 127.0.0.1 (default). You can also set the secret with the BACKLINK_MCP_TOKEN environment variable.


Check it works

Option A: in Claude. Open a new chat and type:

use backlinks to scan https://yoursite.com with max 5 pages

You should get your business name, pages and keywords back.

Option B: MCP Inspector (needs Node.js; tests the server without Claude)

npx @modelcontextprotocol/inspector ~/adys-backlinks-mcp/.venv/bin/backlink-mcp

Click Connect, then Tools → List Tools. You should see 18 tools. Run scan_site to test.

Option C: quick terminal check

~/adys-backlinks-mcp/.venv/bin/backlink-mcp

If it just sits there waiting, it's working (it's listening for an MCP client). Press Ctrl + C to stop.


How to use it (copy-paste prompts)

Send these to Claude one at a time, in order. Replace the example values with the real site's details. Works the same for your own site or a client's.

Golden rule: give Claude real details. The tool rejects placeholders like XXXXXXXXXX, 20XX or your full address, because one wrong phone number copied to 20 directories is worse than none.

1. Save the site as a project (once per site)

Use backlinks save_project for example.com with niche "dental clinic", location "Austin", country "US", keywords ["dentist", "family dentist", "teeth whitening"], competitors ["competitor1.com", "competitor2.com"].

After this, every other tool remembers the niche, city, country and keywords. Just mention the site.

2. Scan and audit

Use backlinks to scan https://example.com (max 50 pages), then run seo_link_audit and internal_link_suggestions. Show me the priority_fixes list.

3. Check the code (optional, if you have it)

Use backlinks scan_codebase on /path/to/the/website/code and tell me exactly which files to change for each priority fix.

4. Make the submission kit (real details only)

Use backlinks build_submission_kit for example.com with business_name "Example Dental", address "1200 Congress Ave", postal_code "78701", state "TX", email "hello@example.com", phone "(512) 555-0142", founded "2016", services ["Family Dentistry", "Teeth Whitening", "Dental Implants"], description "One or two sentences in your own words.". Show me needs_review.

Leave out anything you don't know yet. The kit will list it under needs_review. City and country come from the project.

5. Add business schema to the site

Use backlinks generate_schema for example.com with business_type "Dentist" and add the script tag to the site's <head>.

Common types: ProfessionalService, LocalBusiness, Dentist, Physician, LegalService, Attorney, RealEstateAgent, Plumber, Electrician, GeneralContractor, Restaurant, CafeOrCoffeeShop, Bakery, BeautySalon, HealthClub, Hotel, Store, AutoRepair, AccountingService, EducationalOrganization, NGO. The full list is on schema.org/LocalBusiness.

6. Find where to get links

Use backlinks find_opportunities for example.com. Give me the top 15 directories to sign up on first, with links.

Now sign up on those directories, copy-pasting from the kit. This is the fastest way to get the first links.

7. Find real sites to pitch

Run the roundups_and_lists and local search footprints for example.com with web search. Run qualify_prospect on the top 15 results with my_domain example.com. Add the "good" ones to the tracker. List any "check_manually" ones separately.

8. Write the emails

For each good prospect, use draft_outreach with its recommended_template, my_site example.com, my_name "Your Name", a one-line hook about their page, and proof from these real facts: ["fact 1", "fact 2"]. Show me any warnings.

Only put true facts in proof (customers served, years in business, reviews, awards). Skip prospects whose template is signup: those are just profile sign-ups, no email needed.

Anytime later

list my backlink projects
show my backlink tracker for example.com
I got listed on https://somesite.com/our-profile, verify it for example.com and mark it live
recheck my live links for example.com          ← do this once a month

Multiple sites and clients

Every site is its own project, so one install handles your site and every client's:

Use backlinks save_project for client-one.com with niche "law firm", location "Leeds", country "UK"
Use backlinks save_project for client-two.com with niche "restaurant", location "Pune", country "India"
list my backlink projects
  • scan_site creates a project automatically the first time a site is scanned. Run save_project to add the niche, location and country.

  • Each project has its own scan, submission kit, schema and tracker entries.

  • list_projects shows every site with its tracker progress (todo / submitted / live).

  • When working on a client, always mention their domain so the tools use the right project.


All tools

Tool

What it does

scan_site

Crawls your live site (follows robots.txt, reads sitemap.xml). Finds business name, phone, email, address, socials, keywords, page SEO data and broken links. Separates truly broken links from bot-blocked ones (LinkedIn, Instagram…) and flags JavaScript-only pages.

scan_codebase

Reads a local project (Next.js, React/Vite, Django, FastAPI, plain HTML…). Finds routes, meta tags, sitemap/robots, structured data, contact info and which file holds each social link. Flags mixed-case routes (/About vs /about), inconsistent LinkedIn URLs and missing prerendering. Ignores lockfiles and minified bundles.

seo_link_audit

Returns a ranked priority_fixes list (most important first): noindex, broken links (with how many pages each is on), missing LocalBusiness schema / street address, JS-only pages, sitemap, canonicals, thin pages, weak internal links.

internal_link_suggestions

Suggests "link from page A to page B with this anchor text" for weakly linked pages. Prefers descriptive multi-word anchors and your strongest pages as sources.

save_project

Saves a site (yours or a client's) with its niche, location, country, keywords and competitors, so every other tool uses them.

list_projects

Lists all your sites with niche, location, country, tracker progress and whether a kit is saved.

find_opportunities

Lists directories and citation sites for the niche and country, plus ready search queries for roundups, local lists, guest posts, resource pages, podcasts, partners and competitor mentions. Pass site= to use a saved project.

add_custom_directory

Adds your own directory (optionally only for one city). It's saved to custom.json and survives updates.

add_custom_footprint

Adds your own search query using {kw}, {loc} and {country}.

qualify_prospect

Opens a prospect and scores it 0-100. Detects guest-post pages, "top N companies" roundups, resource pages and directories. Judges spam by where the page links out (not by words in it). Follows contact/about pages to find a real email, and returns recommended_template. Blocked sites return check_manually, not a bad score.

build_submission_kit

Builds one consistent Name/Address/Phone + descriptions kit for all directory sign-ups. Rejects placeholder values, never uses your brand name as the category, formats the phone one way, and lists needs_review. Saved as .md + .json.

generate_schema

Ready-to-paste LocalBusiness JSON-LD (address, phone, email, sameAs, founding date) built from your kit. Lists missing fields instead of inventing them.

draft_outreach

Writes an email: guest_post, list_inclusion, resource_page, broken_link, unlinked_mention, partner, testimonial, local_press. Uses your personal hook and real proof, never claims a relationship you don't have, and returns warnings until it's ready to send. Never sends anything.

verify_backlink

Checks a page really links to you: anchor text, follow/nofollow/sponsored, and whether that page is indexable.

tracker_add

Adds an opportunity to your tracker. Blocks a second entry for the same directory.

tracker_update

Changes status/notes: todo, submitted, pitched, live, rejected.

tracker_list

Shows your tracker with a summary.

recheck_live_links

Re-checks all your live links and flags any that got removed or became nofollow.


Where your data is saved

Everything stays on your computer in ~/.backlink-mcp/:

File

What

projects.json

your sites/clients: niche, location, country, keywords, competitors

custom.json

your own directories, search queries, email templates and categories

tracker.json

your opportunities and their status (for all sites)

submission_kit_<domain>.md / .json

your copy-paste kit

scans/<domain>.json

the last scan (used by audit and link suggestions)

http_token

the secret for HTTP mode

To use a different folder, set the BACKLINK_MCP_DATA environment variable.

Open the folder:

open ~/.backlink-mcp        # Mac
explorer %USERPROFILE%\.backlink-mcp   # Windows

Add your own directories and queries

Your additions go in ~/.backlink-mcp/custom.json, not in the code, so git pull never overwrites them.

The easy way: ask Claude

Use backlinks add_custom_directory "Leeds Chamber of Commerce", url https://www.leedschamber.co.uk/, tags ["general", "local"], region "UK", priority 5, location "Leeds"
Use backlinks add_custom_footprint group "local", query "{loc} {kw} association members"

By hand: edit custom.json

{
  "directories": [
    {"name": "Leeds Chamber of Commerce", "url": "https://www.leedschamber.co.uk/",
     "tags": ["general", "local"], "region": "GB", "priority": 5, "location": "Leeds",
     "notes": "members get a listing"}
  ],
  "footprints": {
    "local": ["{loc} {kw} association members"]
  },
  "outreach_templates": {
    "sponsorship": {
      "needs": ["topic"],
      "subject": "Sponsoring {topic}",
      "body": "Hi {contact},\n\n{hook}\n\nWe'd love to sponsor {topic}...\n\n{my_name}\n{my_site}"
    }
  },
  "category_hints": [
    [["drone", "aerial"], "Aerial Photography Service"]
  ]
}

Field

Meaning

region

global, a country code (US, GB, IN…) or a region: EU, EUROPE, GCC, ANZ, NA, SEA, SOUTH_ASIA. Can be a list.

location

optional; only shown for projects in this city or area

tags

the niches it suits: general, local, software, it, saas, agency, design, startup, manufacturing, b2b, food, hospitality, beauty, fitness, healthcare, legal, realestate, trades, education, ecommerce, events, finance, automotive, nonprofit

priority

5 = do first … 1 = nice to have

Footprint placeholders

{kw} keyword, {loc} city/area, {country} country name

Template placeholders

{contact} {target_site} {topic} {hook} {proof} {my_site} {my_name} {my_page} {broken_url}

Your entries win over built-ins with the same name. To change the built-in lists for everyone (for example, in a pull request), edit backlink_mcp/data.py and backlink_mcp/countries.py.


Troubleshooting

Problem

Fix

spawn ... ENOENT

The path in your config is wrong. Run which backlink-mcp (inside the venv) and paste that exact path.

Remote connect failed on claude.ai

claude.ai can't run local paths. Use the HTTP + tunnel setup, or use Claude Desktop.

externally-managed-environment

You ran pip install outside the venv. Use bash install.sh, or run source .venv/bin/activate first.

Operation not permitted (Mac)

The folder is in Downloads/Desktop/Documents. Move it to ~/adys-backlinks-mcp, delete .venv, and run bash install.sh again.

Tools don't appear in Claude Desktop

Fully quit it (Cmd + Q / tray → Quit), not just close the window. Check the JSON is valid.

"Missing session ID" in the browser

Normal. Browsers can't speak MCP. Add the URL in claude.ai instead.

404 on the HTTP URL

Wrong secret in the URL. Copy it again from the --http startup message.

SSL certificate error during scans (Mac)

Run /Applications/Python\ 3*/Install\ Certificates.command

Scan finds 0 pages

The site blocks bots or is client-side only. Use scan_codebase on the project folder instead.

Prospect says check_manually

That site blocks bots. It's not a bad site. Open it yourself or ask Claude to read it with web fetch.

find_opportunities shows only general sites

No country was set, or the niche word wasn't recognised. Run save_project with a country and a common niche word (e.g. "dentist"), or add your own with add_custom_directory.

Unknown country

Use a name or code: India/IN, UK/GB, US/USA, UAE/AE, Australia/AU…

Kit says ready_to_submit: false

Look at needs_review. Usually a missing street address or PIN code.

command not found: backlink-mcp

The venv isn't active. Use the full path: ~/adys-backlinks-mcp/.venv/bin/backlink-mcp

Logs

  • Mac: tail -50 ~/Library/Logs/Claude/mcp-server-backlinks.log

  • Windows: %APPDATA%\Claude\logs\mcp-server-backlinks.log


Update

See CHANGELOG.md for what changed.

cd ~/adys-backlinks-mcp
git pull
.venv/bin/pip install -e .         # Windows: .venv\Scripts\pip install -e .

Then restart Claude.

Uninstall

  1. Remove the "backlinks" block from your Claude Desktop config (and run claude mcp remove backlinks for Claude Code).

  2. Delete the folder: rm -rf ~/adys-backlinks-mcp

  3. (Optional) delete your data: rm -rf ~/.backlink-mcp


Requirements

  • Python 3.10+

  • Works with the mcp Python SDK 1.x and 2.x

  • macOS, Windows, Linux

License

MIT. See LICENSE.

Available Tools

18 tools
add_custom_directoryA

Add your own directory/citation site so find_opportunities includes it from now on (saved to ~/.backlink-mcp/custom.json, survives updates). tags = niches it suits, e.g. ["legal", "local"] (see NICHE_TAGS in data.py); region = "global", a country (name or code) or a region (EU, GCC, ANZ, NA, SEA). location = optional city/area; if set, it only shows for projects in that location (e.g. a city chamber).

NameRequiredDescriptionDefault
urlYes
nameYes
tagsYes
notesNo
regionNoglobal
locationNo
priorityNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present the description carries the full burden, and it does meaningful work: it discloses persistence location (~/.backlink-mcp/custom.json), that the entry survives updates, and the conditional visibility rule for location (only shown for projects in that area). It omits whether duplicate URLs are rejected, validation rules on url, and the effect of priority.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its consequence, then parameter guidance in priority order. Dense but every clause carries information; the parenthetical file path and data.py reference are slightly internal-facing noise but still orienting.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation with no annotations and no output schema, the description covers the high-value fields and persistence behavior but leaves priority, notes, URL format and duplicate handling undefined, so an agent could still call it incorrectly or redundantly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 7 parameters, so the description must compensate and it partially does: tags gets an example and a pointer to NICHE_TAGS, region gets accepted formats (global, country name/code, EU/GCC/ANZ/NA/SEA), and location gets conditional-display semantics. name, url, notes and priority are left fully unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add your own directory/citation site') plus the downstream effect ('so find_opportunities includes it from now on'), which distinguishes it from sibling registration tools like add_custom_footprint. An agent knows exactly what this mutates and what it changes in later calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies clearly when to use it: when the user has a directory/citation site not already in the built-in set and wants it surfaced by find_opportunities. It does not address when-not-to-use (e.g. duplicates already in the catalog, or the distinction from add_custom_footprint), so no explicit alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_custom_footprintA

Add your own search footprint (saved to custom.json). Use {kw} for keyword, {loc} for city/area and {country} for the country name, e.g. group "local", query '{loc} {kw} association members'.

NameRequiredDescriptionDefault
groupYes
queryYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose the key side effect: the footprint is written to custom.json. It says nothing about whether re-adding an existing group overwrites it, whether validation occurs, or whether the new footprint is immediately usable by sibling scan tools.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and persistence target, then the placeholder rules and an example. Two tight sentences with little waste, though the example is somewhat long relative to the payload it illustrates.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter write tool with no output schema and no annotations, the description covers purpose, persistence destination, and query syntax. The missing piece is the semantics of 'group' and overwrite behavior, but the essentials for a correct call are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does well for 'query', naming the three placeholders {kw}, {loc}, {country} and showing a full example, but 'group' is never defined beyond appearing in the sample as "local" — its role as a label/bucket is left to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource — adding a custom search footprint persisted to custom.json — and explains the templating it expects. It does not, however, distinguish itself from the sibling add_custom_directory, which an agent could easily confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied ('Add your own search footprint'), with no statement of when to prefer this over add_custom_directory or how the resulting footprint is later consumed by the scan tools. The worked example gives a sense of intended shape but not of selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

build_submission_kitB

Build one consistent Name/Address/Phone + descriptions kit for directory/citation sign-ups. Merges the cached scan profile with fields you pass (yours win). Placeholder values (XXXX, 20XX, "your address"...) are rejected, never saved. Returns needs_review so you know what to fix before submitting. Saves .md + .json; generate_schema reuses it.

NameRequiredDescriptionDefault
cityNo
saveNo
emailNo
phoneNo
stateNo
domainYes
addressNo
countryNo
foundedNo
socialsNo
categoryNo
servicesNo
descriptionNo
postal_codeNo
business_nameNo

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses merge precedence ('cached scan profile with fields you pass (yours win)'), input validation behavior (placeholders like XXXX, 20XX, 'your address' are rejected and never saved), a filesystem side effect (saves .md + .json), and one return key (needs_review). It omits whether existing files are overwritten, where files are written, and what happens if no cached profile exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

About 70 words, front-loaded with the artifact and purpose, then precedence, then validation, then return value. Nearly every clause carries information; the only mild inefficiency is the abbreviated 'Saves .md + .json' without stating where.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter, no-annotation, no-output-schema tool that writes files, the description covers the workflow and the critical validation/precedence behavior, but leaves the majority of parameters unexplained and only names one of presumably several return fields. Adequate to call correctly, not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 15 parameters, so the description must compensate and largely does not. It explains the precedence rule for passed fields and implies name/address/phone/description are the core ones, but never clarifies the save flag's default-on file-writing behavior, the socials/services array vs null semantics, or fields like category, founded, and country.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and artifact: 'Build one consistent Name/Address/Phone + descriptions kit for directory/citation sign-ups.' That is clearly distinct from siblings like scan_site (which produces the cached profile) and generate_schema (which it explicitly says reuses the kit). It stops short of a full sibling differentiation statement, but the artifact it produces is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: you build the kit before directory/citation sign-ups and fix 'needs_review' items before submitting, and generate_schema reuses the output. There is no explicit 'do not use when' or a named alternative for the case where no cached scan profile exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

draft_outreachA

Draft an outreach email to edit and send yourself (never sends anything). template: guest_post | list_inclusion (for "top N companies" roundups) | resource_page | broken_link | unlinked_mention | partner | testimonial | local_press. topic: a noun phrase, e.g. "how to choose a family dentist" or "local bakery wins state award". proof: real facts only, e.g. ["Served 200+ local families since 2019", "4.9 stars from 120 Google reviews"]. hook: ONE specific sentence about their page so it doesn't read as a mass email. Returns warnings when something required is missing - fix them before sending.

NameRequiredDescriptionDefault
hookNo
extraNo
proofNo
topicNo
my_nameYes
my_pageNo
my_siteYes
templateYes
broken_urlNo
target_siteNo
contact_nameNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description usefully discloses the most consequential behavior: it never sends anything and only produces a draft for the user to handle. It also discloses missing-requirement warnings, though it does not clarify whether warnings accompany a draft, block generation, or whether any draft is persisted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The safety-critical purpose is front-loaded, followed by scannable parameter guidance and a concise warning behavior note. The examples and emphasis on one specific hook are practical rather than redundant, with no significant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition is sufficient for a basic invocation using the three required parameters and explains the central no-send safeguard. For an 11-parameter tool with no schema descriptions, annotations, or output schema, it remains incomplete because template-dependent fields, warning behavior, and the roles of several inputs are unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds substantial meaning beyond the schema for template, topic, proof, and hook, including allowed template values, formats, and examples. However, schema coverage is 0%, and my_site, my_name, my_page, target_site, contact_name, broken_url, and extra receive no explanation or template-specific usage guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence clearly states the verb and resource: drafting an outreach email for the user to edit and send. The eight template options clarify its outreach scope, although there is no explicit differentiation from the closest sibling, build_submission_kit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage context, including list_inclusion for "top N companies" roundups, factual proof, and a page-specific hook to avoid mass-email wording. It does not explain when to prefer this tool over build_submission_kit or provide per-template selection and input requirements.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_opportunitiesA

Return legit backlink opportunities for ANY business in ANY country: matching citation/directory/profile sites (filtered by niche and country) plus ready-to-run web-search footprint queries (roundups, local lists, guest posts, resource pages, podcasts, partners, competitor mentions). Run the queries with web search. Pass site= to use a saved project's niche/location/country/keywords/competitors (anything you pass wins). niche examples: software, saas, digital marketing, manufacturing, restaurant, salon, gym, hotel, dental clinic, law firm, real estate, plumber, interior design, school, online store, wedding photographer, charity. country: name or code (India, US, UK, UAE, Australia, Germany...).

NameRequiredDescriptionDefault
siteNo
nicheNo
countryNo
keywordsNo
locationNo
competitorsNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that output is two-part (matched sites plus ready-to-run queries) and that the agent must execute those queries externally rather than the tool doing so. It says nothing about empty/no-match results, read-only nature, cost, or limits, which matters for a 0-schema tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, with usage and precedence notes following. The long niche example list is useful grounding rather than fluff, though the single undifferentiated paragraph makes it slightly harder to scan than a short structured list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter tool with no annotations and no output schema, the definition does well to describe the shape of the return value and the site-vs-explicit precedence. It is still incomplete on direct semantics for keywords/competitors and on what happens when no opportunities match, gaps an agent would have to discover at call time.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It documents site's precedence meaning, gives a rich example list for niche, and states country accepts a name or code. Keywords, location, and competitors are only mentioned as values inherited from a saved site, not explained as direct inputs, leaving three of six parameters loosely defined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource+scope: return backlink opportunities, comprising citation/directory/profile sites plus footprint search queries. That is highly distinctive from siblings like draft_outreach or verify_backlink. It never names an alternative tool, so it stops short of explicit sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It tells the agent to run the returned queries with web search, and explains the precedence rule for the site parameter ('anything you pass wins'), which is exactly the decision an agent needs to make. It does not say when not to use this tool or point to a sibling alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_schemaA

Generate ready-to-paste LocalBusiness JSON-LD (name, address, phone, email, logo, sameAs, foundingDate) from the saved submission kit (or the last scan). Paste the returned script tag into your site's (e.g. index.html). business_type: ProfessionalService, LocalBusiness, Organization, Restaurant, BeautySalon, Hotel, MedicalClinic, Store... Fields still missing are listed, never invented.

NameRequiredDescriptionDefault
domainYes
area_servedNo
price_rangeNo
business_typeNoProfessionalService

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the burden and does well: it discloses the key behavioral guarantee that missing fields are 'listed, never invented', describes the output as a script tag, and enumerates accepted business_type values. It does not state whether anything is persisted server-side or what happens if the domain has no saved kit/scan, which leaves a material gap for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the action and output, then the paste instruction, then the business_type enumeration, then the missing-field guarantee. Every sentence carries information, though the line-broken formatting and trailing '...' enumeration are slightly ragged.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter generator with no output schema, the description covers the output shape (script tag with named JSON-LD fields), the source data, and null-handling behavior. The remaining hole is failure modes and prerequisites when no kit or scan exists, which an agent would want spelled out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It partially does: business_type gets a long enumeration of valid values, and the JSON-LD field list clarifies what domain/area_served/price_range feed into. However, those three parameters are never defined directly, and 'domain' in particular (site domain vs. property domain) is left to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and artifact: 'Generate ready-to-paste LocalBusiness JSON-LD' with an explicit field list, and it names the source of truth ('the saved submission kit (or the last scan)'). This also implicitly separates it from siblings like build_submission_kit and scan_site, which produce or refresh that source rather than the schema artifact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the precondition (a saved submission kit or the last scan must exist) and the post-step ('Paste the returned script tag into your site's <head>'), so an agent knows the surrounding workflow. It does not explicitly say when to prefer this over build_submission_kit or what to do when neither source exists, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsB

List every site you've scanned or saved, with niche, location, country and tracker progress.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It implies a read operation and discloses returned content fields (niche, location, country, tracker progress), but it omits pagination, ordering, scope limits, and an explicit read-only guarantee.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted wording. It immediately states what is listed and what fields are included.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no annotations and no output schema, the description is only partially complete. It names key returned fields but does not describe pagination, ordering, response shape, or whether all projects are returned at once.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so parameter semantics are inherently simple. The description does not add parameter meaning, but no parameters exist to explain, matching the baseline for a zero-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: 'List every site you've scanned or saved,' making clear this is a project/site listing tool. It distinguishes from siblings like save_project and scan_site by describing the read-side inventory, though it does not explicitly name alternatives such as tracker_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance or comparison to alternatives. The agent can infer it is for viewing scanned/saved sites, but nothing says whether to use this versus tracker_list or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qualify_prospectA

Fetch a prospect page and score it 0-100. Detects guest-post pages, roundup/"top N companies" lists (ask to be included), resource pages and directories; checks noindex, outbound spam links and sponsored-only policies; follows the site's contact/about/write-for-us pages to find real contact emails; and says which outreach template to use. topic_keywords (e.g. ["dentist", "dental"]) raises the score for relevant pages; if omitted, the saved project's keywords for my_domain are used.

NameRequiredDescriptionDefault
urlYes
my_domainNo
topic_keywordsNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and largely meets it: it discloses that the tool performs network fetching, follows contact/about/write-for-us subpages, checks noindex and sponsored-only policies, and produces a template recommendation. What's missing is any sense of cost, rate limits, or failure behavior on unreachable pages.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and score, then the detection list, then the parameter note. Every clause carries information, though the long semicolon-chained sentence makes it denser than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description has to describe returns — and it does, citing a 0-100 score, detected page types, found emails, and a template recommendation. A brief note on how the result is shaped (single object vs. nested sections) would close the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and only partly does. It explains topic_keywords well with a concrete example and describes its default source, but url is never characterized (absolute URL? existing page only?) and my_domain's role is only obliquely implied through the keyword-lookup sentence rather than stated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+output: "Fetch a prospect page and score it 0-100," then enumerates exactly what the fetch inspects (guest-post pages, roundups, resource pages, noindex, spam links) and that it returns an outreach template. That level of detail clearly separates it from scan_site and find_opportunities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the prospecting context, and the topic_keywords fallback ("if omitted, the saved project's keywords for my_domain are used") clarifies a default. But it never states when to call this instead of scan_site, find_opportunities, or seo_link_audit, nor any prerequisite such as a saved project existing for the keyword fallback to work.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_projectB

Save (or update) a site you're working on - your own or a client's - so every other tool knows its niche, location, country, keywords and competitors. Only the fields you pass are changed. country: name or code ("India", "IN", "UK", "United States"...).

NameRequiredDescriptionDefault
siteYes
nicheNo
notesNo
countryNo
keywordsNo
locationNo
competitorsNo
business_nameNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose one genuinely non-obvious mutation semantic: "Only the fields you pass are changed" (partial merge update), which is critical given that most fields default to empty strings. It does not state what happens on conflicting values, whether permission or auth constraints exist, or what the tool returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the upsert purpose front-loaded and no filler. The trailing country-format sentence reads as a dangling fragment appended to the paragraph rather than integrated, which slightly hurts structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no annotations and no output schema, the definition covers the core upsert behavior and country format but leaves the primary key (site: domain? full URL?) and several fields unexplained. An agent could invoke it, but would be guessing on site formatting and array handling for keywords/competitors.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 8 parameters, so the description must compensate. It only partially does: the country parameter gets a format explanation with examples ("India", "IN", "UK"), and the fields niche/location/country/keywords/competitors are enumerated as stored attributes. Format and expectations for site, notes, and business_name (5 of 8 uncovered) remain undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Save (or update) a site") and adds scope ("your own or a client's"), so the agent knows it's an upsert on a project/site record. Sibling tools like list_projects and scan_site are not named, so differentiation is inferable rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Save (or update)" implies the create-or-modify case and the phrase "so every other tool knows its niche..." hints that this should be called before downstream tools. However, there is no explicit when-not guidance, no prerequisites, and no reference to an alternative tool for reading or deleting projects.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_codebaseA

Scan a local website project (React/Vite, Next.js, Django, plain HTML, etc.): detect framework, routes/pages, meta tags, sitemap/robots, structured data, contact details and external links. Use when the site isn't live yet or to find what to fix in code.

NameRequiredDescriptionDefault
pathYes
max_filesNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full disclosure burden. It is clear that this reads a local filesystem project and what categories of information it derives, which is useful context, but it never states that the operation is read-only, whether it writes anything to disk, or what happens on very large repos beyond the max_files default.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the verb and then the detection list, with the usage cue trailing. The enumeration is long but each item is a distinct signal an agent would care about, so there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the detection list partially compensates by telling the agent what the result will contain. However, for a tool that takes a filesystem path, the missing guidance on path format and on the max_files cap leaves real gaps an agent could hit at call time.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain both parameters. "Local website project" loosely implies that path is a project directory, but no format, relative-vs-absolute guidance, or examples are given, and max_files is never mentioned at all, leaving a 3000-file cutoff undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Scan") and resource ("a local website project") and enumerates the artifacts it extracts: framework, routes/pages, meta tags, sitemap/robots, structured data, contact details, external links. It also distinguishes itself from the live-site sibling by noting it is for projects that aren't live yet.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use when the site isn't live yet or to find what to fix in code" gives a clear selection condition that implicitly separates it from scan_site, which handles live sites. It stops short of naming scan_site explicitly or stating when not to use it, so it is strong context rather than a full routing rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_siteB

Crawl a live website (respects robots.txt, reads sitemap.xml) and return a business profile (name, contact, address, keywords, social profiles), per-page SEO data, broken links and link stats. Results are cached for the other tools.

NameRequiredDescriptionDefault
urlYes
max_pagesNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description does real work: it discloses robots.txt compliance, sitemap.xml discovery, and that results are cached for other tools. It omits important operational traits such as runtime/timeout expectations, whether the crawl is breadth- or depth-limited, handling of JS-rendered sites, and whether caching means repeat calls are free.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense, front-loaded sentence where the crawl action, the governing behaviours, and the returned artefacts each appear in that order. No filler; slightly long clauses are justified by the information they carry.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotations, yet the description still enumerates return contents well enough to plan around (profile fields, per-page SEO, broken links, link stats). The remaining gap is crawl-scope behaviour tied to max_pages and what a cache hit looks like for the caller.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions either parameter. 'url' is obvious from the name, but 'max_pages' (default 30) — the key control over crawl cost and completeness — is left entirely unexplained, so the description fails to compensate for the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb+resource ('Crawl a live website') and enumerates the outputs it produces (business profile, per-page SEO data, broken links, link stats). It doesn't explicitly contrast with near-neighbours like scan_codebase or seo_link_audit, so the sibling differentiation is only inferable from 'live website'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: 'Results are cached for the other tools' hints this is the first-step scan whose output downstream tools consume, but there is no explicit when-to-use/when-not guidance and no named alternative (e.g. scan_codebase for source, recheck_live_links for a re-check).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tracker_addB

Add a backlink opportunity to the tracker. kind: citation | directory | guest_post | resource_page | broken_link | mention | partner | press | profile. status: todo | submitted | pitched | live | rejected.

NameRequiredDescriptionDefault
urlYes
kindYes
siteYes
notesNo
statusNotodo
contactNo

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure and does little with it. It is clearly a write operation, but it never says whether duplicates are rejected or merged, whether the URL is validated, what the tool returns, or whether entries can be undone; only the enum lists add real content.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with the purpose front-loaded and the constrained values listed compactly as pipe-separated sets. No filler, no repetition of the tool name, nothing that could be cut without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter write tool with no annotations and no output schema, the definition covers the core action and the two enum-constrained fields but is silent on return behavior, deduplication, validation, and the meaning of the contact/notes fields. It is callable but an agent would be guessing about side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the schema declares kind and status as bare strings with no enums, so the description's enumerated allowed values for those two parameters add substantial meaning the schema lacks. However, url, site, notes, and contact get no guidance at all — no domain-vs-sitename convention, URL format, or notes/contact intent — so half the surface remains undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Add a backlink opportunity to the tracker', which is immediately distinguishable from tracker_update and tracker_list by the word 'Add'. It does not explicitly contrast itself with siblings like qualify_prospect or tracker_update, but the create-vs-update-vs-list split is inferable from the names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance: nothing says to call this instead of tracker_update, or whether qualify_prospect should precede adding an entry. No prerequisites, no mention of duplicate handling, and no statement about when-status should be set at creation rather than updated later.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tracker_listA

List tracked opportunities, optionally filtered by your site and/or status, with a summary.

NameRequiredDescriptionDefault
siteNo
statusNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It implies a read-only listing operation and mentions that a summary is returned, but it does not disclose pagination, ordering, return shape, permissions, or whether the summary includes counts versus detailed records.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted wording. It efficiently covers the core action, filters, and summary return in one pass.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter list tool with no output schema, the description covers the basic action and filters. However, it omits details about the summary contents and filter value semantics that an agent would need to invoke the tool confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for undocumented parameters. It names both 'site' and 'status' and explains their filtering roles, but it does not state accepted values, matching behavior, or defaults, leaving meaningful ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: list tracked opportunities, with optional site/status filtering and a summary. It distinguishes itself from related siblings like tracker_add and tracker_update by being a read/list operation, though it does not explicitly name an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'List tracked opportunities' and the optional filter fields, but the description does not say when to use this instead of siblings such as find_opportunities or tracker_update. It gives enough context to infer basic use but no explicit exclusions or routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tracker_updateC

Update a tracker entry's status/notes/contact by id.

NameRequiredDescriptionDefault
idYes
notesNo
statusNo
contactNo

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden and does not say whether this is a partial patch or a full overwrite. This matters concretely because notes/status/contact default to empty strings, so an agent cannot tell from the description whether omitting a field clears it. Error behavior for an unknown id and the response shape are also unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the resource and identifier up front and zero filler. It is efficient, though the brevity comes at the cost of the semantics noted elsewhere rather than being genuinely complete.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a small 4-parameter mutation tool, an agent can probably form a call, but with no annotations, no output schema, and zero schema coverage, the definition should explain overwrite semantics and status value expectations. The most consequential behavioral question for this tool is left unanswered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the schema only provides bare titles, so the description must compensate — but it merely restates the parameter names already visible in the schema. It adds no valid status values, no contact format, no notes length/format, and no id provenance (where to obtain it, e.g. from tracker_list).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update a tracker entry') plus the fields affected ('status/notes/contact by id'). It is implicitly distinguishable from tracker_add and tracker_list, though it never names those siblings to confirm the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this instead of tracker_add or tracker_list, no preconditions, and no note that the entry must already exist. The only cue is the verb 'update', leaving the agent to infer everything.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 18 tool updatesv1.2.0
    • First observedadd_custom_directory
    • First observedadd_custom_footprint
    • First observedbuild_submission_kit
    • First observeddraft_outreach
    • First observedfind_opportunities
    • First observedgenerate_schema
    • First observedinternal_link_suggestions
    • First observedlist_projects
    • First observedqualify_prospect
    • First observedrecheck_live_links
    • First observedsave_project
    • First observedscan_codebase
    • First observedscan_site
    • First observedseo_link_audit
    • First observedtracker_add
    • First observedtracker_list
    • First observedtracker_update
    • First observedverify_backlink

TDQS

A3.5/5.0

Scored across 18 tools

Disambiguation5/5

Each tool has a distinct role across scanning, prospecting, outreach, citations, and tracking. Potentially overlapping pairs are clearly differentiated: scan_site handles live sites while scan_codebase handles local projects, and verify_backlink checks one page while recheck_live_links bulk-checks tracked live links.

Naming Consistency4/5

All names use readable snake_case, and most follow a consistent verb_noun pattern. The tracker_add/tracker_update/tracker_list resource-first convention and noun-style names such as seo_link_audit and internal_link_suggestions introduce minor inconsistencies.

Tool Count4/5

Eighteen tools is somewhat above the ideal compact range, but the server covers a broad end-to-end workflow and the tools generally earn their place. It feels comprehensive rather than padded, though the additional technical SEO and schema utilities expand the surface beyond core backlink management.

Completeness4/5

The workflow is well covered from site profiling and opportunity discovery through qualification, outreach drafting, submission assets, tracking, and link verification. Minor lifecycle gaps remain: tracker entries and saved projects cannot be deleted, and custom directories and footprints have add-only management without listing, editing, or removal tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables Claude Desktop to perform advanced web scraping and crawling operations, extracting structured data, analyzing website architectures, and discovering content relationships through natural conversation.
    5
    4
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables Claude to perform full SEO audits on unpublished HTML, Markdown, or Word documents, including keyword analysis, meta tag suggestions, readability scoring, and heading structure validation.
    4 npm
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables MCP clients such as Claude Code, Cursor and Codex to search a 1,245-site backlink library, plan link-building campaigns, build links in the user's own browser by following each site's method, and verify every placement by checking the live hyperlink, anchor text and nofollow status. It also resolves captcha, login and email-code gates in the chat, and re-checks placed links and referring domains over time with spam flags and a disavow file.
    10
    4
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables Claude to operate a local SEO tool through 50 MCP tools for crawling websites, listing and prioritizing issues, checking on-page optimization, measuring Core Web Vitals, researching keywords, viewing ranking data, and generating PDF reports.
    MIT