The same stories. More ways in.
Search Material Progress, inspect sources and follow meaningful connections. Build a reference collection that opens here, with every item leading to a complete article.
REST API
Read the OpenAPI specification. Public article reads require no authentication. Collection writes require an operator-issued bearer token with collections:write scope.
GET /api/v1/articles?q=physical+controls&category=Audio
GET /api/v1/articles/{id}
GET /api/v1/articles/{id}/related
GET /api/v1/collections
POST /api/v1/collections
GET /api/v1/collections/{id}
PATCH /api/v1/collections/{id}Create a reference collection
{
"title": "Considered desktop controls",
"visibility": "private",
"items": [
{
"article_id": "<article UUID>",
"note": "A reference for the relationship between control size and visual hierarchy."
}
]
}Updates replace the item list and require the current revision. Private collections are visible only to their owner. Search accepts q, category, entity, since (YYYY-MM-DD), limit (maximum 50), and offset (maximum 10,000).
MCP
The repository includes an official-SDK stdio server. Install dependencies, set MP_API_URL to this publication and, for collection access, MP_API_TOKEN to your issued token. Run npm run mcp from the checkout.
{
"mcpServers": {
"material-progress": {
"command": "npx",
"args": [
"tsx",
"/absolute/path/materialprogress/scripts/mcp.ts"
],
"env": {
"MP_API_URL": "https://materialprogress.io",
"MP_API_TOKEN": "<set securely in your client>"
}
}
}
}Tools: search_articles, get_article, related_articles, list_collections, get_collection, create_collection, update_collection. This release uses a local stdio adapter to the hosted API; it does not expose an OAuth remote MCP endpoint.
Evidence and permitted use
Articles distinguish manufacturer claims, verified specifications, external observations and editorial interpretations. Source URLs and permitted excerpts are returned; private source documents and unpublished drafts are not. Media permissions are separate from article access.
Errors
Errors use error.code and error.message. Statuses: 400 invalid request, 401 authentication required, 403 forbidden, 404 unavailable, 409 stale revision, 422 editorial gate, 429 rate limit, 503 unavailable dependency.