Skip to main content
Glama
MeruLocal

hemmiles-mcp-server

by MeruLocal

Hemmiles MCP Server

An unofficial, read-only Model Context Protocol server that lets MCP clients (Claude Desktop, MCP Inspector, etc.) query the public hemmiles.com website through structured tools.

Important — what Hemmiles actually is. The site was inspected directly before any code was written. Hemmiles is not an online store. It is the marketing website for Hemmiles, a B2B SaaS "field‑visit / field‑sales management" product (visit planning, route planning, GPS check‑in, photos & notes, follow‑ups, manager dashboard, reports). There is no product catalog, cart, checkout, stock, or customer reviews. This server therefore exposes the site's real capabilities — content, features, pricing, resources, FAQs, and company/contact info — and does not fake e‑commerce actions that the site does not support. See Tool mapping and Known limitations.


Table of contents


Related MCP server: HitKeep

Verified site findings (Stage 1)

Check

Result

GET /products.json (Shopify probe)

Next.js 404 (__next_error__, /_next/static/…) → not Shopify / WooCommerce

Platform

Next.js (App Router), React Server Components streamed into server‑rendered HTML

robots.txt

Allow: /, Disallow: /api/ for all agents → the server never requests /api/

sitemap.xml

Index → pages.xml, markets.xml, resources.xml (~31 canonical pages)

Root /

HTTP 307 geo‑redirect to a locale (e.g. /in); redirects must be followed

Locales

global, in, us, gb, ca, au, nz, ie, sg, ae, za

Structured data

Rich JSON‑LD on every page: SoftwareApplication (name, featureList, offers[]), Organization (email, contact points), WebPage, FAQPage, BreadcrumbList

Pricing

Per user / month, locale‑specific currency (e.g. India ₹3,500 / US $39 Starter). Monthly + annual billing in offers[].priceSpecification[]

Reliability

Intermittent ECONNRESET (rate‑limiting) → retry/backoff + conservative throttling required

Because content and pricing are delivered as JSON‑LD inside server‑rendered HTML, plain fetch is sufficient — Playwright is not used.

Architecture

  • TypeScript + Node 18+, ESM.

  • Official MCP SDK (@modelcontextprotocol/sdk), tools registered with registerTool (Zod input + output schemas, annotations, structuredContent).

  • stdio transport by default (for Claude Desktop); optional Streamable HTTP (HEMMILES_TRANSPORT=http).

  • HemmilesClient — the single network gateway:

    • SSRF‑safe: HTTPS only, host allowlisted to hemmiles.com, every redirect hop re‑validated, /api/ refused.

    • Resilient: per‑request timeout (AbortController), retry with exponential backoff on transient errors (ECONNRESET / 5xx / 429), manual redirect following.

    • Conservative rate limiting (serialized requests with a configurable minimum interval) + in‑memory TTL cache.

  • product-normalizer — pure, JSON‑LD‑first extraction (via cheerio), unit‑tested with fixtures.

  • No secrets, no credentials, no writes, no transactions.

Tools

All tools are read‑only (readOnlyHint: true) and support response_format: "markdown" | "json". Locale defaults to the server's configured locale (in out of the box).

Tool

Purpose

hemmiles_list_pages

Enumerate site pages by section (from the live sitemap).

hemmiles_get_page

Full normalized content of one page: title, description, headings, breadcrumbs, links, JSON‑LD types, body text.

hemmiles_search_site

Keyword search across pages (slug + deep full‑text), ranked, with snippets & pagination.

hemmiles_list_features

The product's capabilities from SoftwareApplication.featureList, linked to feature pages.

hemmiles_get_pricing

Subscription plans for a market: price, currency, unit, user limits, monthly/annual billing.

hemmiles_list_resources

Guides, blog posts, docs/help hubs.

hemmiles_get_faqs

FAQ Q&A from a page's FAQPage JSON‑LD (pricing page has a detailed set).

hemmiles_get_company_info

Organization data: name, site, logo, support email, contact points.

hemmiles_get_policies

Security / privacy / terms / legal / cookies pages that actually exist.

hemmiles_get_contact_options

Official demo / contact / sales links + support email (the safe alternative to cart/checkout).

Tool mapping

How the original e‑commerce brief maps onto this SaaS site:

Brief tool

Status

Implemented as

search_products

✅ remapped

hemmiles_search_site

get_product_details

✅ remapped

hemmiles_get_page

list_categories

✅ remapped

hemmiles_list_pages

get_featured_products

✅ remapped

hemmiles_list_features

get_product_price

✅ remapped

hemmiles_get_pricing

get_store_information

✅ remapped

hemmiles_get_company_info

get_return_policy / get_shipping_information

⚠️ partial

hemmiles_get_policies — no shipping/returns exist for a digital SaaS; billing/trial terms are in hemmiles_get_faqs. Documented, not faked.

get_product_reviews

❌ not implemented

No public reviews/testimonials in the site's structured data.

check_product_availability

❌ not implemented

No stock/inventory concept (SaaS). Plan availability is reflected in hemmiles_get_pricing (availability field).

add_to_cart, get_cart, remove_from_cart, create_checkout_link

❌ not implemented

No cart or checkout exists. Use hemmiles_get_contact_options to reach the official demo/sales flow. The server never performs transactions or submits forms.

Install & build

Requires Node.js ≥ 18.

npm install
npm run build

This compiles TypeScript to dist/, with the entry point at dist/index.js.

Run

# stdio (default)
npm start

# Streamable HTTP on :3000 (POST JSON-RPC to /mcp)
HEMMILES_TRANSPORT=http PORT=3000 npm start

# Development (auto-reload, no build needed)
npm run dev

# Explore interactively with the MCP Inspector
npm run inspector

Startup logs go to stderr only, so the stdio JSON‑RPC stream stays clean.

HTTP endpoints

When running with HEMMILES_TRANSPORT=http, the following informational endpoints are served alongside MCP (which stays on POST /mcp):

Method & path

Returns

GET /

HTML landing page (overview, endpoints, tool list, markets) — open it in a browser

GET /health, GET /healthz

Liveness JSON {status:"ok", version, uptimeSeconds, …}

GET /version

Version/protocol JSON

GET /.well-known/mcp.json

Discovery doc (transport, endpoint, tool names)

POST /mcp

MCP JSON-RPC (Streamable HTTP)

curl http://localhost:3001/health
# {"status":"ok","name":"hemmiles-mcp-server","version":"1.0.0",
#  "transport":"http","locale":"in","uptimeSeconds":6,"mcpEndpoint":"/mcp"}

Open http://localhost:3001/ in a browser to see the landing page. (stdio transport has no HTTP endpoints; its health is simply that the process is running and tools/list responds.)

Connect to Claude Desktop

  1. npm install && npm run build.

  2. Open Claude Desktop → Settings → Developer → Edit Config (this opens claude_desktop_config.json).

  3. Add the server using the absolute path to the compiled entry point, then restart Claude Desktop.

Windows (this machine's path):

{
  "mcpServers": {
    "hemmiles": {
      "command": "node",
      "args": ["C:\\Users\\Hp\\Desktop\\Hemmiles_MCP\\dist\\index.js"],
      "env": {
        "HEMMILES_DEFAULT_LOCALE": "in"
      }
    }
  }
}

macOS / Linux (adjust the path):

{
  "mcpServers": {
    "hemmiles": {
      "command": "node",
      "args": ["/absolute/path/to/Hemmiles_MCP/dist/index.js"],
      "env": { "HEMMILES_DEFAULT_LOCALE": "us" }
    }
  }
}

After restarting, the 🔌 tools menu will list the hemmiles_* tools.

Configuration

All environment variables are optional (no secrets required). See .env.example.

Variable

Default

Meaning

HEMMILES_TRANSPORT

stdio

stdio or http

PORT

3000

HTTP transport port

HEMMILES_DEFAULT_LOCALE

in

Default market (global,in,us,gb,ca,au,nz,ie,sg,ae,za)

HEMMILES_TIMEOUT_MS

20000

Per‑request timeout (1000–60000)

HEMMILES_MAX_RETRIES

3

Retries for transient errors (0–5)

HEMMILES_MIN_REQUEST_INTERVAL_MS

600

Minimum spacing between requests

HEMMILES_CACHE_TTL_SECONDS

300

In‑memory cache TTL (0 disables)

HEMMILES_USER_AGENT

hemmiles-mcp-server/1.0 …

Outbound User‑Agent

Example conversations

Discover and price:

User: What does Hemmiles do, and how much is it in India? Claude: (calls hemmiles_list_features → Visit planning, Route planning, GPS check‑in, Photos & notes, Follow‑ups, Offline mode, Manager dashboard, Reports; then hemmiles_get_pricing {locale:"in"}) Hemmiles is field‑visit software… India pricing is Starter ₹3,500, Professional ₹4,500, Enterprise ₹8,000 per user/month (annual billing is cheaper), with a 14‑day free trial.

Research a capability:

User: Does it work without signal? Show me the details. Claude: (hemmiles_search_site {query:"offline"} → features/offline-mode, then hemmiles_get_page {path:"features/offline-mode"}) Yes — Offline mode lets reps keep working without signal and syncs later…

Get in touch:

User: How do I get a demo? Claude: (hemmiles_get_contact_options) Book a demo at https://hemmiles.com/in/demo, or email hello@hemmiles.com. (The server only returns official links; it doesn't submit anything for you.)

Example tool calls

MCP tools/call request and the resulting structuredContent (abridged, verified against the live site):

// hemmiles_get_pricing
{ "name": "hemmiles_get_pricing", "arguments": { "locale": "in", "response_format": "json" } }
// → structuredContent:
{
  "url": "https://hemmiles.com/in/pricing",
  "locale": "in",
  "currency": "INR",
  "plans": [
    { "name": "Starter plan", "price": "3500", "priceCurrency": "INR",
      "unit": "per user per month", "minUsers": 3, "maxUsers": 10,
      "availability": "https://schema.org/InStock",
      "billing": [ { "name": "Monthly billing", "price": "3500" },
                   { "name": "Annual billing",  "price": "2900" } ] }
    // … Professional, Enterprise
  ]
}
// hemmiles_search_site
{ "name": "hemmiles_search_site",
  "arguments": { "query": "offline", "locale": "in", "limit": 3, "response_format": "json" } }
// → results[0]: { "url": ".../in/features/offline-mode", "section": "features",
//                 "score": 19, "title": "Offline mode for field teams in India", "snippet": "…" }
// hemmiles_get_company_info  →  { "name": "Hemmiles", "email": "hello@hemmiles.com",
//   "url": "https://hemmiles.com", "contactPoints": [ { "contactType": "sales", "url": ".../demo" } ] }

Testing

npm test        # unit tests (no network): validation, SSRF, normalizer, formatting
npm run typecheck

The unit tests use HTML fixtures whose structure mirrors the live site (JSON‑LD with numeric prices, array priceSpecification, FAQPage, Organization) but with test values. SSRF/robots rejections are asserted to happen before any network call.

Security & compliance

  • Read‑only. No writes, purchases, sign‑ins, form submissions, or transactions.

  • robots.txt respected. /api/ is never requested.

  • SSRF‑hardened. HTTPS + hemmiles.com only; every redirect hop re‑validated; arbitrary‑URL fetching is impossible.

  • No sensitive logging. No credentials exist; request logs avoid bodies.

  • Rate‑limited & cached to be a good citizen of the site.

  • Unofficial and not affiliated with Hemmiles.

Known limitations

  • Not an e‑commerce integration — no products/cart/checkout/reviews/stock, because the site has none. See Tool mapping.

  • Pricing reflects the publicly displayed list price only (monthly + annual as published); negotiated/promo pricing isn't exposed.

  • Search ranks by keyword relevance across titles/descriptions/slugs/body; deep full‑text fetching is bounded (MAX_SEARCH_FETCH) to limit load, so very long‑tail matches on huge sites could be capped (the site is small, ~31 canonical pages).

  • Content changes on the live site can change returned text; schema types are stable but values are live.

  • Relies on the site's JSON‑LD; if a page omits structured data, tools fall back to DOM parsing and may return less detail.

Troubleshooting

Symptom

Fix

NETWORK / TIMEOUT errors

The site rate‑limits and occasionally resets connections. Retry; the client already backs off. Raise HEMMILES_TIMEOUT_MS / HEMMILES_MAX_RETRIES.

NOT_FOUND

The path doesn't exist for that locale. Use hemmiles_list_pages / hemmiles_search_site to find valid paths, or try locale:"global".

DISALLOWED_PATH

You asked for a robots‑blocked path (e.g. /api/…). This is intentional and cannot be overridden.

Server not visible in Claude Desktop

Ensure npm run build ran, the args path is absolute and uses escaped backslashes on Windows, then fully restart Claude Desktop.

Empty pricing plans

A locale page may lack offer JSON‑LD; the tool returns the page URL so you can view it directly.

Project structure

Hemmiles_MCP/
├── package.json
├── tsconfig.json
├── .env.example
├── .gitignore
├── LICENSE
├── README.md
├── src/
│   ├── index.ts                  # entry point + transport selection
│   ├── server.ts                 # wires config → client → tools
│   ├── config.ts                 # env configuration
│   ├── constants.ts              # hosts, locales, page list, limits
│   ├── schemas/product.ts        # Zod input + output schemas
│   ├── services/
│   │   ├── hemmiles-client.ts    # SSRF-safe fetch, retry, rate limit, cache
│   │   ├── product-normalizer.ts # pure JSON-LD / HTML extraction
│   │   └── sitemap.ts            # sitemap discovery + fallback
│   ├── tools/
│   │   ├── index.ts  pages.ts  search.ts  features.ts
│   │   ├── pricing.ts  resources.ts  store.ts  helpers.ts
│   └── utils/
│       ├── errors.ts  validation.ts  format.ts
└── tests/
    ├── fixtures.ts
    ├── validation.test.ts  normalizer.test.ts
    ├── client.test.ts  format.test.ts

License

MIT — see LICENSE.

Available Tools

10 tools
hemmiles_get_company_infoGet Hemmiles company infoA
Read-onlyIdempotent

Return Hemmiles' public company and contact information, parsed from the site's Organization JSON-LD: name, website, logo, support email, description, social profiles, and structured contact points (support, sales, etc.).

This is the brief's "get_store_information" for a SaaS vendor.

Args:

  • locale (optional): which market's page to read (org data is global; default: server locale).

  • response_format ('markdown'|'json').

Returns JSON: { name, url, logo, email, description, sameAs:[], contactPoints:[{ contactType, email, telephone, url }] }.

Example: "How do I contact Hemmiles?" / "Who makes Hemmiles?".

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNoMarket locale/region. One of: global, in, us, gb, ca, au, nz, ie, sg, ae, za. 'global' uses the locale-less canonical pages. Defaults to the server's configured locale.
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
logoNo
nameNo
emailNo
sameAsNo
descriptionNo
contactPointsNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare this as a read-only, idempotent, non-destructive open-world operation. The description adds valuable context beyond those annotations: the data is public, parsed from Organization JSON-LD, and the organization data is global even when a locale is supplied.

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 purpose and return shape, then moves through args and examples efficiently. It is appropriately sized, though the line identifying it as the brief's "get_store_information" is internal meta-context that does not help an agent select or invoke the tool.

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 simple read-only tool with no required parameters, full schema coverage, annotations, and an output schema, the description is complete. It covers the source, return shape, locale behavior, and example use cases, leaving no critical gap for correct invocation.

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 100%, so both parameters are already well documented in the input schema. The description adds only a small amount of meaning, mainly clarifying that locale selects the market page while the organization data itself is global; otherwise it largely echoes the 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 states a specific verb and resource: return Hemmiles' public company and contact information parsed from Organization JSON-LD, and it enumerates the fields returned. It is clear what the tool does, but it does not explicitly distinguish itself from sibling tools such as hemmiles_get_contact_options, which likely overlaps with the contact-points portion.

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 through example questions like "How do I contact Hemmiles?" and "Who makes Hemmiles?", which gives the agent useful triggers. However, it does not state when to prefer this tool over alternatives, especially hemmiles_get_contact_options, nor does it provide exclusions.

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

hemmiles_get_contact_optionsGet Hemmiles contact & demo optionsA
Read-onlyIdempotent

Return the official, supported ways to engage with Hemmiles: the sales/demo request page, the general contact page, and the support email — assembled from the site's Organization contact points and known pages.

Why this instead of cart/checkout: Hemmiles has no online store, cart, or self-serve checkout, so the brief's add_to_cart / get_cart / remove_from_cart / create_checkout_link tools are not implemented. This tool is the safe, legitimate alternative — it only returns official links and never performs any transaction or submits any form.

Args:

  • locale (optional): market prefix for the page links (default: server locale).

  • response_format ('markdown'|'json').

Returns JSON: { email?, demoUrl, contactUrl, pricingUrl, salesContactUrl?, note }.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNoMarket locale/region. One of: global, in, us, gb, ca, au, nz, ie, sg, ae, za. 'global' uses the locale-less canonical pages. Defaults to the server's configured locale.
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
emailNo
demoUrlYes
contactUrlYes
pricingUrlYes
salesContactUrlNo

TDQS

A4/5.0
Behavior4/5

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

Beyond the readOnly/idempotent/openWorld annotations, the description discloses that it only returns official links, never performs transactions, and never submits forms. It also explains that results are assembled from Organization contact points and known pages, adding useful provenance.

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 purpose and includes a useful rationale for the cart/checkout alternative. It is somewhat verbose in repeating return fields and argument details already covered by structured data.

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?

Given the rich annotations, full schema coverage, and an output schema, the description supplies everything needed: purpose, alternative context, safety behavior, parameters, and return fields. No material gap remains for an agent selecting or invoking it.

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 100%, so the schema already fully documents locale and response_format. The description repeats their meaning but adds little parameter-specific detail beyond what the schema provides.

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: returning Hemmiles' official sales/demo, contact, and support email options. It is clear what the tool does, but it does not explicitly distinguish itself from sibling tools such as hemmiles_get_company_info or hemmiles_get_policies.

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 clear usage context by positioning the tool as the legitimate alternative to cart/checkout tools that do not exist for Hemmiles. It does not, however, explain when to choose this over the many Hemmiles informational siblings.

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

hemmiles_get_faqsGet Hemmiles FAQsA
Read-onlyIdempotent

Return the frequently-asked-questions published on a Hemmiles page, parsed from its FAQPage JSON-LD. The pricing page in particular carries detailed FAQs (billing, user minimums, trials, etc.).

Args:

  • path (string, default 'pricing'): page to read FAQs from (path or full URL).

  • locale (optional): market prefix for a bare path.

  • response_format ('markdown'|'json').

Returns JSON: { url, total, faqs: [{ question, answer }] }.

Example: "What are Hemmiles' pricing FAQs?" -> path='pricing'.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoPage to read FAQs from (default 'pricing'); a path or full hemmiles.com URL.pricing
localeNoMarket locale/region. One of: global, in, us, gb, ca, au, nz, ie, sg, ae, za. 'global' uses the locale-less canonical pages. Defaults to the server's configured locale.
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
faqsYes
totalYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and open-world semantics, so the description adds context on data provenance (parsed from JSON-LD) and the return shape. It does not mention behavior when a page lacks FAQ markup, which is the one remaining disclosure gap.

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, followed by args and a return shape and example. Slight redundancy between the description's args block and the schema, but nothing is wasted or padded.

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 an output schema, rich annotations, and full param coverage, the description covers what an agent needs to call it. Only the empty/no-FAQ-result case is unaddressed, a minor omission given the structured richness.

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 100%, so all three parameters are already documented. The description restates path and locale semantics ('market prefix for a bare path') with little that isn't in the schema, meriting the baseline 3.

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+resource ('Return the frequently-asked-questions published on a Hemmiles page') and names the parsing source (FAQPage JSON-LD), which distinguishes it cleanly from siblings like get_page, get_pricing, and get_policies.

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?

Gives concrete usage context (pricing page carries detailed billing/user-minimum/trial FAQs) and a worked example mapping a natural question to path='pricing'. It stops short of naming alternatives or stating when to prefer get_page over this tool.

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

hemmiles_get_pageGet a Hemmiles pageA
Read-onlyIdempotent

Fetch a single hemmiles.com page and return its normalized content: title, description, headings, breadcrumbs, in-page links, the detected JSON-LD schema types, and the main body text.

This is the detail view — the brief's "get_product_details" — adapted to a SaaS marketing site. For pricing use hemmiles_get_pricing; for FAQs use hemmiles_get_faqs.

Args:

  • path (string): page path (e.g. 'features/route-planning', 'product') OR a full https://hemmiles.com URL.

  • locale (optional): market prefix for a bare path (default: server locale). Ignored for full URLs.

  • response_format ('markdown'|'json').

Returns JSON: { url, path, locale, title, description, headings:[{level,text}], breadcrumbs:[], jsonldTypes:[], links:[{text,href}], text }.

Error handling:

  • NOT_FOUND if the page does not exist — use hemmiles_list_pages / hemmiles_search_site to find valid paths.

  • DISALLOWED_PATH for robots-blocked paths such as /api/...

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPage path (e.g. 'pricing', 'features/gps-check-in') or a full https://hemmiles.com/... URL.
localeNoMarket locale to prefix onto a bare path. Ignored if a full URL is given.
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
pathYes
textNo
linksNo
titleNo
localeYes
headingsNo
breadcrumbsNo
descriptionNo
jsonldTypesNo

TDQS

A4.4/5.0
Behavior4/5

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

Goes beyond the annotations (which already declare readOnly/idempotent/non-destructive/open-world) by documenting the error taxonomy — NOT_FOUND and DISALLOWED_PATH for robots-blocked routes like /api/ — plus the rule that locale is ignored when a full URL is passed. Minor flaw: it says 'Returns JSON' while response_format permits 'markdown', leaving the actual return shape slightly ambiguous.

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 summary, then a correctly separated Args block and error-handling block — easy to scan. It loses a point for restating parameter meanings already present in the schema, which is the only real redundancy.

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?

Covers the full burden for this tool: what is fetched, how paths resolve, output shape, and failure modes with recovery paths. Since an output schema exists and 100% of parameters are schema-documented, nothing an agent needs in order to call this correctly is missing.

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 100% and the descriptions already state the path-or-URL behavior, the locale-ignored-for-full-URLs rule, and the response_format enum. The Args block largely restates those facts, so the description adds little semantic value beyond the schema; baseline 3 applies.

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 ('Fetch a single hemmiles.com page') and immediately enumerates what comes back: title, description, headings, breadcrumbs, links, JSON-LD types, body text. It also positions itself against siblings by naming the pricing and FAQ equivalents, so an agent can distinguish it without opening another schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent: pricing goes to hemmiles_get_pricing, FAQs to hemmiles_get_faqs, and NOT_FOUND conditions point to hemmiles_list_pages / hemmiles_search_site for discovering valid paths. Both the when-to-use and the recovery alternatives are stated rather than implied.

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

hemmiles_get_policiesGet Hemmiles policiesA
Read-onlyIdempotent

Fetch Hemmiles' publicly available policy pages (security, privacy, terms, legal, cookies) and return their summaries.

Important: Hemmiles is a digital SaaS subscription, so there is NO shipping policy and NO product return/refund policy in the e-commerce sense (the brief's get_shipping_information / get_return_policy do not apply). Billing, trial, and cancellation terms are covered by pricing FAQs (hemmiles_get_faqs) and the terms page when present. This tool reports only the policy pages that actually exist; missing ones are listed as unavailable.

Args:

  • topic ('all'|'security'|'privacy'|'terms'|'legal'|'cookies', default 'all').

  • locale (optional): market prefix (falls back to the global page if the localized one is absent).

  • response_format ('markdown'|'json').

Returns JSON: { note, found: [{ topic, url, title, description, excerpt }], unavailable: string[] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoWhich policy to fetch.all
localeNoMarket locale/region. One of: global, in, us, gb, ca, au, nz, ie, sg, ae, za. 'global' uses the locale-less canonical pages. Defaults to the server's configured locale.
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
foundYes
unavailableYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds genuinely new behavior: only pages that actually exist are reported, missing ones are surfaced in an 'unavailable' list, and locale lookup falls back to the global page.

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-loads the purpose and the important negative scope before the argument details. Some redundancy between the Args block and the schema, and the reference to 'the brief' is meta, but overall it is tight and scannable.

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?

Output schema exists and the description still summarizes the return shape (note, found entries with url/title/description/excerpt, unavailable list), so an agent knows exactly what to expect. Nothing about invocation or failure modes is left unclear.

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 100% with three enums, so the schema already fully documents topic, locale, and response_format. The description's Args block largely restates those enums and the locale fallback rule that the schema already states, adding only the 'all' default framing.

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 ('Fetch Hemmiles' publicly available policy pages') and enumerates the exact topic set, which distinguishes it from siblings like hemmiles_get_page and hemmiles_list_pages. It also routes the agent away from irrelevant policy types by declaring what does not exist.

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

Usage Guidelines5/5

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

Explicitly says the e-commerce shipping and return policy tools do not apply, and names hemmiles_get_faqs as the alternative for billing, trial, and cancellation terms. That is both a when-to-use and a when-not-to-use with a named sibling.

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

hemmiles_get_pricingGet Hemmiles pricingA
Read-onlyIdempotent

Get Hemmiles subscription pricing for a market, parsed from the pricing page's schema.org Offer data.

Pricing is per user per month and varies by locale/currency (for example, India is billed in INR, the US in USD). Always pass the locale you care about.

Args:

  • locale (optional): market to price (default: server locale). One of global/in/us/gb/ca/au/nz/ie/sg/ae/za.

  • response_format ('markdown'|'json').

Returns JSON: { url, locale, currency, summary, plans: [{ id, name, price, priceCurrency, unit, description, url }] }.

Example: "How much is Hemmiles in India?" -> locale='in'. Note: this reports the publicly displayed list price only; it does not include negotiated, annual-discount, or promotional pricing beyond what the page states.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNoMarket whose pricing to return (e.g. 'in' for INR, 'us' for USD).
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
plansYes
localeYes
summaryNo
currencyNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive), yet the description still adds real value: the upstream source is schema.org Offer markup on the public pricing page, and it explicitly scopes results to publicly displayed list price, excluding negotiated, annual-discount, and promotional pricing. That is exactly the kind of caveat an agent needs before quoting a price.

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 purpose sentence, then args, return shape, example, and caveat in a predictable order. The Args block largely restates the schema enums verbatim, which is mild redundancy, but nothing is truly wasted.

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?

Even though an output schema exists, the description summarizes the return payload (url, locale, currency, plans array) and, more importantly, states the coverage limitation of the data. An agent can decide whether to call it and how to present the result without further inference.

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 100% and both params have enums, so the baseline is 3. The description adds meaning beyond the schema: the default is the server locale, currency varies per market, and the example maps a natural-language question to a specific enum value.

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 ('Get Hemmiles subscription pricing for a market') plus the data source ('parsed from the pricing page's schema.org Offer data'). No sibling tool covers pricing, so the resource alone separates it from list_pages, list_features, get_policies, etc.

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?

Gives a concrete triggering example ('How much is Hemmiles in India?' -> locale='in') and an explicit instruction ('Always pass the locale you care about'). It does not name a sibling alternative or state when-not to use it, but no sibling is a close substitute for pricing questions.

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

hemmiles_list_featuresList Hemmiles product featuresA
Read-onlyIdempotent

List the Hemmiles product's capabilities (the "featured" items on a SaaS site), taken from the site's SoftwareApplication JSON-LD feature list and linked to each feature's dedicated page when one exists.

Args:

  • locale (optional): market whose feature-page URLs to return (default: server locale).

  • response_format ('markdown'|'json').

Returns JSON: { total, features: [{ name, url? }] }. Typical features include Visit planning, Route planning, GPS check-in, Photos & notes, Follow-ups, Offline mode, Manager dashboard, Reports.

Example: "What can Hemmiles do?" / "List Hemmiles features".

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNoMarket locale/region. One of: global, in, us, gb, ca, au, nz, ie, sg, ae, za. 'global' uses the locale-less canonical pages. Defaults to the server's configured locale.
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
featuresYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real context beyond that: the underlying source (site JSON-LD), the optional URL linkage to per-feature pages, and the return shape. Remaining gaps (rate limits, freshness) are minor for a read-only listing.

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 purpose, then Args, Returns, and example queries in clean sections. The list of typical feature names is somewhat illustrative padding, but it does convey the domain vocabulary, so it largely earns its space.

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 only 2 optional params, an output schema present, and full annotation coverage, this is close to complete. The description reinforces the return shape and data provenance, leaving little an agent would need beyond it.

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 100%, with both parameters enum-documented and described, so the baseline is 3. The description's one-line restatement of locale ('market whose feature-page URLs to return') adds slight interpretive value but nothing the schema does not already carry.

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 gives a specific verb ('List') and resource ('Hemmiles product's capabilities / featured items'), and pins down the data source (SoftwareApplication JSON-LD feature list) with the linkage rule for dedicated pages. This is clearly distinguishable from siblings like hemmiles_list_pages or hemmiles_list_resources, which are page/resource inventories rather than the product's feature set.

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 through example user queries ('What can Hemmiles do?' / 'List Hemmiles features'), which helps an agent recognize trigger phrasing. However, there is no explicit statement about when NOT to use this tool or which sibling to prefer for adjacent queries (e.g., company info vs. features).

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

hemmiles_list_pagesList Hemmiles pagesA
Read-onlyIdempotent

List the public pages of hemmiles.com, grouped by section, as discovered from the site's sitemap.

Hemmiles is field-visit / field-sales SaaS (not an online store), so this returns marketing and documentation pages — the closest equivalent to "categories". Sections include: home, product, pricing, features, teams, integrations, security, resources, docs, help, guides, blog, company.

Args:

  • section (string, optional): restrict to one section (e.g. 'features').

  • locale ('global'|'in'|'us'|'gb'|'ca'|'au'|'nz'|'ie'|'sg'|'ae'|'za', optional): which market's URLs to return; defaults to the server's locale.

  • response_format ('markdown'|'json'): output format (default markdown).

Returns JSON: { total, count, sections: string[], pages: [{ url, path, section, locale }] }.

Examples:

  • "What pages does Hemmiles have?" -> no args.

  • "List the feature pages" -> section='features'.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNoMarket locale/region. One of: global, in, us, gb, ca, au, nz, ie, sg, ae, za. 'global' uses the locale-less canonical pages. Defaults to the server's configured locale.
sectionNoFilter to one section, e.g. 'features', 'teams', 'guides', 'blog', 'pricing'.
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
pagesYes
totalYes
sectionsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish that this is a safe, idempotent, open-world read, so the description doesn't need to repeat that. It does add real context beyond the annotations: the data source is the sitemap, results are marketing/docs pages rather than commerce categories, and locale defaults to the server's configured market.

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 purpose, then args, return shape, and examples in a scannable order with no filler. It is slightly longer than strictly necessary given the schema already documents all three params, but every line carries information.

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?

The tool is simple (3 optional params, 0 required), annotations cover the safety profile, and an output schema exists, so the return-shape sentence is a bonus rather than a necessity. The one gap is that the overlap with hemmiles_list_features and hemmiles_get_page is not resolved for the agent.

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?

With 100% schema description coverage the baseline is 3, but the description adds value beyond the schema by giving example section values, explaining that 'global' corresponds to locale-less canonical pages, and showing intent-to-argument mappings in the examples.

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 (list public pages of hemmiles.com, grouped by section, sourced from the sitemap) and enumerates the sections returned. It also pre-empts a likely confusion by explaining that Hemmiles is field-sales SaaS, not a store, so pages are the closest thing to 'categories'.

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 examples map natural user intents to concrete argument choices ('What pages does Hemmiles have?' -> no args; 'List the feature pages' -> section='features'), which is strong guidance. However, it never mentions when to prefer siblings such as hemmiles_list_features (which overlaps with section='features'), hemmiles_get_page, or hemmiles_search_site.

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

hemmiles_list_resourcesList Hemmiles resourcesA
Read-onlyIdempotent

List Hemmiles resource content: guides, blog posts, and the resources/docs/help hubs, as discovered from the sitemap.

Args:

  • kind ('all'|'guides'|'blog'|'resources'|'docs'|'help', default 'all').

  • locale (optional): market whose URLs to return (default: server locale).

  • response_format ('markdown'|'json').

Returns JSON: { total, count, pages: [{ url, path, section, locale, title? }] }.

Example: "What guides does Hemmiles have?" -> kind='guides'.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhich resource section to list: all, guides, blog, resources, docs, or help.all
localeNoMarket locale/region. One of: global, in, us, gb, ca, au, nz, ie, sg, ae, za. 'global' uses the locale-less canonical pages. Defaults to the server's configured locale.
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
pagesYes
totalYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new context: results are sitemap-derived (implying potential gaps in coverage) and it documents the return payload shape. It omits freshness/caching behavior and any rate-limit notes, keeping 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 description is front-loaded with purpose, then follows a predictable Args/Returns/Example structure with no filler prose. The Args block duplicates enum values already fully specified in the schema, which is some wasted space, but overall it is tight and scannable.

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 zero-required-parameter listing tool with an output schema, the description covers purpose, scoping, defaults and an invocation example, so an agent could call it correctly. The missing piece is positioning against hemmiles_list_pages and hemmiles_search_site, which matters given nine sibling tools.

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?

With 100% schema description coverage, the schema already documents all three enums and defaults, and the description largely restates them verbatim. The only added value is the locale parenthetical (default: server locale) and the question-to-kind example, which is marginal beyond the 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 first line states a specific verb and resource ('List Hemmiles resource content') and enumerates the exact sections covered: guides, blog posts, resources/docs/help hubs. It also discloses the source of truth ('as discovered from the sitemap'). It does not explicitly contrast itself with the close sibling hemmiles_list_pages, so differentiation is inferred from the section enumeration 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 Guidelines4/5

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

The worked example ('What guides does Hemmiles have?' -> kind='guides') gives concrete guidance on how to translate a user question into a call, and the kind filter defines the scoping choices. There is no explicit when-not-to-use guidance or pointer to hemmiles_list_pages / hemmiles_search_site for broader or keyword-based needs.

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

hemmiles_search_siteSearch Hemmiles siteA
Read-onlyIdempotent

Search hemmiles.com for pages matching a keyword query.

Because Hemmiles is a SaaS marketing site (no shopping catalog), this searches content pages — features, teams/use-cases, guides, blog posts, docs, pricing, etc. — rather than purchasable products.

Args:

  • query (string): keywords to match (2–100 chars).

  • section (string, optional): restrict to one section (e.g. 'guides', 'features').

  • locale (optional): market whose URLs to return (default: server locale).

  • deep (boolean, default true): fetch page bodies for full-text matches + snippets. Set false for a fast slug-only match.

  • limit (1–50, default 20), offset (default 0): pagination.

  • response_format ('markdown'|'json').

Returns JSON: { query, total, count, offset, has_more, next_offset?, results: [{ url, path, section, title, score, snippet }] }.

Examples:

  • "offline" -> finds features/offline-mode and the offline-first blog post.

  • "medical reps" with section='teams'.

Note: results are ranked by keyword relevance in titles, descriptions, slugs and body text; scores are relative, not absolute.

ParametersJSON Schema
NameRequiredDescriptionDefault
deepNoIf true, fetch page bodies for full-text matching and snippets (slower). If false, match slugs only.
limitNoMaximum number of results to return (1–50).
queryYesKeyword(s) to search for across Hemmiles pages.
localeNoMarket locale/region. One of: global, in, us, gb, ca, au, nz, ie, sg, ae, za. 'global' uses the locale-less canonical pages. Defaults to the server's configured locale.
offsetNoNumber of results to skip, for pagination.
sectionNoRestrict search to one section.
response_formatNoOutput format: 'markdown' (human-readable) or 'json' (structured).markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
queryYes
totalYes
offsetYes
resultsYes
has_moreYes
next_offsetNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, but the description adds substantive behavior beyond them. It explains that deep=true fetches page bodies for full-text matching and snippets, that results are ranked by keyword relevance across titles, descriptions, slugs, and body text, and that scores are relative rather than absolute.

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 then organized into Args, Returns, Examples, and Note sections. It is appropriately detailed for a seven-parameter search tool, though the return-shape description and per-parameter recaps partly duplicate the schema/output schema.

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?

Given the moderate complexity, rich annotations, 100% schema description coverage, and presence of an output schema, the description is complete enough for an agent to select and invoke the tool correctly. It covers purpose, parameter behavior, examples, pagination, ranking semantics, and return format.

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 100%, so the schema already documents all seven parameters. The description still adds useful meaning, especially that locale controls which market's URLs are returned, that deep=false performs a fast slug-only match, and that section can restrict results to areas like 'guides' or 'features'.

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: 'Search hemmiles.com for pages matching a keyword query.' It also distinguishes the tool from catalog/product search by explaining that Hemmiles is a SaaS marketing site and this searches content pages such as features, guides, blog posts, docs, and pricing.

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 is clear from the keyword-search framing, the deep=false fast slug-only option, and examples like '"offline"' and '"medical reps" with section="teams"'. It does not explicitly compare against siblings such as list_pages or get_page, but the intended search use case is understandable.

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. 10 tool updatesv1.0.0
    • First observedhemmiles_get_company_info
    • First observedhemmiles_get_contact_options
    • First observedhemmiles_get_faqs
    • First observedhemmiles_get_page
    • First observedhemmiles_get_policies
    • First observedhemmiles_get_pricing
    • First observedhemmiles_list_features
    • First observedhemmiles_list_pages
    • First observedhemmiles_list_resources
    • First observedhemmiles_search_site

TDQS

A4.1/5.0

Scored across 10 tools

Disambiguation4/5

Each tool maps to a distinct slice of the site (pages, search, features, pricing, resources, FAQs, policies, contact, company info), and descriptions explicitly cross-reference each other (e.g. get_page points to get_pricing/get_faqs). The only residual overlap is that get_page can return much of what get_pricing, get_faqs, and get_policies would, and get_company_info vs get_contact_options both surface contact data, but the guidance is clear enough that an agent can choose correctly.

Naming Consistency5/5

All ten tools use the same prefixed verb_noun snake_case pattern (hemmiles_get_*, hemmiles_list_*, hemmiles_search_*), with get_ for single-resource fetch, list_ for collections, and search_ for queries used consistently and semantically. No mixed conventions or casing deviations.

Tool Count5/5

Ten tools is well within the ideal 3-15 range and each corresponds to a real, non-redundant surface of a marketing/docs site. Nothing feels padded; each tool earns its place.

Completeness4/5

The surface covers discovery (list_pages, list_resources), retrieval (get_page), search, and the key content verticals (features, pricing, FAQs, policies, contact, company info), which is essentially full lifecycle for a read-only site server. Minor gaps: no way to enumerate integrations or teams/use-case pages as first-class lists, and no direct docs/help retrieval beyond get_page.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Read-only MCP server for aggregate HitKeep analytics and official documentation, including traffic, events, goals, funnels, ecommerce, Search Console, and AI visibility reporting.
    16
    98
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server for the public EasyHire job board. Enables searching job openings, retrieving full postings, filtering by criteria, and listing countries with open roles.
    MIT