API docs
One body of content, two ways in: REST for scripts, MCP for agents. Public articles need no key; subscriber guides need an API key from an account with access.
Overview
Every path below is relative to this base URL. Responses are JSON.
https://api.modernengineer.devAuthentication
Create an API key in API key management, then send it in an Authorization: Bearer <key> header. The key is shown once, when you create it. Public verbs (catalog, articles) need no key.
Limits & errors
| Applies to | Limit |
|---|---|
| Paid guide reads (content.get) | 1,000 in 24 hours, per account |
| File pack and visual links (packs.download, visuals.issueUrl) | 50 links in 24 hours, per account |
| The /mcp endpoint | 300 per minute, per IP |
Every error comes back in the same JSON shape, with a requestId to quote when reporting it:
{
"error": {
"code": "not_found",
"message": "Content item was not found",
"requestId": "…"
}
}| Status | Error |
|---|---|
| 400 | invalid_input |
| 401 | unauthenticated |
| 403 | forbidden |
| 404 | not_found |
| 429 | too_many_requests |
| 500 | internal_error |
MCP setup
Declare it once in an MCP client and replace <API key> with the key you created (JSON config does not expand environment variables; use your client's own variable syntax if it has one). It uses the same API key as REST.
{
"mcpServers": {
"modernengineer": {
"type": "http",
"url": "https://api.modernengineer.dev/mcp",
"headers": {
"Authorization": "Bearer <API key>"
}
}
}
}Tool list
The verbs agents use to read content. Each has a REST path and an MCP tool with the same parameters. tools/list also returns a few account tools (API keys, billing) not covered here.
| Verb | REST | MCP tool | Access |
|---|---|---|---|
| catalog.list | GET /catalog | catalog_list | No key |
| catalog.get | GET /catalog/{locale}/{slug} | catalog_get | No key |
| articles.list | GET /articles | articles_list | No key |
| articles.get | GET /articles/{locale}/{slug} | articles_get | No key |
| content.list | GET /content | content_list | Key required |
| content.get | GET /content/{locale}/{slug} | content_get | Key required |
| packs.download | POST /packs/{slug}/download | packs_download | Key required |
| visuals.issueUrl | POST /visuals/{locale}/{slug}/url | visuals_issueUrl | Key required |