Koskamo

SaaSCity MCP

A Model Context Protocol server that allows AI agents to audit homepage launch readiness, discover and recommend launch directories from a database of 1,600+ options based on Ahrefs DR and link type, submit projects for human review, check launch queues, verify badges, and search the directory.

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.

SaaSCity MCP logo, by SaaSCityVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by SaaSCity
MCP endpoint (Streamable HTTP)
https://saascity.io/api/mcp
Vendor documentation

What its tools do

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

Can change data (1)

22 of 22 have a description · 22 of 22 declare behavior hints · 20 of 20 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to saascity.io ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Audit homepage launch readiness
  • Recommend launch directories by DR
  • Submit project for human review
  • Search directory listings

Source and maintenance

Vendor evidenceRegistry 2.0.0
Maintenance checked

Protocol and capabilities

Server
saascity 2.0.0
MCP protocol negotiated in check
2025-11-25
Tools
22 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
2 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  }
}

Server-provided instructions

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

SaaSCity helps a founder launch a product. Typical flow: check_launch_readiness on the site, fix what fails, then recommend_launch_directories (hand-picked, with notes) or find_launch_directories (the full dataset, filterable by DR, link type and price). submit_project lists the product on SaaSCity as an inert draft and returns a claim link the human must open - nothing is published or paid without them, and every listing is reviewed by a person. DR figures are Ahrefs Domain Rating; say so when quoting them. Docs: https://saascity.io/mcp

Tools

22 advertised

check_launch_readiness — Check launch readiness
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

check_launch_readiness input schema
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "Homepage URL; the https:// prefix is optional"
    }
  }
}
check_launch_readiness output schema
{
  "type": "object",
  "required": [
    "url",
    "finalUrl",
    "httpStatus",
    "responseMs",
    "score",
    "verdict",
    "saascityBadge",
    "checks"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "score": {
      "type": "integer",
      "maximum": 100,
      "minimum": 0
    },
    "checks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "label",
          "status",
          "detail"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "detail": {
            "type": "string",
            "description": "Finding, and the fix when not passing"
          },
          "status": {
            "enum": [
              "pass",
              "warn",
              "fail"
            ],
            "type": "string"
          },
          "critical": {
            "type": "boolean",
            "description": "Blocks launch when failing"
          }
        }
      }
    },
    "verdict": {
      "enum": [
        "ready",
        "almost_ready",
        "not_ready"
      ],
      "type": "string"
    },
    "finalUrl": {
      "type": "string",
      "description": "After redirects"
    },
    "httpStatus": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responseMs": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Time to response headers, from SaaSCity servers"
    },
    "saascityBadge": {
      "type": "boolean",
      "description": "The SaaSCity badge is on the page"
    }
  }
}
check_launch_readiness annotations
{
  "title": "Check launch readiness",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
recommend_launch_directories — Recommend launch directories
Advertised by the server during the last successful anonymous check.
Advertised read-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,667 sites.

recommend_launch_directories input schema
{
  "type": "object",
  "properties": {
    "free_only": {
      "type": "boolean",
      "default": false,
      "description": "Only picks with a free or freemium route"
    },
    "product_type": {
      "enum": [
        "any",
        "saas",
        "ai",
        "devtools"
      ],
      "type": "string",
      "default": "any",
      "description": "saas = B2B/B2C software, ai = AI tool or app, devtools = sold to developers, any = general"
    }
  }
}
recommend_launch_directories output schema
{
  "type": "object",
  "required": [
    "productType",
    "groups",
    "dataUpdatedAt",
    "attribution"
  ],
  "properties": {
    "groups": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "label",
          "advice",
          "directories"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "advice": {
            "type": "string"
          },
          "directories": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "domain",
                "submitUrl",
                "dr",
                "linkType",
                "pricing",
                "category",
                "badgeExchange",
                "drCheckedAt"
              ],
              "properties": {
                "dr": {
                  "type": "integer",
                  "description": "Ahrefs Domain Rating; 0 means no data, not worthless"
                },
                "name": {
                  "type": "string"
                },
                "note": {
                  "type": "string",
                  "description": "Hand-written verdict, present on curated picks only"
                },
                "domain": {
                  "type": "string"
                },
                "pricing": {
                  "enum": [
                    "free",
                    "freemium",
                    "paid",
                    "unknown"
                  ],
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "linkType": {
                  "enum": [
                    "dofollow",
                    "nofollow",
                    "unknown"
                  ],
                  "type": "string"
                },
                "submitUrl": {
                  "type": "string",
                  "description": "Where to submit or list"
                },
                "drCheckedAt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Day the DR was last checked (YYYY-MM-DD); null = value from the last list sweep"
                },
                "badgeExchange": {
                  "type": "boolean",
                  "description": "The free listing asks for their badge on your site"
                }
              }
            }
          }
        }
      }
    },
    "attribution": {
      "type": "string"
    },
    "productType": {
      "type": "string"
    },
    "dataUpdatedAt": {
      "type": "string",
      "description": "Date link type and price were last swept (YYYY-MM-DD). DR has its own date per row."
    }
  }
}
recommend_launch_directories annotations
{
  "title": "Recommend launch directories",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
find_launch_directories — Find launch directories
Advertised by the server during the last successful anonymous check.
Advertised read-only

Filter 1,667 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.

find_launch_directories input schema
{
  "type": "object",
  "properties": {
    "sort": {
      "enum": [
        "dr",
        "name"
      ],
      "type": "string",
      "default": "dr",
      "description": "dr = strongest first"
    },
    "limit": {
      "type": "integer",
      "default": 20,
      "maximum": 50,
      "minimum": 1,
      "description": "Results per page"
    },
    "query": {
      "type": "string",
      "description": "Match against directory name or domain, e.g. \"hunt\" or \"betalist\""
    },
    "min_dr": {
      "type": "integer",
      "default": 0,
      "maximum": 100,
      "minimum": 0,
      "description": "Minimum Ahrefs Domain Rating"
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0,
      "description": "Skip this many results (pagination)"
    },
    "pricing": {
      "enum": [
        "any",
        "free",
        "free_or_freemium",
        "paid"
      ],
      "type": "string",
      "default": "any",
      "description": "free_or_freemium = there is a no-cost route"
    },
    "category": {
      "enum": [
        "AI Tools",
        "Community",
        "Design Tools",
        "Developer Tools",
        "General Directory",
        "Launchpad",
        "Marketing Tools",
        "Marketplace",
        "Open Source",
        "SaaS Tools",
        "Software Discovery",
        "Software Reviews",
        "Tech / Startups"
      ],
      "type": "string",
      "description": "Directory category"
    },
    "link_type": {
      "enum": [
        "any",
        "dofollow",
        "nofollow"
      ],
      "type": "string",
      "default": "any",
      "description": "dofollow = verified followed link"
    },
    "exclude_badge_exchange": {
      "type": "boolean",
      "default": false,
      "description": "Drop directories whose free listing requires their badge on your site"
    }
  }
}
find_launch_directories output schema
{
  "type": "object",
  "required": [
    "total",
    "offset",
    "directories",
    "dataUpdatedAt",
    "attribution"
  ],
  "properties": {
    "total": {
      "type": "integer",
      "description": "Matches before pagination"
    },
    "offset": {
      "type": "integer"
    },
    "attribution": {
      "type": "string"
    },
    "directories": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "domain",
          "submitUrl",
          "dr",
          "linkType",
          "pricing",
          "category",
          "badgeExchange",
          "drCheckedAt"
        ],
        "properties": {
          "dr": {
            "type": "integer",
            "description": "Ahrefs Domain Rating; 0 means no data, not worthless"
          },
          "name": {
            "type": "string"
          },
          "note": {
            "type": "string",
            "description": "Hand-written verdict, present on curated picks only"
          },
          "domain": {
            "type": "string"
          },
          "pricing": {
            "enum": [
              "free",
              "freemium",
              "paid",
              "unknown"
            ],
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "linkType": {
            "enum": [
              "dofollow",
              "nofollow",
              "unknown"
            ],
            "type": "string"
          },
          "submitUrl": {
            "type": "string",
            "description": "Where to submit or list"
          },
          "drCheckedAt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Day the DR was last checked (YYYY-MM-DD); null = value from the last list sweep"
          },
          "badgeExchange": {
            "type": "boolean",
            "description": "The free listing asks for their badge on your site"
          }
        }
      }
    },
    "dataUpdatedAt": {
      "type": "string",
      "description": "Date link type and price were last swept (YYYY-MM-DD). DR has its own date per row."
    }
  }
}
find_launch_directories annotations
{
  "title": "Find launch directories",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_launch_directory — Look up a launch directory
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_launch_directory input schema
{
  "type": "object",
  "required": [
    "domain"
  ],
  "properties": {
    "domain": {
      "type": "string",
      "description": "Directory domain or any URL on it, e.g. \"uneed.best\" or \"https://www.producthunt.com/posts/new\""
    }
  }
}
get_launch_directory output schema
{
  "type": "object",
  "required": [
    "found",
    "dataUpdatedAt",
    "attribution"
  ],
  "properties": {
    "found": {
      "type": "boolean"
    },
    "directory": {
      "type": "object",
      "required": [
        "name",
        "domain",
        "submitUrl",
        "dr",
        "linkType",
        "pricing",
        "category",
        "badgeExchange",
        "drCheckedAt"
      ],
      "properties": {
        "dr": {
          "type": "integer",
          "description": "Ahrefs Domain Rating; 0 means no data, not worthless"
        },
        "name": {
          "type": "string"
        },
        "note": {
          "type": "string",
          "description": "Hand-written verdict, present on curated picks only"
        },
        "domain": {
          "type": "string"
        },
        "pricing": {
          "enum": [
            "free",
            "freemium",
            "paid",
            "unknown"
          ],
          "type": "string"
        },
        "category": {
          "type": "string"
        },
        "linkType": {
          "enum": [
            "dofollow",
            "nofollow",
            "unknown"
          ],
          "type": "string"
        },
        "submitUrl": {
          "type": "string",
          "description": "Where to submit or list"
        },
        "drCheckedAt": {
          "type": [
            "string",
            "null"
          ],
          "description": "Day the DR was last checked (YYYY-MM-DD); null = value from the last list sweep"
        },
        "badgeExchange": {
          "type": "boolean",
          "description": "The free listing asks for their badge on your site"
        }
      }
    },
    "attribution": {
      "type": "string"
    },
    "dataUpdatedAt": {
      "type": "string",
      "description": "Date link type and price were last swept (YYYY-MM-DD). DR has its own date per row."
    }
  }
}
get_launch_directory annotations
{
  "title": "Look up a launch directory",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
submit_project — Submit a project to SaaSCity
Advertised by the server during the last successful anonymous check.

List a product on the SaaSCity launch directory. Creates an inert draft and returns a claim URL; the human opens it to sign in, gets the submit form prefilled with the draft, picks a plan and a launch Monday and submits the form. Nothing is submitted, published or charged until they submit that form, and every listing is reviewed by a person. Every new listing is paid (see get_offers), and only the human pays. Free subdomain hosts (github.io, netlify.app...) and domains that already have a listing are refused.

submit_project input schema
{
  "type": "object",
  "required": [
    "title",
    "tagline",
    "category",
    "description",
    "website_url"
  ],
  "properties": {
    "tags": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 40
      },
      "maxItems": 10,
      "description": "Up to 10 short keywords (optional)"
    },
    "title": {
      "type": "string",
      "maxLength": 60,
      "minLength": 3,
      "description": "Product name"
    },
    "tagline": {
      "type": "string",
      "maxLength": 100,
      "minLength": 10,
      "description": "One line on what it does and for whom"
    },
    "category": {
      "enum": [
        "ai",
        "saas",
        "productivity",
        "devtools",
        "design",
        "marketing",
        "fintech",
        "health",
        "mobile",
        "games",
        "web3",
        "molt",
        "directories",
        "other"
      ],
      "type": "string",
      "description": "Listing category id"
    },
    "github_url": {
      "type": "string",
      "maxLength": 200,
      "description": "Public repo URL (optional)"
    },
    "description": {
      "type": "string",
      "maxLength": 5000,
      "minLength": 50,
      "description": "Plain text: the problem, who it is for, what makes it different"
    },
    "twitter_url": {
      "type": "string",
      "maxLength": 200,
      "description": "X/Twitter profile URL (optional)"
    },
    "website_url": {
      "type": "string",
      "maxLength": 500,
      "description": "Product homepage, https, on its own domain"
    }
  }
}
submit_project output schema
{
  "type": "object",
  "required": [
    "claimUrl",
    "expiresAt",
    "claimToken",
    "badgeSnippet"
  ],
  "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"
    }
  }
}
submit_project annotations
{
  "title": "Submit a project to SaaSCity",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
check_badge — Check the SaaSCity badge
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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 keeps a free listing booked before November 6, 2026 on a dofollow link. A paid listing needs no badge.

check_badge input schema
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "Site URL to scan (the listing URL; the homepage is read as well)"
    }
  }
}
check_badge output schema
{
  "type": "object",
  "required": [
    "found",
    "code",
    "message"
  ],
  "properties": {
    "code": {
      "type": "string",
      "description": "FOUND, BADGE_NOT_FOUND, UNREACHABLE, TIMEOUT, HTTP_ERROR, ..."
    },
    "found": {
      "type": "boolean"
    },
    "message": {
      "type": "string"
    },
    "badgeSnippet": {
      "type": "string",
      "description": "The HTML to embed when not found"
    }
  }
}
check_badge annotations
{
  "title": "Check the SaaSCity badge",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
get_submission_status — Get submission status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Where a SaaSCity submission stands. By claim token: unclaimed, expired, claimed but the form not submitted yet, submitted and waiting for payment, submitted and in review, rejected, archived, or live. By slug: a live listing (launch week, badge, link type, points).

get_submission_status input schema
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Slug of a live listing"
    },
    "claim_token": {
      "type": "string",
      "description": "Token from submit_project (the mcp_... part of the claim URL)"
    }
  }
}
get_submission_status output schema
{
  "type": "object",
  "required": [
    "state"
  ],
  "properties": {
    "state": {
      "enum": [
        "not_found",
        "unclaimed",
        "expired",
        "claimed_not_submitted",
        "awaiting_payment",
        "claimed_in_review",
        "rejected",
        "archived",
        "live"
      ],
      "type": "string",
      "description": "claimed_not_submitted: the human opened the claim link but has not submitted the form, so nothing is in review. awaiting_payment: the form was submitted and nothing happens until the human pays. claimed_in_review: paid for, and the listing waits for manual review."
    },
    "listing": {
      "type": "object",
      "required": [
        "title",
        "weekStart",
        "badge",
        "linkType",
        "points"
      ],
      "properties": {
        "badge": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "points": {
          "type": "integer"
        },
        "linkType": {
          "type": "string"
        },
        "weekStart": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "expiresAt": {
      "type": "string"
    }
  }
}
get_submission_status annotations
{
  "title": "Get submission status",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_launch_weeks — Get launch weeks
Advertised by the server during the last successful anonymous check.
Advertised read-only

SaaSCity launch weeks: the next 12 Mondays. A round opens each Monday at 00:00 UTC, and a paid listing can take any of them.

get_launch_weeks input schema
{
  "type": "object",
  "properties": {}
}
get_launch_weeks output schema
{
  "type": "object",
  "required": [
    "weeks"
  ],
  "properties": {
    "weeks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "weekStart",
          "isCurrent"
        ],
        "properties": {
          "isCurrent": {
            "type": "boolean"
          },
          "weekStart": {
            "type": "string",
            "description": "Monday, YYYY-MM-DD"
          }
        }
      }
    }
  }
}
get_launch_weeks annotations
{
  "title": "Get launch weeks",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_offers — Get listing offers
Advertised by the server during the last successful anonymous check.
Advertised read-only

SaaSCity listing offers with real prices - Basic listing and Premium listing - and exactly what each buys (dofollow link, city-map building, launch review). Every new listing is paid. Only a human can pay, on the claim page.

get_offers input schema
{
  "type": "object",
  "properties": {}
}
get_offers output schema
{
  "type": "object",
  "required": [
    "offers"
  ],
  "properties": {
    "offers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "priceUsd",
          "summary"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "priceUsd": {
            "type": "number"
          }
        }
      }
    }
  }
}
get_offers annotations
{
  "title": "Get listing offers",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
search_listings — Search SaaSCity listings
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_listings input schema
{
  "type": "object",
  "properties": {
    "sort": {
      "enum": [
        "points",
        "newest"
      ],
      "type": "string",
      "default": "points",
      "description": "points = most upvoted first"
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 25,
      "minimum": 1,
      "description": "Results per page"
    },
    "query": {
      "type": "string",
      "description": "Keyword matched against title and tagline"
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0,
      "description": "Skip this many results (pagination)"
    },
    "category": {
      "enum": [
        "ai",
        "saas",
        "productivity",
        "devtools",
        "design",
        "marketing",
        "fintech",
        "health",
        "mobile",
        "games",
        "web3",
        "molt",
        "directories",
        "other"
      ],
      "type": "string",
      "description": "Listing category id"
    }
  }
}
search_listings output schema
{
  "type": "object",
  "required": [
    "listings",
    "offset"
  ],
  "properties": {
    "offset": {
      "type": "integer"
    },
    "listings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "title",
          "tagline",
          "slug",
          "category",
          "points",
          "pageUrl",
          "websiteUrl"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Pass to get_listing or find_alternatives"
          },
          "title": {
            "type": "string"
          },
          "points": {
            "type": "integer",
            "description": "Community upvote points"
          },
          "pageUrl": {
            "type": "string",
            "description": "SaaSCity listing page"
          },
          "tagline": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "websiteUrl": {
            "type": "string",
            "description": "The product site"
          }
        }
      }
    }
  }
}
search_listings annotations
{
  "title": "Search SaaSCity listings",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_listing — Get a SaaSCity listing
Advertised by the server during the last successful anonymous check.
Advertised read-only

One live SaaSCity listing by slug: title, tagline, full description, category, upvote points, link type (dofollow/nofollow), listing page and product site.

get_listing input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "description": "Listing slug, the last part of saascity.io/live/<slug>"
    }
  }
}
get_listing output schema
{
  "type": "object",
  "required": [
    "found"
  ],
  "properties": {
    "found": {
      "type": "boolean"
    },
    "listing": {
      "type": "object",
      "required": [
        "title",
        "tagline",
        "slug",
        "category",
        "points",
        "pageUrl",
        "websiteUrl",
        "description",
        "linkType"
      ],
      "properties": {
        "slug": {
          "type": "string",
          "description": "Pass to get_listing or find_alternatives"
        },
        "title": {
          "type": "string"
        },
        "points": {
          "type": "integer",
          "description": "Community upvote points"
        },
        "pageUrl": {
          "type": "string",
          "description": "SaaSCity listing page"
        },
        "tagline": {
          "type": "string"
        },
        "category": {
          "type": "string"
        },
        "linkType": {
          "enum": [
            "dofollow",
            "nofollow"
          ],
          "type": "string"
        },
        "websiteUrl": {
          "type": "string",
          "description": "The product site"
        },
        "description": {
          "type": "string"
        }
      }
    }
  }
}
get_listing annotations
{
  "title": "Get a SaaSCity listing",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_leaderboard — Get the launch leaderboard
Advertised by the server during the last successful anonymous check.
Advertised read-only

SaaSCity's most upvoted launches for this week's launch, the last 30 days, or all time, optionally within one category.

get_leaderboard input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 25,
      "minimum": 1,
      "description": "How many to return"
    },
    "period": {
      "enum": [
        "week",
        "month",
        "all_time"
      ],
      "type": "string",
      "default": "week",
      "description": "week = this Monday's launch"
    },
    "category": {
      "enum": [
        "ai",
        "saas",
        "productivity",
        "devtools",
        "design",
        "marketing",
        "fintech",
        "health",
        "mobile",
        "games",
        "web3",
        "molt",
        "directories",
        "other"
      ],
      "type": "string",
      "description": "Listing category id"
    }
  }
}
get_leaderboard output schema
{
  "type": "object",
  "required": [
    "listings",
    "period"
  ],
  "properties": {
    "period": {
      "type": "string"
    },
    "listings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "title",
          "tagline",
          "slug",
          "category",
          "points",
          "pageUrl",
          "websiteUrl"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Pass to get_listing or find_alternatives"
          },
          "title": {
            "type": "string"
          },
          "points": {
            "type": "integer",
            "description": "Community upvote points"
          },
          "pageUrl": {
            "type": "string",
            "description": "SaaSCity listing page"
          },
          "tagline": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "websiteUrl": {
            "type": "string",
            "description": "The product site"
          }
        }
      }
    },
    "weekStart": {
      "type": "string",
      "description": "Present for period=week"
    }
  }
}
get_leaderboard annotations
{
  "title": "Get the launch leaderboard",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
find_alternatives — Find alternatives to a listing
Advertised by the server during the last successful anonymous check.
Advertised read-only

Other SaaSCity listings in the same category as a given listing, most upvoted first. Useful for competitor research and positioning.

find_alternatives input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "description": "Slug of the listing to find alternatives for"
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 25,
      "minimum": 1,
      "description": "How many to return"
    }
  }
}
find_alternatives output schema
{
  "type": "object",
  "required": [
    "listings"
  ],
  "properties": {
    "category": {
      "type": "string"
    },
    "listings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "title",
          "tagline",
          "slug",
          "category",
          "points",
          "pageUrl",
          "websiteUrl"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Pass to get_listing or find_alternatives"
          },
          "title": {
            "type": "string"
          },
          "points": {
            "type": "integer",
            "description": "Community upvote points"
          },
          "pageUrl": {
            "type": "string",
            "description": "SaaSCity listing page"
          },
          "tagline": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "websiteUrl": {
            "type": "string",
            "description": "The product site"
          }
        }
      }
    }
  }
}
find_alternatives annotations
{
  "title": "Find alternatives to a listing",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
calculate_arr — Calculate ARR from MRR
Advertised by the server during the last successful anonymous check.
Advertised read-only

Turn monthly recurring revenue into annual recurring revenue (ARR = MRR x 12), with ARPU when the customer count is given and the months to $100k, $1M and $10M ARR at a monthly growth rate. Count annual plans at their yearly price divided by 12 and leave one-time fees out of MRR. Full calculator: https://saascity.io/free-tools/arr-calculator

calculate_arr input schema
{
  "type": "object",
  "required": [
    "mrr"
  ],
  "properties": {
    "mrr": {
      "type": "number",
      "description": "Monthly recurring revenue in any currency"
    },
    "customers": {
      "type": "number",
      "description": "Paying customers, for ARPU (optional)"
    },
    "monthly_growth_pct": {
      "type": "number",
      "description": "Expected MRR growth per month in percent, e.g. 8 (optional)"
    }
  }
}
calculate_arr output schema
{
  "type": "object",
  "required": [
    "arr",
    "arpu_monthly",
    "arpu_annual",
    "milestones",
    "calculator_url"
  ],
  "properties": {
    "arr": {
      "type": "number",
      "minimum": 0
    },
    "milestones": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "target_arr",
          "months"
        ],
        "properties": {
          "months": {
            "type": [
              "integer",
              "null"
            ],
            "description": "0 when reached, null when not within 20 years"
          },
          "target_arr": {
            "type": "number"
          }
        }
      }
    },
    "arpu_annual": {
      "type": [
        "number",
        "null"
      ]
    },
    "arpu_monthly": {
      "type": [
        "number",
        "null"
      ]
    },
    "calculator_url": {
      "type": "string"
    }
  }
}
calculate_arr annotations
{
  "title": "Calculate ARR from MRR",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
calculate_arr_bridge — ARR bridge: new, expansion, contraction, churn
Advertised by the server during the last successful anonymous check.
Advertised read-only

Explain how ARR moved over a period: ending ARR = starting ARR + new + expansion - contraction - churned. Returns net new ARR, growth, the SaaS quick ratio ((new + expansion) / (contraction + churned)), and net and gross revenue retention of the starting base. Full calculator: https://saascity.io/free-tools/arr-calculator

calculate_arr_bridge input schema
{
  "type": "object",
  "required": [
    "start_arr"
  ],
  "properties": {
    "new_arr": {
      "type": "number",
      "description": "ARR from customers who started paying in the period"
    },
    "start_arr": {
      "type": "number",
      "description": "ARR at the start of the period"
    },
    "churned_arr": {
      "type": "number",
      "description": "ARR lost to customers who cancelled"
    },
    "expansion_arr": {
      "type": "number",
      "description": "ARR added by existing customers (upgrades, seats, add-ons)"
    },
    "contraction_arr": {
      "type": "number",
      "description": "ARR lost to downgrades from customers who stayed"
    }
  }
}
calculate_arr_bridge output schema
{
  "type": "object",
  "required": [
    "end_arr",
    "net_new_arr",
    "growth_pct",
    "quick_ratio",
    "nrr_pct",
    "grr_pct",
    "calculator_url"
  ],
  "properties": {
    "end_arr": {
      "type": "number"
    },
    "grr_pct": {
      "type": [
        "number",
        "null"
      ]
    },
    "nrr_pct": {
      "type": [
        "number",
        "null"
      ]
    },
    "growth_pct": {
      "type": [
        "number",
        "null"
      ]
    },
    "net_new_arr": {
      "type": "number"
    },
    "quick_ratio": {
      "type": [
        "number",
        "null"
      ]
    },
    "calculator_url": {
      "type": "string"
    }
  }
}
calculate_arr_bridge annotations
{
  "title": "ARR bridge: new, expansion, contraction, churn",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
calculate_churn — Customer churn rate
Advertised by the server during the last successful anonymous check.
Advertised read-only

Customer churn and retention for a period, its monthly and annual equivalents (compounded, so 5% a month is about 46% a year, not 60%), and the average customer lifetime. Full calculator: https://saascity.io/free-tools/churn-rate-calculator

calculate_churn input schema
{
  "type": "object",
  "required": [
    "customers_at_start",
    "customers_lost"
  ],
  "properties": {
    "period": {
      "enum": [
        "month",
        "quarter",
        "year"
      ],
      "type": "string",
      "description": "month, quarter or year"
    },
    "customers_lost": {
      "type": "number",
      "description": "Customers from that base who cancelled during the period"
    },
    "customers_at_start": {
      "type": "number",
      "description": "Customers at the start of the period"
    }
  }
}
calculate_churn output schema
{
  "type": "object",
  "required": [
    "result",
    "calculator_url"
  ],
  "properties": {
    "result": {
      "type": "object",
      "description": "The calculator result; percentages as 0-1 shares unless the key says pct"
    },
    "calculator_url": {
      "type": "string"
    }
  }
}
calculate_churn annotations
{
  "title": "Customer churn rate",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
calculate_nrr — Net and gross revenue retention
Advertised by the server during the last successful anonymous check.
Advertised read-only

Net revenue retention (NRR) and gross revenue retention (GRR) of a group of customers from their starting MRR, expansion, contraction and churned MRR, with annualised figures. Full calculator: https://saascity.io/free-tools/net-revenue-retention-calculator

calculate_nrr input schema
{
  "type": "object",
  "required": [
    "start_mrr"
  ],
  "properties": {
    "period": {
      "enum": [
        "month",
        "quarter",
        "year"
      ],
      "type": "string",
      "description": "month, quarter or year"
    },
    "start_mrr": {
      "type": "number",
      "description": "MRR of the customers at the start of the period"
    },
    "churned_mrr": {
      "type": "number",
      "description": "MRR lost to cancellations"
    },
    "expansion_mrr": {
      "type": "number",
      "description": "MRR added by those customers"
    },
    "contraction_mrr": {
      "type": "number",
      "description": "MRR lost to downgrades"
    }
  }
}
calculate_nrr output schema
{
  "type": "object",
  "required": [
    "result",
    "calculator_url"
  ],
  "properties": {
    "result": {
      "type": "object",
      "description": "The calculator result; percentages as 0-1 shares unless the key says pct"
    },
    "calculator_url": {
      "type": "string"
    }
  }
}
calculate_nrr annotations
{
  "title": "Net and gross revenue retention",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
rule_of_40 — Rule of 40 and SaaS efficiency
Advertised by the server during the last successful anonymous check.
Advertised read-only

Rule of 40 score (revenue growth % + profit margin %), plus the magic number, burn multiple and SaaS quick ratio when their inputs are given. Full calculator: https://saascity.io/free-tools/rule-of-40-calculator

rule_of_40 input schema
{
  "type": "object",
  "required": [
    "growth_pct",
    "margin_pct"
  ],
  "properties": {
    "new_mrr": {
      "type": "number",
      "description": "Optional: new MRR, for the quick ratio"
    },
    "net_burn": {
      "type": "number",
      "description": "Optional: net burn over a period, for the burn multiple"
    },
    "growth_pct": {
      "type": "number",
      "description": "Year-over-year revenue growth in percent"
    },
    "margin_pct": {
      "type": "number",
      "description": "Profit margin in percent (EBITDA or free cash flow); negative when losing money"
    },
    "churned_mrr": {
      "type": "number",
      "description": "Optional: churned MRR"
    },
    "net_new_arr": {
      "type": "number",
      "description": "Optional: net new ARR over the same period"
    },
    "expansion_mrr": {
      "type": "number",
      "description": "Optional: expansion MRR"
    },
    "contraction_mrr": {
      "type": "number",
      "description": "Optional: contraction MRR"
    },
    "revenue_last_quarter": {
      "type": "number",
      "description": "Optional: revenue last quarter"
    },
    "revenue_this_quarter": {
      "type": "number",
      "description": "Optional: revenue this quarter, for the magic number"
    },
    "sales_marketing_last_quarter": {
      "type": "number",
      "description": "Optional: sales and marketing spend last quarter"
    }
  }
}
rule_of_40 output schema
{
  "type": "object",
  "required": [
    "result",
    "calculator_url"
  ],
  "properties": {
    "result": {
      "type": "object",
      "description": "The calculator result; percentages as 0-1 shares unless the key says pct"
    },
    "calculator_url": {
      "type": "string"
    }
  }
}
rule_of_40 annotations
{
  "title": "Rule of 40 and SaaS efficiency",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
calculate_nps — Net Promoter Score
Advertised by the server during the last successful anonymous check.
Advertised read-only

Net Promoter Score from the counts of promoters (9-10), passives (7-8) and detractors (0-6), with the margin of error at 95% confidence. Full calculator: https://saascity.io/free-tools/nps-calculator

calculate_nps input schema
{
  "type": "object",
  "required": [
    "promoters",
    "passives",
    "detractors"
  ],
  "properties": {
    "passives": {
      "type": "number",
      "description": "Responses scoring 7 or 8"
    },
    "promoters": {
      "type": "number",
      "description": "Responses scoring 9 or 10"
    },
    "detractors": {
      "type": "number",
      "description": "Responses scoring 0 to 6"
    }
  }
}
calculate_nps output schema
{
  "type": "object",
  "required": [
    "result",
    "calculator_url"
  ],
  "properties": {
    "result": {
      "type": "object",
      "description": "The calculator result; percentages as 0-1 shares unless the key says pct"
    },
    "calculator_url": {
      "type": "string"
    }
  }
}
calculate_nps annotations
{
  "title": "Net Promoter Score",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
ab_test_significance — A/B test significance
Advertised by the server during the last successful anonymous check.
Advertised read-only

Two-proportion test of an A/B result: conversion rates, relative uplift, p-value, confidence interval, the chance that B beats A, and a sample ratio mismatch check. Full calculator: https://saascity.io/free-tools/ab-test-calculator

ab_test_significance input schema
{
  "type": "object",
  "required": [
    "visitors_a",
    "conversions_a",
    "visitors_b",
    "conversions_b"
  ],
  "properties": {
    "visitors_a": {
      "type": "number",
      "description": "Visitors in A"
    },
    "visitors_b": {
      "type": "number",
      "description": "Visitors in B"
    },
    "conversions_a": {
      "type": "number",
      "description": "Conversions in A"
    },
    "conversions_b": {
      "type": "number",
      "description": "Conversions in B"
    },
    "confidence_pct": {
      "type": "number",
      "description": "90, 95 or 99 (default 95)"
    }
  }
}
ab_test_significance output schema
{
  "type": "object",
  "required": [
    "result",
    "calculator_url"
  ],
  "properties": {
    "result": {
      "type": "object",
      "description": "The calculator result; percentages as 0-1 shares unless the key says pct"
    },
    "calculator_url": {
      "type": "string"
    }
  }
}
ab_test_significance annotations
{
  "title": "A/B test significance",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
markup_margin — Markup and margin
Advertised by the server during the last successful anonymous check.
Advertised read-only

Selling price, profit and margin from a cost and a markup percent, or markup and margin from a cost and a selling price. Full calculator: https://saascity.io/free-tools/markup-calculator

markup_margin input schema
{
  "type": "object",
  "required": [
    "cost"
  ],
  "properties": {
    "cost": {
      "type": "number",
      "description": "Unit cost"
    },
    "price": {
      "type": "number",
      "description": "Selling price (give this or markup_pct)"
    },
    "markup_pct": {
      "type": "number",
      "description": "Markup in percent (give this or price)"
    }
  }
}
markup_margin output schema
{
  "type": "object",
  "required": [
    "result",
    "calculator_url"
  ],
  "properties": {
    "result": {
      "type": "object",
      "description": "The calculator result; percentages as 0-1 shares unless the key says pct"
    },
    "calculator_url": {
      "type": "string"
    }
  }
}
markup_margin annotations
{
  "title": "Markup and margin",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
uptime_downtime — SLA uptime to allowed downtime
Advertised by the server during the last successful anonymous check.
Advertised read-only

Allowed downtime per day, week, month, quarter and year, in seconds, for an availability target such as 99.9%. Full calculator: https://saascity.io/free-tools/uptime-calculator

uptime_downtime input schema
{
  "type": "object",
  "required": [
    "availability_pct"
  ],
  "properties": {
    "availability_pct": {
      "type": "number",
      "description": "Availability target in percent, e.g. 99.95"
    }
  }
}
uptime_downtime output schema
{
  "type": "object",
  "required": [
    "result",
    "calculator_url"
  ],
  "properties": {
    "result": {
      "type": "object",
      "description": "The calculator result; percentages as 0-1 shares unless the key says pct"
    },
    "calculator_url": {
      "type": "string"
    }
  }
}
uptime_downtime annotations
{
  "title": "SLA uptime to allowed downtime",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}

Prompts

2 advertised

plan_launch — Plan a product launch

Advertised by the server during the last successful anonymous check.

Audit a site, fix what blocks launch, pick directories and produce a dated launch checklist.

website_url
The product homepage (required)
product_type
saas, ai, devtools or any (default any)
submit_to_saascity — Submit to SaaSCity

Advertised by the server during the last successful anonymous check.

Draft a SaaSCity listing from the product site, confirm it with the human, then submit it.

website_url
The product homepage (required)

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

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
1406 ms
95th percentile latency
1406 ms

Maintenance history

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

  • · probe · passed · 1406 ms · metadata changed · 22 tool(s), 2 prompt(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 saascity-mcp https://saascity.io/api/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 saascity-mcp --url https://saascity.io/api/mcp

Cursor

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

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start saascity-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "saascity-mcp": {
      "type": "http",
      "url": "https://saascity.io/api/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 saascity-mcp https://saascity.io/api/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://saascity.io/api/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": {
    "saascity-mcp": {
      "serverUrl": "https://saascity.io/api/mcp"
    }
  }
}

Let your agent find its tools

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

Do you run SaaSCity MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing