Skip to main content
Glama

LeadIntel

Free, open-source, local-first Model Context Protocol (MCP) server and Python library for AI-powered business intelligence and B2B lead generation.

License: MIT Python 3.11+ MCP Built with uv

LeadIntel empowers AI assistants — such as Claude Desktop, Google Antigravity, and other MCP-compatible clients — to discover businesses, audit websites, benchmark competitors, evaluate deterministic lead scores, run local AI strategic insights via Ollama, export publication-grade multi-sheet Excel spreadsheets, and generate executive business intelligence reports.


Core Principles

  • 100% Free & Open-Source: Licensed under the permissive MIT License.

  • Local-First Architecture: No mandatory paid APIs, no mandatory API keys, no billing accounts, and no subscriptions.

  • Deterministic Lead Scoring: Transparent, evidence-based scoring models (0–100) that distinguish verified gaps from unavailable information without arbitrary penalties.

  • Strict Privacy: Zero telemetry, zero cloud AI exfiltration. Optional AI uses local Ollama instances (http://localhost:11434).

  • Ethical & Compliant: Adheres to OpenStreetMap ODbL 1.0 licensing, respects website robots.txt rules, prevents private personal data harvesting, and provides comprehensive SSRF and path traversal protections.


Related MCP server: Golddigger MCP Server

Architecture

LeadIntel is structured into clean, decoupled layers:

graph TD
    Client["MCP Clients (Claude Desktop / Antigravity / Cursor)"] --> MCP["LeadIntel MCP Server (stdio transport)"]

    subgraph "LeadIntel Tools (13 Registered MCP Tools)"
        T1["search_businesses"]
        T2["get_business_details"]
        T3["find_business_website"]
        T4["analyze_website"]
        T5["check_seo"]
        T6["find_social_profiles"]
        T7["find_competitors"]
        T8["compare_businesses"]
        T9["score_lead"]
        T10["generate_business_insights"]
        T11["generate_outreach"]
        T12["generate_business_report"]
        T13["export_leads"]
    end

    MCP --> T1 & T2 & T3 & T4 & T5 & T6 & T7 & T8 & T9 & T10 & T11 & T12 & T13

    subgraph "Core Services & Providers"
        P_OSM["OpenStreetMap / Overpass Provider"]
        P_Demo["Offline Demo Provider"]
        S_Web["Website Analyzer & Robots Checker"]
        S_SEO["Custom 0-100 SEO Auditor"]
        S_Social["Social Media Profile Extractor"]
        S_Comp["Competitor Taxonomy & Benchmarking Engine"]
        S_Score["Deterministic 100-pt Lead Scoring Engine"]
        S_Ollama["Local AI Service (Ollama HTTP Client)"]
        S_Export["OpenPyXL Multi-Sheet Excel & CSV Exporter"]
        S_Report["Executive Report Generator (MD / HTML / JSON)"]
    end

    T1 & T2 & T3 --> P_OSM & P_Demo
    T4 & T5 & T6 --> S_Web & S_SEO & S_Social
    T7 & T8 --> S_Comp
    T9 --> S_Score
    T10 & T11 --> S_Ollama
    T12 --> S_Report
    T13 --> S_Export

Registered MCP Tools

LeadIntel provides 13 registered MCP tools:

#

Tool Name

Description

Key Inputs

1

search_businesses

Discover local businesses via OpenStreetMap / Overpass API with automatic demo fallback

query, location, category, limit

2

get_business_details

Retrieve full coordinates, address, and contact details for a specific business

business_id

3

find_business_website

Discover and verify official websites using search heuristics and OSM tags

business_name, location, category

4

analyze_website

Audit web availability, HTTPS, SSL validity, viewport, headings, and broken links

url, check_broken_links

5

check_seo

Deterministic 100-point on-page SEO audit (titles, metas, H1s, alt tags, robots.txt, sitemaps)

url

6

find_social_profiles

Extract verified official profiles (LinkedIn, X/Twitter, Facebook, Instagram, YouTube, Pinterest)

url

7

find_competitors

Discover geographically and categorically relevant industry competitors

business_name, business_category, city, state

8

compare_businesses

Side-by-side benchmark comparison between target business and industry rivals

target_business, competitors

9

score_lead

Deterministic 100-point lead qualification assessing website quality, SEO, social, and mobile gaps

business_name, website_analysis, seo_audit, social_profiles

10

generate_business_insights

Local AI business analysis, opportunity explanations, and service recommendations via Ollama

business_name, lead_score_data, website_analysis

11

generate_outreach

Local AI multi-channel outreach pitches (Cold Email, LinkedIn connection, WhatsApp message)

business_name, service_focus, contact_name

12

generate_business_report

Multi-format executive intelligence report (Markdown, styled HTML, or JSON) across 12 sections

business_info, lead_score_data, output_format

13

export_leads

Search and export leads to multi-sheet formatted Excel (.xlsx), CSV, or JSON

query, location, format, output_path


Requirements

  • Python: 3.11 or newer

  • uv: Modern, high-speed Python package manager (install uv)

  • Operating System: macOS, Linux, or Windows

  • (Optional) Ollama: Locally installed Ollama for local AI features


Installation

# 1. Clone the repository
git clone https://github.com/example/leadintel.git
cd leadintel

# 2. Sync dependencies using uv
uv sync

# 3. Create environment configuration (optional)
cp .env.example .env

MCP Client Configuration

Claude Desktop Setup

Add LeadIntel to your Claude Desktop configuration file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "leadintel": {
      "command": "uv",
      "args": [
        "--directory", "/ABSOLUTE/PATH/TO/leadintel",
        "run", "leadintel-server"
      ]
    }
  }
}

Google Antigravity Setup

Add LeadIntel to your Antigravity project configuration:

{
  "mcpServers": {
    "leadintel": {
      "command": "uv",
      "args": [
        "--directory", "/ABSOLUTE/PATH/TO/leadintel",
        "run", "leadintel-server"
      ],
      "env": {
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

Optional Local AI Setup (Ollama)

LeadIntel includes zero-cost, local AI capabilities via Ollama:

# 1. Install and start Ollama
ollama serve

# 2. Pull a recommended lightweight model
ollama pull llama3

# 3. Enable in .env
OLLAMA_ENABLED=true
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3

Privacy Guarantee: All prompts are sent exclusively to your local loopback interface (http://localhost:11434). No business data or prompt information is sent to third-party cloud providers.


Usage Examples

1. Discover Businesses & Export to Multi-Sheet Excel

Ask your AI assistant:

"Search for dental clinics in Austin, TX and export them to an Excel workbook."

Or invoke the tool directly:

await mcp.call_tool("export_leads", {
    "query": "dental clinic",
    "location": "Austin, TX",
    "format": "excel",
    "limit": 20
})

The resulting Excel workbook includes 7 dedicated worksheets:

  1. Dashboard Summary: Aggregate KPI cards, lead priority distribution, and industry mix.

  2. Business Leads: Address, contact information, phone, email, website, and data attribution.

  3. Website Audit: Availability, HTTPS status, load time, mobile viewport, and contact forms.

  4. Competitor Intelligence: Local competitors, category specialization, and confidence metrics.

  5. Lead Scoring: Overall 100-pt score, priority tier, and evidence completeness percentage.

  6. AI Insights: Executive summaries and strategic service opportunities.

  7. Outreach: Multi-channel draft templates for emails, LinkedIn, and WhatsApp.

2. Website & SEO Diagnostic Audit

"Audit the website and technical SEO health for https://example.com."

# Analyze technical performance and structure
website_data = await mcp.call_tool("analyze_website", {"url": "https://example.com"})

# Perform 0-100 technical SEO evaluation
seo_data = await mcp.call_tool("check_seo", {"url": "https://example.com"})

3. Generate Executive Business Intelligence Report

"Create a comprehensive business research report for Apex Solar in Denver, CO in HTML format."

report_html = await mcp.call_tool("generate_business_report", {
    "business_info": {
        "name": "Apex Solar Solutions",
        "category": "Solar Energy Equipment",
        "city": "Denver",
        "state": "CO",
        "website": "https://apexsolar.example"
    },
    "output_format": "html"
})

Screenshots Placeholder

+--------------------------------------------------------------------------+
|                       LeadIntel Dashboard (Excel Export)                 |
+--------------------------------------------------------------------------+
|  Total Businesses: 50  |  High Priority: 14  |  Avg Lead Score: 72/100   |
+--------------------------------------------------------------------------+
|  [Sheet 1: Dashboard] [Sheet 2: Leads] [Sheet 3: Website Audit] ...      |
+--------------------------------------------------------------------------+
|  (Interactive screenshots will be published with the v0.1 release)       |
+--------------------------------------------------------------------------+

Security & Ethical Safeguards

  • SSRF & DNS Rebinding Mitigation: Strict validation against loopback, private subnets (RFC 1918), carrier-grade NAT (RFC 6598), and cloud instance metadata (169.254.169.254, fd00:ec2::254, metadata.google.internal). All HTTP redirects are validated before being followed.

  • Path Traversal Protection: Export file paths are sanitized against traversal sequences (..), null bytes, and sensitive system directories (/etc, /usr, ~/.ssh).

  • Spreadsheet Formula Injection Prevention: Cell contents starting with =, +, -, @, \t, or \r are sanitized with leading text escapes.

  • HTML Injection Defense: Stored XSS defense using strict entity escaping across all dynamic fields in HTML executive reports.

  • ODbL License Attribution: Data retrieved from OpenStreetMap contributors is attributed in accordance with the Open Database License.


Limitations

  • Search Coverage: Business discovery relies on OpenStreetMap and Nominatim data, which may vary in coverage density depending on geographic region and country.

  • On-Page Technical SEO: The check_seo tool evaluates on-page technical factors and source standards. It does not replicate proprietary search engine ranking algorithms or backlinks.

  • Deterministic Lead Scoring: Lead scores evaluate observable digital presence gaps to identify service opportunities. They do not predict commercial budget or purchasing authority.


License

LeadIntel is free and open-source software licensed under the MIT License. OpenStreetMap data is © OpenStreetMap contributors licensed under the Open Database License (ODbL 1.0).

Available Tools

13 tools
analyze_websiteA
    Analyze a business website for technical readiness, structure, and contacts.

    Performs non-invasive examination of the target website:
    - HTTP/HTTPS status and SSL verification.
    - Title, meta description, and mobile viewport configuration.
    - H1/H2 heading hierarchy and image alt tag presence.
    - Public email addresses, telephone numbers, and contact forms.
    - Linked social media profiles.
    - Sampled check for broken internal links.

    Security & Compliance:
    - Respects robots.txt directives before scraping.
    - Protects against SSRF (blocks localhost, private networks, cloud metadata).
    - Enforces request timeouts and max page size limits.
    - Does not scrape private or sensitive personal info.

    Args:
        url: The target website URL (e.g. 'https://example.com').
        check_broken_links: If True, spot-checks up to 10 internal links for broken status (default: True).

    Returns:
        Structured diagnostic dictionary.
    
NameRequiredDescriptionDefault
urlYes
check_broken_linksNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/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 does so well: it declares the examination is non-invasive, honors robots.txt, blocks SSRF targets (localhost, private nets, metadata), and enforces timeouts and page-size caps. What it still omits is the read-only guarantee stated outright and any rate-limit or failure-mode behavior for unreachable sites.

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 one-line summary is front-loaded, then grouped bullets for scope, a security block, and an Args block. The bulleted inventory is longer than strictly necessary but each item maps to real work the tool performs, so little is wasted.

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 read audit with an output schema present, the description covers scope, safety posture, and both inputs. The return value is legitimately left to the output schema, so the only shortfall is the absent routing guidance against overlapping siblings.

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?

Schema coverage is 0%, so the description must compensate and largely does: the Args block gives a URL format example and explains that check_broken_links spot-checks up to 10 internal links. The 'up to 10' cap is genuine added meaning beyond the schema's bare boolean; only minor gaps (URL normalization, scheme handling) remain.

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 first line gives a concrete verb and resource ('Analyze a business website') followed by an enumerated scope (SSL, meta, headings, contacts, socials, broken links). It is clear what the tool does, but it never distinguishes itself from the overlapping sibling check_seo or find_social_profiles, which a reader could otherwise confuse with this sweep.

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 — an agent can infer this is the pre-outreach technical audit step, but there is no explicit when-to-use statement, no prerequisites, and no pointer to alternatives like check_seo when only SEO data is needed. The default-on broken-link check is the only decision guidance offered.

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

check_seoA
    Run a technical on-page SEO audit on a business website.

    Evaluates fundamental search engine optimization signals:
    - Missing or duplicate title tags and length bounds.
    - Missing or suboptimal meta descriptions.
    - Missing H1 or multiple H1 heading tags.
    - Missing image alt attributes and overall image alt coverage percentage.
    - Canonical URL link specification.
    - Meta robots directives (noindex/nofollow).
    - Availability of robots.txt and sitemap.xml.
    - Open Graph tags for social preview readiness.
    - Internal link count and page weight.

    Output:
    - SEO score from 0 to 100.
    - Detailed checklist breakdown.
    - Specific prioritized issues (errors, warnings, info).
    - Actionable recommendations.

    Notice:
    This is an on-page technical SEO diagnostic tool and not an official
    Google ranking assessment or proprietary PageRank score.

    Args:
        url: The target website URL (e.g. 'https://example.com').

    Returns:
        Structured SEO audit report.
    
NameRequiredDescriptionDefault
urlYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/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 does well: it enumerates every signal checked, discloses the 0-100 scoring plus prioritized errors/warnings/info, and sets an explicit expectation about what the score is not. It omits operational traits an agent would want — that it fetches the live page, how long it takes, and whether results are cached or rate-limited.

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 purpose is front-loaded and the bulleted checklist is scannable and well organized. There is redundancy between the 'Output' bullet list and the 'Returns' line ('Structured SEO audit report'), and the Args/Returns sections are stock docstring boilerplate that the schema already provides.

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

Completeness5/5

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

For a single-parameter diagnostic tool with an output schema, the description supplies everything essential: what is evaluated, what the score means, what the report contains, and the key limitation. Only minor operational details are absent, and the output schema covers return-value structure.

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% on the single url parameter, so the description must compensate; it adds a format hint via the example 'https://example.com' and the phrase 'target website URL'. It says nothing about whether scheme, trailing paths, subdomains, or non-resolving URLs are accepted, so the semantics are only partially filled in.

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 line states a specific verb and resource ('Run a technical on-page SEO audit on a business website') and the nine-item checklist pins down the scope precisely. It never names the sibling analyze_website or explains how this differs from it, so the agent must infer the boundary between a general website analysis and this SEO-specific audit.

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?

The 'Notice' clarifies a when-not ('not an official Google ranking assessment or proprietary PageRank score'), which prevents misuse as a ranking predictor. However, there is no explicit guidance on when to pick this over analyze_website or other siblings, and no stated prerequisites such as whether the site must be publicly reachable or HTML-based.

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

compare_businessesB
    Compare a target business against a list of competitor businesses.

    Benchmarks organizations across critical digital and operational dimensions:
    - Website availability & response time
    - Technical SEO score (0-100)
    - HTTPS/SSL security configuration
    - Mobile viewport readiness
    - Social media footprint (channels active)
    - Contact accessibility (forms, direct email, direct phone)
    - Public reviews and ratings where available

    Outputs:
    - Structured comparison table matrix
    - High-confidence strengths
    - Critical digital weaknesses
    - High-leverage growth opportunities
    - Executive competitive positioning summary

    Args:
        target_business: Dict representing target company. Must include 'name', optional 'website', 'category', 'city'.
        competitor_businesses: List of dicts representing competitor companies to benchmark against.

    Returns:
        Comprehensive competitive intelligence comparison report.
    
NameRequiredDescriptionDefault
target_businessYes
competitor_businessesYes

Output Schema

NameRequiredDescription

No output parameters

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 carries the full burden and does disclose the analysis dimensions and delivered artifacts (strengths, weaknesses, opportunities, positioning summary). It omits operational traits an agent would want: whether it performs live crawling, expected latency or cost, and any limits on competitor count.

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

Conciseness3/5

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

The bulleted dimension list is front-loaded and earns its space, but the Outputs block duplicates a return value already covered by the output schema, and the Args section restates what the schema requires. Some trimming would sharpen it.

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 nested-object tool with an output schema, the description gives enough on inputs and analytical scope to call it correctly. What is missing is practical guidance on how many competitors to pass and what depth of object fields are expected.

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?

Schema coverage is 0% and the schema is a bare object with additionalProperties, so the description's note that target_business must include 'name' with optional 'website', 'category', 'city' is genuinely load-bearing. Competitor dict fields are left unspecified, presumably assumed to match the target shape.

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 first sentence states a specific verb and resource: benchmarking a target business against a list of competitors. The enumerated dimensions make the scope unambiguous, though it never explicitly distinguishes itself from siblings like find_competitors or score_lead.

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 statement of when to use this versus find_competitors, score_lead, or generate_business_report, and no preconditions (e.g. that competitors must already be identified). Usage is only inferable from the name and the word 'benchmark'.

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

export_leadsA
    Search for businesses and export results to an Excel (.xlsx), CSV, or JSON file.

    Features:
    - Excel: Creates a multi-sheet workbook with frozen headers, auto-filters, and clean styling.
    - CSV: Standard tabular spreadsheet export.
    - JSON: Complete structured lead metadata with timestamps and attribution.

    Args:
        query: Free-text search term (e.g. 'cafe', 'software').
        location: City, region, or coordinates.
        category: Industry or category filter.
        limit: Max number of leads to export (1-200, default 50).
        format: 'excel' (or 'xlsx'), 'csv' (default), or 'json'.
        output_path: Destination file path (optional).

    Returns:
        Dict containing output_path, row_count, format, and data attribution.
    
NameRequiredDescriptionDefault
limitNo
queryYes
formatNocsv
categoryNo
locationNo
output_pathNo

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full behavioral burden. It does disclose the return dict keys (output_path, row_count, format, attribution) and what each format physically produces, but it never states where files land when output_path is omitted, whether existing files are overwritten, or that this tool writes to disk at all.

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 opening sentence is front-loaded and the format bullets are genuinely informative about output differences. The Args block duplicates schema field names, but each entry adds at least one detail (ranges, aliases), so little of it is pure repetition.

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 six-parameter tool with no annotations and no output schema, the definition covers purpose, all parameters, and the shape of the return value. What is missing is side-effect detail — default write location and overwrite behavior — which matters for a tool that produces files.

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?

Schema description coverage is 0%, so the description must compensate, and it largely does: every one of the six parameters is explained, the 1-200 limit range and default 50 are added beyond the bare schema, and the 'excel'/'xlsx' alias plus default 'csv' are clarified. Remaining gap is output_path, described only as 'optional' with no default-location or overwrite semantics.

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 pair of actions (search businesses, export results) and the concrete artifact produced (xlsx/csv/json file), which an agent can grasp immediately. It does not explicitly distinguish itself from the sibling search_businesses, leaving the boundary between 'search and view' and 'search and export' implicit.

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 word 'export' and the format list, so an agent can infer this is the tool for producing files. However, there is no explicit when-to-use statement, no mention that search_businesses should be preferred for interactive lookups, and no guidance on choosing between formats beyond a one-word gloss.

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

find_business_websiteA
    Find and verify the official website of a business.

    Searches local knowledge providers and free web search (no paid API key required).
    Filters out directories, social media links, and aggregators to isolate the primary domain.

    Args:
        business_name: Name of the business (e.g. 'Blue Bottle Coffee', 'Acme Corp').
        location: Optional location context (e.g. 'San Francisco', 'London').
        business_id: Optional unique LeadIntel/OSM ID (e.g. 'osm_node_123', 'demo_001').

    Returns:
        Dict containing:
          - found (bool): True if an official website was identified
          - business_name (str): Input business name
          - location (str|null): Input location
          - website (str|null): Discovered website URL
          - discovery_method (str): Method used ('provider:openstreetmap', 'duckduckgo_lite', etc.)
          - note (str|null): Informative status note
    
NameRequiredDescriptionDefault
locationNo
business_idNo
business_nameYes

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 full burden and discloses real behavior: the discovery sources, the exclusion of directories/social/aggregators to isolate a primary domain, and the discovery_method field that tells the caller how the result was obtained. It omits failure/ambiguity handling (e.g., multiple candidate domains) and any latency or rate-limit expectations, which keeps it short of a 5.

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 opening sentence is front-loaded with the purpose, followed by mechanism, then structured Args/Returns blocks. The parameter listing duplicates the schema's property names, but given 0% schema coverage that repetition is functional rather than wasteful.

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?

With no output schema, the Returns block is genuinely necessary and covers each returned field including the nullable website and the discovery_method enum-like values. What is missing is guidance on the disambiguation path (what happens on multiple or zero matches) and parameter precedence, given a modest 3-parameter tool.

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?

Schema description coverage is 0%, so the description must compensate, and it does: all three parameters are documented with concrete examples ('Blue Bottle Coffee', 'San Francisco', 'osm_node_123'). It does not explain how business_id interacts with business_name or whether one takes precedence, nor how location constrains the search.

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 states a specific verb and resource ('Find and verify the official website of a business') and sharpens the scope by explaining that directories, social links, and aggregators are filtered out. That filtering detail alone makes it distinguishable from sibling tools like find_social_profiles and analyze_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?

There is some useful context (it uses local knowledge providers plus free web search, so no paid API key is required), which implies it is the cheap first step before analyze_website. However, it never explicitly says when to prefer this over its siblings, when not to use it, or what to do if the name is ambiguous.

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

find_competitorsA
    Discover and analyze competitors of a target business.

    Finds industry rivals using OpenStreetMap and semantic taxonomy rules.
    Distinguishes direct competitors (exact specialization overlap) from
    indirect competitors (broader category overlap), explaining confidence levels.

    Features:
    - Filters out unrelated businesses (does not mistake mere geographical proximity for competition).
    - Identifies competitor websites, contact info, ratings, and reviews.
    - Analyzes digital presence (website status, mobile readiness, social media footprint).
    - Zero paid API keys required; respects OpenStreetMap ODbL attribution.

    Args:
        business_name: Name of the target business (e.g. 'Acme Tech Solutions', 'Blue Bottle Coffee').
        business_category: Industry/category of the business (e.g. 'Software Development', 'Cafe').
        city: Optional city (e.g. 'San Francisco', 'London').
        state: Optional state/province (e.g. 'CA', 'TX').
        country: Optional country (e.g. 'US', 'UK').
        website: Optional target company website URL.
        max_competitors: Maximum competitors to return (1-20, default 5).
        enrich_websites: If True, tests competitor websites for availability and digital channels.

    Returns:
        Structured competitor research report.
    
NameRequiredDescriptionDefault
cityNo
stateNo
countryNo
websiteNo
business_nameYes
enrich_websitesNo
max_competitorsNo
business_categoryNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/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 full load and does so reasonably: it discloses the data source (OpenStreetMap), the ODbL attribution obligation, that no paid API keys are needed, that geographically proximate but unrelated businesses are filtered out, and that confidence levels are reported. It leaves gaps around cost/latency (enrich_websites implied to perform live website tests), behavior when the business is not found, and that it is a read-only operation.

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

Conciseness3/5

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

Front-loaded with a good one-line summary, but it then reverts to a docstring with a Features bullet list, an Args block and a Returns line, and several bullets (websites, contact info, ratings) restate what the Args section already conveys. Structure is legible but padded relative to the information gained.

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?

An output schema exists and the description defers to it appropriately ("Structured competitor research report"), so the main burden is inputs and behavior, both covered across 8 parameters. What is missing is minor but real: how city/state/country combine for geocoding, and whether business_category materially improves direct-vs-indirect matching.

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

Parameters5/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 and largely does: every one of the 8 parameters is addressed with meaning or an example, including the 1-20 range and default of max_competitors, which is not encoded anywhere in the schema, and the effect of enrich_websites (tests competitor sites for availability and digital channels). Examples are given for business_name, business_category, city, state 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?

Opens with a specific verb+resource pair ("Discover and analyze competitors of a target business") and then narrows it further by explaining direct vs indirect competitor logic and the OpenStreetMap/taxonomy basis. Sibling tools like search_businesses and compare_businesses are never named, so an agent must infer the boundary itself, which keeps it short of a 5.

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: the description explains what the tool produces and gives argument examples, so an agent can guess this is the discovery step before compare_businesses or score_lead. There is no explicit when-to-use / when-not-to-use statement, no mention of what must already exist (e.g. a known business_name), and no routing to alternatives.

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

find_social_profilesA
    Extract verified official social media profiles from a business website.

    Discovers:
    - LinkedIn (company / personal)
    - Facebook
    - Instagram
    - Twitter / X
    - YouTube
    - Pinterest

    Filters out share/dialog widgets, intent links, and irrelevant external domains.

    Security & Privacy:
    - Prevents SSRF attacks.
    - Respects robots.txt rules.
    - Only extracts publicly linked B2B / official brand profiles.

    Args:
        url: The business website URL (e.g. 'https://acme.example').

    Returns:
        Dict containing detected profiles by platform and total count.
    
NameRequiredDescriptionDefault
urlYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/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 full behavioral burden and discloses meaningful traits: SSRF prevention, robots.txt compliance, filtering of share widgets and intent links, and scope limited to public B2B/official brand profiles. It stops short of covering rate limits, timeout behavior, or failure modes.

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 core purpose and uses short bulleted lists for platforms and security behavior. The Args and Returns sections are somewhat redundant given the input schema and output schema, but the overall structure remains easy to scan.

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

Completeness5/5

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

For a one-parameter extraction tool, the description supplies purpose, platform coverage, filtering behavior, security constraints, and the URL argument example. An output schema exists, so return-value details need not be extensive, and the description is complete enough to call the tool correctly.

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?

Schema description coverage is 0%, so the description must compensate for the single url parameter. It does so by defining url as the business website URL and giving an example like 'https://acme.example', adding useful meaning beyond the bare 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?

The description clearly states a specific verb and resource: extracting verified official social media profiles from a business website, with an explicit list of platforms. It distinguishes the task from generic website analysis by focusing on social profile discovery, though it does not explicitly contrast itself with sibling tools like analyze_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 by the stated goal of discovering social profiles on a business site. However, there is no explicit when-to-use guidance, no exclusions, and no routing to alternatives such as analyze_website or find_business_website.

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

generate_business_insightsA
    Generate evidence-based strategic business insights using local Ollama AI.

    Synthesizes technical audits, competitor benchmarks, and lead scores to provide:
    - Executive summary of digital maturity
    - Clear explanations for digital marketing and SEO opportunities
    - Strategic interpretation of the deterministic lead score
    - Grounded competitor insights
    - Actionable service recommendations (Web Dev, SEO, Social, Marketing)

    Ethical & Operational Safeguards:
    - Connects to local Ollama (http://localhost:11434). Zero cloud AI calls or tokens used.
    - Grounded strictly in provided evidence; never invents revenue, budgets, or purchasing intent.
    - If Ollama is not installed or running, returns a clean informative error without crashing.

    Args:
        business_name: Name of the business (required).
        business_category: Industry/category description.
        website_analysis: Results from analyze_website tool (optional).
        seo_audit: Results from check_seo tool (optional).
        social_profiles: Results from find_social_profiles tool (optional).
        competitor_comparison: Results from compare_businesses tool (optional).
        lead_score_data: Results from score_lead tool (optional).
        contact_info: Available contact details (optional).
        model: Optional Ollama model override (default: configured OLLAMA_MODEL, e.g. 'llama3').

    Returns:
        Structured AI insights grounded in verified facts.
    
NameRequiredDescriptionDefault
modelNo
seo_auditNo
contact_infoNo
business_nameYes
lead_score_dataNo
social_profilesNo
website_analysisNo
business_categoryNo
competitor_comparisonNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/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 does substantial work: it discloses the local Ollama endpoint (http://localhost:11434), that no cloud AI calls or tokens are used, that output is grounded and will not invent revenue or purchasing intent, and that a missing Ollama returns a clean error rather than crashing. What is missing is latency/throughput expectations and determinism, both material for an LLM-backed tool an agent may chain.

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

Conciseness3/5

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

The opening sentence and safeguards are front-loaded and earn their place, but the output bullet list overlaps the Returns line and the Args block restates the schema's parameter names. Some phrasing is redundant ('Zero cloud AI calls or tokens used' says the same thing twice). Docstring boilerplate ('Args:', 'Returns:') leaks into the agent-facing text.

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?

An output schema exists, so the brief Returns line is proportionate. For a nine-parameter generative tool with zero annotation coverage, the description covers privacy posture, evidence grounding, and failure behavior, which is most of what an agent needs. The remaining gap is workflow ordering relative to the sibling analysis tools and expected runtime.

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?

Schema coverage is 0% and all nine parameters are bare typed objects, so the description is the only source of meaning. Its Args block supplies provenance for each optional payload ('Results from compare_businesses tool') and marks required vs optional, plus the model default. It does not describe the internal shape of the evidence objects, so the agent must know what those sibling tools return.

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: generating evidence-based strategic business insights via local Ollama, and enumerates the concrete outputs (executive summary, SEO opportunities, lead score interpretation, recommendations). It clearly implies synthesis across the audit tools rather than outreach or reporting. It stops short of naming the closest siblings (generate_business_report, generate_outreach), so an agent must infer 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 Guidelines3/5

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

Usage is only implied: each optional argument is annotated as 'Results from analyze_website tool', 'Results from check_seo tool', etc., which sketches a pipeline order without stating it. There is no explicit when-to-use vs generate_business_report or generate_outreach, and no when-not guidance. The one operational exclusion present is the Ollama-not-running case, which is a failure mode rather than a selection rule.

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

generate_business_reportA
    Generate a comprehensive 12-section business intelligence report.

    Synthesizes technical audits, SEO evaluations, social presence scans,
    competitor benchmarks, lead scores, and optional AI strategic insights.

    Report Sections:
    1. Executive Summary
    2. Business Overview
    3. Digital Presence Assessment
    4. Website Technical Audit
    5. SEO Analysis
    6. Social Media Analysis
    7. Competitor Benchmarking
    8. Lead Qualification & Scoring
    9. Identified Digital Opportunities
    10. Recommended Service Packages
    11. Suggested Multi-Channel Outreach
    12. Data Sources, Attributions & Limitations

    Features:
    - Works completely offline without AI or external paid APIs.
    - Outputs in Markdown, HTML, or structured JSON.
    - Accurately references OpenStreetMap ODbL attributions.

    Args:
        business_info: Dict containing at least 'name', plus optional 'category', 'city', 'website'.
        website_analysis: Output from analyze_website tool (optional).
        seo_audit: Output from check_seo tool (optional).
        social_profiles: Output from find_social_profiles tool (optional).
        competitor_research: Output from find_competitors tool (optional).
        lead_score_data: Output from score_lead tool (optional).
        ai_insights: Output from generate_business_insights or generate_outreach tool (optional).
        output_format: 'markdown' (default), 'html', or 'json'.

    Returns:
        Dict containing the rendered report content, format, and metadata.
    
NameRequiredDescriptionDefault
seo_auditNo
ai_insightsNo
business_infoYes
output_formatNomarkdown
lead_score_dataNo
social_profilesNo
website_analysisNo
competitor_researchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/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 full burden and does well: it discloses offline operation without AI or paid APIs, supported output formats, and ODbL attribution handling. Gaps remain on whether the tool is purely computational (no side effects) and how missing optional inputs affect the rendered sections.

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?

Well front-loaded with purpose first, then capabilities, then Args. The 12-item section list is long but earns its place by telling the agent what data to gather; the Features list is slightly padded but short.

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?

A complex 8-parameter aggregator, yet the description covers inputs, formats, offline behavior, and attributions; an output schema exists so return values need only minimal mention. The main omission is guidance on graceful degradation when optional inputs are absent.

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?

Schema description coverage is 0%, so the description must compensate, and it largely does: each of the 8 parameters is explained, business_info's required 'name' plus optional fields are spelled out beyond the permissive schema, and output_format's enum and default are restated. It does not specify the nested shape expected for the analysis payloads, which all accept arbitrary objects.

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 ('Generate a comprehensive 12-section business intelligence report') and enumerates the exact content, so an agent knows precisely what it produces. The 'Synthesizes technical audits, SEO evaluations, social presence scans...' sentence distinguishes it from the sibling tools that produce those individual inputs.

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?

The Args block implicitly defines the pipeline by naming the sibling tool each input comes from (analyze_website, check_seo, find_social_profiles, find_competitors, score_lead, generate_business_insights/generate_outreach), and every input except business_info is marked optional. It lacks an explicit statement of when to prefer this aggregator over calling individual tools, or whether partial inputs yield a degraded report.

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

generate_outreachA
    Generate personalized, multi-channel B2B outreach messages using local Ollama AI.

    Produces ready-to-use drafts across 3 channels:
    - Email pitch: Structured subject line + 3-paragraph value-first pitch referencing verified findings.
    - LinkedIn message: Concise connection request (< 300 characters).
    - WhatsApp Business: Respectful, direct conversational pitch (< 120 words).

    Ethical & Operational Safeguards:
    - Uses local Ollama model (no third-party cloud data transfer).
    - Grounded exclusively in verified technical data.
    - Does not invent fake claims, guarantees, or assume prospect budgets.

    Args:
        business_name: Target company name (required).
        business_category: Business industry/category.
        website_analysis: Results from analyze_website tool (optional).
        seo_audit: Results from check_seo tool (optional).
        social_profiles: Results from find_social_profiles tool (optional).
        competitor_comparison: Results from compare_businesses tool (optional).
        lead_score_data: Results from score_lead tool (optional).
        contact_info: Contact details dictionary (optional).
        agency_name: Your digital agency or company name.
        sender_name: Name of the person/role sending the message.
        model: Optional Ollama model override.

    Returns:
        Dict containing multi-channel outreach drafts.
    
NameRequiredDescriptionDefault
modelNo
seo_auditNo
agency_nameNoOur Agency
sender_nameNoLead Specialist
contact_infoNo
business_nameYes
lead_score_dataNo
social_profilesNo
website_analysisNo
business_categoryNo
competitor_comparisonNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/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 does deliver real value: it discloses the local Ollama model (no third-party data transfer), that output is grounded in verified data, and that it will not fabricate guarantees or budgets. It also sketches the return shape. It omits operational behavior an agent needs, such as expected latency/cost of an LLM call, behavior when all optional inputs are null, and what happens if the Ollama model is unavailable.

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?

Purpose is front-loaded, followed by a scannable per-channel breakdown, then safeguards, then args. Dense but well organized with no filler sentences; the args block earns its space given the schema has no descriptions.

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 an 11-param, annotation-free generation tool with an output schema, the description covers inputs, output shape, data-handling policy, and content constraints. The remaining gap is edge-case behavior (missing optional inputs, model failure) and the fact that the output schema's structure is only vaguely gestured at as 'Dict containing multi-channel outreach drafts'.

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?

Schema description coverage is 0%, so the description must compensate across 11 params, and it does list every one with a short gloss and a required marker. Its biggest contribution is provenance mapping — naming which sibling tool produces website_analysis, seo_audit, social_profiles, competitor_comparison, and lead_score_data — which the schema cannot express. It still leaves the expected shape of those nested objects undefined, so an agent knows where to get them but not what they should contain.

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 ('Generate personalized, multi-channel B2B outreach messages') and enumerates exactly what is produced across three channels, including length constraints. It never explicitly contrasts itself with siblings like generate_business_insights or generate_business_report, so differentiation is implicit 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?

Usage is only implied: tagging inputs as 'Results from analyze_website tool' / 'check_seo' / 'score_lead' sketches a pipeline order without stating when to call this versus the report/insight generators. There is no guidance on required prerequisites, no note that richer optional inputs yield more personalized drafts, and no when-not-to-use case.

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

get_business_detailsA
    Retrieve enriched details for a specific business by ID.

    Looks up the entity across all available providers (OpenStreetMap, demo fixtures).
    If the business is missing a website and `auto_enrich_website` is True,
    attempts to discover its official website.

    Args:
        business_id: Unique identifier (e.g. 'osm_node_12345', 'osm_way_67890', or 'demo_001').
        auto_enrich_website: If True, search for missing official website if not present in OSM tags.

    Returns:
        Dict containing:
          - found (bool): Whether the business was resolved
          - business (dict|null): Enriched business record
          - provider (str): Source of the data
          - attribution (str|null): Mandatory attribution notice if source is OSM
          - enriched_fields (list[str]): Fields added or updated via enrichment

    Compliance:
        - Respects OSM ODbL attribution.
        - Does not scrape private personal information.
    
NameRequiredDescriptionDefault
business_idYes
auto_enrich_websiteNo

TDQS

A3.7/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 does substantial work: it discloses multi-provider resolution (OSM, demo fixtures), the conditional enrichment side behavior, the ODbL attribution obligation, and a privacy constraint against scraping PII. It does not say whether enrichment results are persisted or whether the enrichment call adds latency, which are the remaining behavioral gaps.

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, followed by behavior, args, returns, and compliance in a predictable structure. The Returns and Compliance blocks are justified because no output schema or annotations exist, though the prose is slightly padded.

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

Completeness5/5

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

For a two-parameter read tool with no annotations and no output schema, the description covers purpose, both parameters, the full return shape including attribution and enriched_fields, and compliance obligations. An agent has everything needed to invoke it and interpret the response.

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?

Schema coverage is 0%, so the description must compensate, and it largely does: it gives concrete ID format examples ('osm_node_12345', 'osm_way_67890', 'demo_001') and explains that auto_enrich_website triggers a search only when the website is absent from OSM tags. It omits the default value of true, which the schema does carry.

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 ("Retrieve enriched details for a specific business by ID") and the lookup-by-ID framing distinguishes it from the search_businesses sibling. It stops short of naming siblings explicitly, so the differentiation is implied 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 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 or when-not-to-use guidance, and no routing to alternatives such as search_businesses (to find an ID first) or find_business_website (the dedicated website lookup). The agent must infer the workflow position from the parameter name alone.

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

score_leadA
    Evaluate and score a business lead for digital services suitability.

    Calculates a deterministic 0-100 overall prospect score based on:
    1. Website quality (max 20 pts)
    2. Technical SEO (max 20 pts)
    3. Social media presence (max 15 pts)
    4. Contact accessibility (max 10 pts)
    5. Mobile readiness (max 10 pts)
    6. Digital presence gaps vs competitors (max 15 pts)
    7. Business relevance & localization (max 10 pts)

    Opportunity Analysis:
    Provides specialized opportunity scores (0-100) for:
    - Website Development
    - SEO Services
    - Social Media Management
    - Digital Marketing

    Compliance & Ethics:
    - Missing inputs reduce confidence and evidence completeness, avoiding arbitrary score penalties.
    - Verified defects are separated from missing information.
    - Does not speculate on customer purchasing budget or guarantee conversion.
    - Uses zero paid APIs or tokens.

    Args:
        business_name: Name of the business (required).
        business_category: Industry/category description.
        website_analysis: Results from analyze_website tool (optional).
        seo_audit: Results from check_seo tool (optional).
        social_profiles: Results from find_social_profiles tool (optional).
        competitor_comparison: Results from compare_businesses tool (optional).
        contact_info: Available phone, email, or address dictionary (optional).
        weights: Optional custom weight overrides for the 7 categories.

    Returns:
        Structured lead evaluation report including overall score, priority tier,
        service opportunities, and recommended package.
    
NameRequiredDescriptionDefault
weightsNo
seo_auditNo
contact_infoNo
business_nameYes
social_profilesNo
website_analysisNo
business_categoryNo
competitor_comparisonNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the whole burden. It does usefully disclose that scoring is deterministic, that missing inputs reduce confidence rather than trigger arbitrary penalties, that verified defects are separated from missing data, and that no paid APIs are used; but it never states that the tool is side-effect-free/read-only, nor anything about scoring cost or execution limits.

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 and rubric are front-loaded, and each block (scoring categories, opportunity scores, compliance, args, returns) is clearly separated. The seven-item points breakdown and the compliance bullets are informative rather than filler, though the section headers duplicate what the Args/Returns blocks already imply, so the text is longer than strictly needed.

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?

An output schema exists, so return values need not be spelled out, yet the description still usefully signals that the report includes an overall score, priority tier, service opportunities and a recommended package. For an eight-parameter pure-computation tool with no annotations, the only real omission is the weights key contract and nested input shapes.

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?

Schema description coverage is 0%, so the description must compensate, and it largely does by naming all eight parameters, marking business_name required and the rest optional, and telling the agent which sibling tool produces each input object. The gap is 'weights', which is documented only as 'custom weight overrides for the 7 categories' with no key names or value conventions, even though the schema leaves it as a free-form number map. The expected shapes of the nested analysis objects are likewise undescribed.

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 ('Evaluate and score a business lead') plus the domain ('digital services suitability'), and the rubric makes obvious what the output measures. It never names a sibling, so the agent must infer on its own how this differs from generate_business_insights or generate_business_report.

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?

Usage context is conveyed through the parameter docs: the optional inputs are labelled 'Results from analyze_website tool', 'check_seo tool', 'find_social_profiles tool' and 'compare_businesses tool', which effectively describes an upstream pipeline. There is no explicit when-not or contrast with the report/insight-generation siblings.

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

search_businessesA
    Search for businesses matching a query using free, open data sources.

    Uses OpenStreetMap / Overpass API for live discovery (no API key required).
    Falls back to demo data when the network is unavailable or DEMO_MODE=true.

    Args:
        query:    Free-text search term, e.g. "coffee shop", "software company",
                  "law firm", "restaurant". Pass "*" for a broad sweep.
        location: City, region, or "lat,lon" coordinates to centre the search,
                  e.g. "London", "Austin, TX", "48.8566,2.3522".
                  Required for live OSM search — omitting it falls back to demo data.
        category: Optional industry hint, e.g. "Technology", "Healthcare",
                  "Food & Beverage". Narrows the Overpass tag filter.
        limit:    Maximum results to return (1–50, default 10).

    Returns:
        dict with keys:
          query, location, category  — echoed inputs
          total_found (int)          — number of matching results
          businesses (list[dict])    — business records
          provider (str)             — data source used
          retrieved_at (str)         — ISO-8601 timestamp
          attribution (str|null)     — ODbL attribution (show this when displaying OSM data)
          note (str|null)            — caveat about data quality or mode

    Attribution:
        When provider is "openstreetmap", you MUST display the attribution string
        "Data © OpenStreetMap contributors, ODbL 1.0" wherever results appear.

    Compliance:
        - OpenStreetMap data is used under the ODbL licence.
        - No data is sent to third parties.
        - is_ai_generated=False for all records from this tool.
    
NameRequiredDescriptionDefault
limitNo
queryYes
categoryNo
locationNo

TDQS

A4.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 full burden and does well: it discloses the data source and licence, the degraded demo fallback, the 1-50 result cap, the provider field revealing which mode ran, and a mandatory attribution obligation. It omits rate limits, ordering of results, and latency expectations for a live external API.

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 one-line purpose followed by Args and Returns blocks that are easy to scan. The Returns section is justified because no output schema exists, though the compliance bullet list partially repeats the attribution note already stated above.

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?

Covers what the agent needs: inputs with formats, echoed outputs, provider/mode signaling, caveat note field, and the attribution duty. Only minor gaps remain, such as result ordering and failure handling beyond the demo fallback.

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

Parameters5/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 and does: all four parameters get meaning, worked examples ("coffee shop", "Austin, TX", "48.8566,2.3522"), the "*" wildcard convention, the accepted limit range and default, and the critical fact that omitting location silently degrades to demo data.

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 (search businesses) and names the exact mechanism and data source: live OpenStreetMap/Overpass discovery with a demo-data fallback. An agent can tell this is the discovery entry point rather than a detail/export sibling like get_business_details or export_leads.

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?

Clear operational context: no API key required, demo mode when the network is unavailable, and location is required for live OSM search. It does not, however, explicitly route the agent to siblings (e.g. after finding candidates, use get_business_details or score_lead), so the when-not-to-use side is only implied.

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. 13 tool updatesv0.1.0
    • First observedanalyze_website
    • First observedcheck_seo
    • First observedcompare_businesses
    • First observedexport_leads
    • First observedfind_business_website
    • First observedfind_competitors
    • First observedfind_social_profiles
    • First observedgenerate_business_insights
    • First observedgenerate_business_report
    • First observedgenerate_outreach
    • First observedget_business_details
    • First observedscore_lead
    • First observedsearch_businesses

TDQS

A3.9/5.0

Scored across 13 tools

Disambiguation4/5

Most tools target a clearly distinct stage of the lead-gen pipeline (discover, detail, website, SEO, social, competitors, compare, score, insights, outreach, report). Two overlaps remain: export_leads duplicates search_businesses' search before writing a file, and analyze_website's technical checklist (title, meta, H1, alt tags) substantially overlaps check_seo, so an agent may pick the wrong one for a given question.

Naming Consistency5/5

All 13 tools use snake_case with a leading verb and a clear object (search_businesses, get_business_details, find_social_profiles, generate_business_report). No camelCase mixing or vague standalone verbs; check_seo is the only object-less name but still fits the verb_noun family.

Tool Count5/5

13 tools sits squarely in the well-scoped range, and each maps to a discrete pipeline step rather than a redundant variant. Nothing feels padded, and no stage is split into needless near-duplicates.

Completeness4/5

The surface covers a full workflow from discovery through enrichment, auditing, scoring, AI synthesis, outreach, and report generation, with export as the terminal step. Gaps are minor: no persistence/lead-list management (save, retrieve, update, or dedupe previously scored leads) and no batching, but agents can chain tools to work around both.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI tools to search and enrich B2B leads, including finding professional emails, company profiles, and filtering people and companies by various criteria.
    5
    482 npm
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to search, enrich, and score B2B leads in real time from a database of 10M+ companies.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides tools for lead discovery, company research, email finding, social media search, and CSV export to support AI-driven customer outreach and business development.
    MIT