fetch
Retrieves the full details of a single agentView resource identified by its URI. Use this after search to read the complete content of a discovered resource, or directly when you already know the URI. Public URIs (e.g. agentview://public/status, agentview://public/instructions) require no authentication; private URIs (e.g. agentview://account/me, agentview://display/{id}) require a valid session. Returns uri, type, title, text (human-readable content) and data (structured details).
get_pricing
Returns agentView plan pricing, features and upgrade options. Use this when the user asks about pricing, costs, plan differences or what an additional display costs. No authentication required. Returns an array of plans with name, price, included displays and features, plus the per-display add-on price and a link to the pricing page.
search_public_apis
Searches a curated catalog of 600+ free, public APIs that require no authentication and work over HTTPS — ideal for embedding live data in display HTML pages via fetch(). Covers 47 categories including weather, news, finance, sports, images, food, entertainment, science, geocoding and more. Use this when generating HTML that needs live data from the internet. Returns matching APIs with documentation links, CORS support info and ready-to-use fetch() code hints. No authentication required.
search_public_apis
Searches a curated catalog of 600+ free, public APIs that require no authentication and work over HTTPS — ideal for embedding live data in display HTML pages via fetch(). Covers 47 categories including weather, news, finance, sports, images, food, entertainment, science, geocoding and more. Use this when generating HTML that needs live data from the internet. Returns matching APIs with documentation links, CORS support info and ready-to-use fetch() code hints. No authentication required.
authenticate
Validates a JWT agent token and caches the resulting identity on the current MCP session so that subsequent protected tool calls succeed without resending the token. Use this only if your client cannot reliably send an Authorization: Bearer header on every request; modern streamable HTTP clients should send the header instead. Do not call this if the session was already auto-authenticated by get_auth_session. Returns authenticated (boolean), sessionBound (whether the identity was cached on this session), userId, name, email, scope and expiresAt (ISO 8601).
set_display_grant
Grants a specific user access to a specific display within an organization. Creates or updates the grant. The target user must be a member of the organization. Access levels: 'view' (see status) or 'control' (send content). Requires admin scope.
set_idle_content
Sets or clears the default idle content for a display. Idle content is shown whenever the display has no active live content (after clear_display, after duration expires, or on first connect). Provide html to set idle content, or omit it to clear idle content and revert to the system default. Provide content_description to improve later state reads. Requires admin scope. Returns id, name and idle content metadata.
get_display_capabilities
Returns resolved display capabilities for a display, including effective network mode plus concrete browser/runtime facts such as screen, viewport, touch/input hints, browser and engine version, platform classification, feature support, known limitations, graphics hints, and a recommended delivery mode. Call this BEFORE generating or sending HTML so your agent can match the content to the real display browser. Requires authentication with at least content_only scope.
create_auth_session
Creates a browser-based login session and returns a loginUrl the user must open to authenticate. Use this as the first step when your client cannot complete OAuth 2.1 with PKCE itself. Do not use this if you already have a valid Bearer token. Returns sessionRequestId (needed for get_auth_session), loginUrl, pollUrl and expiresIn (seconds until the login window closes, default 600). After calling this, instruct the user to open the loginUrl, then poll get_auth_session until status becomes active.
unlock_display
Unlocks a previously locked display so that content changes (send_html, send_url, clear_display) are accepted again. Use this when the user wants to resume managing a locked display. Requires admin scope. Returns id and locked (boolean false). To lock again, use lock_display.
get_display
Returns the full details of a single display including its live state, current content, pairing links, screen and viewport facts, touch capability, runtime classification, hardware/UI settings, and the latest reported browser/runtime facts. Use this when you already know the display ID and need its complete state. Do not use this to discover displays — use list_displays first. Requires authentication with at least content_only scope.
assign_license
Assigns a premium license to a display, removing its watermark and making it ad-free. For personal displays the license is taken from the user's free pool. For organization displays the license is taken from the group's allocated slot pool (use allocate_licenses first to give the organization licenses). Each license also adds +30 MB to the display's context storage pool. Requires admin scope. Returns id, name, isPremiumAssigned, badgeMode and freeLicenses.
lock_display
Locks a display so that content changes such as send_html, send_url and clear_display are rejected until unlock_display is called. Use this when the user wants to protect a display from accidental content changes. The display continues showing its current content. Requires admin scope. Returns id and locked (boolean true). To reverse this, use unlock_display.
send_html
Send HTML content to a display. Prefer this over send_url unless the user explicitly wants an external website rendered as-is. For rich content with images, fonts, or media, first upload assets using upload_asset and reference the returned URLs in your HTML. Include content_description whenever possible so get_display_content can describe intent without immediately reading raw HTML. Assets are cached on the display — only the HTML is re-downloaded on updates. Use <img src="asset_url">, <video src="asset_url">, or @font-face { src: url("asset_url") } to embed assets. Before generating complex HTML, call get_display_capabilities for the target display so you know the real browser/runtime limits. Produce high-quality, visually polished output suitable for digital signage: clean typography, balanced spacing, large readable fonts, consistent colors, full-screen layout (100vw/100vh, no scrollbars), and smooth animations where appropriate. Always include <meta charset='UTF-8'> and <meta name='viewport' content='width=device-width, initial-scale=1'>. Requires authentication with at least content_only scope. Exactly one of html or base64_html must be provided. Returns id, name, duration, file and version.
create_api_key
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. Returns the raw key (avk_...), keyId, name, scope, permissions, allowedSlotSlugs, allowedDisplayIds, capabilities, and expiration.
read_display_html
Reads the raw HTML source code that is currently shown on a display. Use this when you want to inspect, modify or reuse the existing content. Typical workflow: call read_display_html to get the current HTML, make changes, then send the modified HTML back via send_html. Returns the HTML as a string plus metadata (character count, content type, when it was sent). If no live content is active, returns the idle/default HTML if one is set. Requires authentication with at least content_only scope.
remove_display_grant
Removes a user's access grant from a display within an organization. Requires admin scope and admin or owner role.
upload_asset
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 { src: url("...") }. Assets are cached on displays — only the HTML is re-downloaded on updates. Pass files as base64-encoded data. IMPORTANT: When creating content for an organization display (a display with an orgId), pass that orgId as group_id so assets are stored in the group's shared storage pool. Omit group_id only for personal displays. Requires authentication with at least content_only scope.
unassign_license
Removes a premium license from a display, restoring the watermark and ad eligibility. The license returns to the user's available pool (personal) or the group's allocated slot pool (organization). Requires admin scope. Returns id, name, isPremiumAssigned, badgeMode and freeLicenses.
get_display_content
Returns the current content state of a display including the active live content file, currentContentDescription, content URL, a live preview link (displayUrl) that can be opened in a browser, idle content and delivery status. Use currentContentDescription first to understand intent; call read_display_html only when raw source access is truly needed. The displayUrl shows exactly what the display renders in real time. Requires authentication with at least content_only scope.
get_auth_session
Polls the status of a login session created by create_auth_session and returns the agent token once the user completes the browser login. Use this after create_auth_session; poll every 2-3 seconds until the status is no longer 'pending'. Do not use this for any other purpose. Returns one of three states: 'pending' (user has not logged in yet — keep polling), 'active' (login succeeded — response includes token as a raw JWT string and tokenExpiresAt as ISO 8601 timestamp), or 'expired' (login window or token timed out — call create_auth_session again). When status is active the current MCP session is automatically authenticated; you can call protected tools immediately.
rename_organization
Renames an existing organization. Requires admin scope and admin or owner role in the organization.
list_org_displays
Returns all displays in an organization with their real-time connection status, online/offline state, and license info. Use this for fleet monitoring. Requires content_only scope and organization membership.
delete_data_slot
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.
fetch
Retrieves the full details of a single agentView resource identified by its URI. Use this after search to read the complete content of a discovered resource, or directly when you already know the URI. Public URIs (e.g. agentview://public/status, agentview://public/instructions) require no authentication; private URIs (e.g. agentview://account/me, agentview://display/{id}) require a valid session. Returns uri, type, title, text (human-readable content) and data (structured details).
claim_display
Converts an unclaimed guest or pending display into a managed personal display owned by the authenticated user. This permanently transfers ownership and counts against the user's display quota. Use this only when the user explicitly wants to adopt an existing hardware or demo display that is already running. For first-time physical setup, prefer pair_by_code instead. Requires admin scope. Returns profileId (the new managed display ID) and name.
remove_member
Removes a member from an organization. Transfers their owned displays to a successor, unassigns their license allocations, and removes their display grants. Cannot remove the last owner. Requires admin scope and admin or owner role.
get_asset
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.
list_displays
Returns all displays accessible to the authenticated user as an array with count and display details. Use this to discover available display IDs before reading or modifying a specific display with get_display or send_html. Requires authentication with at least content_only scope; admin is not required. Each display entry includes id (8-character alphanumeric profile ID), name, status, locked, displayUrl, setupUrl, pairingUrl and other management links plus a compact runtime summary such as screen resolution, touch support, deviceClass and deviceFamily when known. Do not use this to get full details of one display — use get_display with the display_id instead.
list_data_slots
Lists data slots with optional filtering. Returns metadata only (no jsonContent). Each item includes readUrl: /data/u/{publicSlug}/{slug}.json or /data/g/{groupSlug}/{slug}.json. Use readUrl in display HTML fetch() calls. Requires authentication.
create_organization
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.
logout
Clears the cached authentication identity from the current MCP session. Use this when the user wants to end the session or switch accounts. This does not revoke the underlying JWT token — it only removes the session-local cache. After logout, protected tools will require re-authentication. Returns loggedOut (boolean) and sessionBound (boolean).
list_organizations
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.
delete_display
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).
delete_asset
Deletes one or more assets. Displays referencing deleted assets will show broken images. Requires authentication with at least content_only scope.
get_organization
Returns full details of a specific organization including its displays, members with roles, allocated slots and remaining capacity. Use this after list_organizations to inspect a specific organization's state. Requires authentication with at least content_only scope and the user must be a member of the organization.
remove_display_from_org
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.
set_org_connectivity
Sets the default connectivity mode and global whitelist for an organization. These settings apply to all displays in the org unless overridden at the display level. Use this when an org admin wants to declare their network topology (e.g., 'our displays can only reach *.corp.local'). Requires admin scope and Org-Admin role.
clear_display
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').
list_api_keys
Lists all API keys for the current user. Returns key metadata (prefix, name, scope, dates) but never the raw key. Requires admin scope.
get_account
Returns the authenticated user's account profile including userId, name, email, plan with feature details, personal display limits, total accessible displays across all organizations, organization memberships summary and points balance. Use this to answer questions about the user's subscription, display quota, organization memberships or plan capabilities. Requires authentication with at least content_only scope. Do not use this to list displays — use list_displays instead.
revoke_api_key
Permanently revokes an API key. This is irreversible — the key will immediately stop working. Requires admin scope.
configure_display
Updates hardware permission, UI settings, and connectivity overrides for a display. Use this when the user wants to enable or disable camera, microphone or geolocation access, toggle the mouse cursor or badge overlay visibility, change the watermark position, or set network connectivity constraints. All parameters except display_id are optional — only provided settings are changed. If the display is online, changes are pushed immediately. Requires admin scope.
delete_organization
Permanently deletes an organization, releasing all its displays and removing all members. Only the owner can delete. This cannot be undone. Requires admin scope.
pair_by_code
PREFERRED way to set up a physical display — and the DEFAULT for any ambiguous user request about creating, adding, or setting up a display. Unless the user explicitly asks for pre-provisioning without hardware or a virtual/headless display, ALWAYS use this tool instead of create_display. agentView is purely browser-based — there is NO native app to install. Workflow: (1) Ask the user to open https://display.agentview.de in any web browser on the target TV/screen/tablet, (2) ask them to read the 6-character code shown on screen, (3) call this tool with the code. This creates and pairs the display in one step — no orphaned or offline displays. Two modes: (A) New display — provide code + profile_name to create and pair in one step. This is the recommended default for first-time setup. (B) Rebind — provide code + target_display_id to move an existing display profile to new hardware. Call list_displays first to get the target_display_id. Always prefer this over create_display or create_org_display for physical devices. Requires admin scope.
update_member_role
Changes a member's role within an organization. Cannot change your own role or the owner's role. Requires admin scope and admin or owner role.
broadcast_content
Sends HTML content to multiple displays at once. Provide display_ids to target specific displays or set all to true to target all accessible displays. Locked displays are skipped. Returns sent and skipped lists with reasons. Requires content_only scope.
get_billing_url
Returns a URL to the user's billing and subscription page where they can purchase or manage premium display licenses. Use this when the user wants to buy more licenses, upgrade their plan, or manage their subscription. Present the URL to the user and offer to allocate and assign the new licenses once the purchase is complete. Requires content_only scope.
get_pricing
Returns agentView plan pricing, features and upgrade options. Use this when the user asks about pricing, costs, plan differences or what an additional display costs. No authentication required. Returns an array of plans with name, price, included displays and features, plus the per-display add-on price and a link to the pricing page.
get_public_status
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.
search
Searches agentView resources by keyword and returns a ranked list of matching resource URIs with titles and snippets. Use this to discover resources before calling fetch for full details. Do not use this if you already know the exact resource URI — call fetch directly instead. Without authentication only public documentation resources are searched; with authentication your account and accessible displays are included. Returns query, resourceType, count and a results array where each entry has uri, type, title, snippet and requiresAuthentication.
create_display
Creates a personal display WITHOUT pairing it to physical hardware. The display starts offline and uncoupled — this is NOT the normal setup flow. IMPORTANT: Do NOT use this tool for ambiguous requests like 'create a display', 'add a screen', 'set up a display', 'neues Display erstellen', or 'Bildschirm hinzufügen'. Those requests mean physical display onboarding by default. In such cases, instruct the user to open https://display.agentview.de in any web browser on the target screen (there is NO native app — agentView is purely browser-based), ask for the 6-character pairing code, and then call pair_by_code instead. Use create_display ONLY when the user explicitly says they want to pre-provision a display without hardware, create a virtual/headless display, or manage an already-existing profile separately from device setup. Do not call this just to check capacity — use get_account to inspect remainingDisplays first. Requires admin scope; list_displays and send_html only need content_only. Returns a pre-provisioned offline profile (id, name, displayUrl, setupUrl, managedUrl, pairingUrl, pairingExpiresAt, approvalUrl, status) — not the recommended first-time device onboarding flow.
invite_member
Creates an invite link to add a new member to an organization. The invite is valid for 7 days. Optionally bind it to a specific email address. Requires admin scope and the user must be an admin or owner of the organization. Returns the inviteUrl to share with the invitee.
rename_display
Changes the friendly name of an existing display. Use this when the user wants to update only the display name without affecting its content or state. Requires admin scope. Returns id and the updated name.
update_asset
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.
allocate_licenses
Allocates premium display licenses from the authenticated user's Premium plan to an organization. Premium users have a pool of allocatable licenses (base + purchased extras) that can be distributed across organizations. Requires admin scope and a Premium plan.
create_org_display
Creates a new display directly within an organization WITHOUT pairing it to physical hardware. The display starts offline and uncoupled. For physical screens, ALWAYS prefer pair_by_code instead — it creates and pairs in one step. Use create_org_display only for administrative pre-provisioning when the screen is not yet available. The display is owned by the organization, not by a personal user. Requires admin scope and manager or higher role in the organization. The organization must have available licenses (use allocate_licenses first if needed).
send_url
Loads a web page by URL on a display using a full-page iframe, immediately replacing whatever is currently shown. Use this when the user wants to show an external website, dashboard or web app on a display. Include content_description whenever available so get_display_content can communicate intent without immediately calling read_display_html. The URL must be an absolute HTTP or HTTPS address. Call get_display_capabilities first to confirm connectivity and browser/runtime support before relying on a remote page. Requires authentication with at least content_only scope. Returns id, name, duration, file (stored filename) and version (content version ID).
list_assets
Lists uploaded assets with optional filtering. When working with an organization display, pass its orgId as group_id to search the group's shared asset pool. Without group_id, only personal assets are returned. Check this before uploading to avoid duplicates. Requires authentication with at least content_only scope.
get_data_slot
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.
get_license_info
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.
set_data_slot
Creates or updates a mutable JSON data slot (max 2 MB). Display HTML reads it via the readUrl returned in the response: /data/u/{publicSlug}/{slug}.json (personal) or /data/g/{groupSlug}/{slug}.json (group). Slugs are unique per-user or per-group — two users can both use slug 'weather'. Human-readable slugs are not secret. Two slot kinds are supported: omit 'type' or pass 'value' to store the JSON content verbatim (default); pass 'type' = 'aggregate' to store a composite slot whose 'content' is a definition document of the shape { sources: [{slot,as}], onMissing, includeMeta }. The public read URL of an aggregate slot resolves and combines the source slots on every fetch, so displays only need one request to read multiple producers. Aggregate sources must live in the same scope (personal aggregate → personal sources; group aggregate → sources in the same group). Requires authentication with content scope. Note: in the dashboard UI, aggregate slots are presented to the user as 'JSON collections'. When a user asks to 'create a JSON collection' or 'combine slots', use type='aggregate'.