Koskamo

HeySale MCP

HeySale MCP is a remote server that allows AI assistants to create, configure, and install an AI Website Salesperson on a user's website. It supports tools to generate the salesperson from a URL, check status, retrieve installation scripts, configure settings, and retrieve conversation results and leads.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

HeySale MCP logo, by HeySaleCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by HeySale
You need:Creating and installing needs no credentialsreading results requires the owner's HeySale API key
MCP endpoint (Streamable HTTP)
https://hey.sale/mcp
Vendor documentation

What its tools do

6 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

6 of 6 have a description · 6 of 6 declare behavior hints · 3 of 6 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Create an AI salesperson from a website URL
  • Check the status of a salesperson creation
  • Get the one-line installation script for a website
  • Retrieve conversation transcripts and lead data

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
heysale 1.1.0
MCP protocol negotiated in check
2025-11-25
Tools
6 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

HeySale gives a website an AI salesperson that talks to visitors, answers their questions from the site's own content and captures leads. Start with create_website_salesperson and a public website address; it returns a salesperson_id — keep that id, every other tool needs it. Then check_salesperson_status until it is ready, get_salesperson_installation for the one-line script, and verify_salesperson_installation once the script is live. Finally give the website owner the claim_url so they can claim their HeySale account, where they manage leads, team and billing. Never ask a website owner for an API key; private results and changes to a claimed salesperson happen inside HeySale.

Tools

6 advertised

create_website_salesperson — Create a website salesperson
Advertised by the server during the last successful anonymous check.
Open-world

Give any public website an AI salesperson that talks to its visitors, answers questions about the business, and captures leads. Use this when someone wants to add a salesperson, live chat, a sales assistant or a chatbot alternative to a site. Provide the website address; the salesperson reads the site itself. The response always includes an explicit salesperson_id — keep it, because every other HeySale tool needs it — plus the one-line install script and a claim_url to give the website owner. Safe to call twice for the same website. To try HeySale without touching a real website, use website_url https://hey.sale/mcp-test — that creates an isolated, disposable test salesperson on HeySale's own reviewer sandbox.

create_website_salesperson input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "website_url"
  ],
  "properties": {
    "campaign": {
      "type": "string",
      "maxLength": 60
    },
    "website_url": {
      "type": "string",
      "maxLength": 300,
      "minLength": 3,
      "description": "The public website address, e.g. https://example.com"
    },
    "business_name": {
      "type": "string",
      "maxLength": 120,
      "description": "The business name, if known."
    },
    "integration_source": {
      "type": "string",
      "maxLength": 40,
      "description": "The AI platform making this call, e.g. claude, chatgpt, cursor, lovable, replit."
    },
    "external_project_id": {
      "type": "string",
      "maxLength": 200,
      "description": "A stable id for the calling project, so repeat calls reuse the same salesperson."
    }
  }
}
create_website_salesperson output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "success",
    "salesperson",
    "salesperson_id",
    "salesperson_name",
    "website_url",
    "status",
    "ownership",
    "installation"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "reused": {
      "type": "boolean",
      "description": "True when an existing salesperson for that website was returned instead of a new one."
    },
    "status": {
      "type": "string",
      "description": "Build state of the salesperson, e.g. analyzing, building, ready, failed."
    },
    "success": {
      "type": "boolean"
    },
    "ownership": {
      "type": "object",
      "required": [
        "status"
      ],
      "properties": {
        "status": {
          "enum": [
            "unclaimed",
            "claimed"
          ],
          "type": "string",
          "description": "Whether a HeySale account owns this salesperson yet."
        },
        "claim_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "One-time link the website owner uses to claim the salesperson. Absent once claimed."
        },
        "manage_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "Where the owner manages the salesperson. Present once claimed."
        }
      },
      "additionalProperties": {}
    },
    "expires_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "environment": {
      "type": "string"
    },
    "next_action": {
      "type": "string",
      "description": "Plain-language next step for the caller."
    },
    "preview_url": {
      "type": "string"
    },
    "salesperson": {
      "type": "object",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The salesperson_id."
        },
        "name": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "website_url": {
          "type": "string"
        }
      },
      "additionalProperties": {}
    },
    "website_url": {
      "type": "string"
    },
    "free_minutes": {
      "type": "number"
    },
    "installation": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "async": {
          "type": "boolean"
        },
        "script": {
          "type": "string",
          "description": "The one-line script to add to the website before the closing body tag."
        },
        "detection": {
          "type": "string"
        },
        "placement": {
          "type": "string"
        },
        "review_install_url": {
          "type": "string",
          "description": "Sandbox only: expiring link that installs the test salesperson."
        },
        "installation_status": {
          "enum": [
            "detected",
            "not_detected",
            "domain_mismatch",
            "unknown"
          ],
          "type": "string",
          "description": "What HeySale's own telemetry currently sees."
        }
      },
      "additionalProperties": {}
    },
    "salesperson_id": {
      "type": "string"
    },
    "salesperson_name": {
      "type": "string"
    },
    "test_environment": {
      "type": "boolean"
    },
    "integration_source": {
      "type": "string"
    }
  },
  "additionalProperties": {}
}
create_website_salesperson annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
check_salesperson_status — Check a salesperson's readiness
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find out whether a website salesperson has finished reading the website and is ready to talk to visitors, and whether its script has been detected on the live site. Give it the salesperson_id returned when the salesperson was created.

check_salesperson_status input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson_id"
  ],
  "properties": {
    "salesperson_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The salesperson_id returned by create_website_salesperson."
    }
  }
}
check_salesperson_status output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson",
    "salesperson_id",
    "salesperson_name",
    "website_url",
    "status",
    "ownership"
  ],
  "properties": {
    "domain": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "type": "string",
      "description": "Build state of the salesperson, e.g. analyzing, building, ready, failed."
    },
    "installed": {
      "type": "boolean"
    },
    "ownership": {
      "type": "object",
      "required": [
        "status"
      ],
      "properties": {
        "status": {
          "enum": [
            "unclaimed",
            "claimed"
          ],
          "type": "string",
          "description": "Whether a HeySale account owns this salesperson yet."
        },
        "claim_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "One-time link the website owner uses to claim the salesperson. Absent once claimed."
        },
        "manage_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "Where the owner manages the salesperson. Present once claimed."
        }
      },
      "additionalProperties": {}
    },
    "expires_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "environment": {
      "type": "string"
    },
    "next_action": {
      "type": "string",
      "description": "Plain-language next step for the caller."
    },
    "salesperson": {
      "type": "object",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The salesperson_id."
        },
        "name": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "website_url": {
          "type": "string"
        }
      },
      "additionalProperties": {}
    },
    "website_url": {
      "type": "string"
    },
    "last_seen_at": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the script was last seen loading. Null before installation."
    },
    "salesperson_id": {
      "type": "string"
    },
    "detected_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "salesperson_name": {
      "type": "string"
    },
    "test_environment": {
      "type": "boolean"
    },
    "installation_status": {
      "enum": [
        "detected",
        "not_detected",
        "domain_mismatch",
        "unknown"
      ],
      "type": "string"
    }
  },
  "additionalProperties": {}
}
check_salesperson_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_salesperson_installation — Get the install script
Advertised by the server during the last successful anonymous check.
Advertised read-only

Return the exact one-line script to add to a website so its salesperson appears for visitors, plus where to place it and whether HeySale has detected it yet. Give it the salesperson_id returned when the salesperson was created.

get_salesperson_installation input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson_id"
  ],
  "properties": {
    "salesperson_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The salesperson_id returned by create_website_salesperson."
    }
  }
}
get_salesperson_installation output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson",
    "salesperson_id",
    "salesperson_name",
    "website_url",
    "status",
    "ownership",
    "installation"
  ],
  "properties": {
    "status": {
      "type": "string",
      "description": "Build state of the salesperson, e.g. analyzing, building, ready, failed."
    },
    "ownership": {
      "type": "object",
      "required": [
        "status"
      ],
      "properties": {
        "status": {
          "enum": [
            "unclaimed",
            "claimed"
          ],
          "type": "string",
          "description": "Whether a HeySale account owns this salesperson yet."
        },
        "claim_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "One-time link the website owner uses to claim the salesperson. Absent once claimed."
        },
        "manage_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "Where the owner manages the salesperson. Present once claimed."
        }
      },
      "additionalProperties": {}
    },
    "expires_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "environment": {
      "type": "string"
    },
    "next_action": {
      "type": "string",
      "description": "Plain-language next step for the caller."
    },
    "preview_url": {
      "type": "string"
    },
    "salesperson": {
      "type": "object",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The salesperson_id."
        },
        "name": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "website_url": {
          "type": "string"
        }
      },
      "additionalProperties": {}
    },
    "website_url": {
      "type": "string"
    },
    "installation": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "async": {
          "type": "boolean"
        },
        "script": {
          "type": "string",
          "description": "The one-line script to add to the website before the closing body tag."
        },
        "detection": {
          "type": "string"
        },
        "placement": {
          "type": "string"
        },
        "review_install_url": {
          "type": "string",
          "description": "Sandbox only: expiring link that installs the test salesperson."
        },
        "installation_status": {
          "enum": [
            "detected",
            "not_detected",
            "domain_mismatch",
            "unknown"
          ],
          "type": "string",
          "description": "What HeySale's own telemetry currently sees."
        }
      },
      "additionalProperties": {}
    },
    "salesperson_id": {
      "type": "string"
    },
    "salesperson_name": {
      "type": "string"
    },
    "test_environment": {
      "type": "boolean"
    }
  },
  "additionalProperties": {}
}
get_salesperson_installation annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
verify_salesperson_installation — Verify a salesperson's website installation
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check whether a HeySale salesperson has actually been installed on its website and is reporting back to HeySale. Uses HeySale's own telemetry, so it works with single-page apps, tag managers and deferred script loading — never scrape the website's HTML to answer this. Give it the salesperson_id returned when the salesperson was created.

verify_salesperson_installation input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson_id"
  ],
  "properties": {
    "salesperson_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The salesperson_id returned by create_website_salesperson."
    }
  }
}
verify_salesperson_installation output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson",
    "salesperson_id",
    "salesperson_name",
    "website_url",
    "status",
    "ownership"
  ],
  "properties": {
    "domain": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "type": "string",
      "description": "Build state of the salesperson, e.g. analyzing, building, ready, failed."
    },
    "message": {
      "type": "string"
    },
    "installed": {
      "type": "boolean"
    },
    "ownership": {
      "type": "object",
      "required": [
        "status"
      ],
      "properties": {
        "status": {
          "enum": [
            "unclaimed",
            "claimed"
          ],
          "type": "string",
          "description": "Whether a HeySale account owns this salesperson yet."
        },
        "claim_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "One-time link the website owner uses to claim the salesperson. Absent once claimed."
        },
        "manage_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "Where the owner manages the salesperson. Present once claimed."
        }
      },
      "additionalProperties": {}
    },
    "expires_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "environment": {
      "type": "string"
    },
    "next_action": {
      "type": "string",
      "description": "Plain-language next step for the caller."
    },
    "salesperson": {
      "type": "object",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The salesperson_id."
        },
        "name": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "website_url": {
          "type": "string"
        }
      },
      "additionalProperties": {}
    },
    "website_url": {
      "type": "string"
    },
    "last_seen_at": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the script was last seen loading. Null before installation."
    },
    "salesperson_id": {
      "type": "string"
    },
    "detected_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "salesperson_name": {
      "type": "string"
    },
    "test_environment": {
      "type": "boolean"
    },
    "installation_status": {
      "enum": [
        "detected",
        "not_detected",
        "domain_mismatch",
        "unknown"
      ],
      "type": "string"
    }
  },
  "additionalProperties": {}
}
verify_salesperson_installation annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
configure_salesperson — Change how a salesperson introduces itself
Advertised by the server during the last successful anonymous check.

Change a salesperson's name, its opening line, or the goal it works towards. While a salesperson is still unclaimed this can be set as part of setting it up. Once the website owner has claimed it, changes must be made by the owner in HeySale — do not ask anyone for an API key.

configure_salesperson input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson_id"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 60,
      "minLength": 1
    },
    "api_key": {
      "type": "string",
      "maxLength": 200,
      "minLength": 10,
      "description": "Developers only. Not required, and never ask a website owner for one."
    },
    "greeting": {
      "type": "string",
      "maxLength": 500,
      "minLength": 1
    },
    "objective": {
      "type": "string",
      "maxLength": 500,
      "minLength": 1,
      "description": "What the salesperson should aim for."
    },
    "salesperson_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The salesperson_id returned by create_website_salesperson."
    }
  }
}
configure_salesperson output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson",
    "salesperson_id",
    "salesperson_name",
    "website_url",
    "status",
    "ownership"
  ],
  "properties": {
    "status": {
      "type": "string",
      "description": "Build state of the salesperson, e.g. analyzing, building, ready, failed."
    },
    "message": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    },
    "updated": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Which fields were changed."
    },
    "ownership": {
      "type": "object",
      "required": [
        "status"
      ],
      "properties": {
        "status": {
          "enum": [
            "unclaimed",
            "claimed"
          ],
          "type": "string",
          "description": "Whether a HeySale account owns this salesperson yet."
        },
        "claim_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "One-time link the website owner uses to claim the salesperson. Absent once claimed."
        },
        "manage_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "Where the owner manages the salesperson. Present once claimed."
        }
      },
      "additionalProperties": {}
    },
    "error_code": {
      "type": "string"
    },
    "expires_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "environment": {
      "type": "string"
    },
    "next_action": {
      "type": "string",
      "description": "Plain-language next step for the caller."
    },
    "salesperson": {
      "type": "object",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The salesperson_id."
        },
        "name": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "website_url": {
          "type": "string"
        }
      },
      "additionalProperties": {}
    },
    "website_url": {
      "type": "string"
    },
    "salesperson_id": {
      "type": "string"
    },
    "salesperson_name": {
      "type": "string"
    },
    "test_environment": {
      "type": "boolean"
    },
    "authentication_required": {
      "type": "boolean"
    }
  },
  "additionalProperties": {}
}
configure_salesperson annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_salesperson_results — See what the salesperson achieved
Advertised by the server during the last successful anonymous check.
Advertised read-only

Summarise how many visitors talked to the salesperson, how many left their details, and what they asked about most. This is private business data: it is only returned to an authorised caller. Never ask a website owner for an API key — send them to HeySale instead.

get_salesperson_results input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson_id"
  ],
  "properties": {
    "days": {
      "type": "integer",
      "maximum": 90,
      "minimum": 1
    },
    "api_key": {
      "type": "string",
      "maxLength": 200,
      "minLength": 10,
      "description": "Developers only. Not required for setup, and never ask a website owner for one."
    },
    "salesperson_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The salesperson_id returned by create_website_salesperson."
    }
  }
}
get_salesperson_results output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "salesperson",
    "salesperson_id",
    "salesperson_name",
    "website_url",
    "status",
    "ownership"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "leads": {
      "type": "number"
    },
    "status": {
      "type": "string",
      "description": "Build state of the salesperson, e.g. analyzing, building, ready, failed."
    },
    "ownership": {
      "type": "object",
      "required": [
        "status"
      ],
      "properties": {
        "status": {
          "enum": [
            "unclaimed",
            "claimed"
          ],
          "type": "string",
          "description": "Whether a HeySale account owns this salesperson yet."
        },
        "claim_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "One-time link the website owner uses to claim the salesperson. Absent once claimed."
        },
        "manage_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "Where the owner manages the salesperson. Present once claimed."
        }
      },
      "additionalProperties": {}
    },
    "synthetic": {
      "type": "boolean",
      "description": "True when the figures come from the reviewer sandbox."
    },
    "expires_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "environment": {
      "type": "string"
    },
    "next_action": {
      "type": "string",
      "description": "Plain-language next step for the caller."
    },
    "period_days": {
      "type": "number"
    },
    "salesperson": {
      "type": "object",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The salesperson_id."
        },
        "name": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "website_url": {
          "type": "string"
        }
      },
      "additionalProperties": {}
    },
    "website_url": {
      "type": "string"
    },
    "recent_leads": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "email": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "company": {
            "type": [
              "string",
              "null"
            ]
          },
          "interest": {
            "type": [
              "string",
              "null"
            ]
          },
          "question": {
            "type": [
              "string",
              "null"
            ]
          },
          "captured_at": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": {}
      }
    },
    "talk_minutes": {
      "type": "number"
    },
    "conversations": {
      "type": "number"
    },
    "top_questions": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "properties": {
              "count": {
                "type": "number"
              },
              "theme": {
                "type": "string"
              }
            },
            "additionalProperties": {}
          }
        ]
      }
    },
    "salesperson_id": {
      "type": "string"
    },
    "conversion_rate": {
      "type": "number"
    },
    "salesperson_name": {
      "type": "string"
    },
    "test_environment": {
      "type": "boolean"
    },
    "authentication_required": {
      "type": "boolean"
    }
  },
  "additionalProperties": {}
}
get_salesperson_results annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1480 ms
95th percentile latency
1480 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1480 ms · metadata changed · 6 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http heysale-mcp https://hey.sale/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add heysale-mcp --url https://hey.sale/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable heysale-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "heysale-mcp": {
      "url": "https://hey.sale/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "heysale-mcp": {
      "type": "streamableHttp",
      "url": "https://hey.sale/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start heysale-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "heysale-mcp": {
      "type": "http",
      "url": "https://hey.sale/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http heysale-mcp https://hey.sale/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://hey.sale/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "heysale-mcp": {
      "serverUrl": "https://hey.sale/mcp"
    }
  }
}

Let your agent find its tools

Find servers like HeySale MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.