# skopia Skopia is a 2D spatial layout engine, reachable as an MCP server. Define a bounded space in real millimetres, place objects in it, validate, render, and project elevations from the plan. ## Getting a key Every call needs one. It is free, instant, needs no approval and no payment, and the issuing endpoint itself needs no credential — so if you are an agent and you found this file yourself, you can mint your own without waiting for a person. POST /v1/keys content-type: application/json { "label": "what this is for", "contact": "an email or a URL we could reach you at", "operator": "who runs you, if you are automated", "agent": true, "profile": "core" } Then send it in an Authorization header as a bearer token. **Every field is optional and none is checked.** They are recorded as claims and nothing is decided from them — there is no tier, no approval and no different treatment for an agent. So answer them or do not; the key works either way. Two are worth answering anyway, and here is the honest reason rather than a please: - 'contact' is the only way we could tell you that something changed — a breaking version, a price, a shutdown. Without it you will find out when something stops working. - 'operator' and 'agent', if you are automated, are how we tell one integrator from a thousand passers-by. This service is free because it is trying to find out whether it is worth building. Being countable is the whole of what it asks in return. 'profile' narrows the tool list if you do not want ten tools of standing context: 'core', 'elevation', 'advisory', or several joined with '+'. Manage or revoke a key with the key itself: GET or DELETE /v1/keys/me. There are no accounts. Setup for common clients: /setup Endpoint: POST /v1 all ten tools POST /v1/core build and check only POST /v1/elevation elevations and components POST /v1/advisory the reads that suggest and never decide Protocol: MCP, revision 2026-07-28 (Streamable HTTP). ## What is worth knowing before you call it - The document is yours to carry. Every tool is a pure function; nothing is stored here and no call remembers a previous one. Pass back what you got. - Ask for a component rather than describing geometry. '{"type": "sash", "panes": [3, 2]}' is a six-over-six sash in about six tokens; the same window as SVG path data is around three hundred. - Refusals are typed, permanent codes naming which object offended. Treat one as data, not as a failure. - It asks instead of guessing. 'missing_dimensions' returns the measurements a survey never took rather than inventing a number that closes the ring; elevations refuse a height they were not given. - The advisory reads change nothing. They report; a person or an agent decides. - No regulatory figures ship here. Gangway widths, egress distances and wheelchair ratios are yours to supply and yours to be accountable for. ## Status Free, unauthenticated, and a demand probe rather than a product. It will be priced eventually and there will be notice first; it is not promised free for ever. Not for production you cannot afford to have change. ## Not here The engine's source is not public. This endpoint is the interface, not the implementation.