Build on edugalbs.com
Everything Eduardo Galbiati publishes here (his profile, the Factory diary and the blog on technology and leadership) can be searched and read from code or an AI agent, over a REST API or an MCP server. Public, read-only, free, and no API key.
Quickstart
Search the site:
curl "https://www.edugalbs.com/api/v1/search?q=12-factor+agents&limit=3"
Read one of the results in full, as Markdown:
curl "https://www.edugalbs.com/api/v1/pages?url=/blog/12-factor-agents"
Or add the MCP server to an agent. In Claude Code:
claude mcp add --transport http edugalbs https://www.edugalbs.com/api/mcp
Any client that speaks MCP over Streamable HTTP works with the same URL. Any page of the site is also available as Markdown: add .md to its address or ask for it with Accept: text/markdown.
Endpoints
All are GET, answer JSON and take lang=pt|en where it applies. The full description is the OpenAPI 3.1 document.
| Endpoint | What it returns |
|---|---|
/api/v1 | The list of endpoints. |
/api/v1/search?q= | The best matching sections of every page, with a snippet and the page URL (section=all|diary|blog|profile, limit=1–10). |
/api/v1/pages?url= | A page as Markdown, with its title and summary; read long pages in parts with offset and max_chars. |
/api/v1/chapters | The chapters of the Factory diary, in order. |
/api/v1/posts | The blog posts, newest first. |
/api/v1/profile | The profile Eduardo wrote for AI assistants. |
POST /api/mcp | The MCP server (JSON-RPC 2.0): tools search_site, get_page, list_diary_chapters, list_blog_posts, get_profile. |
API keys and sandbox
There are no API keys and nothing to sign up for: every endpoint is public. The API only reads what is already published, so there is no separate sandbox: production is safe to experiment with, and nothing you send can change the site. Scheduled chapters and posts stay out of it until their publication time.
Rate limits
60 requests a minute per client address, shared by the REST API and the MCP server. Every answer says where you stand, with the RateLimit headers of the IETF draft and the fields of its earlier versions:
RateLimit-Policy: "default";q=60;w=60
RateLimit: "default";r=59;t=60
RateLimit-Limit: 60
RateLimit-Remaining: 59
RateLimit-Reset: 60
Beyond the limit the answer is 429 with Retry-After, the seconds to wait.
Errors
Every error under /api/ is JSON with the HTTP status, a code to branch on, a message and a hint on what to do:
{ "error": { "status": 400, "code": "missing_parameter",
"message": "The parameter \"q\" is required.",
"hint": "Add ?q=… : What to look for.",
"docs": "https://www.edugalbs.com/openapi.json" } }
The codes: not_found, unsupported_version, method_not_allowed, missing_parameter, invalid_parameter, page_not_found, rate_limited and unavailable. The MCP server answers JSON-RPC errors. A page that does not exist is a 404 in Markdown when you ask for text/markdown.
Versioning and deprecation
- The major version is in the path:
/api/v1/./api/<endpoint>, without a version, is an alias of v1 and stays one. - Additions (new endpoints, parameters or fields) come within v1 and only bump
info.versionin the OpenAPI document. Clients should ignore fields they do not know. - Anything that would break a client comes as
/api/v2/. v1 then keeps working for at least 6 months, and its answers announce it with theDeprecation(RFC 9745) andSunset(RFC 8594) headers and aLinkto this section withrel="deprecation". - The MCP server negotiates its protocol version in
initialize, and its tools follow the same rule.
Machine-readable files
- /openapi.json: the API, in OpenAPI 3.1.
- /.well-known/mcp/server-card.json: the MCP server's card.
- /.well-known/api-catalog: the API catalog (RFC 9727).
- /.well-known/agent-skills/index.json: agent skills to introduce Eduardo, read the diary and search the site.
- /llms.txt and /llms-full.txt: the guide to the site and its full text, as Markdown.
- /sitemap.xml and /robots.txt, which declares the content may be used for search, AI answers and AI training.
Questions or a bug? Write to eduardo.galbiati@gmail.com (see contact and privacy).
Updated on October 29, 2026.