LPT Hub API and MCP documentation
LPT Hub has a public read-only API for the game list and an MCP server so AI agents can query the same data. No API key or login is needed.
Overview
Base URL: https://lyphucthien.vercel.app/api/v1. All responses are JSON (application/json; charset=utf-8) and every response carries an API-Version header. The machine-readable specification is /openapi.json (OpenAPI 3.1) and the API catalog is at /.well-known/api-catalog.
Authentication
None. The public endpoints are read-only and open. Do not send credentials. Keys are never issued through the API: a user has to complete the short link in their own browser, so an agent cannot get a key for them. The key-check API is reserved for the LPT Hub script and is not part of the public API.
List games
GET /api/v1/games (alias: /api/games) returns the games LPT Hub supports or will support soon.
| Parameter | Type | Description |
|---|---|---|
status | string | Optional. all (default), on (supported) or soon (coming soon). |
query | string | Optional. Keyword, up to 100 characters, matched against the game name and description. |
curl -s "https://lyphucthien.vercel.app/api/v1/games?status=on&query=minecraft"
Example response:
{
"success": true,
"games": [
{
"id": "Game-Mau",
"name": "Game-Mau",
"status": "on",
"type": "",
"description": "A short description.",
"image": "",
"order": 9999,
"features": [{ "category": "Other", "items": ["Feature 1"] }]
}
],
"errors": []
}
Each game has id, name, status (on or soon), type (minecraft, lpthub or empty), description, image, order and features (groups with a category and a list of items).
Errors
Errors are always JSON, never an HTML page, with the matching HTTP status:
{
"success": false,
"error": "status must be all, on or soon",
"code": "INVALID_PARAMETER",
"hint": "Send ?status=on, ?status=soon or omit it.",
"status": 400,
"parameter": "status"
}
error is a human-readable message, code is a stable identifier to branch on, and hint says how to fix it. Codes: INVALID_PARAMETER and INVALID_REQUEST (400), FORBIDDEN (403), NOT_FOUND (404, also returned for unknown /api/* paths), METHOD_NOT_ALLOWED (405, with an Allow header), RATE_LIMITED (429) and SERVER_ERROR (500).
Rate limits
Each IP address may make 120 requests per 60 seconds to the API and to the MCP server. Responses include RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds until the window resets), plus the structured RateLimit-Policy and RateLimit fields. When the limit is exceeded the API answers 429 with a Retry-After header and the RATE_LIMITED error. Responses may be cached for up to a minute, so the header values are advisory.
Versioning and deprecation policy
The API version is in the URL path (/api/v1) and in the API-Version response header. Within a major version, changes only add optional fields, parameters or endpoints, so clients should ignore fields they do not know. A breaking change ships under a new path such as /api/v2. A deprecated version stays available for at least 90 days after it is announced on this page; during that time its responses carry the Deprecation and Sunset headers (RFC 9745 and RFC 8594) with the removal date.
MCP server
Endpoint: https://lyphucthien.vercel.app/mcp (also available at /.well-known/mcp). Streamable HTTP transport; send JSON-RPC with POST; no authentication. There are two read-only tools:
list_games: lists supported games, with optional filtersstatusandquery.get_key_instructions: the steps to get a key, the wait time, and the key page link.
curl -s https://lyphucthien.vercel.app/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Command-line tool
The lpthub-cli package wraps the API for scripts and terminals. It has no dependencies and needs Node 18 or newer:
npx lpthub-cli games --status on --json
npx lpthub-cli key-info
Exit codes: 0 success, 1 request or API error, 2 invalid usage.
Files for agents
/llms.txt describes when to use LPT Hub, /sitemap.xml lists the pages, /openapi.json is the API specification, and the home page returns Markdown when you send Accept: text/markdown.