{"name":"agentView MCP","version":"2.1.119","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","search_store_templates","list_store_categories","get_store_template_details","get_store_template_content","get_agent_artifact"],"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":"Starts a browser login and returns a loginUrl plus sessionRequestId. Use as STEP 0 in a fresh conversation before any protected tool. Show the loginUrl to the user as a clickable link in their language, then poll get_auth_session until 'active' and pass session_request_id on every later call. Returns sessionRequestId, loginUrl, pollUrl and expiresIn.","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 a login session created by create_auth_session until the user completes the browser login. Poll every 2-3 seconds while status is 'pending'. Status 'active' auto-authenticates this MCP session — protected tools work immediately; keep passing session_request_id on later calls (the raw token is intentionally not returned over MCP). 'expired' means start over with create_auth_session.","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 identity on this MCP session so later calls work without resending it. Use only when your client cannot send an Authorization: Bearer header; prefer session_request_id-based auth via create_auth_session. Not needed after get_auth_session returned 'active'.","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 login from this MCP session (does not revoke the underlying token). Use when the user wants to sign out or switch accounts.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"noauth"}]},"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"}]},"category":"discovery"},{"name":"search","title":"Search Resources","description":"Searches agentView resources by keyword: documentation, server status, your account, your displays and the API catalog. Returns ranked resource URIs with snippets to read via fetch. Unauthenticated searches cover public docs only. Skip when you already know the URI — call fetch directly.","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":"Fetches one agentView resource by agentview:// URI, e.g. agentview://public/status, agentview://account/me or agentview://display/ABCD1234. Use after search or with a known URI. Public URIs need no auth; account and display URIs need a session. Returns uri, type, title, text and structured data.","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 template store for ready-made display designs ('Zahnarzt-Wartezimmer', 'Bistro', 'reception', ...). Use when the user wants a polished pre-built design instead of generated HTML; results render as a gallery widget. Filter by category, suite and language; paginate with limit/offset. Follow up with get_store_template_details. 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 full details of one store template: localized title and description, long-form markdown, category, suite, tags, features, preview image and agentArtifacts (bot-onboarding files such as system prompts, Agent Skills SKILL.md, MCP config). Use after search_store_templates before recommending or installing; when agentArtifacts is non-empty, fetch bodies via get_agent_artifact. 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_agent_artifact (slug = raw, display_id = substituted).","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_content","title":"Get Store Template Content (HTML + Slots)","description":"Returns the raw display HTML of a published store template plus its slot definitions and allowed external origins, for editing or embedding the template yourself. {{asset:NAME}} placeholders resolve to public URLs; {{slot:KEY.prop}} stay intact for your own binding. Large HTML is windowed via max_bytes (default 51200) and offset; the result reports totalBytes and truncated. To push a template to a display directly, use send_store_template_to_display instead. No authentication required.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"Template slug from search_store_templates, e.g. 'bistro-warm-door'."},"version":{"type":"string","description":"Optional published version id (stpv_…) to pin. Omit for current."},"offset":{"type":"integer","minimum":0,"description":"Byte offset into the HTML. Default 0."},"max_bytes":{"type":"integer","minimum":1024,"maximum":204800,"description":"Maximum HTML bytes to return. Default 51200."}}},"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"]},"totalBytes":{"type":["integer","null"]},"offset":{"type":["integer","null"]},"truncated":{"type":["boolean","null"]},"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":"store"},{"name":"get_agent_artifact","title":"Get Agent Artifact","description":"Returns an agent-onboarding artifact shipped with a store template: system prompt, Agent Skills SKILL.md or MCP-config snippet. Pass slug for the RAW template artifact (before install, {{slot:...}} placeholders intact) or display_id for the display-bound artifact with placeholders resolved against installed slots (ready to save, e.g. into ~/.claude/skills/). Discover keys via get_store_template_details (agentArtifacts array). Template mode needs no auth; display mode requires content scope and display ownership.","inputSchema":{"type":"object","required":["key"],"properties":{"key":{"type":"string","description":"Artifact key, e.g. 'bot-system-prompt', 'agent-skill', 'mcp-config'."},"slug":{"type":"string","description":"Template slug for the raw artifact. Provide slug OR display_id."},"display_id":{"type":"string","description":"Display profile ID for the placeholder-resolved artifact. If both slug and display_id are given, display_id wins (substituted body)."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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":{"slug":{"type":["string","null"]},"displayId":{"type":["string","null"]},"key":{"type":["string","null"]},"kind":{"type":["string","null"]},"title":{"type":["string","null"]},"content":{"type":["string","null"]},"unresolvedPlaceholders":{"type":["array","null"],"items":{"type":["string","null"]}}}},"category":"store"},{"name":"get_store_template_install_options","title":"Get Store Template Install Options","description":"Returns the displays the user can install a store template on plus the data slots it needs (key, label, type, required). Call before send_store_template_to_display. An empty displays list means the user must first set up a display (pair_by_code). Requires content scope.","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 bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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 a display: materializes the HTML, auto-creates required data slots (reusing prior installs) and publishes within seconds. Call get_store_template_install_options first for valid targets and slots; customize per-slot JSON inline via data_slot_overrides (raw JSON string or inline object per key, max 64 KiB each). Requires content scope and control access to the display.","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 bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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":"search_public_apis","title":"Search Public APIs","description":"Searches a curated catalog of 600+ free public APIs (no key, HTTPS) for embedding live data in display HTML via fetch(): weather, news, finance, sports, images, food and 40+ more categories. Use when generating HTML that needs live internet data. Set list_categories=true to get the category menu with counts instead of search results. Returns docs links, CORS status and fetch() hints. No authentication required.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text search, e.g. 'weather forecast', 'bitcoin price', 'jokes'."},"category":{"type":"string","description":"Category ID filter, e.g. 'weather', 'finance', 'news'. Omit for all."},"cors_only":{"type":"boolean","description":"true returns only APIs with confirmed browser CORS support. Default false."},"list_categories":{"type":"boolean","description":"true returns all categories with API counts instead of search results."},"limit":{"type":"integer","minimum":1,"maximum":20,"description":"Maximum results, 1-20. Default 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"]}}}},"categories":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"count":{"type":["integer","null"]}}}}}},"category":"discovery"},{"name":"get_account","title":"Get Account","description":"Returns the user's account profile: plan and features, personal display limits and remaining quota, accessible display count, organization memberships and points balance. Use for subscription, quota and membership questions. Not for listing displays (use list_displays). Requires content scope.","inputSchema":{"type":"object","properties":{"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."}}},"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":"Lists all displays the user can access, with id, name, online status, lock state and device class — the starting point to discover display IDs before get_display, send_html or send_store_template_to_display. Pass org_id to list an organization's displays instead. response_format 'detailed' adds screen/viewport facts, URLs and language per display. To show what a display looks like right now, use get_display_preview_url. Requires content scope.","inputSchema":{"type":"object","properties":{"org_id":{"type":"string","description":"Optional organization ID: list that organization's displays (member access required)."},"response_format":{"type":"string","enum":["concise","detailed"],"description":"concise (default) returns key fields per display; detailed adds screen/viewport, URLs and language."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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"]},"isOnline":{"type":["boolean","null"]},"locked":{"type":["boolean","null"]},"orgId":{"type":["string","null"]},"deviceClass":{"type":["string","null"]},"resolution":{"type":["string","null"]},"hasTouch":{"type":["boolean","null"]},"lastSeen":{"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 bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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":"manage_display_category","title":"Manage Display Category","description":"Creates or renames a display category (categories group displays for broadcast_content include_category_ids). action 'create' needs name (optional parent_category_id for a subcategory); action 'rename' needs category_id and new_name — assignments and grants stay intact. Discover IDs with list_display_categories; assign displays with assign_display_categories.","inputSchema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["create","rename"],"description":"Operation to perform."},"name":{"type":"string","description":"Category name for action 'create', e.g. 'Reception'."},"parent_category_id":{"type":"string","description":"Optional parent category ID (create only) for a subcategory."},"category_id":{"type":"string","description":"Category ID to rename (rename only)."},"new_name":{"type":"string","description":"New category name (rename only)."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"category":"displays"},{"name":"assign_display_categories","title":"Assign Display Categories","description":"Assigns displays to categories. mode 'replace' (default) sets the full category list of each display in display_ids to category_ids; mode 'add' or 'remove' adds/removes one category (category_ids[0]) across many displays without touching other assignments. Discover IDs with list_display_categories; create categories with manage_display_category.","inputSchema":{"type":"object","required":["display_ids","category_ids"],"properties":{"display_ids":{"type":"array","items":{"type":"string"},"description":"Display profile IDs to update."},"category_ids":{"type":"array","items":{"type":"string"},"description":"Category IDs; for mode 'add'/'remove' only the first entry is used."},"mode":{"type":"string","enum":["replace","add","remove"],"description":"replace (default) sets the exact list; add/remove mutates one category across displays."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"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 token; prefer session_request_id."}}},"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 one organization's details: plan, your role, display count, allocated and remaining license slots. response_format 'detailed' adds the full member list (with roles) and display list. Use after list_organizations. Requires content scope and membership.","inputSchema":{"type":"object","required":["org_id"],"properties":{"org_id":{"type":"string","description":"Organization ID from list_organizations or get_account."},"response_format":{"type":"string","enum":["concise","detailed"],"description":"concise (default) returns counts and core fields; detailed adds members and displays arrays."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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"]},"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"]}},"displays":{"type":["array","null"],"items":{"type":["object","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 bearer token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"category":"orgs"},{"name":"configure_organization","title":"Configure Organization","description":"Updates organization settings: rename (name) and/or network connectivity defaults for all its displays (default_connectivity_mode, global_whitelist). Only provided fields change. Use when an org admin renames the organization or declares network topology. Requires admin scope and org-admin role.","inputSchema":{"type":"object","required":["org_id"],"properties":{"org_id":{"type":"string","description":"Organization ID from list_organizations."},"name":{"type":"string","description":"New organization name (rename)."},"default_connectivity_mode":{"type":"string","enum":["full-access","whitelist-only","isolated","inherit"],"description":"Default connectivity for all org displays."},"global_whitelist":{"type":"array","items":{"type":"string"},"description":"Domain whitelist applied org-wide in whitelist-only mode."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"category":"orgs"},{"name":"manage_org_member","title":"Manage Org Member","description":"Manages organization membership: action 'invite' adds a member by email with a role, 'set_role' changes a member's role, 'remove' removes the member. Roles for organizations: 'admin' (manage members and displays), 'manager' (manage displays and content), 'viewer' (read-only); families accept 'child'. Requires admin scope.","inputSchema":{"type":"object","required":["org_id","action"],"properties":{"org_id":{"type":"string","description":"Organization ID."},"action":{"type":"string","enum":["invite","set_role","remove"],"description":"Membership operation."},"email":{"type":"string","description":"Email address to invite (action 'invite')."},"target_user_id":{"type":"string","description":"Member user ID (actions 'set_role' and 'remove')."},"role":{"type":"string","description":"Role for 'invite' and 'set_role': 'admin', 'manager', 'viewer' (families: 'child')."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"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 bearer token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"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 bearer token; prefer session_request_id."}}},"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":"manage_licenses","title":"Manage Licenses","description":"Manages premium display licenses: action 'allocate' sets how many license slots an organization gets (licenses, 0 deallocates all), 'assign' binds a free license to a display, 'unassign' releases a display's license back to the pool. Check availability first with get_license_info. Requires admin scope.","inputSchema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["allocate","assign","unassign"],"description":"License operation."},"org_id":{"type":"string","description":"Organization ID (action 'allocate')."},"licenses":{"type":"integer","minimum":0,"description":"License slot count for 'allocate'; 0 deallocates all."},"display_id":{"type":"string","description":"Display profile ID (actions 'assign' and 'unassign')."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"category":"orgs"},{"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 bearer token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"category":"orgs"},{"name":"set_display_grant","title":"Set Display Grant","description":"Grants or revokes a member's access to one display inside an organization. action 'set' (default) creates/updates the grant with access_level 'view' (see status) or 'control' (send content); action 'remove' revokes it. The target user must be an organization member. Requires admin scope.","inputSchema":{"type":"object","required":["org_id","display_id","target_user_id"],"properties":{"org_id":{"type":"string","description":"Organization ID."},"display_id":{"type":"string","description":"Display profile ID."},"target_user_id":{"type":"string","description":"User to grant or revoke."},"action":{"type":"string","enum":["set","remove"],"description":"'set' (default) creates/updates the grant; 'remove' revokes it."},"access_level":{"type":"string","enum":["view","control"],"description":"Required for action 'set'."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"category":"orgs"},{"name":"broadcast_content","title":"Broadcast Content","description":"Sends HTML to many displays at once. Target explicit display_ids, all=true for every accessible display, or include_category_ids to reach every display in those categories (include_descendants for subcategories, dry_run to preview matches without sending). Locked displays are skipped with reasons. For a single display use send_html. Requires content scope.","inputSchema":{"type":"object","properties":{"description":{"type":"string","description":"Short summary of the content being sent (required when sending)."},"html":{"type":"string","description":"Complete HTML document. Mutually exclusive with base64_html."},"base64_html":{"type":"string","description":"Base64-encoded HTML. Mutually exclusive with html."},"display_ids":{"type":"array","items":{"type":"string"},"description":"Display profile IDs to target."},"all":{"type":"boolean","description":"true targets all accessible displays."},"include_category_ids":{"type":"array","items":{"type":"string"},"description":"Category IDs: broadcast to displays assigned to these categories."},"include_descendants":{"type":"boolean","description":"With include_category_ids: also include subcategories."},"dry_run":{"type":"boolean","description":"Preview: return the matched displays without sending. Works with all targeting modes."},"duration":{"type":"integer","minimum":0,"description":"Seconds the content stays; 0 = indefinite."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"category":"content"},{"name":"get_display","title":"Get Display","description":"Returns one display's state: status, lock, URLs, settings, language and current content summary. response_format 'detailed' adds browser/runtime facts (screen, viewport, engine), resolved connectivity mode with allowed domains, and full content state (idle content, content URL) — use detailed before generating complex HTML for the display. Use list_displays first to discover IDs. Requires content scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"8-character display profile ID from list_displays, e.g. 'ABCD1234'."},"response_format":{"type":"string","enum":["concise","detailed"],"description":"concise (default) returns key fields; detailed adds runtime facts, connectivity/capabilities and full content state."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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"]},"isOnline":{"type":["boolean","null"]},"locked":{"type":["boolean","null"]},"setupUrl":{"type":["string","null"]},"managedUrl":{"type":["string","null"]},"pairingUrl":{"type":["string","null"]},"currentContent":{"type":["string","null"]},"effectiveLanguage":{"type":["string","null"]},"deviceClass":{"type":["string","null"]},"resolution":{"type":["string","null"]},"hasTouch":{"type":["boolean","null"]},"settings":{"type":["object","null"]},"capabilities":{"type":["object","null"]},"connectivity":{"type":["object","null"]},"runtime":{"type":["object","null"]},"content":{"type":["object","null"]}}},"category":"displays"},{"name":"create_display","title":"Create Display","description":"Pre-provisions a display without hardware, personal or inside an organization (org_id). The new display starts offline. For a physical screen ALWAYS prefer pair_by_code, which creates and pairs in one step; use create_display only to prepare a display before the screen exists or for virtual/API-only displays. Requires admin scope. Returns id plus setup and pairing URLs.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Friendly display name, e.g. 'Lobby Screen'. Required when org_id is set."},"org_id":{"type":"string","description":"Optional: create the display inside this organization (needs manager role and a free license slot)."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"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 token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"category":"displays"},{"name":"send_html","title":"Send HTML","description":"Shows HTML content on a display: menus, dashboards, welcome pages, schedules or any custom design. slot 'live' (default) replaces the current content; slot 'idle' stores the default/fallback content shown when nothing live is active (idle requires admin scope). Always pass a short description so later content reads stay meaningful. Exactly one of html or base64_html. For external web pages use send_url; to edit current content call read_display_html first. For polished results load prompt render_premium_display_html or resource agentview://public/design-system. Requires content scope.","inputSchema":{"type":"object","required":["display_id","description"],"properties":{"display_id":{"type":"string","description":"8-character display profile ID, e.g. 'ABCD1234'."},"description":{"type":"string","minLength":1,"maxLength":1000,"description":"Short human-readable summary of the content, e.g. 'Weekly KPI dashboard'."},"html":{"type":"string","description":"Complete HTML document to render. Mutually exclusive with base64_html."},"base64_html":{"type":"string","description":"Base64-encoded HTML (standard base64). Use only when raw HTML cannot survive JSON transport. Mutually exclusive with html."},"slot":{"type":"string","enum":["live","idle"],"description":"Target slot: 'live' (default) replaces current content; 'idle' sets the default shown when idle (admin scope)."},"duration":{"type":"integer","minimum":0,"description":"Seconds the content stays; 0 = indefinite (default). Live slot only."},"token":{"type":"string","description":"Display-specific demo/preview token for unauthenticated access. NOT the OAuth token."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id. Distinct from the display-specific 'token'."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"category":"content"},{"name":"test_display_content","title":"Test Display Content","description":"Dry-run validator for generated HTML: runs agentView's size and description checks WITHOUT touching a real display. Use after composing complex HTML and before send_html or broadcast_content. No display_id needed; the response carries simulated=true. Capped at 1 MB. Requires authentication.","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 bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"category":"content"},{"name":"send_url","title":"Send URL","description":"Shows an external web page on a display via full-page iframe: dashboards, websites or web apps. slot 'live' (default) replaces current content; slot 'idle' stores it as default/fallback content (admin scope). The URL must be absolute HTTP(S). Check get_display (response_format 'detailed') first when unsure about connectivity or embedding limits. If the page design is not display-ready, prefer send_html with generated content. Requires content scope.","inputSchema":{"type":"object","required":["display_id","url"],"properties":{"display_id":{"type":"string","description":"8-character display profile ID, e.g. 'ABCD1234'."},"url":{"type":"string","description":"Absolute HTTP or HTTPS URL to load, e.g. 'https://example.com/dashboard'."},"slot":{"type":"string","enum":["live","idle"],"description":"'live' (default) or 'idle' for default/fallback content (admin scope)."},"duration":{"type":"integer","minimum":0,"description":"Seconds the content stays; 0 = indefinite (default). Live slot only."},"content_description":{"type":"string","description":"Short summary of what the page shows (recommended)."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"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 token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"category":"content"},{"name":"get_display_preview_url","title":"Generate Display Preview Share Link","description":"Creates a short-lived signed link showing what a display is presenting RIGHT NOW, rendered inline as a preview widget. ALWAYS call this when the user wants to SEE their display or screen content (preview, 'zeig mir das Display'). Link lifetime follows the display's privacy mode. Requires content 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 bearer token; prefer session_request_id."}}},"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 currently shown on a display so you can inspect or edit it and push it back with send_html. content_type 'idle' reads the default/fallback content instead. Responses are windowed for large documents: max_bytes (default 51200) and offset page through the source; the result reports totalBytes and truncated. Not for visual previews (use get_display_preview_url). Requires content scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"8-character display profile ID, e.g. 'ABCD1234'."},"content_type":{"type":"string","enum":["live","idle"],"description":"'live' (default) reads active content; 'idle' reads default content."},"offset":{"type":"integer","minimum":0,"description":"Byte offset to start reading from. Default 0."},"max_bytes":{"type":"integer","minimum":1024,"maximum":204800,"description":"Maximum bytes of HTML to return. Default 51200."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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"]},"totalBytes":{"type":["integer","null"]},"offset":{"type":["integer","null"]},"truncated":{"type":["boolean","null"]},"source":{"type":["string","null"]}}},"category":"content"},{"name":"configure_display","title":"Configure Display","description":"Updates display settings: rename (name), lock or unlock content changes (locked), privacy mode for share links (privacy_mode), embed-origin allowlist (origins), hardware permissions (camera, microphone, geolocation), preferred language, mouse cursor, badge overlay and watermark position. Only the fields you pass are changed; online displays apply changes immediately. Use for any display setting change. Not for sending content (send_html, send_url) or deleting (delete_display). Requires admin scope.","inputSchema":{"type":"object","required":["display_id"],"properties":{"display_id":{"type":"string","description":"8-character display profile ID, e.g. 'ABCD1234'."},"name":{"type":"string","description":"New display name (rename)."},"locked":{"type":"boolean","description":"true blocks content changes until unlocked; false unlocks."},"privacy_mode":{"type":"string","enum":["Private","Public"],"description":"Private caps share-link TTL at 1 hour; Public (signage mode) allows 24 hours."},"origins":{"type":"array","items":{"type":"string"},"description":"Embed-origin allowlist for Public displays; [] allows all origins."},"allow_camera":{"type":"boolean"},"allow_microphone":{"type":"boolean"},"allow_geolocation":{"type":"boolean"},"preferred_language":{"type":"string","enum":["de","en","zh"]},"show_mouse_cursor":{"type":"boolean"},"show_badge_overlay":{"type":"boolean"},"watermark_position":{"type":"string","enum":["BottomLeft","BottomRight","TopLeft","TopRight"]},"connectivity_mode":{"type":"string","enum":["full-access","whitelist-only","isolated","inherit"],"description":"Per-display network mode override."},"whitelist":{"type":"array","items":{"type":"string"},"description":"Domain whitelist for whitelist-only mode."},"strict_whitelist":{"type":"boolean","description":"true: the display whitelist replaces the org whitelist instead of extending it."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"category":"displays"},{"name":"pair_by_code","title":"Pair Display by Code","description":"Pairs a physical screen with the 6-character code shown on https://display.agentview.de — the recommended first-time setup: ask the user to open that URL on the TV and read the code, then call this (creates and pairs in one step). Pass target_display_id to rebind an EXISTING display profile onto new hardware instead (keeps name, settings, content). Requires admin scope.","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 bearer token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"category":"displays"},{"name":"claim_display","title":"Claim Display","description":"Adopts an unclaimed guest or pending display as a managed personal display (permanent ownership transfer, counts against quota). Use only when the user explicitly wants to take over hardware that is already running; for first-time setup prefer pair_by_code. Requires admin scope.","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 token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"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 bearer token; prefer session_request_id."}}},"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 bearer token; prefer session_request_id."}}},"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 bearer token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:admin"]}]},"category":"api-keys"},{"name":"submit_feedback","title":"Submit Feedback","description":"Sends the user's feedback, feature request or bug report about agentView itself (not display content) for later review. Confirm the exact wording with the user before sending; optional sentiment. There is no automatic reply. Requires content scope.","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 bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"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 bearer token; prefer session_request_id."}}},"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 user's uploaded assets (images, videos, fonts, documents) with public URLs for use in display HTML. Filter by type, search term or group. Check before upload_asset to avoid duplicates. response_format 'detailed' adds description, size and timestamps per asset. Requires content 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."},"group_id":{"type":"string","description":"Only this group's assets. Omit for personal."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"Maximum results (default 50)."},"response_format":{"type":"string","enum":["concise","detailed"],"description":"concise (default): id, name, url, mimeType; detailed adds description, sizeBytes, createdAt."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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"]}}}}}},"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 bearer token; prefer session_request_id."}}},"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 bearer token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"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 bearer token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"category":"assets"},{"name":"set_data_slot","title":"Set Data Slot","description":"Creates or updates a mutable JSON data slot (max 2 MB) that display HTML fetches via its readUrl — the live-data backbone for store templates. The slug is stable; reusing it updates in place. type 'value' stores JSON verbatim; 'aggregate' composes up to 32 sources ({slot:'name'} or one {prefixMatch:'agent-'}) within the same personal/group scope. Requires content scope. Returns slug, readUrl and size.","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 bearer token; prefer session_request_id."}}},"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 bearer token; prefer session_request_id."}}},"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 bearer token; prefer session_request_id."}}},"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 bearer token; prefer session_request_id."}}},"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:content"]}]},"category":"data-slots"},{"name":"get_storage_usage","title":"Get Storage Usage","description":"Returns the storage pool snapshot (used, limit and remaining bytes) for the personal scope or a group — data slots and uploaded assets share this quota; check before large set_data_slot or upload_asset writes. Pass slug to additionally scan which displays reference that data slot (do this before delete_data_slot to know which displays would break). Narrowly-scoped API keys get suppressed=true with zeroed numbers. Requires content scope.","inputSchema":{"type":"object","properties":{"group_id":{"type":"string","description":"Group/organization ID for the group pool. Omit for the personal pool."},"slug":{"type":"string","description":"Optional data-slot slug: also report which displays reference it (slotUsage)."},"access_token":{"type":"string","description":"Optional bearer token; prefer session_request_id."},"session_request_id":{"type":"string","description":"Session handle from create_auth_session; pass it on every authenticated call."}}},"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"]},"scope":{"type":"string","enum":["personal","group"]},"groupId":{"type":["string","null"]},"slotUsage":{"type":["object","null"],"properties":{"slug":{"type":["string","null"]},"count":{"type":["integer","null"]},"truncated":{"type":["boolean","null"]},"displays":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"profileId":{"type":["string","null"]},"name":{"type":["string","null"]}}}}}}}},"category":"data-slots"}],"toolCount":57,"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"}}