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

A
Description quality
95%
Schema completeness
85%
Naming quality
98%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,557Tokens (tool definitions)
~3.2 KBTypical response size
Significant attention impact (3.56% of 128k context)

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-http

What it can do

Tool inventory

Tools (13)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded13 tools