Find SaaS products for a need: search a directory and get an AI-scored shortlist. Free, no key.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
One live listing of the directory, by the id that search_listings or shortlist returned.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http shortlist https://shortlistsaas.com/mcp
One live listing of the directory, by the id that search_listings or shortlist returned.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1
}
}
}The active categories of the directory, with the slug that the other tools accept.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}The live listings in the categories, plus the listings whose text contains the words of the need. Each listing has the TypeSafe score when one is already cached for this need, and it scores no listing. Without categories, the tool finds the category of the need first (one AI call). When the need fits more than one category, it returns `choices`: call again with one or two of them. Pass the returned `categories` to shortlist, so that it does not find the category again.
| Argument | Type | Description |
|---|---|---|
| need* | string | What the person needs from a SaaS product, in plain words. For example: track the visits to my website. |
| categories | array | One or two category slugs from list_categories. Leave it out to let the tool find the category of the need. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"need"
],
"properties": {
"need": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "What the person needs from a SaaS product, in plain words. For example: track the visits to my website."
},
"categories": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"maxLength": 40
},
"maxItems": 2,
"description": "One or two category slugs from list_categories. Leave it out to let the tool find the category of the need."
}
}
}The SaaS products that fit the need, best first, scored by TypeSafe (fitPct 0 to 100). Each call scores at most 8 new listings. When `remaining` is more than 0, call again with the same need and categories to score the next ones. Without categories, the tool finds the category of the need first. When the need fits more than one category, it returns `choices`: call again with one or two of them.
| Argument | Type | Description |
|---|---|---|
| need* | string | What the person needs from a SaaS product, in plain words. For example: track the visits to my website. |
| categories | array | One or two category slugs from list_categories. Leave it out to let the tool find the category of the need. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"need"
],
"properties": {
"need": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "What the person needs from a SaaS product, in plain words. For example: track the visits to my website."
},
"categories": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"maxLength": 40
},
"maxItems": 2,
"description": "One or two category slugs from list_categories. Leave it out to let the tool find the category of the need."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.