{"name":"agentView MCP","version":"2.1.114","protocolVersion":"2025-11-25","transport":{"streamableHttp":"https://agentview.de/mcp","protocol":"streamable-http","preferred":"streamableHttp"},"auth":{"type":"oauth2","protectedResourceMetadata":"https://agentview.de/.well-known/oauth-protected-resource/mcp","authorizationServerMetadata":"https://agentview.de/.well-known/oauth-authorization-server","publicTools":["create_auth_session","get_auth_session","authenticate","logout","get_public_status","search","fetch","search_public_apis","list_public_api_categories","search_store_templates","list_store_categories","get_store_template_details"],"secureFlow":["Preferred: Use OAuth 2.1 Authorization Code with PKCE against /authorize and /token. The /token response returns the Bearer access token.","Modern /mcp transport requires a valid Bearer token on every protected HTTP request.","Compatibility auth tools are optional and mainly for clients that cannot complete OAuth or cannot reliably resend headers.","Open the returned loginUrl in a browser and let the user approve access.","Poll get_auth_session until status is active.","Then pass session_request_id (from create_auth_session) on every protected tool call. For security the raw bearer token is intentionally not returned over MCP; the server resolves your identity from session_request_id server-side."]},"tools":[{"name":"create_auth_session","title":"Create Auth Session","description":"Creates a browser-based login session and returns a loginUrl the user must open to authenticate. Use this as the first step when your client cannot complete OAuth 2.1 with PKCE itself. Do not use this if you already have a valid Bearer token. Returns sessionRequestId (needed for get_auth_session), loginUrl, pollUrl and expiresIn (seconds until the login window closes, default 600). After calling this, instruct the user to open the loginUrl, then poll get_auth_session until status becomes active.","inputSchema":{"type":"object","properties":{"agent_identifier":{"type":"string","description":"Optional display name of the MCP client or agent, shown to the user in the browser consent screen. Example: 'ChatGPT' or 'my-home-automation'."},"scope":{"type":"string","enum":["content_only","admin"],"description":"Requested access scope. Must be either 'content_only' (read and send content to displays) or 'admin' (content_only plus create/delete/rename displays). Defaults to 'content_only'."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"sessionRequestId":{"type":["string","null"]},"requestedScope":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"expiresIn":{"type":["integer","null"]},"pollUrl":{"type":["string","null"]},"hint":{"type":["string","null"]}}},"category":"auth"},{"name":"get_auth_session","title":"Get Auth Session","description":"Polls the status of a login session created by create_auth_session. Use this after create_auth_session; poll every 2-3 seconds until the status is no longer 'pending'. Do not use this for any other purpose. Returns one of three states: 'pending' (user has not logged in yet — keep polling), 'active' (login succeeded; tokenExpiresAt is an ISO 8601 timestamp for when re-authentication is required. For security the raw bearer token is intentionally not returned over MCP, so keep using your session_request_id on protected calls), or 'expired' (login window or token timed out — call create_auth_session again). When status is active the current MCP session is automatically authenticated; you can call protected tools immediately.","inputSchema":{"type":"object","required":["session_request_id"],"properties":{"session_request_id":{"type":"string","description":"The sessionRequestId string returned by create_auth_session. Must be passed exactly as received."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","active","expired"]},"requestedScope":{"type":["string","null"]},"expiresIn":{"type":["integer","null"]},"scope":{"type":["string","null"]},"tokenExpiresAt":{"type":["string","null"],"format":"date-time"},"sessionRequestId":{"type":["string","null"]}}},"category":"auth"},{"name":"authenticate","title":"Authenticate Session","description":"Validates a JWT agent token and caches the resulting identity on the current MCP session so that subsequent protected tool calls succeed without resending the token. Use this only if your client cannot reliably send an Authorization: Bearer header on every request; modern streamable HTTP clients should send the header instead. Do not call this if the session was already auto-authenticated by get_auth_session. Returns authenticated (boolean), sessionBound (whether the identity was cached on this session), userId, name, email, scope and expiresAt (ISO 8601).","inputSchema":{"type":"object","properties":{"token":{"type":"string","description":"The raw JWT token string returned by get_auth_session or an OAuth access token. Pass the opaque token exactly as received — do not add a 'Bearer ' prefix and do not expand or decode the JWT claims."},"jwt":{"type":"string","description":"Alias for token. Use this if your wrapper cannot send the 'token' field reliably."},"access_token":{"type":"string","description":"Alias for token. Use this if your wrapper follows OAuth naming conventions."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"authenticated":{"type":["boolean","null"]},"sessionBound":{"type":["boolean","null"]},"transportAuthRequired":{"type":["boolean","null"]},"userId":{"type":["string","null"]},"name":{"type":["string","null"]},"email":{"type":["string","null"]},"isAgent":{"type":["boolean","null"]},"scope":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"category":"auth"},{"name":"logout","title":"Logout","description":"Clears the cached authentication identity from the current MCP session. Use this when the user wants to end the session or switch accounts. This does not revoke the underlying JWT token — it only removes the session-local cache. After logout, protected tools will require re-authentication. Returns loggedOut (boolean) and sessionBound (boolean).","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"loggedOut":{"type":["boolean","null"]},"sessionBound":{"type":["boolean","null"]},"transportAuthRequired":{"type":["boolean","null"]}}},"category":"auth"},{"name":"get_public_status","title":"Get Public Status","description":"Returns the server's public readiness status, version string and discovery URLs. Use this before authenticating to verify the server is reachable and to obtain entry-point URLs. No authentication required. Returns status ('ready'), server name, version, statusUrl and instructionsUrl.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"status":{"type":["string","null"]},"server":{"type":["string","null"]},"version":{"type":["string","null"]},"statusUrl":{"type":["string","null"]},"instructionsUrl":{"type":["string","null"]}}},"category":"discovery"},{"name":"search","title":"Search Resources","description":"Searches agentView resources by keyword and returns a ranked list of matching resource URIs with titles and snippets. Use this to discover resources before calling fetch for full details. Do not use this if you already know the exact resource URI — call fetch directly instead. Without authentication only public documentation resources are searched; with authentication your account and accessible displays are included. Returns query, resourceType, count and a results array where each entry has uri, type, title, snippet and requiresAuthentication.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text search terms. Examples: a display name, 'account', 'OAuth', 'status'. At least one of query or resource_type should be provided."},"resource_type":{"type":"string","enum":["all","documentation","status","account","display","api"],"description":"Restricts results to a specific resource category. Must be one of: 'all', 'documentation', 'status', 'account', 'display', 'api'. Defaults to 'all' when omitted."},"limit":{"type":"integer","minimum":1,"maximum":20,"description":"Maximum number of results to return. Integer between 1 and 20 inclusive. Defaults to 5."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"},{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"noauth"},{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"query":{"type":["string","null"]},"resourceType":{"type":["string","null"]},"count":{"type":["integer","null"]},"results":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"uri":{"type":["string","null"]},"type":{"type":["string","null"]},"title":{"type":["string","null"]},"snippet":{"type":["string","null"]},"requiresAuthentication":{"type":["boolean","null"]}}}}}},"category":"discovery"},{"name":"fetch","title":"Fetch Resource","description":"Retrieves the full details of a single agentView resource identified by its URI. Use this after search to read the complete content of a discovered resource, or directly when you already know the URI. Public URIs (e.g. agentview://public/status, agentview://public/instructions) require no authentication; private URIs (e.g. agentview://account/me, agentview://display/{id}) require a valid session. Returns uri, type, title, text (human-readable content) and data (structured details).","inputSchema":{"type":"object","required":["uri"],"properties":{"uri":{"type":"string","description":"The resource URI to fetch. Must use the agentview:// scheme. Examples: 'agentview://public/status', 'agentview://account/me', 'agentview://display/ABCD1234'."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"},{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"noauth"},{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"uri":{"type":["string","null"]},"type":{"type":["string","null"]},"title":{"type":["string","null"]},"text":{"type":["string","null"]},"data":{"type":["object","null"]}}},"category":"discovery"},{"name":"search_store_templates","title":"Search Store Templates","description":"Searches the agentView public template store for ready-made display designs (e.g. 'Zahnarzt-Wartezimmer', 'Bistro warm', 'Empfang'). Each template is a polished HTML design a user can push to one of their Türschild / digital-signage displays. Use this when the user describes a use case and wants to pick a pre-built design instead of having you generate raw HTML. Returns total, offset, limit, language and a templates array with slug, title, description, category, optional suite (design family), tags, theme, designStyle, placement, previewImageUrl, detailPath, previewPath, featured and publishedAt. No authentication required.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text search over template title, description and tags. Examples: 'Zahnarzt', 'italienisches Bistro', 'conference room'."},"category":{"type":"string","description":"Optional category slug to restrict the search (English kebab-case, e.g. 'gastronomie', 'waiting-room')."},"suite":{"type":"string","description":"Optional design-family suite slug (e.g. 'bistro-warm', 'sushi-minimal')."},"language":{"type":"string","enum":["de","en"],"description":"Preferred content language. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Maximum number of templates to return. Defaults to 10."},"offset":{"type":"integer","minimum":0,"description":"Offset into the filtered result set for pagination. Defaults to 0."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}],"openai/outputTemplate":"ui://agentview/store-gallery","openai/toolInvocation/invoking":"Searching the agentView template store…","openai/toolInvocation/invoked":"agentView Templates"},"outputSchema":{"type":"object","properties":{"total":{"type":["integer","null"]},"offset":{"type":["integer","null"]},"limit":{"type":["integer","null"]},"language":{"type":["string","null"]},"templates":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"slug":{"type":["string","null"]},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"category":{"type":["object","null"],"properties":{"slug":{"type":["string","null"]},"title":{"type":["string","null"]}}},"suite":{"type":["object","null"],"properties":{"slug":{"type":["string","null"]},"title":{"type":["string","null"]}}},"tags":{"type":["array","null"],"items":{"type":["string","null"]}},"theme":{"type":["string","null"]},"designStyle":{"type":["string","null"]},"placement":{"type":["string","null"]},"previewImageUrl":{"type":["string","null"]},"detailPath":{"type":["string","null"]},"previewPath":{"type":["string","null"]},"featured":{"type":["boolean","null"]},"publishedAt":{"type":["string","null"],"format":"date-time"}}}}}},"category":"store"},{"name":"list_store_categories","title":"List Store Categories","description":"Lists all published agentView store categories (e.g. Gastronomie, Wartezimmer, Empfang, Smart Home) with localized titles, descriptions and template counts. Use this to narrow a subsequent search_store_templates call when the user asks for 'templates for a waiting room' or similar. No authentication required. Returns count, language and a categories array where each entry has slug, title, description, templateCount, heroIconKey and detailPath.","inputSchema":{"type":"object","properties":{"language":{"type":"string","enum":["de","en"],"description":"Preferred content language. Defaults to 'en'."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"count":{"type":["integer","null"]},"language":{"type":["string","null"]},"categories":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"slug":{"type":["string","null"]},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"templateCount":{"type":["integer","null"]},"heroIconKey":{"type":["string","null"]},"detailPath":{"type":["string","null"]}}}}}},"category":"store"},{"name":"get_store_template_details","title":"Get Store Template Details","description":"Returns the full public details of a single store template: localized title, short description, long-form markdown (intro, use cases, audience, setup), category, optional suite (design family), tags, theme, designStyle, placement, features list, preview image URL, store detail path, AND an agentArtifacts array listing the bot-onboarding files shipped with the template (system prompts, Agent Skills standard SKILL.md files, MCP-config snippets). agentArtifacts is metadata only — bodies live behind get_store_template_agent_artifact (anonymous, raw with placeholders intact) and get_display_agent_artifact (owner-scoped, placeholders substituted against a specific display's installed slot slugs). Use this after search_store_templates picks a candidate so you can explain the template to the user, decide whether it ships agent integration, and offer the right install/onboard flow. No authentication required.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"The template slug (English kebab-case) returned by search_store_templates, e.g. 'bistro-warm-door' or 'agent-ops-cyan-wall'."},"language":{"type":"string","enum":["de","en"],"description":"Preferred content language. Defaults to 'en'."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}],"openai/outputTemplate":"ui://agentview/store-detail","openai/toolInvocation/invoking":"Loading template details…","openai/toolInvocation/invoked":"agentView Template"},"outputSchema":{"type":"object","properties":{"slug":{"type":["string","null"]},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"introMarkdown":{"type":["string","null"]},"useCasesMarkdown":{"type":["string","null"]},"audienceMarkdown":{"type":["string","null"]},"setupMarkdown":{"type":["string","null"]},"category":{"type":["object","null"],"properties":{"slug":{"type":["string","null"]},"title":{"type":["string","null"]}}},"categoryDescription":{"type":["string","null"]},"suite":{"type":["object","null"],"properties":{"slug":{"type":["string","null"]},"title":{"type":["string","null"]}}},"suiteDescription":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":["string","null"]}},"theme":{"type":["string","null"]},"designStyle":{"type":["string","null"]},"features":{"type":["array","null"],"items":{"type":["string","null"]}},"placement":{"type":["string","null"]},"previewImageUrl":{"type":["string","null"]},"detailPath":{"type":["string","null"]},"previewPath":{"type":["string","null"]},"featured":{"type":["boolean","null"]},"publishedAt":{"type":["string","null"],"format":"date-time"},"fileName":{"type":["string","null"]},"sourceKind":{"type":["string","null"]},"agentArtifacts":{"type":["array","null"],"description":"Agent-onboarding files shipped with the template (system prompts, Agent Skills standard SKILL.md, MCP config snippets). Empty array when the template ships none. Body lives behind get_store_template_agent_artifact / get_display_agent_artifact.","items":{"type":["object","null"],"properties":{"key":{"type":["string","null"],"description":"Stable key, lowercase kebab-case (e.g. 'bot-system-prompt'). Used in URL of the per-artifact body tool."},"kind":{"type":"string","enum":["prompt","skill","mcp-config","example-code"]},"fileName":{"type":["string","null"],"description":"Suggested filename when downloading (e.g. 'SKILL.md', '.mcp.json')."},"contentType":{"type":["string","null"],"description":"MIME type (text/markdown, application/json, …)."},"sizeBytes":{"type":["integer","null"]},"label":{"type":["string","null"],"description":"Localised human-readable label."},"description":{"type":["string","null"],"description":"Localised description explaining where the artifact goes."},"sortOrder":{"type":["integer","null"]}}}}}},"category":"store"},{"name":"get_store_template_agent_artifact","title":"Get Store Template Agent Artifact (Raw)","description":"Returns the RAW body of one agent-onboarding artifact shipped with a store template (system prompt, Agent Skills SKILL.md, MCP-config snippet, …). Placeholders ({{slot:KEY.prop}}) are NOT substituted — use this BEFORE installing the template, when there is no display yet to resolve slot slugs against. After install, use get_display_agent_artifact for the placeholder-substituted body ready to paste/save. Discover available artifact keys via get_store_template_details (agentArtifacts array). No authentication required.","inputSchema":{"type":"object","required":["slug","key"],"properties":{"slug":{"type":"string","description":"Template slug (e.g. 'agent-ops-cyan-wall')."},"key":{"type":"string","description":"Artifact key from get_store_template_details (e.g. 'bot-system-prompt', 'agent-skill', 'mcp-config')."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"slug":{"type":["string","null"]},"key":{"type":["string","null"]},"kind":{"type":"string","enum":["prompt","skill","mcp-config","example-code"]},"fileName":{"type":["string","null"],"description":"Suggested filename when saving to disk (e.g. 'SKILL.md', '.mcp.json')."},"contentType":{"type":["string","null"],"description":"MIME type of the body."},"sizeBytes":{"type":["integer","null"]},"content":{"type":["string","null"],"description":"Raw artifact body with placeholders intact. Treat as opaque text in the configured contentType."}}},"category":"general"},{"name":"get_store_template_content","title":"Get Store Template Content (HTML + Slots)","description":"Returns the raw display HTML body of a published store template plus its static slot definitions and allowed external origins — everything needed to insert the template as an editable slide in your own editor. {{asset:NAME}} placeholders are resolved to public URLs; {{slot:KEY.prop}} placeholders are left intact so you can bind them yourself using the returned slots array (same shape as get_store_template_install_options.requiredDataSlots). Only the current published version is returned. No authentication required.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"Template slug (English kebab-case) from search_store_templates, e.g. 'bistro-warm-door'."},"version":{"type":"string","description":"Optional published version id (stpv_…) to pin. Omit for the current published version; a non-matching version returns template_not_found / version_not_available."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"slug":{"type":["string","null"]},"version":{"type":["string","null"]},"html":{"type":["string","null"],"description":"Raw display HTML. {{asset:NAME}} resolved to public URLs; {{slot:KEY.prop}} left intact."},"slots":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"type":{"type":"string","enum":["value","aggregate"]},"placeholderName":{"type":["string","null"]},"required":{"type":["boolean","null"]}}}},"allowedExternalOrigins":{"type":["array","null"],"items":{"type":["string","null"]}}}},"category":"general"},{"name":"get_display_agent_artifact","title":"Get Display Agent Artifact (Substituted)","description":"Returns the agent-onboarding artifact body ready to paste/install, with {{slot:KEY.prop}} placeholders SUBSTITUTED against the slot slugs that were materialised when the template was installed on this display. The killer flow: 'Add my Claude Code agent to my agentView swarm display' → list_displays() to find the display → get_display_agent_artifact(display_id, key='agent-skill') → save the response.content to ~/.claude/skills/agentview-swarm-bot/SKILL.md. Requires content scope. The caller must own the display (or have a valid display.read API-key scope). Unresolved placeholders (e.g. when the template references a slot that wasn't installed) are returned verbatim in content and listed in unresolvedPlaceholders.","inputSchema":{"type":"object","required":["display_id","key"],"properties":{"display_id":{"type":"string","description":"Display profile ID (8-char alphanumeric) from list_displays."},"key":{"type":"string","description":"Artifact key (e.g. 'bot-system-prompt', 'agent-skill', 'mcp-config'). Discover available keys for a display's template via get_store_template_details on its installed template slug."},"access_token":{"type":"string","description":"Optional JWT access token (use session_request_id instead when possible)."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session. Preferred over access_token."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"displayId":{"type":["string","null"]},"key":{"type":["string","null"]},"kind":{"type":"string","enum":["prompt","skill","mcp-config","example-code"]},"fileName":{"type":["string","null"]},"contentType":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"content":{"type":["string","null"],"description":"Artifact body with {{slot:KEY.prop}} placeholders resolved to this display's installed slot slugs / readUrls."},"unresolvedPlaceholders":{"type":["array","null"],"items":{"type":["string","null"]},"description":"Placeholders that could not be resolved (rare — usually a template-vs-install drift). The literal placeholder text remains in content; surface this warning to the user."}}},"category":"general"},{"name":"get_store_template_install_options","title":"Get Store Template Install Options","description":"Returns the displays the authenticated user can send a given store template to, plus the data slots the template needs. Call this before send_store_template_to_display so you can show the user which Türschild they can target and know which per-slot JSON the template consumes. Requires authentication with at least content_only scope. API-key callers scoped to a display whitelist only see their scoped displays. When no displays come back, tell the user they first need to create/claim a display (create_display / pair_by_code) before installing store content.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"Template slug returned by search_store_templates, e.g. 'bistro-warm-door'."},"language":{"type":"string","enum":["de","en"],"description":"Preferred UI language for labels. Defaults to 'en'."},"access_token":{"type":"string","description":"Optional JWT access token."},"session_request_id":{"type":"string","description":"Optional session request ID from create_auth_session. Preferred over access_token."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"templateSlug":{"type":["string","null"]},"language":{"type":["string","null"]},"displays":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"displayId":{"type":["string","null"]},"name":{"type":["string","null"]},"scope":{"type":"string","enum":["personal","group"]},"groupId":{"type":["string","null"]},"isLocked":{"type":["boolean","null"]}}}},"requiredDataSlots":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"type":{"type":"string","enum":["value","aggregate"]},"placeholderName":{"type":["string","null"]},"required":{"type":["boolean","null"]}}}}}},"category":"store"},{"name":"send_store_template_to_display","title":"Send Store Template to Display","description":"Installs a published store template onto one of the authenticated user's displays. The server materializes the template HTML, auto-creates any required data slots (reusing existing slots from a prior install when possible) and publishes the result so the Türschild updates within seconds. Optional data_slot_overrides bake per-slot JSON directly into the install so a 'show my daily menu' flow does not need a second set_data_slot call. Requires authentication with at least content_only scope, control access to the target display, and (for API-key callers) the display.send capability. Errors: 'template_not_found', 'display_not_found', 'access_denied', 'slot_install_failed', 'storage_quota_exceeded', 'invalid_slot_override', 'publish_failed'. Always call get_store_template_install_options first to know which slots the template needs.","inputSchema":{"type":"object","required":["slug","display_id"],"properties":{"slug":{"type":"string","description":"Template slug to install, e.g. 'bistro-warm-door'. Must be a currently published template."},"display_id":{"type":"string","description":"Display profile ID (8-char alphanumeric) from list_displays or get_store_template_install_options."},"data_slot_overrides":{"type":"object","description":"Optional { key: value } map keyed by data-slot key (see requiredDataSlots). Each value is JSON payload to install into that slot — either a string of raw JSON or an inline object/array. Unknown keys are silently dropped; malformed JSON fails with invalid_slot_override. Per-slot payload capped at 64 KiB, max 64 overrides per call.","additionalProperties":true},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional opaque key (max 128 chars) to make this install retry-safe. If a previous successful install for the same (user, display, idempotency_key) tuple exists within 24 hours, the cached result is returned without re-publishing. Use this when an MCP client may retry the call after a network timeout (e.g. ChatGPT and other LLM hosts retry tool calls automatically) so the user doesn't see the display flicker through two near-identical installs. Recommended format: a UUID generated client-side per user request."},"access_token":{"type":"string","description":"Optional JWT access token."},"session_request_id":{"type":"string","description":"Optional session request ID from create_auth_session. Preferred over access_token."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"openai/outputTemplate":"ui://agentview/store-install-result","openai/toolInvocation/invoking":"Sending template to display…","openai/toolInvocation/invoked":"Template installed"},"outputSchema":{"type":"object","properties":{"templateSlug":{"type":["string","null"]},"versionId":{"type":["string","null"]},"displayId":{"type":["string","null"]},"fileName":{"type":["string","null"]},"contentVersionId":{"type":["string","null"]},"overrideCount":{"type":["integer","null"]},"installedSlots":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"key":{"type":["string","null"]},"placeholderName":{"type":["string","null"]},"slug":{"type":["string","null"]},"readUrl":{"type":["string","null"]},"groupId":{"type":["string","null"]},"type":{"type":["string","null"]}}}}}},"category":"store"},{"name":"list_public_api_categories","title":"List Public API Categories","description":"Lists all public-API categories with the number of APIs in each. Call this BEFORE search_public_apis when you want to offer the user a guided category pick (e.g. 'weather', 'finance', 'news'), or when the user asks 'what kinds of free APIs do you have?'. No authentication required.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"totalApis":{"type":["integer","null"]},"totalCategories":{"type":["integer","null"]},"categories":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"count":{"type":["integer","null"]}}}}}},"category":"discovery"},{"name":"search_public_apis","title":"Search Public APIs","description":"Searches a curated catalog of 600+ free, public APIs that require no authentication and work over HTTPS — ideal for embedding live data in display HTML pages via fetch(). Covers 47 categories including weather, news, finance, sports, images, food, entertainment, science, geocoding and more. Use this when generating HTML that needs live data from the internet. Returns matching APIs with documentation links, CORS support info and ready-to-use fetch() code hints. Use list_public_api_categories first if you want to offer the user a category-driven menu before searching. No authentication required.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text search terms. Examples: 'weather forecast', 'random quotes', 'cat pictures', 'bitcoin price', 'jokes'."},"category":{"type":"string","description":"Filter by category ID. Examples: 'weather', 'finance', 'animals', 'food-drink', 'sports-fitness', 'news', 'entertainment'. Use 'all' or omit for all categories."},"cors_only":{"type":"boolean","description":"When true, only return APIs with confirmed CORS support (safe for browser-side fetch in HTML). Defaults to false."},"limit":{"type":"integer","minimum":1,"maximum":20,"description":"Maximum results to return, 1-20. Defaults to 10."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"outputSchema":{"type":"object","properties":{"query":{"type":["string","null"]},"category":{"type":["string","null"]},"corsOnly":{"type":["boolean","null"]},"totalCatalogApis":{"type":["integer","null"]},"count":{"type":["integer","null"]},"results":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"slug":{"type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"category":{"type":["string","null"]},"cors":{"type":["string","null"]},"link":{"type":["string","null"]},"htmlEmbeddingHint":{"type":["string","null"]},"fetchUri":{"type":["string","null"]}}}}}},"category":"discovery"},{"name":"get_account","title":"Get Account","description":"Returns the authenticated user's account profile including userId, name, email, plan with feature details, personal display limits (maxPersonalDisplays, currentPersonalDisplays, remainingPersonalDisplays), total accessible displays across all organizations, organization memberships summary and points balance. Use this to answer questions about the user's subscription, display quota, organization memberships or plan capabilities. Requires authentication with at least content_only scope. Do not use this to list displays — use list_displays instead.","inputSchema":{"type":"object","properties":{"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"userId":{"type":["string","null"]},"name":{"type":["string","null"]},"email":{"type":["string","null"]},"plan":{"type":["string","null"]},"planFeatures":{"type":["array","null"],"items":{"type":["string","null"]}},"maxPersonalDisplays":{"type":["integer","null"]},"currentPersonalDisplays":{"type":["integer","null"]},"remainingPersonalDisplays":{"type":["integer","null"]},"totalAccessibleDisplays":{"type":["integer","null"]},"organizations":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"orgId":{"type":["string","null"]},"name":{"type":["string","null"]},"role":{"type":["string","null"]},"displayCount":{"type":["integer","null"]}}}},"organizationCount":{"type":["integer","null"]},"maxDisplays":{"type":["integer","null"]},"currentDisplays":{"type":["integer","null"]},"remainingDisplays":{"type":["integer","null"]},"points":{"type":["integer","null"]},"authenticatedVia":{"type":["string","null"]},"hint":{"type":["string","null"]}}},"category":"account"},{"name":"list_displays","title":"List Displays","description":"Returns all displays accessible to the authenticated user as an array with count and display details. Use this to discover available display IDs before reading or modifying a specific display with get_display or send_html. Requires authentication with at least content_only scope; admin is not required. Each display entry includes id (8-character alphanumeric profile ID), name, status, locked, setupUrl, pairingUrl, managedUrl and approvalUrl plus a compact runtime summary such as screen resolution, touch support, deviceClass and deviceFamily when known. Do not use this to get full details of one display — use get_display with the display_id instead. To share what a display is currently showing, mint a short-lived signed link with get_display_preview_url; the platform no longer exposes a permanent public viewer URL.","inputSchema":{"type":"object","properties":{"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session. Pass this instead of access_token for simpler, more reliable authentication — the server resolves the identity server-side."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"count":{"type":["integer","null"]},"displays":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"status":{"type":["string","null"]},"locked":{"type":["boolean","null"]},"approvalUrl":{"type":["string","null"]},"setupUrl":{"type":["string","null"]},"managedUrl":{"type":["string","null"]},"pairingUrl":{"type":["string","null"]},"pairingExpiresAt":{"type":["string","null"]},"hasDefaultContent":{"type":["boolean","null"]},"orgId":{"type":["string","null"]},"preferredLanguage":{"type":["string","null"]},"effectiveLanguage":{"type":["string","null"]},"resolution":{"type":["string","null"]},"screen":{"type":["object","null"]},"viewport":{"type":["object","null"]},"classification":{"type":["object","null"]},"hasTouch":{"type":["boolean","null"]},"deviceClass":{"type":["string","null"]},"deviceFamily":{"type":["string","null"]}}}}}},"category":"displays"},{"name":"list_display_categories","title":"List Display Categories","description":"Lists the authenticated user's personal display categories with stable IDs, paths and assignment counts. Use this to discover existing categories before assigning or replacing categories on a display. Requires authentication with at least content_only scope and display.read capability.","inputSchema":{"type":"object","properties":{"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"count":{"type":["integer","null"]},"categories":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"categoryId":{"type":["string","null"]},"name":{"type":["string","null"]},"path":{"type":["string","null"]},"parentCategoryId":{"type":["string","null"]},"color":{"type":["string","null"]},"count":{"type":["integer","null"]}}}}}},"category":"displays"},{"name":"create_display_category","title":"Create Display Category","description":"Creates a personal display category. Pass parent_category_id to create a subcategory under an existing category. Categories use stable IDs; renaming a category keeps assignments and grants intact. Requires display.manage capability.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Human-readable category name, e.g. 'Reception' or 'Meeting room'."},"parent_category_id":{"type":"string","description":"Optional parent category ID for creating a subcategory."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"categoryId":{"type":["string","null"]},"name":{"type":["string","null"]},"path":{"type":["string","null"]},"parentCategoryId":{"type":["string","null"]},"color":{"type":["string","null"]},"count":{"type":["integer","null"]}}},"category":"displays"},{"name":"set_display_categories_for_display","title":"Set Display Categories For Display","description":"Replaces the caller's personal category assignments on one display with the provided category ID list. Empty array clears the caller's assignments. This only affects the caller's personal category scope and never deletes another manager's organization categories on shared displays. Requires display.manage capability.","inputSchema":{"type":"object","required":["display_id","category_ids"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID."},"category_ids":{"type":"array","description":"Array of category IDs to set on the display. Empty array clears assignments.","items":{"type":"string"}},"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"displayId":{"type":["string","null"]},"categoryIds":{"type":["array","null"],"items":{"type":["string","null"]}}}},"category":"displays"},{"name":"bulk_assign_display_category","title":"Bulk Assign Display Category","description":"Bulk adds or removes one category across multiple displays the caller can manage. Operations are owner-scoped: add/remove only touches the caller's assignment rows and does not mutate other managers' categories. Returns a per-display result list with success/error status.","inputSchema":{"type":"object","required":["category_id","mode","display_ids"],"properties":{"category_id":{"type":"string","description":"Category ID to add or remove."},"mode":{"type":"string","enum":["add","remove"],"description":"Operation mode. Must be 'add' or 'remove'."},"display_ids":{"type":"array","description":"Array of display profile IDs to mutate.","items":{"type":"string"}},"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"categoryId":{"type":["string","null"]},"mode":{"type":["string","null"]},"results":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"displayId":{"type":["string","null"]},"ok":{"type":["boolean","null"]},"error":{"type":["string","null"]}}}}}},"category":"displays"},{"name":"rename_display_category","title":"Rename Display Category","description":"Renames one personal display category by stable category ID. Existing assignments and grants keep working because they reference the category ID; only the category name/path changes. Requires display.manage capability.","inputSchema":{"type":"object","required":["category_id","new_name"],"properties":{"category_id":{"type":"string","description":"Current category ID to rename."},"new_name":{"type":"string","description":"New category name. The path segment is normalised by the server."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"categoryId":{"type":["string","null"]},"name":{"type":["string","null"]},"path":{"type":["string","null"]},"parentCategoryId":{"type":["string","null"]},"color":{"type":["string","null"]},"count":{"type":["integer","null"]}}},"category":"displays"},{"name":"broadcast_to_categories","title":"Broadcast to Categories","description":"Sends HTML content to every display assigned to one of the selected category IDs. Set include_descendants=true to include subcategories. Set dry_run=true to preview matched profile IDs without sending. Requires display.send capability. Locked displays are skipped with reason='locked'.","inputSchema":{"type":"object","required":["include_category_ids"],"properties":{"include_category_ids":{"type":"array","description":"Category IDs to include.","items":{"type":"string"}},"include_descendants":{"type":"boolean","description":"When true, include displays assigned to subcategories of the selected categories."},"html":{"type":"string","description":"HTML body. Required unless dry_run=true."},"description":{"type":"string","description":"Optional human-readable description (<=1000 chars)."},"dry_run":{"type":"boolean","description":"When true, returns matched profile list without sending."},"access_token":{"type":"string"},"session_request_id":{"type":"string"}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"matched":{"type":["integer","null"]},"sent":{"type":["integer","null"]},"skipped":{"type":["integer","null"]},"dryRun":{"type":["boolean","null"]},"results":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"profileId":{"type":["string","null"]},"ok":{"type":["boolean","null"]},"error":{"type":["string","null"]}}}}}},"category":"displays"},{"name":"list_organizations","title":"List Organizations","description":"Returns all organizations the authenticated user belongs to with their role, display count, member count and allocated slots. Use this to answer questions about the user's organizations, how many displays an organization has, or team membership. Requires authentication with at least content_only scope.","inputSchema":{"type":"object","properties":{"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"count":{"type":["integer","null"]},"organizations":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"orgId":{"type":["string","null"]},"name":{"type":["string","null"]},"role":{"type":["string","null"]},"displayCount":{"type":["integer","null"]},"memberCount":{"type":["integer","null"]},"allocatedSlots":{"type":["integer","null"]},"plan":{"type":["string","null"]},"isActive":{"type":["boolean","null"]}}}}}},"category":"orgs"},{"name":"get_organization","title":"Get Organization","description":"Returns full details of a specific organization including its displays, members with roles, allocated slots and remaining capacity. Use this after list_organizations to inspect a specific organization's state. Requires authentication with at least content_only scope and the user must be a member of the organization.","inputSchema":{"type":"object","required":["org_id"],"properties":{"org_id":{"type":"string","description":"The organization ID. Obtain this from list_organizations or from get_account."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"orgId":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"plan":{"type":["string","null"]},"isActive":{"type":["boolean","null"]},"yourRole":{"type":["string","null"]},"displayCount":{"type":["integer","null"]},"allocatedSlots":{"type":["integer","null"]},"remainingSlots":{"type":["integer","null"]},"memberCount":{"type":["integer","null"]},"members":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"userId":{"type":["string","null"]},"name":{"type":["string","null"]},"email":{"type":["string","null"]},"role":{"type":["string","null"]},"allocatedDisplays":{"type":["integer","null"]}}}},"displays":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"status":{"type":["string","null"]},"locked":{"type":["boolean","null"]}}}},"createdAt":{"type":["string","null"]}}},"category":"orgs"},{"name":"invite_member","title":"Invite Member","description":"Creates an invite link to add a new member to an organization. The invite is valid for 7 days. Optionally bind it to a specific email address so only that person can accept it. Requires admin scope and the user must be an admin or owner of the organization. Returns the inviteUrl to share with the invitee.","inputSchema":{"type":"object","required":["org_id","role"],"properties":{"org_id":{"type":"string","description":"The organization ID to invite a member to. Obtain this from list_organizations."},"role":{"type":"string","description":"The role for the invited member. Valid roles depend on organization type: organizations accept 'admin' (manage members and displays), 'manager' (manage displays and content) or 'viewer' (read-only dashboard access); families accept 'child'."},"email":{"type":"string","description":"Optional email address to bind the invite to. If set, only this email address can accept the invite."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"inviteToken":{"type":["string","null"]},"inviteUrl":{"type":["string","null"]},"orgId":{"type":["string","null"]},"orgName":{"type":["string","null"]},"role":{"type":["string","null"]},"inviteeEmail":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"category":"orgs"},{"name":"allocate_licenses","title":"Allocate Licenses","description":"Distributes the account's existing premium display licenses to an organization. The account has a pool of premium licenses (a base allowance plus any additional licenses on the account) that can be allocated across organizations it owns. Requires admin scope and available premium licenses.","inputSchema":{"type":"object","required":["org_id","licenses"],"properties":{"org_id":{"type":"string","description":"The organization ID to allocate licenses to. Obtain this from list_organizations."},"licenses":{"type":"integer","minimum":0,"description":"Number of premium display licenses to allocate to this organization. Set to 0 to deallocate all licenses from this org."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"orgId":{"type":["string","null"]},"allocatedToOrg":{"type":["integer","null"]},"freeAllocatableLicenses":{"type":["integer","null"]},"totalAllocatableLicenses":{"type":["integer","null"]},"personalDisplayLimit":{"type":["integer","null"]}}},"category":"orgs"},{"name":"create_organization","title":"Create Organization","description":"Creates a new organization and makes the authenticated user the owner. Use this when the user wants to set up a shared display fleet. Returns orgId, name, slug, type and yourRole. Requires admin scope.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Friendly name for the organization. Example: 'Marketing Team'."},"type":{"type":"string","enum":["organization","family"],"description":"Organization type. Defaults to 'organization' if omitted."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"orgId":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"type":["string","null"]},"type":{"type":["string","null"]},"yourRole":{"type":["string","null"]}}},"category":"orgs"},{"name":"rename_organization","title":"Rename Organization","description":"Renames an existing organization. Requires admin scope and admin or owner role in the organization.","inputSchema":{"type":"object","required":["org_id","name"],"properties":{"org_id":{"type":"string","description":"The organization ID to rename."},"name":{"type":"string","description":"The new name for the organization."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"orgId":{"type":["string","null"]},"name":{"type":["string","null"]}}},"category":"orgs"},{"name":"delete_organization","title":"Delete Organization","description":"Permanently deletes an organization, releasing all its displays and removing all members. Only the owner can delete. This cannot be undone. Requires admin scope.","inputSchema":{"type":"object","required":["org_id"],"properties":{"org_id":{"type":"string","description":"The organization ID to delete."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"orgId":{"type":["string","null"]},"name":{"type":["string","null"]},"deleted":{"type":["boolean","null"]},"displaysReleased":{"type":["integer","null"]},"membersRemoved":{"type":["integer","null"]}}},"category":"orgs"},{"name":"update_member_role","title":"Update Member Role","description":"Changes a member's role within an organization. Cannot change your own role or the owner's role. Requires admin scope and admin or owner role.","inputSchema":{"type":"object","required":["org_id","target_user_id","role"],"properties":{"org_id":{"type":"string","description":"The organization ID."},"target_user_id":{"type":"string","description":"The user ID of the member whose role to change."},"role":{"type":"string","description":"The new role. Valid roles depend on organization type (e.g. 'admin', 'manager', 'viewer')."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"orgId":{"type":["string","null"]},"targetUserId":{"type":["string","null"]},"previousRole":{"type":["string","null"]},"newRole":{"type":["string","null"]}}},"category":"orgs"},{"name":"remove_member","title":"Remove Member","description":"Removes a member from an organization. Transfers their owned displays to a successor, unassigns their license allocations, and removes their display grants. Cannot remove the last owner. Requires admin scope and admin or owner role.","inputSchema":{"type":"object","required":["org_id","target_user_id"],"properties":{"org_id":{"type":"string","description":"The organization ID."},"target_user_id":{"type":"string","description":"The user ID of the member to remove."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"orgId":{"type":["string","null"]},"targetUserId":{"type":["string","null"]},"removed":{"type":["boolean","null"]},"displaysTransferred":{"type":["integer","null"]}}},"category":"orgs"},{"name":"list_org_displays","title":"List Organization Displays","description":"Returns all displays in an organization with their real-time connection status, online/offline state, and license info. Use this for fleet monitoring. Requires content_only scope and organization membership.","inputSchema":{"type":"object","required":["org_id"],"properties":{"org_id":{"type":"string","description":"The organization ID."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"orgId":{"type":["string","null"]},"orgName":{"type":["string","null"]},"totalDisplays":{"type":["integer","null"]},"onlineDisplays":{"type":["integer","null"]},"displays":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"status":{"type":["string","null"]},"isOnline":{"type":["boolean","null"]},"isPremiumAssigned":{"type":["boolean","null"]},"isLocked":{"type":["boolean","null"]}}}}}},"category":"orgs"},{"name":"get_license_info","title":"Get License Info","description":"Returns the authenticated user's complete license allocation overview: total premium licenses, personal usage, allocatable licenses, per-organization allocations, and free licenses. Use this to understand available capacity before allocating licenses. Requires content_only scope.","inputSchema":{"type":"object","properties":{"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"totalPremiumLicenses":{"type":["integer","null"]},"personalDisplays":{"type":["integer","null"]},"personalPremiumDisplays":{"type":["integer","null"]},"allocatableLicenses":{"type":["integer","null"]},"totalAllocatedToOrgs":{"type":["integer","null"]},"freeAllocatableLicenses":{"type":["integer","null"]},"canAllocate":{"type":["boolean","null"]},"orgAllocations":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"orgId":{"type":["string","null"]},"name":{"type":["string","null"]},"allocatedLicenses":{"type":["integer","null"]},"usedDisplays":{"type":["integer","null"]},"premiumDisplays":{"type":["integer","null"]}}}}}},"category":"account"},{"name":"remove_display_from_org","title":"Remove Display from Organization","description":"Removes a display from an organization, clearing its group assignment and all display grants. The display becomes unassigned. Requires admin scope and admin or owner role.","inputSchema":{"type":"object","required":["org_id","display_id"],"properties":{"org_id":{"type":"string","description":"The organization ID."},"display_id":{"type":"string","description":"The display profile ID to remove."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"displayId":{"type":["string","null"]},"previousOrgId":{"type":["string","null"]},"removed":{"type":["boolean","null"]}}},"category":"orgs"},{"name":"set_display_grant","title":"Set Display Grant","description":"Grants a specific user access to a specific display within an organization. Creates or updates the grant. The target user must be a member of the organization. Access levels: 'view' (see status) or 'control' (send content). Requires admin scope.","inputSchema":{"type":"object","required":["org_id","display_id","target_user_id","access_level"],"properties":{"org_id":{"type":"string","description":"The organization ID."},"display_id":{"type":"string","description":"The display profile ID."},"target_user_id":{"type":"string","description":"The user ID to grant access to."},"access_level":{"type":"string","enum":["view","control"],"description":"Access level: 'view' or 'control'."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"displayId":{"type":["string","null"]},"targetUserId":{"type":["string","null"]},"accessLevel":{"type":["string","null"]},"granted":{"type":["boolean","null"]}}},"category":"orgs"},{"name":"remove_display_grant","title":"Remove Display Grant","description":"Removes a user's access grant from a display within an organization. Requires admin scope and admin or owner role.","inputSchema":{"type":"object","required":["org_id","display_id","target_user_id"],"properties":{"org_id":{"type":"string","description":"The organization ID."},"display_id":{"type":"string","description":"The display profile ID."},"target_user_id":{"type":"string","description":"The user ID whose grant to remove."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"displayId":{"type":["string","null"]},"targetUserId":{"type":["string","null"]},"removed":{"type":["boolean","null"]}}},"category":"orgs"},{"name":"broadcast_content","title":"Broadcast Content","description":"Sends HTML content to multiple displays at once. Provide display_ids to target specific displays or set all to true to target all accessible displays. Locked displays are skipped. Returns sent and skipped lists with reasons. Requires content_only scope.","inputSchema":{"type":"object","required":["description"],"properties":{"description":{"type":"string","description":"Short description of the content being sent."},"html":{"type":"string","description":"Complete HTML document to render. Mutually exclusive with base64_html."},"base64_html":{"type":"string","description":"Base64-encoded HTML string. Mutually exclusive with html."},"display_ids":{"type":"array","items":{"type":"string"},"description":"Array of display profile IDs to target. Provide this or set all to true."},"all":{"type":"boolean","description":"Set to true to target all accessible displays."},"duration":{"type":"integer","description":"How long content stays in seconds. 0 = indefinite."},"content_description":{"type":"string","description":"Optional semantic description of the content."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"fileName":{"type":["string","null"]},"duration":{"type":["integer","null"]},"sentCount":{"type":["integer","null"]},"sent":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]}}}},"skippedCount":{"type":["integer","null"]},"skipped":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"reason":{"type":["string","null"]}}}}}},"category":"content"},{"name":"create_org_display","title":"Create Organization Display","description":"Creates a new display directly within an organization WITHOUT pairing it to physical hardware. The display starts offline and uncoupled. For physical screens, ALWAYS prefer pair_by_code instead — it creates and pairs in one step. Use create_org_display only for administrative pre-provisioning when the screen is not yet available. The display is owned by the organization, not by a personal user. Requires admin scope and manager or higher role in the organization. The organization must have available licenses (use allocate_licenses first if needed).","inputSchema":{"type":"object","required":["org_id","name"],"properties":{"org_id":{"type":"string","description":"The organization ID to create the display in. Obtain this from list_organizations."},"name":{"type":"string","description":"Friendly name for the new display. Example: 'Lobby Screen'."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"orgId":{"type":["string","null"]},"orgName":{"type":["string","null"]},"setupUrl":{"type":["string","null"]},"pairingUrl":{"type":["string","null"]},"pairingExpiresAt":{"type":["string","null"]},"status":{"type":["string","null"]}}},"category":"orgs"},{"name":"get_display","title":"Get Display","description":"Returns the full details of a single display including its live state, current content, pairing links, screen and viewport facts, touch capability, runtime classification, hardware/UI settings, and the latest reported browser/runtime facts. Use this when you already know the display ID and need its complete state before sending content or managing it. Do not use this to discover displays — use list_displays first. Requires authentication with at least content_only scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'. Obtain this from list_displays or from a previous create_display call."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session. Pass this instead of access_token for simpler, more reliable authentication — the server resolves the identity server-side."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"status":{"type":["string","null"]},"locked":{"type":["boolean","null"]},"approvalUrl":{"type":["string","null"]},"setupUrl":{"type":["string","null"]},"managedUrl":{"type":["string","null"]},"pairingUrl":{"type":["string","null"]},"pairingExpiresAt":{"type":["string","null"]},"hasDefaultContent":{"type":["boolean","null"]},"lastSeen":{"type":["string","null"]},"resolution":{"type":["object","null"]},"screen":{"type":["object","null"]},"viewport":{"type":["object","null"]},"classification":{"type":["object","null"]},"hasTouch":{"type":["boolean","null"]},"browser":{"type":["string","null"]},"engine":{"type":["string","null"]},"platform":{"type":["string","null"]},"deviceClass":{"type":["string","null"]},"deviceFamily":{"type":["string","null"]},"screenSource":{"type":["string","null"]},"viewportSource":{"type":["string","null"]},"touchSource":{"type":["string","null"]},"currentContent":{"type":["string","null"]},"effectiveLanguage":{"type":["string","null"]},"runtime":{"type":["object","null"]},"settings":{"type":["object","null"],"properties":{"allowCamera":{"type":["boolean","null"]},"allowMicrophone":{"type":["boolean","null"]},"allowGeolocation":{"type":["boolean","null"]},"preferredLanguage":{"type":["string","null"]},"effectiveLanguage":{"type":["string","null"]},"showMouseCursor":{"type":["boolean","null"]},"showBadgeOverlay":{"type":["boolean","null"]},"watermarkPosition":{"type":["string","null"]}}}}},"category":"displays"},{"name":"get_display_capabilities","title":"Get Display Capabilities","description":"Returns resolved display capabilities for a display, including effective network mode plus concrete browser/runtime facts such as screen, viewport, touch/input hints, browser and engine version, platform classification, feature support, known limitations, graphics hints, and a recommended delivery mode. Call this before generating or sending HTML so your agent can match the content to the real display browser. Requires authentication with at least content_only scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session. Pass this instead of access_token for simpler, more reliable authentication — the server resolves the identity server-side."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"displayId":{"type":["string","null"]},"capabilities":{"type":["object","null"],"properties":{"resolvedMode":{"type":["string","null"]},"effectiveWhitelist":{"type":["array","null"],"items":{"type":["string","null"]}},"supportsEmbeddedContent":{"type":["boolean","null"]}}},"connectivity":{"type":["object","null"],"properties":{"resolvedMode":{"type":["string","null"]},"effectiveWhitelist":{"type":["array","null"],"items":{"type":["string","null"]}},"supportsEmbeddedContent":{"type":["boolean","null"]}}},"screen":{"type":["object","null"]},"viewport":{"type":["object","null"]},"classification":{"type":["object","null"]},"runtime":{"type":["object","null"]},"metadata":{"type":["object","null"],"properties":{"inheritedFrom":{"type":["string","null"]}}}}},"category":"displays"},{"name":"create_display","title":"Create Display","description":"Creates a personal display WITHOUT pairing it to physical hardware. The display starts offline and uncoupled. For physical screens, ALWAYS prefer pair_by_code instead — it creates and pairs in one step. Use create_display only when: (a) the user explicitly wants to pre-provision a display before the screen is available, or (b) the user needs a virtual/headless display for API-only content delivery. Do not call this just to check capacity — use get_account to inspect remainingDisplays first. Requires admin scope; list_displays and send_html only need content_only. Returns id, name, setupUrl, managedUrl, pairingUrl, pairingExpiresAt, approvalUrl and status. To share what the display is currently showing, mint a short-lived signed link via get_display_preview_url.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Optional friendly name for the new display. If omitted, a default name is assigned. Example: 'Lobby Screen'."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"setupUrl":{"type":["string","null"]},"managedUrl":{"type":["string","null"]},"pairingUrl":{"type":["string","null"]},"pairingExpiresAt":{"type":["string","null"]},"approvalUrl":{"type":["string","null"]},"status":{"type":["string","null"]}}},"category":"displays"},{"name":"rename_display","title":"Rename Display","description":"Changes the friendly name of an existing display. Use this when the user wants to update only the display name without affecting its content or state. Requires admin scope. Returns id and the updated name.","inputSchema":{"type":"object","required":["display_id","name"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID to rename, e.g. 'ABCD1234'."},"name":{"type":"string","description":"The new friendly display name. Non-empty string."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]}}},"category":"displays"},{"name":"delete_display","title":"Delete Display","description":"Permanently deletes a display and all its associated content. This action cannot be undone. Use this only when the user explicitly confirms they want to remove the display. Requires admin scope. Returns id, name and deleted (boolean true).","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID to delete, e.g. 'ABCD1234'."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"deleted":{"type":["boolean","null"]}}},"category":"displays"},{"name":"send_html","title":"Send HTML","description":"Pushes raw HTML to one display, replacing current content. Prefer send_url only when the user explicitly wants an external web page. Include a human-readable description so get_display_content can summarize intent without reading raw HTML. Before complex content, call get_display_capabilities to match the real browser/runtime. When no design system is supplied, use premium digital-signage quality: full-screen layout, strong hierarchy, refined typography, robust fallback data, and no action buttons unless touch is requested. Exactly one of html or base64_html is required. Requires content_only scope and display management access. Returns id, name, duration, file and version.","inputSchema":{"type":"object","required":["display_id","description"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID to send content to, e.g. 'ABCD1234'."},"description":{"type":"string","minLength":1,"maxLength":1000,"description":"Mandatory short human-readable description of the HTML upload (1-1000 characters), e.g. 'Weekly KPI dashboard with revenue and uptime'."},"content_description":{"type":"string","description":"Optional alias for description. If both are provided, description wins."},"html":{"type":"string","description":"Complete HTML document or fragment to render on the display. Mutually exclusive with base64_html — provide exactly one."},"base64_html":{"type":"string","description":"Base64-encoded HTML string (standard base64, not base64url). Use this instead of html only when the HTML contains characters that cannot survive JSON string transport. Mutually exclusive with html."},"duration":{"type":"integer","minimum":0,"description":"How long the content stays on the display in seconds. 0 means indefinite (content persists until replaced). Defaults to 0 when omitted."},"token":{"type":"string","description":"Display-specific preview token for unauthenticated demo-sign access. This is NOT the auth/JWT token. Omit this for normal authenticated usage."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically. This is different from 'token' which is a display-specific preview token."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"duration":{"type":["integer","null"]},"file":{"type":["string","null"]},"version":{"type":["string","null"]},"currentContentDescription":{"type":["string","null"]}}},"category":"content"},{"name":"test_display_content","title":"Test Display Content","description":"DRY-RUN validator for HTML payloads. Pushes the HTML through agentView's size + description checks WITHOUT touching any real display. Use this when an LLM has just generated HTML and you want to confirm it is well-formed and within limits BEFORE risking a real send_html call (e.g. after composing a complex layout, or before broadcasting to many displays). No display_id is needed; the response carries simulated=true and a safe size summary. Capped at 1 MB. Authenticated, but no display-scope check — only verb-level enforcement.","inputSchema":{"type":"object","required":["description"],"properties":{"description":{"type":"string","maxLength":1000,"description":"Short human-readable description of what the HTML represents (1-1000 chars). Same validation rules as send_html."},"html":{"type":"string","description":"Complete HTML document to validate. Mutually exclusive with base64_html — provide exactly one."},"base64_html":{"type":"string","description":"Base64-encoded HTML payload. Mutually exclusive with html."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"success":{"type":["boolean","null"]},"simulated":{"type":["boolean","null"]},"displayId":{"type":["string","null"],"description":"Always 'test' — no real display is touched."},"displayName":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"description":{"type":["string","null"]},"hint":{"type":["string","null"]}}},"category":"content"},{"name":"send_url","title":"Send URL","description":"Loads a web page by URL on a display using a full-page iframe, immediately replacing whatever is currently shown. Use this when the user wants to show an external website, dashboard or web app on a display. Provide content_description whenever available so get_display_content can communicate intent without forcing read_display_html. The URL must be an absolute HTTP or HTTPS address. Check get_display_capabilities first to confirm connectivity and browser/runtime support before relying on a remote page. Use this only when the external page already has the desired design quality; otherwise prefer send_html and load render_premium_display_html or read agentview://public/design-system so you can generate a premium display-native experience yourself. Requires authentication with at least content_only scope. Returns id, name, duration, file and version.","inputSchema":{"type":"object","required":["display_id","url"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'."},"url":{"type":"string","description":"The absolute HTTP or HTTPS URL to load on the display. Example: 'https://example.com/dashboard'."},"duration":{"type":"integer","minimum":0,"description":"How long the content stays on the display in seconds. 0 means indefinite. Defaults to 0."},"content_description":{"type":"string","description":"Optional human-readable summary of what this URL content is about (recommended)."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"duration":{"type":["integer","null"]},"file":{"type":["string","null"]},"version":{"type":["string","null"]},"currentContentDescription":{"type":["string","null"]}}},"category":"content"},{"name":"clear_display","title":"Clear Display","description":"Removes the current live content from a display and returns it to its idle/default state. Viewers will immediately see the change. Use this when the user wants to blank or reset a display. This does not delete the display itself — use delete_display for that. Requires authentication with at least content_only scope. Returns id and status ('cleared').","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID to clear, e.g. 'ABCD1234'."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]}}},"category":"content"},{"name":"set_idle_content","title":"Set Idle Content","description":"Sets or clears the default idle content for a display. Idle content is shown whenever the display has no active live content. Provide html OR url to set idle content (mutually exclusive — url is wrapped in a full-page iframe document), or omit both to clear idle content. Provide content_description to make later state reads easier for agents. When the display is currently idle (no active live content), the new idle is pushed to the display immediately; otherwise it stays dormant until the live content ends. Requires admin scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'."},"html":{"type":"string","description":"Complete HTML to use as idle content. Omit this (and url) to clear custom idle content. Mutually exclusive with url."},"url":{"type":"string","description":"Absolute HTTP or HTTPS URL to use as idle content; the server wraps it in a sandboxed full-page iframe. Mutually exclusive with html."},"content_description":{"type":"string","description":"Optional human-readable summary for the idle/default content."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"idleFile":{"type":["string","null"]},"idleVersion":{"type":["string","null"]},"idleContentCleared":{"type":["boolean","null"]}}},"category":"content"},{"name":"get_display_content","title":"Get Display Content","description":"Returns the current content state of a display including active live content, content URL, idle content and delivery status. Check currentContentDescription first to understand intent; call read_display_html only when you truly need raw source edits. To share what the display is currently showing, mint a short-lived signed link via get_display_preview_url — the platform no longer exposes a permanent public viewer URL. Requires content_only scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"status":{"type":["string","null"]},"hasLiveContent":{"type":["boolean","null"]},"currentFile":{"type":["string","null"]},"currentVersion":{"type":["string","null"]},"currentContentDescription":{"type":["string","null"]},"contentUrl":{"type":["string","null"]},"hasIdleContent":{"type":["boolean","null"]},"idleFile":{"type":["string","null"]},"liveContentInfo":{"type":["string","null"]}}},"category":"content"},{"name":"set_display_privacy_mode","title":"Set Display Privacy Mode","description":"Sets the per-display privacy mode that caps how long share-links can live. 'Private' (default for new displays) caps share-link TTL at 1 hour — choose this for displays that might show PII. 'Public' opts the display in to digital-signage mode and lifts the cap to 24 hours. Flipping is audit-logged. Requires admin scope.","inputSchema":{"type":"object","required":["display_id","privacy_mode"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'."},"privacy_mode":{"type":"string","enum":["Private","Public"],"description":"Desired privacy mode."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"privacyMode":{"type":["string","null"]},"previousPrivacyMode":{"type":["string","null"]},"shareLinkMaxTtlSeconds":{"type":["integer","null"]},"changed":{"type":["boolean","null"]}}},"category":"displays"},{"name":"get_display_preview_url","title":"Generate Display Preview Share Link","description":"Generates a short-lived signed share link for the display's CURRENT content. This is the ONLY supported way to share what's on the screen — the legacy permanent public viewer URL has been removed for GDPR compliance. Use this when the user wants to send what the screen is showing to a colleague, embed it in a chat or document, or hand it to an external integration. The returned previewUrl is read-only, expires after ttl_seconds, and dies the moment the owner pushes new content. The TTL ceiling depends on the display's privacy_mode: 'Private' caps at 3600s; 'Public' caps at 86400s. Requested TTLs above the per-mode ceiling are silently clamped; the returned ttlSeconds reflects the actual lifetime. Recipients see the display's content framed in a preview chrome — they cannot push, configure, or discover other displays. Requires content_only scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'."},"ttl_seconds":{"type":"integer","minimum":60,"maximum":86400,"description":"Lifetime of the share link in seconds. Default 3600 (1 hour). Clamped to [60, 86400]."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"previewUrl":{"type":["string","null"]},"expiresAt":{"type":["string","null"]},"ttlSeconds":{"type":["integer","null"]},"displayId":{"type":["string","null"]},"displayName":{"type":["string","null"]},"contentVersionId":{"type":["string","null"]},"mode":{"type":["string","null"]},"privacyMode":{"type":["string","null"]}}},"category":"content"},{"name":"read_display_html","title":"Read Display HTML","description":"Reads the raw HTML source code currently shown on a display. Use this to inspect, modify or reuse existing content. Typical workflow: read_display_html to get the HTML, make changes, then send_html to push it back. Returns the complete HTML string plus metadata. If no live content is active, returns idle content if set. Requires content_only scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'."},"content_type":{"type":"string","enum":["live","idle"],"description":"Which content to read: 'live' (default) returns the active content, 'idle' returns the idle/default content."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"contentType":{"type":["string","null"]},"hasContent":{"type":["boolean","null"]},"html":{"type":["string","null"]},"htmlLength":{"type":["integer","null"]},"source":{"type":["string","null"]}}},"category":"content"},{"name":"lock_display","title":"Lock Display","description":"Locks a display so that content changes such as send_html, send_url and clear_display are rejected until unlock_display is called. Use this when the user wants to protect a display from accidental content changes. The display continues showing its current content. Requires admin scope. Returns id and locked (boolean true). To reverse this, use unlock_display.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID to lock, e.g. 'ABCD1234'."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"locked":{"type":["boolean","null"]}}},"category":"displays"},{"name":"unlock_display","title":"Unlock Display","description":"Unlocks a previously locked display so that content changes (send_html, send_url, clear_display) are accepted again. Use this when the user wants to resume managing a locked display. Requires admin scope. Returns id and locked (boolean false). To lock again, use lock_display.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID to unlock, e.g. 'ABCD1234'."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"locked":{"type":["boolean","null"]}}},"category":"displays"},{"name":"configure_display","title":"Configure Display","description":"Updates hardware permission and UI settings for a display. Use this when the user wants to enable or disable camera, microphone or geolocation access, set the preferred display language, toggle the mouse cursor or badge overlay visibility, or change the watermark position. All parameters except display_id are optional — only provided settings are changed. If the display is online, changes are pushed immediately via SignalR. Requires admin scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'."},"allow_camera":{"type":"boolean","description":"Allow embedded content to request camera access. Default is false."},"allow_microphone":{"type":"boolean","description":"Allow embedded content to request microphone access. Default is false."},"allow_geolocation":{"type":"boolean","description":"Allow embedded content to request geolocation access. Default is false."},"preferred_language":{"type":"string","enum":["de","en","zh"],"description":"Preferred language for the display shell. Omit to leave unchanged."},"show_mouse_cursor":{"type":"boolean","description":"Show a visible mouse cursor on the display surface. Default is true."},"show_badge_overlay":{"type":"boolean","description":"Show the AI connect badge overlay on the display. Default is true."},"watermark_position":{"type":"string","enum":["BottomLeft","BottomRight","TopLeft","TopRight"],"description":"Position of the badge watermark on the display."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"allowCamera":{"type":["boolean","null"]},"allowMicrophone":{"type":["boolean","null"]},"allowGeolocation":{"type":["boolean","null"]},"preferredLanguage":{"type":["string","null"]},"effectiveLanguage":{"type":["string","null"]},"showMouseCursor":{"type":["boolean","null"]},"showBadgeOverlay":{"type":["boolean","null"]},"watermarkPosition":{"type":["string","null"]},"changedSettings":{"type":["array","null"],"items":{"type":["string","null"]}},"appliedToLiveDisplay":{"type":["boolean","null"]}}},"category":"displays"},{"name":"pair_by_code","title":"Pair Display by Code","description":"PREFERRED way to set up a physical display. Ask the user to open https://display.agentview.de on the target TV/screen, read the 6-character code, and share it. Then call this tool. This creates and pairs the display in one step — no orphaned or offline displays. Two modes: (1) New display — provide code + profile_name to create and pair in one step. This is the recommended default for first-time setup. (2) Rebind — provide code + target_display_id to move an existing display profile to new hardware. Call list_displays first to get the target_display_id. Always prefer this over create_display or create_org_display for physical devices. Use create_display/create_org_display only for pre-provisioning when the screen is not yet available. Requires admin scope. Returns profileId, name, linkedHardwareId and mode ('new' or 'rebind').","inputSchema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"The 6-character pairing code shown on the display (e.g. 'AB3K7F')."},"profile_name":{"type":"string","description":"Friendly name for the display (required for new pairing, ignored for rebind). Example: 'Lobby Screen'."},"target_display_id":{"type":"string","description":"To rebind: the existing display profile ID to switch to the new hardware. Omit for new display pairing."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"profileId":{"type":["string","null"]},"name":{"type":["string","null"]},"linkedHardwareId":{"type":["string","null"]},"mode":{"type":"string","enum":["new","rebind"]}}},"category":"displays"},{"name":"claim_display","title":"Claim Display","description":"Converts an unclaimed guest or pending display into a managed personal display owned by the authenticated user. This permanently transfers ownership and counts against the user's display quota. Use this only when the user explicitly wants to adopt an existing hardware or demo display that is already running. For first-time physical setup, prefer pair_by_code instead. Requires admin scope. Returns profileId (the new managed display ID) and name.","inputSchema":{"type":"object","required":["display_id","profile_name"],"properties":{"display_id":{"type":"string","description":"The short ID of the pending, guest or demo display to claim. This is the hardware or temporary ID shown on the device."},"profile_name":{"type":"string","description":"Friendly name to assign to the newly claimed display. Non-empty string. Example: 'Reception Kiosk'."},"access_token":{"type":"string","description":"Optional bearer credential. Prefer passing session_request_id (from create_auth_session) instead; every tool accepts it and the server resolves it to your identity server-side. Use access_token only when you hold an OAuth bearer token and your MCP client cannot send it as an Authorization: Bearer HTTP header automatically."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"profileId":{"type":["string","null"]},"name":{"type":["string","null"]}}},"category":"displays"},{"name":"assign_license","title":"Assign License","description":"Marks a display as premium using one of the account's available licenses, which removes the free-tier watermark. The account must have an unassigned premium license available. Each license also adds +30 MB to the display's context storage pool (personal or group). Requires admin scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID to assign a license to, e.g. 'ABCD1234'."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"isPremiumAssigned":{"type":["boolean","null"]},"badgeMode":{"type":["string","null"]},"freeLicenses":{"type":["integer","null"]}}},"category":"displays"},{"name":"unassign_license","title":"Unassign License","description":"Removes a premium license from a display; the license returns to the account's available pool and the display reverts to the free-tier watermark. Requires admin scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID to remove a license from, e.g. 'ABCD1234'."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"isPremiumAssigned":{"type":["boolean","null"]},"badgeMode":{"type":["string","null"]},"freeLicenses":{"type":["integer","null"]}}},"category":"displays"},{"name":"create_api_key","title":"Create API Key","description":"Creates a long-lived API key for server-to-server integration without OAuth. The raw key is returned only once — store it securely. The user must explicitly consent to creating the key. Requires admin scope. Supports granular scoping: restrict the key to specific data-slot slugs, specific display IDs, a read/write permission flag, and/or fine-grained capability flags.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Human-readable name for the key. Example: 'Home Assistant', 'CI Pipeline'."},"scope":{"type":"string","default":"content_only","enum":["content_only","admin"],"description":"Scope for the key: 'content_only' (send content, list displays) or 'admin' (full management)."},"org_id":{"type":"string","description":"Optional organization ID. If set, the key acts on behalf of this organization."},"expires_in_days":{"type":"integer","description":"Optional expiration in days. If not set, the key never expires."},"permissions":{"type":"string","default":"read_write","enum":["read","write","read_write"],"description":"Granular permission flag: 'read', 'write', or 'read_write' (default). Applied on top of 'scope' — e.g. a content_only read-only key cannot PUT data slots. Matched against HTTP verb: GET requires read, PUT/POST/PATCH/DELETE require write."},"allowed_slot_slugs":{"type":"array","maxItems":64,"items":{"type":"string"},"description":"Optional JSON array of data-slot slugs this key may touch (max 64). When set, every data-slot request must target one of these slugs. Omit or pass [] for no slug restriction. Example: ['sensor-lobby', 'sensor-garage']."},"allowed_display_ids":{"type":"array","maxItems":64,"items":{"type":"string","pattern":"^[A-Z0-9]{8}$"},"description":"Optional JSON array of display profile IDs this key may touch (max 64). When set, every display request must target one of these IDs. Omit or pass [] for no display restriction. Example: ['ABCD1234','EFGH5678']."},"capabilities":{"type":"array","items":{"type":"string","enum":["slot.read","slot.write","display.read","display.send","display.manage"]},"description":"Optional JSON array of fine-grained capability flags this key may exercise. Allowed values: 'slot.read' (list/get slots), 'slot.write' (put/delete slots), 'display.read' (list/get displays, read content), 'display.send' (send_html/send_url/broadcast/clear/set_idle), 'display.manage' (rename/delete/lock/configure/license/pair/claim/create). Omit or pass [] for no capability restriction. Capabilities narrow — never expand — the key's rights; they combine with scope, permissions, and resource whitelists."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"key":{"type":["string","null"]},"keyId":{"type":["string","null"]},"name":{"type":["string","null"]},"scope":{"type":["string","null"]},"permissions":{"type":["string","null"]},"allowedSlotSlugs":{"type":["array","null"],"items":{"type":["string","null"]}},"allowedDisplayIds":{"type":["array","null"],"items":{"type":["string","null"]}},"capabilities":{"type":["array","null"],"items":{"type":["string","null"]}},"orgId":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"warning":{"type":["string","null"]}}},"category":"api-keys"},{"name":"list_api_keys","title":"List API Keys","description":"Lists all API keys for the current user. Returns key metadata (prefix, name, scope, dates) but never the raw key. Requires admin scope.","inputSchema":{"type":"object","properties":{"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"count":{"type":["integer","null"]},"keys":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"keyId":{"type":["string","null"]},"keyPrefix":{"type":["string","null"]},"name":{"type":["string","null"]},"scope":{"type":["string","null"]},"permissions":{"type":["string","null"]},"allowedSlotSlugs":{"type":["array","null"],"items":{"type":["string","null"]}},"allowedDisplayIds":{"type":["array","null"],"items":{"type":["string","null"]}},"capabilities":{"type":["array","null"],"items":{"type":["string","null"]}},"orgId":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"isRevoked":{"type":["boolean","null"]},"isValid":{"type":["boolean","null"]}}}}}},"category":"api-keys"},{"name":"revoke_api_key","title":"Revoke API Key","description":"Permanently revokes an API key. This is irreversible — the key will immediately stop working. Requires admin scope.","inputSchema":{"type":"object","required":["key_id"],"properties":{"key_id":{"type":"string","description":"The ID of the key to revoke (from list_api_keys)."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"revoked":{"type":["boolean","null"]},"keyId":{"type":["string","null"]}}},"category":"api-keys"},{"name":"submit_feedback","title":"Submit Feedback","description":"Sends the user's product feedback about agentView to an internal review queue. Use this ONLY when the user explicitly wants to share feedback, a feature request, a complaint, or praise about agentView itself (not about the content shown on a display). Always confirm the wording with the user before sending; never invent or embellish feedback on their behalf. Requires authentication with at least content_only scope. The feedback is stored for later review; no automatic reply is sent and this does not open a support ticket. Returns the new feedback id and a status of 'received'.","inputSchema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","maxLength":2000,"description":"The user's verbatim feedback text (max 2000 characters). Pass what the user actually said; do not paraphrase or add your own commentary."},"sentiment":{"type":"string","enum":["positive","neutral","negative"],"description":"Optional overall sentiment of the feedback. Set only when the user's tone is clear; omit if unsure."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session. Preferred over access_token."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["integer","null"]},"status":{"type":["string","null"]}}},"category":"account"},{"name":"upload_asset","title":"Upload Asset","description":"Upload one or more files (images, fonts, CSS, video, etc.) as assets and receive stable URLs. Use these URLs in your HTML with <img src> or @font-face. Assets are cached on displays. Pass files as base64-encoded data. Requires authentication with at least content_only scope.","inputSchema":{"type":"object","required":["files","descriptions"],"properties":{"files":{"type":"array","description":"Array of file objects, each with 'name' (filename with extension) and 'data' (base64-encoded content).","items":{"type":"object","properties":{"name":{"type":"string"},"data":{"type":"string"}}}},"descriptions":{"type":"object","description":"JSON object mapping each filename to a human-readable description."},"group_id":{"type":"string","description":"Optional group ID to associate the assets with."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"count":{"type":["integer","null"]},"assets":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"assetId":{"type":["string","null"]},"name":{"type":["string","null"]},"url":{"type":["string","null"]},"mimeType":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]}}}}}},"category":"assets"},{"name":"list_assets","title":"List Assets","description":"Lists the authenticated user's uploaded assets with optional filtering by type, search term, and group. Returns asset URLs that can be used in HTML content. Check this before uploading to avoid duplicates. Requires authentication with at least content_only scope.","inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["image","video","audio","font","document","data"],"description":"Filter by MIME category."},"search":{"type":"string","description":"Search in filename and description (case-insensitive)."},"group_id":{"type":"string","description":"Only assets of this group. Omit for personal assets."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"Maximum results (default: 50, max: 200)."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"count":{"type":["integer","null"]},"assets":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"assetId":{"type":["string","null"]},"name":{"type":["string","null"]},"url":{"type":["string","null"]},"mimeType":{"type":["string","null"]},"description":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}}}}}},"category":"assets"},{"name":"get_asset","title":"Get Asset","description":"Returns metadata for a single asset including its URL. Use this to verify an asset still exists before referencing it in HTML. Requires authentication with at least content_only scope.","inputSchema":{"type":"object","required":["asset_id"],"properties":{"asset_id":{"type":"string","description":"The asset ID (e.g. 'ast_01H7KXZ...')."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"assetId":{"type":["string","null"]},"name":{"type":["string","null"]},"url":{"type":["string","null"]},"mimeType":{"type":["string","null"]},"description":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}}},"category":"assets"},{"name":"update_asset","title":"Update Asset","description":"Updates the name and/or description of an existing asset. The URL does not change. At least one of name or description must be provided. Requires authentication with at least content_only scope.","inputSchema":{"type":"object","required":["asset_id"],"properties":{"asset_id":{"type":"string","description":"The asset ID to update."},"name":{"type":"string","description":"New filename for the asset."},"description":{"type":"string","description":"New description for the asset."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"assetId":{"type":["string","null"]},"name":{"type":["string","null"]},"url":{"type":["string","null"]},"description":{"type":["string","null"]}}},"category":"assets"},{"name":"delete_asset","title":"Delete Asset","description":"Deletes one or more assets. Displays referencing deleted assets will show broken images. Requires authentication with at least content_only scope.","inputSchema":{"type":"object","required":["asset_ids"],"properties":{"asset_ids":{"type":"array","description":"One or more asset IDs to delete.","items":{"type":"string"}},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"deleted":{"type":["integer","null"]}}},"category":"assets"},{"name":"set_data_slot","title":"Set Data Slot","description":"Creates or updates a mutable JSON data slot (max 2 MB). Slug is stable; reusing it updates in place. The public read URL uses a separate server-generated PublicId, so the slug is not itself a secret URL. type='value' stores JSON verbatim; type='aggregate' stores a composite definition with sources such as {slot:'name', as?:'alias'} or {prefixMatch:'agent-'} for dynamic inclusion. Aggregates allow up to 32 sources and at most one prefixMatch, and sources must stay in the same personal/group scope. Requires content scope. Returns slug, readUrl metadata, size and timestamp.","inputSchema":{"type":"object","required":["slug","content"],"properties":{"slug":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,64}$","description":"Stable slug for the data slot. Must match ^[A-Za-z0-9_-]{8,64}$. Same slug on a later call updates the existing slot. Slug stays exactly as supplied; the public URL uses a separate server-generated PublicId so the slug itself is never sensitive."},"content":{"description":"JSON content to store. For value slots: any valid JSON value up to 2 MB. For aggregate slots: a definition object { sources: [{slot,as?} | {prefixMatch}], onMissing?, onInvalidJson?, includeMeta?, staleAfterMs?, output? }."},"label":{"type":"string","maxLength":200,"description":"Human-readable label (max 200 chars). Required when creating a new slot; optional on update."},"group_id":{"type":"string","description":"Group/organization ID for shared group slots. Omit for personal slots."},"type":{"type":"string","enum":["value","aggregate"],"description":"Slot kind. 'value' (default) stores 'content' verbatim. 'aggregate' stores 'content' as a composite-slot definition. Immutable after creation."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"slug":{"type":["string","null"]},"label":{"type":["string","null"]},"type":{"type":["string","null"]},"groupId":{"type":["string","null"]},"readUrl":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"updatedAt":{"type":["string","null"],"format":"date-time"}}},"category":"data-slots"},{"name":"get_data_slot","title":"Get Data Slot","description":"Returns the current JSON content and metadata of a data slot by slug. Supply group_id to look up a group slot; omit it for personal slots. The response includes readUrl — the public anonymous URL for display HTML to fetch. Requires authentication.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"The slug of the data slot to retrieve."},"group_id":{"type":"string","description":"Group/organization ID to retrieve a group slot. Omit for personal slots."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"slug":{"type":["string","null"]},"label":{"type":["string","null"]},"type":{"type":["string","null"]},"content":{},"readUrl":{"type":["string","null"]},"groupId":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"updatedAt":{"type":["string","null"],"format":"date-time"}}},"category":"data-slots"},{"name":"list_data_slots","title":"List Data Slots","description":"Lists data slots with optional filtering. Returns metadata only (no jsonContent). Each item includes readUrl. Use readUrl in display HTML fetch() calls. Requires authentication.","inputSchema":{"type":"object","properties":{"group_id":{"type":"string","description":"Group/organization ID to list shared group slots. Omit for personal slots."},"search":{"type":"string","description":"Search in label (case-insensitive)."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"Maximum results (default: 50, max: 200)."},"offset":{"type":"integer","minimum":0,"description":"Offset for pagination."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"count":{"type":["integer","null"]},"slots":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"slug":{"type":["string","null"]},"label":{"type":["string","null"]},"type":{"type":["string","null"]},"readUrl":{"type":["string","null"]},"groupId":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"updatedAt":{"type":["string","null"],"format":"date-time"}}}}}},"category":"data-slots"},{"name":"delete_data_slot","title":"Delete Data Slot","description":"Permanently deletes a data slot. Display HTML fetching its readUrl will receive 404 after deletion. Cannot be undone. Supply group_id to delete a group slot; omit for personal slots. Requires authentication.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"The slug of the data slot to delete."},"group_id":{"type":"string","description":"Group/organization ID to delete a group slot. Omit for personal slots."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"slug":{"type":["string","null"]},"deleted":{"type":["boolean","null"]}}},"category":"data-slots"},{"name":"get_data_slot_usage","title":"Get Data Slot Usage","description":"Lists displays whose IdleHtmlContent embeds a {{slot:<slug>}} placeholder for this data slot (with optional .readUrl / .slug / .label / .key suffix). Use this BEFORE delete_data_slot to know which displays will start returning 404, or before set_data_slot on a structural change to know which displays will pick up the new shape. Scope is restricted to displays the caller can already see in the same scope as the slot — personal slots only check personal displays, group slots only check the group's displays. Capped at 50 results; 'truncated' is true if more matches exist. Requires authentication; the same slot read scope as get_data_slot.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"The slug of the data slot to scan usage for."},"group_id":{"type":"string","description":"Group/organization ID for group slots. Omit for personal slots."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"slug":{"type":["string","null"]},"count":{"type":["integer","null"],"description":"Total number of displays referencing the slot (may exceed displays.length if truncated)."},"truncated":{"type":["boolean","null"],"description":"True if more than 50 displays match; only the first 50 are returned in 'displays'."},"displays":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"profileId":{"type":["string","null"]},"name":{"type":["string","null"]}}}}}},"category":"data-slots"},{"name":"get_storage_quota","title":"Get Storage Quota","description":"Returns the storage-pool snapshot (used / limit / remaining bytes) for the personal scope or a specific group. Data slots and uploaded assets share one quota; call this BEFORE set_data_slot or upload_asset on large payloads to verify the write will fit and avoid a 413 quota_exceeded round-trip. Suppresses raw numbers for narrowly-scoped API keys (slot- or display-whitelisted) to avoid leaking org-wide storage state — those callers see usedBytes=limitBytes=0 and suppressed=true.","inputSchema":{"type":"object","properties":{"group_id":{"type":"string","description":"Group/organization ID for the group's pool. Omit for the caller's personal pool."},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"outputSchema":{"type":"object","properties":{"usedBytes":{"type":["integer","null"]},"limitBytes":{"type":["integer","null"]},"remainingBytes":{"type":["integer","null"]},"suppressed":{"type":["boolean","null"],"description":"True for narrowly-scoped API keys; usedBytes/limitBytes are zeroed and meaningless."},"scope":{"type":"string","enum":["personal","group"]},"groupId":{"type":["string","null"]}}},"category":"data-slots"},{"name":"set_org_connectivity","title":"Set Org Connectivity","description":"Sets the default connectivity mode and global whitelist for an organization. These settings apply to all displays in the org unless overridden at the display level. Use this when an org admin wants to declare their network topology. Requires admin scope and Org-Admin role.","inputSchema":{"type":"object","required":["org_id"],"properties":{"org_id":{"type":"string","description":"The organization ID."},"default_connectivity_mode":{"type":"string","enum":["full-access","whitelist-only","isolated","inherit"],"description":"Default connectivity mode for all org displays."},"global_whitelist":{"type":"array","description":"Org-wide whitelist of allowed URL patterns. Pass an empty array to clear.","items":{"type":"string"}},"access_token":{"type":"string","description":"Optional JWT access token for authentication."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"orgId":{"type":["string","null"]},"defaultConnectivityMode":{"type":["string","null"]},"globalWhitelist":{"type":["array","null"],"items":{"type":["string","null"]}}}},"category":"connectivity"},{"name":"set_display_embeddable_origins","title":"Set Display Embeddable Origins","description":"Sets the optional origin allowlist that restricts which third-party websites may embed this display via /display-embed/{profileId}. Only effective when the display's privacy_mode is 'Public'; private displays reject the embed route entirely regardless of this setting. Pass an empty array to clear the allowlist so public displays can be embedded from any origin. Pass an array like ['https://example.com'] to lock embedding to those specific origins plus agentView's own domains and the ChatGPT widget host. Requires admin scope and is audit-logged.","inputSchema":{"type":"object","required":["display_id","origins"],"properties":{"display_id":{"type":"string","description":"The 8-character alphanumeric display profile ID, e.g. 'ABCD1234'."},"origins":{"type":"array","description":"Origin strings allowed to embed this display. Pass an empty array to allow all origins for Public displays. Each entry must be a full HTTPS origin like 'https://example.com'.","items":{"type":"string"}},"access_token":{"type":"string","description":"Optional JWT access token for authentication."},"session_request_id":{"type":"string","description":"Optional session request ID returned by create_auth_session. Preferred over access_token."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"outputSchema":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"embeddableOrigins":{"type":["array","null"],"items":{"type":["string","null"]}},"changed":{"type":["boolean","null"]}}},"category":"displays"}],"toolCount":79,"prompts":[{"name":"onboard_first_display","title":"First Display Onboarding","description":"Guide the assistant through helping a user create and understand their first display.","arguments":[{"name":"goal","description":"Optional end goal, for example 'show a welcome page on a lobby screen'.","required":false}]},{"name":"recover_mcp_auth","title":"Recover MCP Auth","description":"Guide the assistant through diagnosing MCP OAuth, discovery and session failures.","arguments":[{"name":"client_name","description":"Optional MCP client name such as ChatGPT, Claude Desktop or Antigravity.","required":false},{"name":"symptom","description":"Optional short symptom description such as 'redirect loop' or '401 on first tool call'.","required":false}]},{"name":"render_premium_display_html","title":"Render Premium Display HTML","description":"Load the premium agentView creative brief for generating polished, high-end digital signage HTML from a one-shot request.","arguments":[{"name":"brief","description":"The one-shot request or content brief that should become display HTML.","required":true},{"name":"category","description":"Optional category such as dashboard, welcome screen, menu board or event schedule.","required":false},{"name":"touch_mode","description":"Optional interaction mode: display-first, touch or control-panel.","required":false},{"name":"data_mode","description":"Optional data strategy: live-with-fallback, static or mock-only.","required":false},{"name":"brand_direction","description":"Optional visual direction such as Apple-like, luxury hospitality or industrial operations.","required":false}]}],"promptCount":3,"resources":[{"uri":"ui://agentview/store-gallery","name":"agentView Template Gallery","title":"agentView Template Gallery","description":"Visual card grid of agentView store templates returned by search_store_templates and list_store_categories.","mimeType":"text/html;profile=mcp-app","annotations":{"audience":["assistant"],"priority":0.4}},{"uri":"ui://agentview/store-detail","name":"agentView Template Detail","title":"agentView Template Detail","description":"Hero + intro + features + use cases for a single store template returned by get_store_template_details.","mimeType":"text/html;profile=mcp-app","annotations":{"audience":["assistant"],"priority":0.4}},{"uri":"ui://agentview/store-install-result","name":"agentView Template Installed","title":"agentView Template Installed","description":"Success/error confirmation card rendered after send_store_template_to_display.","mimeType":"text/html;profile=mcp-app","annotations":{"audience":["assistant"],"priority":0.4}},{"uri":"ui://agentview/display-preview","name":"agentView Display Preview","title":"agentView Display Preview","description":"Live preview of a single display via a signed time-limited URL.","mimeType":"text/html;profile=mcp-app","annotations":{"audience":["assistant"],"priority":0.4}},{"uri":"ui://agentview/display-grid","name":"agentView Displays","title":"agentView Displays","description":"Grid of the user's displays with online status and privacy mode.","mimeType":"text/html;profile=mcp-app","annotations":{"audience":["assistant"],"priority":0.4}},{"uri":"ui://agentview/auth-session","name":"agentView Sign In","title":"agentView Sign In","description":"Login button + countdown rendered after create_auth_session so the user has a clean call-to-action instead of a long technical URL in chat.","mimeType":"text/html;profile=mcp-app","annotations":{"audience":["assistant"],"priority":0.4}},{"uri":"agentview://public/status","name":"Public status","title":"Public status","description":"Server health, MCP discovery endpoints and public readiness information.","mimeType":"application/json","annotations":{"audience":["user","assistant"],"priority":0.3}},{"uri":"agentview://public/instructions","name":"Agent instructions","title":"Agent instructions","description":"Recommended authentication and usage flow for MCP clients.","mimeType":"text/plain","annotations":{"audience":["assistant"],"priority":0.8}},{"uri":"agentview://public/design-system","name":"Premium display design system","title":"Premium display design system","description":"Default premium digital-signage brief for generating high-end display HTML.","mimeType":"text/plain","annotations":{"audience":["assistant"],"priority":0.5}},{"uri":"agentview://public/developers","name":"Developer documentation","title":"Developer documentation","description":"Technical MCP and OAuth integration reference.","mimeType":"text/plain","annotations":{"audience":["user","assistant"],"priority":0.4}},{"uri":"agentview://public/mcp","name":"MCP capability status","title":"MCP capability status","description":"Supported protocol versions, transports, resources, prompts, completions and subscription capabilities.","mimeType":"application/json","annotations":{"audience":["assistant"],"priority":0.3}},{"uri":"agentview://public/oauth","name":"OAuth status","title":"OAuth status","description":"Authorization endpoints, supported scopes, token methods, PKCE and protected resource metadata.","mimeType":"application/json","annotations":{"audience":["assistant"],"priority":0.6}},{"uri":"agentview://public/support","name":"Support diagnostics","title":"Support diagnostics","description":"Recommended evidence and checks for MCP, OAuth, session and interoperability troubleshooting.","mimeType":"text/plain","annotations":{"audience":["user","assistant"],"priority":0.2}},{"uri":"agentview://public/apis","name":"Public API catalog","title":"Public API catalog","description":"Catalog of 638 free, no-auth public APIs for embedding live data in display HTML via fetch().","mimeType":"application/json","annotations":{"audience":["assistant"],"priority":0.5}}],"resourceCount":14,"designGuidance":{"defaultMode":"premium-digital-signage","instructionsMode":"always-on-compact","recommendedPrompt":"render_premium_display_html","recommendedResource":"agentview://public/design-system"},"publicEndpoints":{"instructions":"https://agentview.de/agent-instructions","status":"https://agentview.de/api/status","developers":"https://agentview.de/developers.html","manifest":"https://agentview.de/mcp/manifest"}}