{"name":"Steldris","version":"1.1","description":"Agent-native multi-tenant CMS platform. Agents can generate pages, migrate content, manage tenants, and deliver structured blocks.","base_url":"https://steldris.fru.io","mcp":{"endpoint":"/api/mcp","transport":"streamable-http","description":"Primary agent surface. Connect Claude (Settings -> Connectors -> custom connector) or ChatGPT (MCP connectors) to <base_url>/api/mcp with a tenant API key as the bearer token. Stateless: POST JSON-RPC only; GET/DELETE return 405.","auth":"Authorization: Bearer sk_steldris_... (tenant-scoped API key)","tools":["get_site_info","list_pages","get_page","create_page","update_page","publish_page","list_media","generate_alt_text","generate_page","get_navigation","update_navigation","list_redirects","create_redirect","list_forms","list_form_submissions"]},"auth":{"api_key":{"type":"bearer","header":"Authorization: Bearer sk_steldris_...","description":"Tenant-scoped API key — the production path for agents and CI, on /api/admin/* and /api/mcp. Mint at POST /api/admin/api-keys (admin capability; the token is shown exactly once). Each key carries one role: viewer < editor < publisher < admin."},"session":{"type":"cookie","description":"Auth0 session cookie (browser admin UI). Org members select a site via the x-tenant header."},"oauth_jwt":{"type":"bearer","status":"dormant","description":"Auth0-issued RS256 access tokens are accepted on the same Authorization header, but only once AUTH0_API_AUDIENCE is configured on the deployment. Until then, use an API key."},"development":{"type":"headers","headers":{"x-dev-bypass":"true","x-tenant":"<tenant-slug>"},"description":"Dev only. Not available in production."},"public_routes":["/api/public/*","/api/health","/api/agent/manifest","/llms.txt"]},"capabilities":[{"id":"mcp","method":"POST","path":"/api/mcp","auth":"required","description":"Model Context Protocol endpoint (streamable-http, stateless). Exposes the tools listed under `mcp.tools`, scoped to the API key's tenant and role."},{"id":"generate_page","method":"POST","path":"/api/admin/ai/generate","auth":"required","description":"Generate a structured block-based page draft from a natural language prompt. Optionally persists as a draft CMS page.","input":{"prompt":"string — what the page should be about","brandVoice":"string? — optional tone/voice guidance","createPage":{"slug":"string — URL slug","title":"string — page title"}},"output":{"blocks":"Block[] — structured content blocks ready for rendering","page":"{ id, slug, title } — only present when createPage was provided"}},{"id":"generate_alt_text","method":"POST","path":"/api/admin/ai/alt-text","auth":"required","description":"Generate WCAG-compliant alt text for a media asset (or a raw image URL).","input":{"media_id":"string? — Steldris media asset ID (mediaId is accepted as a legacy alias)","image_url":"string? — raw image URL when no media asset exists","save":"boolean? — persist onto the media asset (default true)"},"output":{"alt_text":"string"}},{"id":"import_drupal","method":"POST","path":"/api/admin/import/drupal","auth":"required","description":"Migrate pages from a Drupal 9/10 site into a Steldris tenant.","input":{"sourceUrl":"string — Drupal base URL","tenantId":"string? — defaults to session tenant"}},{"id":"import_wordpress","method":"POST","path":"/api/admin/import/wordpress","auth":"required","description":"Migrate pages from a WordPress site via WP REST API.","input":{"sourceUrl":"string — WordPress base URL","tenantId":"string? — defaults to session tenant"}},{"id":"read_page","method":"GET","path":"/api/public/{tenant}/{slug}","auth":"none","description":"Fetch a published page as structured blocks. The bare /api/public/{tenant} returns the homepage (slug 'home').","output":{"tenant":"string — tenant slug","slug":"string","title":"string","seo":"object | null","blocks":"Block[] — structured content blocks","published_at":"string | null"}},{"id":"signup","method":"POST","path":"/api/signup","auth":"none","description":"Self-serve signup for new clients. Creates a suspended org + Stripe Checkout session. On payment, the org is activated and an Auth0 invite email is sent.","input":{"org_name":"string","slug":"string — lowercase alnum + hyphens, becomes the org identifier","email":"string — admin email, receives the Auth0 invite","plan":"business | government"},"output":{"checkout_url":"string — redirect here to complete payment"}},{"id":"provision_org","method":"POST","path":"/api/admin/organizations","auth":"required","description":"Agent/staff provision path. For existing clients: supply auth0_organization_id to link the shared org identity. For net-new clients: set createAuth0Org:true. skip_billing:true bypasses Stripe. invite_email triggers an Auth0 invite immediately.","input":{"slug":"string","name":"string","auth0_organization_id":"string? — existing Auth0 org id (from UnRoo/FCP)","createAuth0Org":"boolean? — mint a new Auth0 org (net-new clients only)","skip_billing":"boolean? — bypass Stripe (default false)","invite_email":"string? — send Auth0 invite to this address immediately","plan":"string?","unroo_client_id":"string?","fcp_client_id":"string?"},"output":{"organization":"{ id, slug, name, auth0_org_id, invite_sent, invite_url, admin_url }","created":"boolean"}},{"id":"list_plans","method":"GET","path":"/api/signup","auth":"none","description":"Returns available plans and whether each is configured.","output":{"plans":"Array<{ key, label, configured }>"}},{"id":"list_tenants","method":"GET","path":"/api/admin/tenants","auth":"required","description":"List all tenants visible to the authenticated user."},{"id":"list_pages","method":"GET","path":"/api/admin/pages","auth":"required","description":"List CMS pages for the active tenant."},{"id":"mint_api_key","method":"POST","path":"/api/admin/api-keys","auth":"required","description":"Mint a tenant-scoped API key (admin capability). The full token is returned once; use it as the bearer token for /api/mcp and /api/admin/*.","input":{"name":"string","role":"viewer | editor | publisher | admin"},"output":{"key":"{ id, name, role, key_prefix, token }"}}],"block_types":["hero","heading","rich_text","html","quote","cta","button_group","image","gallery","video","card_grid","accordion","columns","divider","action_launcher","tabs","document_library","form","service_card_grid"],"llms_txt":"/llms.txt"}