hemmiles-mcp-server
You can use this read-only MCP server to query the public Hemmiles marketing website for SaaS product, pricing, resource, and company information.
List site pages by section and locale
Fetch normalized content for a specific page
Search the site with ranked snippets and pagination
List Hemmiles product features
Get locale-specific subscription pricing
List guides, blog posts, docs, and help resources
Retrieve FAQs from pages such as pricing
Get company info, support email, and contact points
Retrieve existing policy pages
Get official demo, contact, and sales links
Return results as markdown or JSON; no cart, checkout, reviews, stock, or write actions
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
Tool mapping (vs. the original e‑commerce brief)
Related MCP server: HitKeep
Verified site findings (Stage 1)
Check | Result |
| Next.js 404 ( |
Platform | Next.js (App Router), React Server Components streamed into server‑rendered HTML |
|
|
| Index → |
Root | HTTP 307 geo‑redirect to a locale (e.g. |
Locales |
|
Structured data | Rich JSON‑LD on every page: |
Pricing | Per user / month, locale‑specific currency (e.g. India ₹3,500 / US $39 Starter). Monthly + annual billing in |
Reliability | Intermittent |
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 withregisterTool(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 (viacheerio), 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 |
| Enumerate site pages by section (from the live sitemap). |
| Full normalized content of one page: title, description, headings, breadcrumbs, links, JSON‑LD types, body text. |
| Keyword search across pages (slug + deep full‑text), ranked, with snippets & pagination. |
| The product's capabilities from |
| Subscription plans for a market: price, currency, unit, user limits, monthly/annual billing. |
| Guides, blog posts, docs/help hubs. |
| FAQ Q&A from a page's |
| Organization data: name, site, logo, support email, contact points. |
| Security / privacy / terms / legal / cookies pages that actually exist. |
| 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 |
| ✅ remapped |
|
| ✅ remapped |
|
| ✅ remapped |
|
| ✅ remapped |
|
| ✅ remapped |
|
| ✅ remapped |
|
| ⚠️ partial |
|
| ❌ not implemented | No public reviews/testimonials in the site's structured data. |
| ❌ not implemented | No stock/inventory concept (SaaS). Plan availability is reflected in |
| ❌ not implemented | No cart or checkout exists. Use |
Install & build
Requires Node.js ≥ 18.
npm install
npm run buildThis 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 inspectorStartup 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 |
| HTML landing page (overview, endpoints, tool list, markets) — open it in a browser |
| Liveness JSON |
| Version/protocol JSON |
| Discovery doc (transport, endpoint, tool names) |
| 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
npm install && npm run build.Open Claude Desktop → Settings → Developer → Edit Config (this opens
claude_desktop_config.json).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 |
|
|
|
|
| HTTP transport port |
|
| Default market ( |
|
| Per‑request timeout (1000–60000) |
|
| Retries for transient errors (0–5) |
|
| Minimum spacing between requests |
|
| In‑memory cache TTL (0 disables) |
|
| 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; thenhemmiles_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, thenhemmiles_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 athttps://hemmiles.com/in/demo, or emailhello@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 typecheckThe 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.comonly; 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 |
| The site rate‑limits and occasionally resets connections. Retry; the client already backs off. Raise |
| The path doesn't exist for that locale. Use |
| You asked for a robots‑blocked path (e.g. |
Server not visible in Claude Desktop | Ensure |
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.tsUse as a plugin
This repo ships an Open Plugins component at .mcp.json, so any
MCP client that reads plugin repos can pick the server up directly. It points at
the hosted, read-only endpoint:
{
"mcpServers": {
"hemmiles": {
"type": "http",
"url": "https://mcp.hemmiles.com/mcp"
}
}
}No API key is required — the server holds no customer data and performs no write actions. To run it yourself instead, see the stdio and HTTP instructions above.
License
MIT — see LICENSE.
Available Tools
10 toolshemmiles_get_company_infoGet Hemmiles company infoARead-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?".
Inputs: locale, response_format. Returns: url, logo, name, email, +3 more
hemmiles_get_contact_optionsGet Hemmiles contact & demo optionsARead-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 }.
Inputs: locale, response_format. Returns: note, email, demoUrl, contactUrl, +2 more
hemmiles_get_faqsGet Hemmiles FAQsARead-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'.
Inputs: path, locale, response_format. Returns: url, faqs, total
hemmiles_get_pageGet a Hemmiles pageARead-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/...
Inputs: path (required), locale, response_format. Returns: url, path, text, links, +6 more
hemmiles_get_policiesGet Hemmiles policiesARead-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[] }.
Inputs: topic, locale, response_format. Returns: note, found, unavailable
hemmiles_get_pricingGet Hemmiles pricingARead-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.
Inputs: locale, response_format. Returns: url, plans, locale, summary, +1 more
hemmiles_list_featuresList Hemmiles product featuresARead-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".
Inputs: locale, response_format. Returns: total, features
hemmiles_list_pagesList Hemmiles pagesARead-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'.
Inputs: locale, section, response_format. Returns: count, pages, total, sections
hemmiles_list_resourcesList Hemmiles resourcesARead-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'.
Inputs: kind, locale, response_format. Returns: count, pages, total
hemmiles_search_siteSearch Hemmiles siteARead-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.
Inputs: query (required), deep, limit, locale, +3 more. Returns: count, query, total, offset, +3 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
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.
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.
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.
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
Related MCP Connectors
Read-only MCP server for The Automators: services, pricing, industries, case studies, calculators.
Read-only MCP server for Flamel.ai's public content: company overview, blog, case studies, FAQs.
Public, read-only MCP server for FarmNeural company facts, packages, and capabilities.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for HeyMax CRM API, providing read-only tools to query pipelines, services, and other CRM data.106 npmMIT
- AlicenseAqualityAmaintenanceRead-only MCP server for aggregate HitKeep analytics and official documentation, including traffic, events, goals, funnels, ecommerce, Search Console, and AI visibility reporting.16105MIT

easyhire-jobsofficial
AlicenseNot gradedqualityCmaintenanceRead-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- FlicenseNot gradedqualityCmaintenanceRemote MCP server of Aureum Technology GmbH (IT service provider, Rodewisch/Vogtland, Germany): company and contact data, service catalogue, current prices and full-text search across aureum-tech.com for AI assistants. Streamable HTTP at https://aureum-tech.com/mcp, read-only, no authentication.-