Developer and agent documentation
Public API, OpenAPI specification, Markdown content negotiation and MCP server for Lee Sugano Digital Solutions.
This page describes everything leesugano.com exposes for programmatic use: the public content API, the OpenAPI specification that describes it, the Markdown representation of every page, and the MCP server.
None of it requires an API key or a signup. The endpoints are public, rate limited per IP, and every response - errors included - is JSON.
Quick start
Three calls cover most cases: read the specification, list published posts, and read any page of the site as Markdown.
# OpenAPI
curl -s https://leesugano.com/openapi.json
# listPublishedPosts
curl -s "https://leesugano.com/api/posts?limit=5&locale=en"
# Markdown
curl -s -H "Accept: text/markdown" https://leesugano.com/blogPublic endpoints
Every endpoint below accepts anonymous requests. Full request and response schemas live in the OpenAPI specification.
| Method | Path | operationId | What it does |
|---|---|---|---|
| GET | /api/posts | listPublishedPosts | List published blog posts |
| GET | /api/categories | listCategories | List blog categories |
| GET | /api/tags | listTags | List blog tags |
| GET | /api/posts/{id}/reactions | getPostReactions | Read a post's reactions |
| POST | /api/posts/{id}/reactions | reactToPost | Add, switch or remove a reaction |
| POST | /api/newsletter | subscribeToNewsletter | Subscribe an email to the newsletter |
| POST | /api/start/recommend | recommendSolution | Recommend a solution from a business profile |
| GET | /api/og | renderOpenGraphImage | Render a 1200x630 Open Graph image |
Markdown at the same URL
Every public page is served as HTML to browsers and as Markdown to agents, from the same URL, decided by the Accept header per the acceptmarkdown.com convention.
Responses carry Vary: Accept, so CDNs cache the two representations separately. If you prefer an explicit URL, append .md to the path.
curl -sI -H "Accept: text/markdown" https://leesugano.com/blog
curl -s https://leesugano.com/blog.mdError format
Errors are never HTML. Every failure returns a JSON object with the fields below and the matching HTTP status.
Branch on code, which is stable, rather than on the error text, which may change.
| Field | Meaning |
|---|---|
error | Human-readable message. May change without notice. |
code | Stable SCREAMING_SNAKE_CASE code. Use this in your logic. |
requestId | Request identifier, also returned in the x-request-id header. |
details | Validation details. Present only in development. |
Rate limits
The 7 public endpoints are rate limited per IP over a 60-second window.
Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset. When the limit is exceeded the response is a 429 with Retry-After in seconds. Self-throttle on those headers instead of retrying in a loop.
| Endpoint | Limit |
|---|---|
GET /api/posts | 60 req/min per IP / 60s |
GET /api/categories | 60 req/min per IP / 60s |
GET /api/tags | 60 req/min per IP / 60s |
GET /api/posts/{id}/reactions | 60 req/min per IP / 60s |
POST /api/posts/{id}/reactions | 20 req/min per IP / 60s |
POST /api/newsletter | 10 req/min per IP / 60s |
POST /api/start/recommend | 8 req/min per IP / 60s |
MCP server
A Model Context Protocol server runs at https://mcp.leesugano.com over Streamable HTTP transport.
It is OAuth-protected: the tool listing becomes available after authorization, not anonymously.
For AI agents
Operating instructions - which jobs this agency is right for, which it is not, and the exact call that serves each intent - live at /agents.md.
Canonical facts about the company are at /llms.txt, and in expanded form at /llms-full.txt.
Machine-readable resources
Stable files, cached and CORS-enabled.