SaaSCity
Audit your site, pick from 1,600+ launch directories by DR and link type, and list on SaaSCity.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"saascity": {
"url": "https://saascity.io/api/mcp"
}
}
}Remote endpoints
https://saascity.io/api/mcpstreamable-httpWhat it can do
Tool inventory
Tools (13)
🟢check_launch_readiness(url)
Audit a product homepage before launching it: HTTPS, noindex, title and meta description, og:image (fetched to confirm it loads), X card, favicon, canonical, mobile viewport, h1, JSON-LD, robots.txt, sitemap, parked or 404 pages, response time, and whether the page is empty without JavaScript. Returns a 0-100 score, a verdict and a fix for every problem. Reads the static HTML the way directory scrapers and link-preview bots do.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Homepage URL; the https:// prefix is optional"
}
},
"required": [
"url"
]
}Output Schema
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"finalUrl": {
"type": "string",
"description": "After redirects"
},
"httpStatus": {
"type": [
"integer",
"null"
]
},
"responseMs": {
"type": [
"integer",
"null"
],
"description": "Time to response headers, from SaaSCity servers"
},
"score": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"verdict": {
"type": "string",
"enum": [
"ready",
"almost_ready",
"not_ready"
]
},
"saascityBadge": {
"type": "boolean",
"description": "The SaaSCity badge is on the page"
},
"checks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"pass",
"warn",
"fail"
]
},
"detail": {
"type": "string",
"description": "Finding, and the fix when not passing"
},
"critical": {
"type": "boolean",
"description": "Blocks launch when failing"
}
},
"required": [
"id",
"label",
"status",
"detail"
]
}
}
},
"required": [
"url",
"finalUrl",
"httpStatus",
"responseMs",
"score",
"verdict",
"saascityBadge",
"checks"
]
}🟢recommend_launch_directories(product_type, free_only)
Hand-picked launch directories for a product type, grouped by when to submit (launch day first, evergreen after). Every pick carries a human-written verdict, including the ones that are not worth paying for, plus Ahrefs DR, link type and price. Start here; use find_launch_directories to go wider across all 1,666 sites.
Input Schema
{
"type": "object",
"properties": {
"product_type": {
"type": "string",
"enum": [
"any",
"saas",
"ai",
"devtools"
],
"default": "any",
"description": "saas = B2B/B2C software, ai = AI tool or app, devtools = sold to developers, any = general"
},
"free_only": {
"type": "boolean",
"default": false,
"description": "Only picks with a free or freemium route"
}
}
}Output Schema
{
"type": "object",
"properties": {
"productType": {
"type": "string"
},
"groups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"advice": {
"type": "string"
},
"directories": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"domain": {
"type": "string"
},
"submitUrl": {
"type": "string",
"description": "Where to submit or list"
},
"dr": {
"type": "integer",
"description": "Ahrefs Domain Rating; 0 means no data, not worthless"
},
"linkType": {
"type": "string",
"enum": [
"dofollow",
"nofollow",
"unknown"
]
},
"pricing": {
"type": "string",
"enum": [
"free",
"freemium",
"paid",
"unknown"
]
},
"category": {
"type": "string"
},
"badgeExchange": {
"type": "boolean",
"description": "The free listing asks for their badge on your site"
},
"drCheckedAt": {
"type": [
"string",
"null"
],
"description": "Day the DR was last checked (YYYY-MM-DD); null = value from the last list sweep"
},
"note": {
"type": "string",
"description": "Hand-written verdict, present on curated picks only"
}
},
"required": [
"name",
"domain",
"submitUrl",
"dr",
"linkType",
"pricing",
"category",
"badgeExchange",
"drCheckedAt"
]
}
}
},
"required": [
"id",
"label",
"advice",
"directories"
]
}
},
"dataUpdatedAt": {
"type": "string",
"description": "Date link type and price were last swept (YYYY-MM-DD). DR has its own date per row."
},
"attribution": {
"type": "string"
}
},
"required": [
"productType",
"groups",
"dataUpdatedAt",
"attribution"
]
}🟢find_launch_directories(query, category, min_dr, link_type, pricing, ...)
Filter 1,666 startup, SaaS and AI directories by category, minimum Ahrefs DR, link type (dofollow/nofollow), price and badge-swap requirement. Returns submit URLs. Link type and price are "unknown" where nobody has verified them yet - treat those as unverified, not as free or dofollow.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Match against directory name or domain, e.g. \"hunt\" or \"betalist\""
},
"category": {
"type": "string",
"enum": [
"AI Tools",
"Community",
"Design Tools",
"Developer Tools",
"General Directory",
"Launchpad",
"Marketing Tools",
"Marketplace",
"Open Source",
"SaaS Tools",
"Software Discovery",
"Software Reviews",
"Tech / Startups"
],
"description": "Directory category"
},
"min_dr": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"default": 0,
"description": "Minimum Ahrefs Domain Rating"
},
"link_type": {
"type": "string",
"enum": [
"any",
"dofollow",
"nofollow"
],
"default": "any",
"description": "dofollow = verified followed link"
},
"pricing": {
"type": "string",
"enum": [
"any",
"free",
"free_or_freemium",
"paid"
],
"default": "any",
"description": "free_or_freemium = there is a no-cost route"
},
"exclude_badge_exchange": {
"type": "boolean",
"default": false,
"description": "Drop directories whose free listing requires their badge on your site"
},
"sort": {
"type": "string",
"enum": [
"dr",
"name"
],
"default": "dr",
"description": "dr = strongest first"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 20,
"description": "Results per page"
},
"offset": {
"type": "integer",
"minimum": 0,
"default": 0,
"description": "Skip this many results (pagination)"
}
}
}Output Schema
{
"type": "object",
"properties": {
"total": {
"type": "integer",
"description": "Matches before pagination"
},
"offset": {
"type": "integer"
},
"directories": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"domain": {
"type": "string"
},
"submitUrl": {
"type": "string",
"description": "Where to submit or list"
},
"dr": {
"type": "integer",
"description": "Ahrefs Domain Rating; 0 means no data, not worthless"
},
"linkType": {
"type": "string",
"enum": [
"dofollow",
"nofollow",
"unknown"
]
},
"pricing": {
"type": "string",
"enum": [
"free",
"freemium",
"paid",
"unknown"
]
},
"category": {
"type": "string"
},
"badgeExchange": {
"type": "boolean",
"description": "The free listing asks for their badge on your site"
},
"drCheckedAt": {
"type": [
"string",
"null"
],
"description": "Day the DR was last checked (YYYY-MM-DD); null = value from the last list sweep"
},
"note": {
"type": "string",
"description": "Hand-written verdict, present on curated picks only"
}
},
"required": [
"name",
"domain",
"submitUrl",
"dr",
"linkType",
"pricing",
"category",
"badgeExchange",
"drCheckedAt"
]
}
},
"dataUpdatedAt": {
"type": "string",
"description": "Date link type and price were last swept (YYYY-MM-DD). DR has its own date per row."
},
"attribution": {
"type": "string"
}
},
"required": [
"total",
"offset",
"directories",
"dataUpdatedAt",
"attribution"
]
}🟢get_launch_directory(domain)
Look up one directory by domain or URL: Ahrefs DR, dofollow or nofollow, price, whether it wants a badge swap, the submit URL, and a human verdict where one exists. Use it to vet a directory before paying for a listing.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Directory domain or any URL on it, e.g. \"uneed.best\" or \"https://www.producthunt.com/posts/new\""
}
},
"required": [
"domain"
]
}Output Schema
{
"type": "object",
"properties": {
"found": {
"type": "boolean"
},
"directory": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"domain": {
"type": "string"
},
"submitUrl": {
"type": "string",
"description": "Where to submit or list"
},
"dr": {
"type": "integer",
"description": "Ahrefs Domain Rating; 0 means no data, not worthless"
},
"linkType": {
"type": "string",
"enum": [
"dofollow",
"nofollow",
"unknown"
]
},
"pricing": {
"type": "string",
"enum": [
"free",
"freemium",
"paid",
"unknown"
]
},
"category": {
"type": "string"
},
"badgeExchange": {
"type": "boolean",
"description": "The free listing asks for their badge on your site"
},
"drCheckedAt": {
"type": [
"string",
"null"
],
"description": "Day the DR was last checked (YYYY-MM-DD); null = value from the last list sweep"
},
"note": {
"type": "string",
"description": "Hand-written verdict, present on curated picks only"
}
},
"required": [
"name",
"domain",
"submitUrl",
"dr",
"linkType",
"pricing",
"category",
"badgeExchange",
"drCheckedAt"
]
},
"dataUpdatedAt": {
"type": "string",
"description": "Date link type and price were last swept (YYYY-MM-DD). DR has its own date per row."
},
"attribution": {
"type": "string"
}
},
"required": [
"found",
"dataUpdatedAt",
"attribution"
]
}🟡submit_project(title, tagline, category, description, website_url, ...)
List a product on the SaaSCity launch directory. Creates an inert draft and returns a claim URL; the human opens it to sign in, confirm the listing and pick a launch Monday. Nothing is published or charged until they do, and every listing is reviewed by a person. Free to submit. Free subdomain hosts (github.io, netlify.app...) and domains that already have a listing are refused.
Input Schema
{
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 3,
"maxLength": 60,
"description": "Product name"
},
"tagline": {
"type": "string",
"minLength": 10,
"maxLength": 100,
"description": "One line on what it does and for whom"
},
"category": {
"type": "string",
"enum": [
"ai",
"saas",
"productivity",
"devtools",
"design",
"marketing",
"fintech",
"health",
"mobile",
"games",
"web3",
"molt",
"directories",
"other"
],
"description": "Listing category id"
},
"description": {
"type": "string",
"minLength": 50,
"maxLength": 5000,
"description": "Plain text: the problem, who it is for, what makes it different"
},
"website_url": {
"type": "string",
"maxLength": 500,
"description": "Product homepage, https, on its own domain"
},
"twitter_url": {
"type": "string",
"maxLength": 200,
"description": "X/Twitter profile URL (optional)"
},
"github_url": {
"type": "string",
"maxLength": 200,
"description": "Public repo URL (optional)"
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 10,
"description": "Up to 10 short keywords (optional)"
}
},
"required": [
"title",
"tagline",
"category",
"description",
"website_url"
]
}Output Schema
{
"type": "object",
"properties": {
"claimUrl": {
"type": "string",
"description": "The human must open this to publish the listing"
},
"expiresAt": {
"type": "string",
"description": "ISO date after which the draft is discarded"
},
"claimToken": {
"type": "string",
"description": "Pass to get_submission_status"
},
"badgeSnippet": {
"type": "string",
"description": "HTML that earns a dofollow link once verified with check_badge"
}
},
"required": [
"claimUrl",
"expiresAt",
"claimToken",
"badgeSnippet"
]
}🟢check_badge(url)
Check whether the SaaSCity badge is live on a site. Reads the given URL and, for a deep page, the site homepage too, rendering JavaScript if the static HTML misses it. A verified badge turns the listing link dofollow.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Site URL to scan (the listing URL; the homepage is read as well)"
}
},
"required": [
"url"
]
}Output Schema
{
"type": "object",
"properties": {
"found": {
"type": "boolean"
},
"code": {
"type": "string",
"description": "FOUND, BADGE_NOT_FOUND, UNREACHABLE, TIMEOUT, HTTP_ERROR, ..."
},
"message": {
"type": "string"
},
"badgeSnippet": {
"type": "string",
"description": "The HTML to embed when not found"
}
},
"required": [
"found",
"code",
"message"
]
}🟢get_submission_status(claim_token, slug)
Where a SaaSCity submission stands: a draft by claim token (unclaimed, claimed and in review, or expired) or a live listing by slug (launch week, badge, link type, points).
Input Schema
{
"type": "object",
"properties": {
"claim_token": {
"type": "string",
"description": "Token from submit_project (the mcp_... part of the claim URL)"
},
"slug": {
"type": "string",
"description": "Slug of a live listing"
}
}
}Output Schema
{
"type": "object",
"properties": {
"state": {
"type": "string",
"enum": [
"not_found",
"unclaimed",
"claimed_in_review",
"expired",
"live"
]
},
"expiresAt": {
"type": "string"
},
"listing": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"weekStart": {
"type": [
"string",
"null"
]
},
"badge": {
"type": "string"
},
"linkType": {
"type": "string"
},
"points": {
"type": "integer"
}
},
"required": [
"title",
"weekStart",
"badge",
"linkType",
"points"
]
}
},
"required": [
"state"
]
}🟢get_launch_weeks
SaaSCity launch-week queue: the next 12 Mondays, how many free slots each has left, and which are full. Use it to tell a founder when a free listing would go live.
Input Schema
{
"type": "object",
"properties": {}
}Output Schema
{
"type": "object",
"properties": {
"freeCapacityPerWeek": {
"type": "integer"
},
"weeks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weekStart": {
"type": "string",
"description": "Monday, YYYY-MM-DD"
},
"freeRemaining": {
"type": "integer"
},
"isCurrent": {
"type": "boolean"
}
},
"required": [
"weekStart",
"freeRemaining",
"isCurrent"
]
}
}
},
"required": [
"freeCapacityPerWeek",
"weeks"
]
}🟢get_offers
SaaSCity listing offers with real prices - free queue, Quick Pass, Premium - and exactly what each buys (queue position, dofollow link, launch post). Only a human can pay, on the claim page.
Input Schema
{
"type": "object",
"properties": {}
}Output Schema
{
"type": "object",
"properties": {
"offers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"priceUsd": {
"type": "number"
},
"summary": {
"type": "string"
}
},
"required": [
"id",
"name",
"priceUsd",
"summary"
]
}
}
},
"required": [
"offers"
]
}🟢search_listings(query, category, sort, limit, offset)
Search products listed on SaaSCity by keyword and/or category. Returns title, tagline, category, upvote points, the listing page and the product site. Useful for market research ("what else exists in this space?") before a launch.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Keyword matched against title and tagline"
},
"category": {
"type": "string",
"enum": [
"ai",
"saas",
"productivity",
"devtools",
"design",
"marketing",
"fintech",
"health",
"mobile",
"games",
"web3",
"molt",
"directories",
"other"
],
"description": "Listing category id"
},
"sort": {
"type": "string",
"enum": [
"points",
"newest"
],
"default": "points",
"description": "points = most upvoted first"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10,
"description": "Results per page"
},
"offset": {
"type": "integer",
"minimum": 0,
"default": 0,
"description": "Skip this many results (pagination)"
}
}
}Output Schema
{
"type": "object",
"properties": {
"listings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"tagline": {
"type": "string"
},
"slug": {
"type": "string",
"description": "Pass to get_listing or find_alternatives"
},
"category": {
"type": "string"
},
"points": {
"type": "integer",
"description": "Community upvote points"
},
"pageUrl": {
"type": "string",
"description": "SaaSCity listing page"
},
"websiteUrl": {
"type": "string",
"description": "The product site"
}
},
"required": [
"title",
"tagline",
"slug",
"category",
"points",
"pageUrl",
"websiteUrl"
]
}
},
"offset": {
"type": "integer"
}
},
"required": [
"listings",
"offset"
]
}🟢get_listing(slug)
One live SaaSCity listing by slug: title, tagline, full description, category, upvote points, link type (dofollow/nofollow), listing page and product site.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Listing slug, the last part of saascity.io/live/<slug>"
}
},
"required": [
"slug"
]
}Output Schema
{
"type": "object",
"properties": {
"found": {
"type": "boolean"
},
"listing": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"tagline": {
"type": "string"
},
"slug": {
"type": "string",
"description": "Pass to get_listing or find_alternatives"
},
"category": {
"type": "string"
},
"points": {
"type": "integer",
"description": "Community upvote points"
},
"pageUrl": {
"type": "string",
"description": "SaaSCity listing page"
},
"websiteUrl": {
"type": "string",
"description": "The product site"
},
"description": {
"type": "string"
},
"linkType": {
"type": "string",
"enum": [
"dofollow",
"nofollow"
]
}
},
"required": [
"title",
"tagline",
"slug",
"category",
"points",
"pageUrl",
"websiteUrl",
"description",
"linkType"
]
}
},
"required": [
"found"
]
}🟢get_leaderboard(period, category, limit)
SaaSCity's most upvoted launches for this week's launch, the last 30 days, or all time, optionally within one category.
Input Schema
{
"type": "object",
"properties": {
"period": {
"type": "string",
"enum": [
"week",
"month",
"all_time"
],
"default": "week",
"description": "week = this Monday's launch"
},
"category": {
"type": "string",
"enum": [
"ai",
"saas",
"productivity",
"devtools",
"design",
"marketing",
"fintech",
"health",
"mobile",
"games",
"web3",
"molt",
"directories",
"other"
],
"description": "Listing category id"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10,
"description": "How many to return"
}
}
}Output Schema
{
"type": "object",
"properties": {
"listings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"tagline": {
"type": "string"
},
"slug": {
"type": "string",
"description": "Pass to get_listing or find_alternatives"
},
"category": {
"type": "string"
},
"points": {
"type": "integer",
"description": "Community upvote points"
},
"pageUrl": {
"type": "string",
"description": "SaaSCity listing page"
},
"websiteUrl": {
"type": "string",
"description": "The product site"
}
},
"required": [
"title",
"tagline",
"slug",
"category",
"points",
"pageUrl",
"websiteUrl"
]
}
},
"period": {
"type": "string"
},
"weekStart": {
"type": "string",
"description": "Present for period=week"
}
},
"required": [
"listings",
"period"
]
}🟢find_alternatives(slug, limit)
Other SaaSCity listings in the same category as a given listing, most upvoted first. Useful for competitor research and positioning.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Slug of the listing to find alternatives for"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10,
"description": "How many to return"
}
},
"required": [
"slug"
]
}Output Schema
{
"type": "object",
"properties": {
"listings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"tagline": {
"type": "string"
},
"slug": {
"type": "string",
"description": "Pass to get_listing or find_alternatives"
},
"category": {
"type": "string"
},
"points": {
"type": "integer",
"description": "Community upvote points"
},
"pageUrl": {
"type": "string",
"description": "SaaSCity listing page"
},
"websiteUrl": {
"type": "string",
"description": "The product site"
}
},
"required": [
"title",
"tagline",
"slug",
"category",
"points",
"pageUrl",
"websiteUrl"
]
}
},
"category": {
"type": "string"
}
},
"required": [
"listings"
]
}Community
Evidence