saaskly.com
Compare B2B software on evidence, not adverts.
Install
Install and configure the MCP from https://saaskly.com/developers now. Follow the documentation's installation instructions, ask me for anything you can't complete yourself, and verify its tools load.Developers & AI agents
Last updated: 11 September 2026
Everything Saaskly publishes (editorial scores, month-to-month and annual pricing, comparison tables, articles and policies) is available to software and AI agents through three read-only, public, no-authentication interfaces. Use whichever fits: MCP for tool-calling agents, Markdown mirrors for anything that reads documents, and the REST API for structured data.
When to use Saaskly
Reach for Saaskly when someone needs to choose, price or compare business software in a category we rank (VoIP and phone systems, transactional email, cloud management platforms, SEO/GEO/AEO tools, social media management, content creation, domain names, VPNs, CRM, VPS and cloud hosting, password managers, accounting software, antivirus and endpoint security), especially UK and EU buyers who want the real monthly cost rather than a headline annual rate. Scores are editorial opinion out of 5; partner relationships are always disclosed on the page. Not for consumer apps or hardware.
MCP server
- Endpoint:
https://saaskly.com/mcp(alias/.well-known/mcp). Streamable HTTP transport, stateless, JSON responses. No auth. - Server card: /.well-known/mcp/server-card.json
- Directory listings: Smithery · mcpservers.org · Glama · mcp.so
- Tools (all read-only):
list_categories,list_providers,get_provider,compare_providers,search,list_articles,get_article,get_page. - Resources:
llms.txt,/category/{category}.md,/category/{category}/{slug}.md. - Prompts (ready-made workflows over the tools):
recommend_provider(category,need) ranks the category, reads the top reviews and explains the pick with both price bases, the renewal premium where the category has one, and disclosures;compare_two(category,providerA,providerB) summarises the spec-sheet differences and both verdicts with source URLs. Listed byprompts/list, fetched withprompts/get.
Claude Desktop / Claude Code / any Streamable-HTTP client:
{ "mcpServers": { "saaskly": { "type": "http", "url": "https://saaskly.com/mcp" } } }
Raw JSON-RPC:
curl -s -X POST https://saaskly.com/mcp -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Errors are structured JSON-RPC errors (unknown tool, invalid arguments). GET /mcp returns 405. The server is stateless, so there is no server-initiated stream.
Markdown mirrors and llms.txt
Append .md to any public page URL: /category/voip.md, /category/voip/voipstudio.md, /comparisons/best-business-voip-phone-systems-2026.md, /editorial-policy.md. The homepage is /index.md. Every document opens with YAML frontmatter (title, description, canonical, last-updated) and a top-level heading; every HTML page links its mirror with <link rel="alternate" type="text/markdown">.
- Site index: /llms.txt. This section's index: /developers/llms.txt
- Agent skill: SKILL.md. Discovery index at /.well-known/agent-skills/index.json
- Credentials: none needed (/auth.md). Pricing: free for readers and agents (/pricing.md).
REST API
Base URL https://saaskly.com/api. OpenAPI 3.1: /openapi.json. API catalog (RFC 9727): /.well-known/api-catalog. Agentic Resource Discovery catalog: /.well-known/ard.json.
Collections: providers, categories, articles, pages (published documents only). Query grammar (Payload CMS): where[field][op]=value with equals, not_equals, in, like, contains, greater_than, less_than; sort (-field for descending); limit / page for pagination (totalDocs, totalPages, hasNextPage in the envelope); depth for relationship population (0 = ids only).
Top 5 VoIP providers by editorial score
curl -s "https://saaskly.com/api/providers?where[category][equals]=voip&sort=-overallRating&limit=5&depth=0"
One provider by slug
curl -s "https://saaskly.com/api/providers?where[slug][equals]=voipstudio&depth=0"
Comparison articles
curl -s "https://saaskly.com/api/articles?where[contentType][equals]=comparison&depth=0"
Prose fields (description, body) are Lexical editor JSON. Prefer the .md mirror for text. Errors are JSON ({"errors":[{"message":"…"}]}) with the status code carrying the class: 400 bad query, 403 forbidden collection or method, 404 missing id.
Versioning and deprecation. The current version is /api/v1/; the un-prefixed /api/ paths are a legacy alias of v1. Additive changes ship without notice; breaking changes get 90 days' notice and Deprecation + Sunset headers on the affected endpoints. Full text: API versioning and deprecation policy.
Rate limits
300 requests per 60 seconds per client IP across /api/*, /api/v1/* and /mcp. Every response carries the IETF RateLimit headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset (seconds until the window resets) and RateLimit-Policy (300;w=60), plus the X-RateLimit-* spellings. Over the limit you get a JSON 429 ({"errors":[{"message":"Rate limit exceeded…"}]}) with Retry-After; wait that many seconds and retry. Uploaded media under /api/media/file/ is served from the edge cache and not counted. Please identify your agent in the User-Agent header with a contact URL.
Retries and idempotency
Reads are safe to retry. The POST endpoints (/api/v1/providers/batch and /api/v1/vendors/register) accept an Idempotency-Key header (any unique string up to 255 characters; a UUID is ideal). A retry with the same key and the same body within 24 hours returns the original response with Idempotency-Replayed: true instead of repeating the side effect; the same key with a different body is refused with 422. Retry on network errors and 5xx with the same key; on 429 wait for Retry-After first.
Batch reads and pagination
- Batch:
POST /api/v1/providers/batchwith{"slugs":["descript","davinci-resolve"]}(orids, max 25) returns{docs, requested, returned, missing}in one round trip;GET /api/v1/providers/batch?slugs=a,b,cis the same. Published providers only. - Pagination: list endpoints are page/limit based:
page,limit(≤ 100), andtotalPages,hasNextPage,nextPagein the response. For stable iteration sort byid(sort=id) and steppage; the whole catalogue is small enough thatlimit=100usually fetches a collection in one or two calls. - Long-running work: none. Every endpoint answers synchronously; there is no job queue to poll.
Using what you fetch
Permitted under our Terms of Use section 4: answer questions, research and compare on a user's behalf, with attribution and a link to the source page; present scores as editorial opinion; quote both price bases where we publish them; pass on partner disclosures verbatim. Bulk republishing, reselling and model training need written permission: help@saaskly.com.
Changelog
- 2026-09-02: Rate limiting (300/min per IP) with RateLimit headers;
Idempotency-Keyon POST endpoints; batch provider endpoint; deprecation policy page; Content Creation category. - 2026-08-28: MCP server, OpenAPI description, Markdown mirrors, llms.txt, discovery manifests and this page published.
Researched and drafted with AI assistance; reviewed and approved by Tim Meredith. See https://saaskly.com/ai-transparency.md and https://saaskly.com/editorial-policy.md.
Canonical HTML: https://saaskly.com/developers · Markdown index: https://saaskly.com/llms.txt
