MCP server endpoint (JSON-RPC 2.0 over Streamable HTTP)
Model Context Protocol server: a single endpoint through which AI clients (Claude, ChatGPT, Claude Code or any MCP client) read, create, edit and publish the activities of the authenticated user by calling tools.
Transport. Streamable HTTP, stateless: every JSON-RPC request or notification is its own POST, the answer is always one JSON object (no SSE streams), no session is ever issued (Mcp-Session-Id is ignored) and notifications are acknowledged with 202. GET is not served.
Protocol revisions. Two eras are served on the same endpoint.
- Handshake revisions 2024-11-05, 2025-03-26, 2025-06-18 and 2025-11-25: the client sends initialize and the server answers with the negotiated version (the newest it supports when the requested one is unknown), serverInfo, capabilities (tools) and instructions.
- Revision 2026-07-28: no handshake. Each request declares params._meta["io.modelcontextprotocol/protocolVersion"] and mirrors it in the MCP-Protocol-Version header, together with Mcp-Method (the method) and, on tools/call, Mcp-Name (the tool name, Base64 sentinel encoding accepted). Results carry resultType: "complete", _meta["io.modelcontextprotocol/serverInfo"] and, on lists, ttlMs and cacheScope. server/discover returns the supported versions, capabilities, identity and instructions and can be called under either era.
Methods. server/discover, initialize, ping, tools/list, tools/call, resources/list and prompts/list (both empty). Anything else answers -32601 (404 under 2026-07-28, 200 under the handshake revisions).
Tools. tools/list returns 26 tools, each with its title, its JSON Schema and annotations (title, readOnlyHint, destructiveHint, idempotentHint):
- Discover: list_activity_types, get_activity_schema, list_my_activities, get_activity, get_activity_content, get_publish_blockers.
- Create and edit: create_activity, set_activity_content, attach_video, update_activity, set_activity_audience, classify_activity, update_activity_settings, add_label, remove_label.
- Media and audio: list_my_media, illustrate_items, search_image_library, set_item_images, remove_item_media, set_item_text_visibility, describe_image, generate_field_audio.
- Publication and visibility: publish_activity, unpublish_activity, set_activity_privacy.
Every tool answers a JSON text, {"ok": true, ...} or {"ok": false, "error": "<code>", ...}, and isError mirrors ok. Tools that write or publish execute immediately: asking the user for confirmation is the client's job, which is what destructiveHint is for. Calls are independent of each other (there is no server-side conversation); the image catalogue returned by list_my_media and search_image_library stays valid for one hour so that set_item_images and describe_image can refer to it from later requests.
Authentication. Any Bearer token of this API: an application token generated from the profile settings (for clients where the user pastes a token, for example claude mcp add --transport http educaplay <this URL> --header "Authorization: Bearer <token>"), or an access token obtained through the OAuth 2.1 flow described under the OAuth tag (for connectors that sign the user in, such as the Claude or ChatGPT connector settings, where only this URL is needed). Both grant exactly the same access as any other token of the API.
Quotas. Calls count against the API rate limit of the plan like any other request. describe_image spends the AI budget the user shares with the site's assistant, the audio tools spend the text to speech quota of the plan, and publishing is subject to the limits of the plan, which come back as blockers.
Request
- Base URL: https://api.educaplay.com
- URL: https://api.educaplay.com/v1/agent/mcp/
- Auth: HTTP bearer
Request body
Example request
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_activity",
"arguments": {
"activity_id": 12345678
}
}
}Response
JSON-RPC response: result on success or error on a protocol failure. A tool that fails answers inside result with isError: true and a JSON text such as {"ok": false, "error": "forbidden"}.
Example response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"ok\":true,\"activity\":{\"id\":12345678,\"title\":\"Rivers of Spain\",\"published\":false}}"
}
],
"isError": false
}
}Changes
No recorded changes to this operation across all 1 revision of this API.