# InfoSlides — put content on a TV or screen (mcpb · infoslides-mcp-v1.9.0.mcpb)

Put a PowerPoint, PDF, photo, or live data on any smart TV, menu board, or lobby screen.

- Trust score: 61/100 (medium)
- Change this week: +14
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- mcpb · `infoslides-mcp-v1.9.0.mcpb`: 61/100 (this document), [markdown](https://verifymcp.io/servers/arnibj-infoslides/infoslides-mcp.md), [page](https://verifymcp.io/servers/arnibj-infoslides/infoslides-mcp)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/arnibj/InfoSlides.MCP/releases/download/v1.9.0/infoslides-mcp-v1.9.0.mcpb`
- Version: `1.9.0`
- Transport: `stdio`
- SHA-256: `f36a3060d3f9591c0facb0dfaa86d9f20dcb4e734858124596b94f683dcc1d8c`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to arnibj/InfoSlides.MCP).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 2 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 71/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 16943 tokens (~141/item across 120 items; 120 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 70/100
  - Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (97% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 14 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 121 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the InfoSlides — put content on a TV or screen MCP server?

InfoSlides — put content on a TV or screen ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, f36a3060d3f9591c0facb0dfaa86d9f20dcb4e734858124596b94f683dcc1d8c; the commands to do that are on this page. If it does not match, do not open it.

- Download bundle: `https://github.com/arnibj/InfoSlides.MCP/releases/download/v1.9.0/infoslides-mcp-v1.9.0.mcpb`
- SHA-256: `f36a3060d3f9591c0facb0dfaa86d9f20dcb4e734858124596b94f683dcc1d8c`

### Verify on macOS / Linux

```bash
echo "f36a3060d3f9591c0facb0dfaa86d9f20dcb4e734858124596b94f683dcc1d8c  infoslides-mcp-v1.9.0.mcpb" | shasum -a 256 -c
```

### Verify on Windows (PowerShell)

```powershell
(Get-FileHash -Algorithm SHA256 .\infoslides-mcp-v1.9.0.mcpb).Hash -eq "f36a3060d3f9591c0facb0dfaa86d9f20dcb4e734858124596b94f683dcc1d8c"
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 61, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-03 (score 60, +11)

- [security improvement] Provenance: fail → pass
- [security] The attested source repository moved: arnibj/InfoSlides.MCP
- [functional regression] Schema quality: 10543 → 16943
- [functional] First check of Tool coverage: 97
- [functional] Package version: 1.7.3 → 1.9.0

### 2026-11-02 (score 49, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-31 (score 48, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-29 (score 47, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 46, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 45, +1)

No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-22 (score 44, +4)

- [functional improvement] Stability: unverified → 0.23

## MCP tools (120)

### `invite_team_member` (~113 tokens)

Invite team member

Invite a person to this workspace by email. This is how the person gets in after you created the workspace with your own address: invite them as TenantAdmin (the default) so they can manage screens, billing and the team themselves. Other roles: ContentManager (edits content), DeviceManager (pairs screens), Viewer. The invitation expires in 7 days.

Input parameters:

- `email` (string, required): The person's email address.
- `role` (string|null): TenantAdmin (default), ContentManager, DeviceManager or Viewer.

### `update_template` (~177 tokens)

Update slide template

Change a layout the workspace owns: title, html, css and/or schema (the data fields, e.g. {"fields":[{"name":"sales","type":"number"}]}). Send only what should change; new html without a schema takes its fields from the {{field}} tokens. Slides already using it pick up the change, so check get_template_usage first. A built-in layout cannot be changed: copy it with clone_template and change the copy.

Input parameters:

- `css` (string|null): New stylesheet.
- `html` (string|null): New HTML with {{field}} placeholders.
- `schema` (object|null): The data fields as JSON, e.g. {"fields":[{"name":"sales","type":"number"}]}.
- `templateId` (string, required): Id of the template.
- `title` (string|null): New title.

### `test_source_config` (~112 tokens)

Test content source settings

Try a source's settings against the live service without saving anything, e.g. whether an RSS address works. Returns success and a plain-language message; a failed test is still an answer, not an error. Use before create_source. Limited to 10 calls a minute per workspace.

Input parameters:

- `adapterType` (string, required): Adapter type from list_adapters, e.g. 'RssFeed'.
- `config` (object|null): Config object as JSON, e.g. {"feedUrl":"https://..."}.

### `report_issue` (~173 tokens)

Report an issue

Tell the InfoSlides team you could not do what the person asked because of InfoSlides itself: no tool for it, an error you could not get past, or docs that led you wrong. The team reads every report. Leave out personal data. Then tell the person plainly what you could not do; do not retry the same failing call in a loop. At most 50 reports and testimonials per workspace a day.

Input parameters:

- `agent` (string|null): Your product name, e.g. 'Claude'.
- `intent` (string|null): What the person asked for, in their words.
- `problem` (string, required): What went wrong, or what you could not do.
- `request` (string|null): The call that failed, e.g. 'PATCH /v1/slides/{id}' or a tool name.

### `list_brand_previews` (~20 tokens)

List brand sample slides

List the sample slide names preview_brand can draw.

### `preview_slide` (~79 tokens)

Preview slide image

See exactly what a slide will look like on the screen, as a PNG image, before the public does. Worth doing whenever text might overflow, a logo might sit badly, or live data has just been pushed — a mistake on a lobby display is visible to every person walking past.

Input parameters:

- `slideId` (string, required): Id of the slide to render.

### `create_template` (~379 tokens)

Create slide template

Design a screen layout that fills itself in from live data, so the display stays current without anyone editing it — today's soup and price, the current exchange rate, a live sales counter, the next departure time. Requires a paid plan. Two ways to build it: describe the look in 'prompt' and give an example of the data in 'sampleJson', or hand over finished 'html' with {{field}} placeholders plus optional 'css' (leave sampleJson out: the placeholders are the fields). That shape is what every later push must match. Set dataMode='push' when the data will come from the user's own system (a queue, meters, scores): the slide then gets a push source, stays hidden until the first data arrives, and every plan includes one such live data slide, the free plan too (code mode). Design rules and a worked example: https://infoslides.app/blog/agents-guide-to-the-infoslides-galaxy. Set dryRun=true to check it without creating anything.

Input parameters:

- `css` (string|null): Optional stylesheet for the custom HTML (code mode).
- `dataMode` (string|null): 'push' when an outside system will send the data (gives the slide a push source); omit otherwise.
- `dryRun` (boolean): Check the layout without creating it.
- `html` (string|null): Finished HTML with {{field}} placeholders (code mode).
- `prompt` (string|null): Description of how the slide should look (AI mode). Requires sampleJson.
- `sampleJson` (object|null): Example of the data this slide will show, as JSON (AI mode only, with prompt). Defines the shape update_source must send.
- `title` (string, required): What this layout is for, e.g. 'Soup of the day' or 'Live sales board'.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `upload_slideshow` (~193 tokens)

Upload presentation file

Create the content that will play on a screen — the lunch menu, this week's offers, opening hours, staff notices, a welcome message for a hotel lobby. A slideshow is a deck of slides that loops on the display. Resolution defaults to 1920x1080 for a normal wall-mounted TV; use 1080x1920 for a portrait screen standing on its end, which is common for menu boards and shop windows. Slides can be added inline here or later with add_media_slide.

Input parameters:

- `height` (integer): Screen height in pixels (default 1080 — landscape TV).
- `slides` (array|null): Optional initial slides (mediaUrl and/or templateId, optional durationSeconds).
- `title` (string, required): What this content is, e.g. 'Lunch menu' or 'Reception welcome screen'.
- `width` (integer): Screen width in pixels (default 1920 — landscape TV).

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `get_device_diagnosis` (~103 tokens)

Diagnose screen issues

"Why is the lobby screen black?" Lists every cause that could explain a screen looking wrong, most likely first: offline since a time, an empty or failed slideshow, nothing scheduled, every slide hidden by its rules, expired plan, or paired elsewhere. Each cause has a sentence to read out and, where there is one, a ready-made fix request. No causes means the screen looks healthy.

Input parameters:

- `deviceId` (string, required): Id of the screen.

### `list_devices` (~220 tokens)

List screens

See every screen registered to this workspace, the shape each one is set up for and what it is playing now (nowPlayingTitle and nowPlayingSlideshowId). This is how "the front lobby screen" becomes content you can read and edit: find the screen by name, then get_slideshow with its nowPlayingSlideshowId. Also use it to find the id of a screen before assigning content to it, or to check how many of the account's allowed screens are already used. q filters by name ("lobby" finds "Lobby Screen"). For "this screen" or "the screen in front of me", pass near with the person's position: screens with a saved location (update_device) come nearest-first with distanceMeters. supportsHtml says whether the screen's app plays HTML playback.

Input parameters:

- `near` (string|null): Optional 'latitude,longitude' to sort screens nearest-first, e.g. '64.1466,-21.9426'.
- `q` (string|null): Optional name filter, case- and accent-insensitive.

Output parameters:

- `data` (array|null)
- `undo` (object)
- `warnings` (array|null)

### `leave_testimonial` (~175 tokens)

Submit testimonial

After a job went well, give your own verdict on working with InfoSlides, once per job. The team may pin it to the InfoSlides landing page, shown as a quote from '<agent>, AI agent' with the context below it as 'Job: <context>'; nothing about the workspace or the person is shown. Write it in your own words; never quote the person, and leave out personal data.

Input parameters:

- `agent` (string|null): Your product name, e.g. 'Claude'.
- `context` (string|null): The job, short and without names, e.g. 'set up a live menu board'. Shown as 'Job: ...'.
- `quote` (string, required): Your verdict, as you would want it shown, e.g. 'Had the lunch menu on the lobby TV in two calls.'

### `set_workspace_offline_alerts` (~121 tokens)

Set workspace offline alerts

"Don't email me about screens at night." Sets the quiet hours for offline alert emails (alerts wait until they end). Give quietStart and quietEnd; give neither to alert at any hour. Screens with their own quiet hours keep them. Workspace admins only.

Input parameters:

- `quietEnd` (string|null): Quiet hours end, HH:mm; before quietStart spans midnight, e.g. '07:00'.
- `quietStart` (string|null): Quiet hours start, HH:mm in the workspace time zone, e.g. '22:00'.

### `add_dynamic_slide` (~289 tokens)

Add live data slide

Add a slide that keeps itself up to date instead of showing a fixed picture — today's soup, the current queue number, live sales figures, tomorrow's weather. Needs a template first (see create_template or list_templates). With a push template the result includes sourceId, the push source to send data to with push_data, and with createPushKey=true a pushKey for the user's system (shown once); the slide stays hidden until the first data arrives. Otherwise push values with update_source. For a fetched source such as weather or an RSS feed, create the source first (create_source) and pass its id as sourceId with a template of the same type: the slide is bound to it in this one call.

Input parameters:

- `createPushKey` (boolean): For a push template: also create a push-only key for the new push source.
- `durationSeconds` (number|null): How long the slide stays on screen, in seconds.
- `position` (integer|null): Zero-based position in the loop; appended when omitted.
- `slideshowId` (string, required): Id of the slideshow to add the slide to.
- `sourceId` (string|null): A fetched source (weather, RSS feed) to bind to the slide; its type must match the template's. Omit for a push template.
- `templateId` (string, required): Id of a template (from create_template/list_templates).

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `regenerate_template_thumbnail` (~47 tokens)

Redraw template thumbnail

Redraw the gallery picture of a layout the workspace owns, for example after its look changed. Returns thumbnailPath. Rate limited.

Input parameters:

- `templateId` (string, required): Id of the template.

### `get_ai_slide_job` (~101 tokens)

Get AI slide generation job

Check an AI-designed slide job: Processing, Ready (previews to show the person), Inserted, NeedsClarification (read its question out, then start a new job with the answer in the prompt) or Failed. Jobs are kept for 24 hours. Poll at most every 5 seconds.

Input parameters:

- `jobId` (string, required): Id of the job from make_ai_slide.
- `slideshowId` (string, required): The slideshow the job belongs to.

### `list_adapters` (~64 tokens)

List content adapters

See the kinds of live content source this workspace can create (RSS feed, weather, calendar and more), with the config fields each one needs. Use before create_source, and ask the person for those settings (feed address, city, calendar link) instead of guessing them.

### `get_upload_limits` (~73 tokens)

Get upload limits

Check what an upload can be before sending one: storageUsedBytes, storageLimitBytes, storageFreeBytes, maxFileBytes (the largest upload; a file must be a little smaller) and acceptedFileTypes. Call it before a large upload, or after a quota or too-large error, instead of trying again.

### `get_platform_version` (~111 tokens)

Get InfoSlides version

Which InfoSlides release is running: version (for example v1.10.2), build (changes with every deploy), deployedAt, and releaseNotes, the published release notes of this version as title, slug and url. Remember the version; when it has changed since you last looked, tell the person an update is live and read the release notes with get_article (type release-note). An empty releaseNotes list means the notes are not written yet, so check again later instead of guessing what changed.

### `get_source_fields` (~71 tokens)

Get content source fields

List the fields a source's items have (key, label and a sample value from its latest item), to decide which template fields to fill from it. Empty until the source has fetched something: fetch_source_now asks for that.

Input parameters:

- `sourceId` (string, required): Id of the source (from list_sources).

### `identify_devices` (~118 tokens)

Identify screens visually

"Which screen is this?" Shows each online screen's own name in large text (or just the given ones) for about 90 seconds so the person can read out the name they see. The result lists each screen's deviceId and name, and says how many seconds it takes to appear (up to 60): tell the person to wait that long before looking. Try list_devices with near first; use this when several screens are in one room.

Input parameters:

- `deviceIds` (array|null): Only these screens; all online screens when omitted.

### `create_api_key` (~194 tokens)

Create API key

Issue a credential so another system or person can work with this workspace. Type 'admin' grants full access — use it sparingly. Type 'dataProvider' creates a locked-down push-only key tied to named slides that can do nothing except feed those slides new values via update_source: the right choice when a till system, CRM, or script needs to keep one number on the screen current, because a leaked key cannot read or change anything else. The full key is shown once and never again — tell the user to store it somewhere safe.

Input parameters:

- `name` (string, required): What this key is for, e.g. 'till-system-lunch-price'.
- `slideIds` (array|null): Ids of the slides a push-only key may feed. Required for dataProvider keys.
- `type` (string, required): Key type: 'admin' for full access, or 'dataProvider' for a push-only key.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `fetch_source_now` (~81 tokens)

Refresh content source now

Ask InfoSlides to fetch a source (RSS, weather, calendar) right now instead of waiting for its next scheduled fetch. The fetch runs in the background: call get_source_status after a few seconds to see the new health. Limited to 10 calls a minute per workspace.

Input parameters:

- `sourceId` (string, required): Id of the source (from list_sources).

### `get_now_slide_png` (~86 tokens)

Get current slide preview

"What's on the lobby screen?" Returns the slide the screen should be showing right now as an image, worked out from its schedule, takeovers, slide rules and slide durations. It is what should be on the screen, not a camera: an offline TV may show something else, so check get_device_status too.

Input parameters:

- `deviceId` (string, required): Id of the screen.

### `replace_slideshow_file` (~128 tokens)

Replace slideshow file

Swap the PowerPoint or PDF behind an existing slideshow for a new version, so "replace the lobby presentation with this new PowerPoint" keeps the same slideshow, the same screens and the same schedule. Photos, videos and live-data slides the slideshow already has are kept. Read it back with get_slideshow to check the pages. The screen updates once the re-render finishes (renderStatus: Completed).

Input parameters:

- `filePath` (string, required): Absolute path to the new .pptx or .pdf file on disk.
- `slideshowId` (string, required): Id of the slideshow whose file to replace.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `delete_slide` (~89 tokens)

Delete slide

Remove one slide from a slideshow for good: the Christmas slide once it is over, a wrong photo, a page nobody wants. The slides after it close up and any rule on it goes too. If the slide may come back later, hide it with update_slide instead. Confirm with the person first unless they clearly asked for it.

Input parameters:

- `slideId` (string, required): Id of the slide to remove.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `list_slideshows` (~189 tokens)

List slideshows

See everything this workspace can put on a screen, with the shape (landscape or portrait) each one is built for, whether its latest render has finished (renderStatus) and how many screens are playing it (screenCount). Use it to find the id of existing content before editing it or assigning it to a display; to go from a screen's name to its content, list_devices shows what each screen is playing. q filters by title ("q1" finds "Q1 Results 2026"). The answer has items and total: when total is more than the items returned, ask for the next page.

Input parameters:

- `page` (integer|null): Page number, from 1.
- `pageSize` (integer|null): Items per page, 1 to 100 (default 50).
- `q` (string|null): Optional title filter, case- and accent-insensitive.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `show_media_on_device` (~218 tokens)

Show photo or clip on screen

"Show this photo on the lobby screen for an hour." Puts a photo or video on a screen as a temporary takeover, then the normal schedule returns. Give filePath (a local file) or mediaUrl (a public address), not both. The screen switches once processing finishes (seconds for a photo, longer for video): poll get_show_status with the returned ids and report the percent. A photo whose shape does not match the screen gets a blurred fill, not black bars.

Input parameters:

- `caption` (string|null): Optional name for the slideshow that is created.
- `deviceId` (string, required): Id of the screen.
- `filePath` (string|null): Absolute path to a photo or video on disk.
- `mediaUrl` (string|null): Public address of a photo or video to download instead.
- `until` (string|null): How long it stays, e.g. '2026-10-01T17:00' (workspace local time) or with Z/offset; default 30 minutes from now.

### `preview_brand` (~102 tokens)

Preview brand sample slide

See a sample slide drawn from the brand guide as an image, so the person and you can check how it looks before it is confirmed. Samples: title, text, data, image, logo-light, logo-dark, ticker, clock. Shows the draft by default; source 'confirmed' shows what slides use now. Rate limited.

Input parameters:

- `sample` (string|null): Sample name (default title).
- `source` (string|null): draft (default) or confirmed.

### `add_media_slide` (~265 tokens)

Add photo or video slide

Put a picture or a video on the screen — a photo of the specials board, a poster, a promo clip, a logo. Takes either a publicly reachable URL (downloaded server-side) or the id of a file already in the media library (see upload_media); provide exactly one. The picture is shown exactly as it is and nothing checks what it says. It is also the way to add a slide the fixed layouts of add_designed_slide cannot make: design the slide as an image and add it here. If the picture's shape does not match the screen's, the call still succeeds but returns an AspectMismatch warning — fix it rather than letting content be stretched or cropped on a display the public can see.

Input parameters:

- `durationSeconds` (number|null): How long the slide stays on screen, in seconds.
- `mediaAssetId` (string|null): Id of a file already in the media library (e.g. from upload_media); omit when using mediaUrl.
- `mediaUrl` (string|null): Publicly reachable URL of the image/video; omit when using mediaAssetId.
- `position` (integer|null): Zero-based position in the loop; appended when omitted.
- `slideshowId` (string, required): Id of the slideshow to add the slide to.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `get_schedule` (~77 tokens)

Get screen schedule entries

See a screen's schedule: its default content and any timed entries (breakfast menu 6-11, lunch menu 11-15), in the workspace time zone. Say which time zone it is when you read the times out. Use the entry ids with delete_schedule_entry.

Input parameters:

- `deviceId` (string, required): Id of the screen.

### `search_stock_images` (~161 tokens)

Search stock photos

Search free stock photos (Unsplash) for a text slide background, 9 a page. Show the person thumbUrl with the photographer credit (photographerName, photographerProfileUrl, unsplashPhotoUrl) beside it: the credit must be visible whenever a photo is shown. To use one, pass the whole result as stockPhoto to add_designed_slide or in the design for update_slide_design; that is the only way to use a stock photo. Rate limited to 30 searches a minute.

Input parameters:

- `orientation` (string|null): landscape (default), portrait or squarish.
- `page` (integer|null): Page number, from 1.
- `q` (string, required): What the photo should show, e.g. 'lake at sunrise'.

### `get_brand_guide` (~95 tokens)

Get brand guide

Read the workspace's brand guide before making slides so they match the company: colours, fonts, logos, voice, picture style and layout. 'inUse' is what slides are made from, 'draft' is the working copy. If 'waitingForApproval' is true a person still has to confirm the draft on the Brand page (brandPageUrl): tell them, because slides keep using the confirmed version until then.

### `set_slide_conditions` (~315 tokens)

Set slide display conditions

Make a slide appear only at the right moment, or vanish at one, like the breakfast menu before 11, the weekend offer on Saturday and Sunday, the Christmas slide only in December, a 'target hit' message only when the number is actually hit. Types: 'time' (e.g. '08:00-11:00'), 'weekday' (e.g. 'sat,sun'), 'date' (e.g. '2026-12-01..2026-12-26'; either end may be left out), 'data_trigger' (e.g. 'sales_today > 1000000'). By default the slide is shown only while ALL the conditions hold; match='any' shows it while at least one does, and mode='hide' turns the rule around so the slide is hidden while they hold. Checked server-side as the stream renders; an empty list clears the slide's rule. get_slideshow reads every rule back; ones marked readOnly were set on the web page and are not replaced by this call. To hide a slide unconditionally use update_slide.

Input parameters:

- `conditions` (array, required): The conditions. Empty list clears them.
- `match` (string|null): "all" (default): every condition must hold. "any": one is enough.
- `mode` (string|null): "show" (default): show the slide only while the conditions hold. "hide": hide it while they hold.
- `slideId` (string, required): Id of the slide.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `delete_media` (~73 tokens)

Delete media file

Delete a file from the media library for good and free its storage. Confirm with the person first. Refused while a slide uses the file: the error lists those slides (slideId, slideshowId, slideshowTitle), so change or remove them first.

Input parameters:

- `mediaAssetId` (string, required): Id of the media file.

### `create_media_folder` (~77 tokens)

Create media folder

Create a folder in the media library, where the workspace keeps its photos and videos, such as 'Menus', at the top level or inside another folder.

Input parameters:

- `name` (string, required): Folder name, 1 to 200 characters.
- `parentFolderId` (string|null): Folder to create it in; the top level when omitted.

### `get_source_items` (~86 tokens)

Get content source items

See the latest items a source has fetched, newest first: title, body, imageUrl, url, fetchedAt and expiresAt. Use it to check what a slide on this source would show.

Input parameters:

- `limit` (integer|null): How many items, 1 to 100 (default 20).
- `sourceId` (string, required): Id of the source (from list_sources).

### `resend_verification_email` (~53 tokens)

Resend verification email

Send the owner's confirmation email again. Use this when another tool fails with EmailNotVerified — the owner has to click the link in that email before screens can be registered. Tell the user to check their spam folder.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `pair_device` (~329 tokens)

Pair a TV screen

Connect a physical TV to this workspace. The TV shows a pairing screen (the InfoSlides TV app, or https://infoslides.app/pair.html in its browser) with a QR code and a short nickname such as swift-oak-42. If the person reads you the QR code or nickname, or you see it through their glasses, send qr or nickname plus slideshowId (a new screen playing it) or deviceId (replaces the TV on an existing screen). With neither, the error is NeedsClarification with the workspace's slideshows and screens as choices: call again with the chosen id. With nothing to scan, send deviceId alone: you get a 6-character code for the person to type on the TV before it expires. For live pushed data (HTML playback), prefer the browser page: only the browser and the Android app 1.2.0+ play HTML for now.

Input parameters:

- `deviceId` (string|null): An existing screen: alone, returns a code to type on the TV; with qr/nickname, binds this TV to it.
- `deviceName` (string|null): Name for a newly created screen, e.g. 'Lobby TV'.
- `dryRun` (boolean): True to validate without pairing anything.
- `nickname` (string|null): The nickname shown under the QR code, e.g. 'swift-oak-42'.
- `qr` (string|null): The scanned QR code URL (or its bare session id).
- `slideshowId` (string|null): With qr/nickname: creates a new screen playing this slideshow.

### `update_slideshow` (~516 tokens)

Update slideshow settings

Change what is already playing on a screen: rename it, switch it between landscape and portrait, reorder the slides, turn the news ticker or the on-screen clock on or off, make every slide show for the same number of seconds, or force how it plays. Pass slideOrder as the complete list of slide ids in the sequence you want them shown. playbackMode overrides the usual rendered-video stream with a smooth HTML/CSS loop (or back again) for this one slideshow; pass "inherit" to drop the override and go back to whatever the workspace normally uses. Only what you pass changes. The screen picks the change up after a re-render: read the slideshow with get_slideshow until renderStatus is Completed before telling the person it is live.

Input parameters:

- `clockBackgroundColor` (string|null): Clock background as a hex colour, e.g. #000000 or #00000080.
- `clockEnabled` (boolean|null): true shows the on-screen clock, false hides it.
- `clockPosition` (string|null): Where the clock sits: TopLeft, TopRight, BottomLeft or BottomRight.
- `clockShowDate` (boolean|null): Whether the date shows under the time.
- `clockTextColor` (string|null): Clock text as a hex colour, e.g. #ffffff.
- `defaultDurationSeconds` (integer|null): How many seconds each slide shows unless it has its own duration, 1 to 300. "Make every slide show 15 seconds" is this.
- `height` (integer|null): New height in pixels, if changing (requires width too).
- `playbackMode` (string|null): "VideoStream" or "Html" to force how this slideshow plays; "inherit" to clear the override and fall back to the workspace default; omit to leave the current setting untouched.
- `shared` (boolean|null): Whether other slideshows in the workspace may import slides from this one.
- `slideOrder` (array|null): Complete ordered list of slide ids, if reordering.
- `slideshowId` (string, required): Id of the slideshow to update.
- `tickerEnabled` (boolean|null): true shows the news ticker along the bottom of the screen, false turns it off (and clears its sources).
- `tickerSourceIds` (array|null): Content sources whose headlines scroll in the ticker (ids from list_sources).
- `title` (string|null): New title, if changing.
- `width` (integer|null): New width in pixels, if changing (requires height too).

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `get_audit_trail` (~284 tokens)

Get audit trail

"Who changed this?" The workspace's audit trail, newest first: time, action (e.g. SlideshowDeleted), entityType, entityId, userId and details. Filter by what it is about (entityType and entityId), who (userId), action, category (User, Tenant, Slideshow, Device, Schedule, Sources, Templates, Billing, Settings, Support, TvDevice, WebClient) and a UTC from/to. action SlideshowDeleted finds the id restore_slideshow needs. Workspace admins only.

Input parameters:

- `action` (string|null): Only this action, e.g. SlideshowDeleted.
- `category` (string|null): Only this category, e.g. Device.
- `entityId` (string|null): Only events about this id.
- `entityType` (string|null): Only events about this kind of thing, e.g. Slideshow.
- `from` (string|null): From this time, UTC, e.g. 2026-10-01T00:00:00Z.
- `page` (integer|null): Page number, from 1.
- `pageSize` (integer|null): Items per page, 1 to 100 (default 25).
- `to` (string|null): Up to this time, UTC.
- `userId` (string|null): Only events by this user id.

### `get_platform_notices` (~93 tokens)

Get InfoSlides notices

Notices from the InfoSlides team that are still active, newest first (an empty list when there are none). Each has kind (SystemUpdate for an update or maintenance window, NewFeature for news), title, message, postedAt, startsAt (when the update begins, or null) and expiresAt. When a SystemUpdate notice is active, tell the person what is coming and when, using startsAt.

### `reactivate_member` (~49 tokens)

Turn on team member access

Turn a team member's access back on. Fails with EntitlementRequired when the plan's user limit is reached. Workspace admins only.

Input parameters:

- `memberId` (string, required): Id of the member.

### `delete_slideshow` (~108 tokens)

Delete slideshow

Delete a slideshow for good: the old lunch menu, a campaign that has ended, a test deck. Its schedules are removed and any screen playing it stops showing it at its next check-in. restore_slideshow can bring it back for a while, but not its schedules, so confirm with the person first unless they clearly asked for it. To take one slide out, use delete_slide or hide it with update_slide instead.

Input parameters:

- `slideshowId` (string, required): Id of the slideshow to delete.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `check_slideshow` (~109 tokens)

Check a slideshow before it goes on a screen

Check what will go wrong before a slideshow goes on a screen: no slides to show, a failed render, a live data slide with no source or a source that is off or failing, and a media file that failed to prepare. ready is false when any finding is an error; each finding has a message to read out and a fix. Advisory only. It does not look at text size, expired content or the screen's shape.

Input parameters:

- `slideshowId` (string, required): Id of the slideshow.

### `update_source_settings` (~112 tokens)

Update source configuration

Change a content source's name, config, fetch interval, or pause and resume it (ids from list_sources). To send data to a push source, use push_data instead.

Input parameters:

- `config` (object|null): New config object as JSON.
- `fetchIntervalSeconds` (integer|null): New fetch interval in seconds.
- `isEnabled` (boolean|null): False pauses fetching, true resumes it.
- `name` (string|null): New display name.
- `sourceId` (string, required): Id of the source.

### `add_designed_slide` (~629 tokens)

Add text slide

Add a slide made of words: an announcement, a notice, a welcome, "lunch moved to 1pm". This is the quickest way to put words on a screen. Give a heading, optionally some text and a call to action, and a background, either a colour, a picture already in the media library or a picture URL. A separate picture can sit beside the text, and the workspace's logo and accent colour can be added. The slide is drawn at the screen's size from fixed layouts, so the words appear exactly as written; they are not checked for accuracy. Text that is too long for the layout is refused with the field named and the number of characters that fit, rather than cut off. The layouts are fixed: for a table, columns or a look they do not have, make the slide as an image and use add_media_slide. The slide is added at once; undo_change takes it out.

Input parameters:

- `backgroundColor` (string|null): Background colour as hex, e.g. #0F172A. The workspace accent colour (a dark blue when it has none) is used when no background is given.
- `branding` (boolean|null): true adds the workspace logo and accent colour; a workspace without a logo gets nothing added.
- `cta` (string|null): A short call to action such as "Book now". Up to 55 characters fit (30 to 50 beside a picture, depending on the screen).
- `durationSeconds` (number|null): How long the slide stays on screen, in seconds, from 1 to 99; sized to the text when omitted.
- `heading` (string, required): The headline. About 60 characters fit (50 to 80 beside a picture, depending on the screen); longer text is refused with the number that fits.
- `imageMediaAssetId` (string|null): Id of an image in the media library to show beside the text; omit when using imageUrl.
- `imageUrl` (string|null): Publicly reachable URL of an image to show beside the text; omit when using imageMediaAssetId.
- `layout` (string|null): heading, heading-text, heading-text-cta, heading-image-right or heading-image-left. Chosen from the fields given when omitted.
- `mediaAssetId` (string|null): Id of an image already in the media library to use as the background.
- `mediaUrl` (string|null): Publicly reachable URL of an image to use as the background.
- `position` (integer|null): Zero-based position in the loop; appended when omitted.
- `slideshowId` (string, required): Id of the slideshow to add the slide to.
- `stockPhoto` (object|null): A stock photo background: one search_stock_images result as given (photoId, downloadLocation, fullUrl and the photographer credit fields).
- `text` (string|null): Supporting text under the headline. About 160 to 200 characters fit (175 to 275 beside a picture, depending on the screen); capitals take about 30% more room.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `preview_new_template` (~113 tokens)

Preview unsaved template

See what a template design looks like as an image before saving it with create_template. Give the layout HTML and CSS and sample data; nothing is saved. Rate limited.

Input parameters:

- `aspectRatio` (string|null): 16:9 (default), 9:16 or 1:1.
- `layoutCss` (string|null): Template CSS.
- `layoutHtml` (string, required): Template HTML; every {{field}} is a data field.
- `sampleData` (object|null): Example data as a JSON object.

### `undo_change` (~142 tokens)

Undo previous change

Undo the last change: puts back what an earlier call changed. Calls that change something return an undo field; pass its body.token here within 24 hours. A deleted slide comes back, an added slide, takeover or paired screen is removed. Not covered: deleting a slideshow (restore_slideshow brings one back), and screen settings. If the same thing was changed again since, the answer is NeedsClarification: ask the person before sending force=true, which overwrites that later change.

Input parameters:

- `force` (boolean): True to overwrite a later change; only after the person agreed.
- `token` (string, required): The token from the undo field of the earlier result.

### `upload_pptx` (~120 tokens)

Upload PowerPoint or PDF

Put an existing PowerPoint or PDF on a screen. Uploads a .pptx or .pdf from the local disk and turns it into screen content — the server reads the slide/page count and the file's own resolution and starts rendering it into a video stream. This is usually the quickest route when the user says they already have a presentation or a PDF deck.

Input parameters:

- `filePath` (string, required): Absolute path to a .pptx or .pdf file on disk.
- `title` (string|null): Display name; defaults to the file name.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `create_takeover` (~180 tokens)

Start screen takeover

Take over one or more screens for a while, e.g. a fire drill notice for 30 minutes or a launch announcement on every screen until 17:00, then return them to their schedule by themselves. Give deviceIds (one or more screens), the slideshow, and either durationMinutes or endsAt. Without an end it runs until end_takeover.

Input parameters:

- `deviceIds` (array, required): Ids of the screens to take over.
- `durationMinutes` (integer|null): How long, in minutes.
- `endsAt` (string|null): Optional end, read like startsAt.
- `slideshowId` (string, required): The slideshow to show.
- `startsAt` (string|null): Optional start, e.g. '2026-10-01T09:00' (workspace local time) or with Z/offset; default now.

### `get_device_plays` (~91 tokens)

Get screen play time

"How long did the lobby screen play, and what?" Estimated minutes per day for each slideshow the screen played. Estimated from screen heartbeats, not exact: say so when you report it.

Input parameters:

- `deviceId` (string, required): The screen.
- `from` (string, required): Start date, yyyy-MM-dd (UTC day).
- `to` (string, required): End date, yyyy-MM-dd (UTC day).

### `import_google_slides` (~189 tokens)

Import Google Slides

Make a slideshow from a Google Slides presentation. Needs a short-lived Google access token with Drive read access to that file (from a Google sign-in you run with the drive.readonly scope); it is used for this one call and never stored. Give fileId or the presentation url. Google exports at most 10 MB. Counts against the plan's slideshow limit. Without a token, ask the person to download the presentation as PDF or PowerPoint and use upload_pptx instead.

Input parameters:

- `accessToken` (string, required): Google access token with Drive read access to the file.
- `fileId` (string|null): The Google Drive file id; omit when giving url.
- `title` (string|null): Title for the slideshow; the Google file name when omitted.
- `url` (string|null): The presentation address, e.g. https://docs.google.com/presentation/d/.../edit.

### `start_ai_studio_trial` (~52 tokens)

Start AI Studio trial

Start the workspace's free AI Studio trial (7 days or 3 slides, prompt handler only). Once per workspace, so ask the person first. Calling it again while it runs returns the same trial.

### `list_sources` (~118 tokens)

List content sources

See the data sources this workspace can show on a screen: RSS news feeds, calendars, weather, live data pushed by another system. Use it to find the id of a source before scrolling its headlines in a slideshow's news ticker (update_slideshow tickerSourceIds) or pointing a live-data slide at it (update_slide sourceId). Each entry has its name, type, when it last received data and its health (Healthy, Degraded or Failing, with lastError in plain words): check it before building a slide on a source.

Output parameters:

- `data` (array|null)
- `undo` (object)
- `warnings` (array|null)

### `set_device_offline_alerts` (~142 tokens)

Set screen offline alerts

Stop or restart the "screen went offline" emails for one screen, e.g. a TV that is switched off on purpose, and optionally give it its own quiet hours. This replaces the screen's settings, so send enabled every time; without quiet hours the workspace's apply.

Input parameters:

- `deviceId` (string, required): Id of the screen.
- `enabled` (boolean, required): False stops the emails for this screen.
- `quietEnd` (string|null): Optional quiet hours end, HH:mm; before quietStart spans midnight.
- `quietStart` (string|null): Optional quiet hours start, HH:mm in the workspace time zone; give with quietEnd.

### `end_takeover` (~38 tokens)

End screen takeover

End a takeover now; the screen goes back to its schedule within about a minute.

Input parameters:

- `takeoverId` (string, required): Id of the takeover.

### `get_slide_design` (~94 tokens)

Get text slide design

Read the design behind a slide made with add_designed_slide, in the same fields that tool takes (design: heading, text, cta, the background, imageMediaAssetId, branding, layout, durationSeconds), so you can change one and send the whole design back with update_slide_design. A slide that was not made that way answers NotFound.

Input parameters:

- `slideId` (string, required): Id of the slide.

### `get_error_log` (~189 tokens)

Get error log

The workspace's error log, newest first, as a workspace admin sees it in the web app: time, level (Warning, Error, Critical), component, message, entityType, entityId and acknowledged. Use it to explain a failed render or a source that stopped. Filter by level, component, acknowledged and a UTC from/to. Workspace admins only.

Input parameters:

- `acknowledged` (boolean|null): True for acknowledged errors only, false for new ones only.
- `component` (string|null): Only errors from this component.
- `from` (string|null): From this time, UTC.
- `level` (string|null): Warning, Error or Critical.
- `page` (integer|null): Page number, from 1.
- `pageSize` (integer|null): Items per page, 1 to 100 (default 25).
- `to` (string|null): Up to this time, UTC.

### `delete_device` (~95 tokens)

Remove screen

Remove a screen from the workspace, as the Devices page does: it stops playing, no longer counts against the plan's screen limit and leaves list_devices. Its schedule and pairing are kept. Say which screen by name and get the person's yes first. The result carries an undo token that brings it back (which fails with DeviceLimitReached if the plan has filled up since).

Input parameters:

- `deviceId` (string, required): Id of the screen.

### `list_media_folders` (~55 tokens)

List media folders

List every media library folder as one flat list: id, name and parentFolderId (null at the top level). Find a folder by name here, then pass its id as folderId to list_media or update_media.

### `update_brand_guide` (~183 tokens)

Update brand guide draft

Replace the brand guide DRAFT with the whole guide given (admin only). It never changes what slides use: a person confirms it on the Brand page, so say it is waiting for their approval and give them brandPageUrl. Colours are #rrggbb; low text contrast comes back as a warning. Values are typed in, nothing is read from files. Call get_brand_guide first and send back the full guide with your changes.

Input parameters:

- `guide` (object, required): The whole guide as JSON, e.g. {"palette":{"primary":"#0a5c36","accent":"#e11d48","background":"#ffffff","text":"#111827"},"type":{"headingFontKey":"montserrat"},"voice":{"tone":"Friendly","preferredP…

### `update_schedule_entry` (~169 tokens)

Update schedule entry

Change a daily time window in place (ids from get_schedule): what it plays, its start or end (HH:mm, workspace time zone) or its priority. Send only what should change. A window that would overlap another is refused. Returns the entry with the same warnings as add_schedule_entry and an undo token. The default content has no times: change it with assign_schedule.

Input parameters:

- `deviceId` (string, required): Id of the screen.
- `endTime` (string|null): New end, HH:mm.
- `entryId` (string, required): Id of the schedule entry.
- `priority` (integer|null): New priority where windows overlap.
- `slideshowId` (string|null): The slideshow to play in the window instead.
- `startTime` (string|null): New start, HH:mm.

### `play_slideshow_find_device` (~208 tokens)

Play slideshow on screen

"Play my Q1 slides on the lobby screen" in one call. Checks that the slideshow has rendered, whether the screen is online and what it plays now, then does it. Without deviceId it picks the only screen, or the one already playing the slideshow; otherwise the error is NeedsClarification listing the screens to choose from. With until, it plays as a temporary takeover and the normal schedule returns afterwards; without it, it replaces the screen's default content. Use dryRun to tell the person what would happen first.

Input parameters:

- `deviceId` (string|null): The screen; optional when the workspace has one screen.
- `dryRun` (boolean): True to report what would happen without changing anything.
- `slideshowId` (string, required): The slideshow to play.
- `until` (string|null): Optional end time, e.g. '2026-10-01T17:00' (workspace local time) or with Z/offset. Makes it a takeover.

### `restore_slideshow` (~96 tokens)

Restore deleted slideshow

Bring back a deleted slideshow with its slides and settings. Its schedules and the screens that played it are not brought back, so assign it to a screen again. Find the id with get_audit_trail (action SlideshowDeleted, entityId). Deleted slideshows are removed for good after 90 days. Fails when the plan's slideshow limit is full.

Input parameters:

- `slideshowId` (string, required): Id of the deleted slideshow.

### `delete_media_folder` (~60 tokens)

Delete media folder

Delete an empty folder from the media library (the place photos and videos are kept). Refused while it still holds files or folders; move or delete those first. Confirm with the person first.

Input parameters:

- `folderId` (string, required): Id of the folder.

### `add_schedule_entry` (~200 tokens)

Add schedule entry

Play a slideshow on a screen during a time window every day, e.g. the breakfast menu from 06:00 to 11:00, on top of the screen's default content. Times are HH:mm in the workspace time zone: name it when you confirm. For a one-off stretch ("for two hours", "until 17:00") use create_takeover instead. Higher priority wins where windows overlap. Warnings (aspect mismatch, HTML unsupported on this screen) come back with the result: pass them on.

Input parameters:

- `deviceId` (string, required): Id of the screen.
- `endTime` (string, required): End time, HH:mm, e.g. '11:00'.
- `priority` (integer): Priority where windows overlap (default 0).
- `slideshowId` (string, required): The slideshow to play in the window.
- `startTime` (string, required): Start time, HH:mm, e.g. '06:00'.

### `update_slide_design` (~160 tokens)

Update text slide design

Change a slide made with add_designed_slide, such as new wording or another background. Send the whole design: read it with get_slide_design, change what you need and send all of it back, since a field left out is not kept. The slide is drawn again in place and keeps its position, hidden state and visibility rules. The same length and colour checks apply as when adding it. The result carries an undo token that puts the old design back.

Input parameters:

- `design` (object, required): The whole design as JSON, the design object from get_slide_design with your changes, e.g. {"heading":"Lunch moved to 1pm","backgroundColor":"#0F172A"}.
- `slideId` (string, required): Id of the slide.

### `list_media` (~183 tokens)

List media library

Browse the workspace's media library, newest first: id, name, fileType (image, video, document), sizeBytes, width, height, folderId, shared (a file another workspace shares, which cannot be changed here), sharedWithOthers and createdAt. Filter by folder, type or name; the answer also has total, totalPages and storage used and allowed. Use an id as mediaAssetId on add_media_slide.

Input parameters:

- `folderId` (string|null): Only files in this folder (ids from list_media_folders).
- `name` (string|null): Only files whose name contains this, any case.
- `page` (integer|null): Page number, from 1.
- `pageSize` (integer|null): Items per page, 1 to 100 (default 50).
- `type` (string|null): image, video or document.

### `add_weather_alert_timeline` (~197 tokens)

Add weather alert timeline

Add a weather alert timeline to a slideshow: 8 live data slides, one per 6 hours over the next 48 hours, each showing the weather alerts for its step and hiding itself when there are none. Needs a Weather alert source (list_sources, adapter WeatherAlert) and a plan with live data slides. Returns the 8 slides and an undo token that removes them all.

Input parameters:

- `durationSeconds` (integer|null): Seconds per slide (default 10).
- `hideWhenEmpty` (boolean|null): Whether the first slide hides itself when it has no alerts (the later ones always do).
- `position` (integer|null): Zero-based position of the first slide; appended when omitted.
- `slideshowId` (string, required): Id of the slideshow.
- `sourceId` (string, required): Id of a WeatherAlert source.
- `templateId` (string|null): A weather alert timeline template; found for you when omitted.

### `get_media` (~74 tokens)

Get media file status

Check whether an uploaded file is ready to use: processingStatus (Ready, Queued, Processing or Failed), progressPercent while a video is being prepared, and error when it failed. Images and documents are always Ready. Poll at most every 5 seconds.

Input parameters:

- `mediaAssetId` (string, required): Id of the media file.

### `check_brand` (~94 tokens)

Check slideshow against brand guide

Check whether a slideshow follows the confirmed brand guide: colours outside the palette, text that is hard to read, a missing logo, banned phrases and fonts that are not the guide's, slide by slide. Advisory only, nothing is blocked. Covers designed and dynamic slides, not slides inside an uploaded presentation. If hasConfirmedGuide is false there is nothing to check against.

Input parameters:

- `slideshowId` (string, required): Id of the slideshow.

### `assign_schedule` (~126 tokens)

Set screen schedule

Tell a screen what to play. Connects slideshows to a registered display, in the order given, as a continuous loop. The call succeeds even when the content's shape does not match the screen's, but returns an AspectMismatch warning — act on it, because it means the content will be stretched or cropped on a display people can see. Follow with get_stream_link to get the URL to open on the TV.

Input parameters:

- `deviceId` (string, required): Id of the device.
- `slideshowIds` (array, required): Ids of the slideshows to play, in order.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `revoke_team_invitation` (~38 tokens)

Revoke team invitation

Cancel a pending invitation (ids from list_team) so its link stops working.

Input parameters:

- `invitationId` (string, required): Id of the invitation.

### `get_tenant_info` (~80 tokens)

Get workspace info

Check what this account is allowed to do before planning any screen work: workspace name, owner, whether their email is confirmed, which plan they are on, how many screens are in use out of the allowance, and the scope of the API key in use. Call this early — designing around the limits beats discovering them through errors halfway through a setup.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `list_shared_slideshows` (~80 tokens)

List shared slideshows

List the workspace's shared slideshows with id, title, slideCount and importableSlideNumbers (the pages that can be copied), to pick a page for import_slide. excludeId leaves one out, usually the slideshow that will receive the page.

Input parameters:

- `excludeId` (string|null): A slideshow to leave out of the list.

### `list_team` (~30 tokens)

List team members

See who is in this workspace (members and their roles) and which invitations are still waiting to be accepted.

### `upgrade_subscription` (~249 tokens)

Upgrade subscription

Get the checkout link when the plan runs out: a second screen is needed, or the user wants self-updating slides fed by live data. Reach for this after a DeviceLimitReached or EntitlementRequired error rather than telling the user the thing cannot be done. Ask monthly or annual first and pass plan and billingPeriod: the result is then a Paddle checkout (/checkout?_ptxn=...) with its price, which needs no InfoSlides sign-in and pays for this workspace only. Without billingPeriod the link opens the plans page. Paying needs the person's clear yes to this plan at this price. Before they commit, tell them the price from the result, that it renews every month or year until cancelled, that they can cancel at any time and keep the plan until the period ends, and link https://infoslides.app/refund-policy. Then hand them the link, or open it and pay once they have said yes. A workspace that already pays gets its billing page, which needs a signed-in admin. The plan unlocks by itself once payment goes through.

Input parameters:

- `billingPeriod` (string|null): monthly or annual.
- `plan` (string|null): Starter, Professional or Business.

### `create_tenant` (~374 tokens)

Create workspace

Start here when someone wants content on a TV or screen but has no InfoSlides account yet — a café putting its menu on a screen, a hotel with a lobby display, a school noticeboard, a shop window. Sets up their workspace and returns the Primary Admin API Key used by every later call. This is the only tool that needs no credentials. The new account lands on the permanent free plan: 1 screen, 4 slideshows, no credit card, nothing expires. Before creating it, give the person the Terms of Service (https://infoslides.app/terms) and Privacy Policy (https://infoslides.app/privacy) links. ownerEmail must be an address you can open right now, never an invented one: your own is recommended, so you can verify it at once and then add the person with invite_team_member. Adding a screen fails with EmailNotVerified until the address is verified. Pass ownerName (the person's first name) only when you already know it or it is free to ask; never invent one. It is what emails greet them with.

Input parameters:

- `locale` (string|null): Optional locale for number and date formats, e.g. 'en-GB'.
- `ownerEmail` (string, required): Email address of the owner. Receives the verification email and the sign-in details.
- `ownerName` (string|null): Optional name of the person who owns the workspace (first name is fine, at most 100 characters). Without it emails greet the workspace name.
- `tenantName` (string, required): Name of the workspace — usually the company, venue, or shop name, e.g. 'Acme Cafe'.
- `timeZone` (string|null): Optional IANA time zone, e.g. 'Europe/London'; decides when schedules switch and what clocks show.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `search_articles` (~229 tokens)

Search InfoSlides help and news

Search the InfoSlides help articles, blog posts and release notes. Search here before telling the person something cannot be done. Also finds news since a date (since) or the notes of one release (releaseVersion). Each item has type, title, slug, url (the public page), publishedAt, releaseVersion, appRoute (the page in the InfoSlides web app the article is about) and a short excerpt. Read a whole article with get_article.

Input parameters:

- `page` (integer|null): Page number, from 1.
- `pageSize` (integer|null): Items per page, 1 to 100 (default 25).
- `q` (string|null): Free text, e.g. 'portrait screen'. Best match first; without it, newest first.
- `releaseVersion` (string|null): Only the release notes of this version, e.g. v1.10.2.
- `since` (string|null): Only articles published on or after this date, yyyy-MM-dd.
- `type` (string|null): help, blog or release-note; all three when omitted.

### `rename_media_folder` (~53 tokens)

Rename media folder

Rename a folder in the media library (the place photos and videos are kept).

Input parameters:

- `folderId` (string, required): Id of the folder.
- `name` (string, required): New name, 1 to 200 characters.

### `list_takeovers` (~87 tokens)

List screen takeovers

See which screens are showing a notice or announcement that interrupts their normal schedule for a while (a fire drill message, a launch announcement, an evacuation map), now or planned, and until when. Filter by screen, or only the active ones.

Input parameters:

- `activeOnly` (boolean): Only takeovers active right now.
- `deviceId` (string|null): Only this screen's takeovers.

### `update_device` (~180 tokens)

Update screen details

Rename a screen, change its resolution (use 1080x1920 for a screen turned on its end), or save where it is so "this screen" can be found later with list_devices near the person's position (do that once, right after pairing). Send only what should change.

Input parameters:

- `deviceId` (string, required): Id of the screen.
- `height` (integer|null): New height in pixels; give with width.
- `latitude` (number|null): Latitude in degrees; give with longitude.
- `locationName` (string|null): Optional label for the location, e.g. 'Front lobby entrance'.
- `longitude` (number|null): Longitude in degrees; give with latitude.
- `name` (string|null): New name, e.g. 'Lobby TV'.
- `width` (integer|null): New width in pixels; give with height.

### `list_api_keys` (~72 tokens)

List API keys

Audit who and what can reach this workspace: every key with its scope, when it was created, and when it was last used. Only the opening characters of each key are shown, never the whole thing. Use it to spot unused keys worth revoking, or to find the id of a key to revoke.

Output parameters:

- `data` (array|null)
- `undo` (object)
- `warnings` (array|null)

### `get_billing` (~139 tokens)

Get billing summary

Which plan the workspace is on and when it renews. Returns the plan with its prices, the status (free, active, cancelling, paused, past_due, cancelled or suspended), renewsAt (empty when the plan does not renew or the date could not be read), endsAt when a cancellation is already scheduled, and what is used against each limit: slideshows, devices, users and storageMb, each as used and limit. invoicesUrl points a person at their invoices. Read-only and without card data; changing the plan, pausing or cancelling is done by the person in the web app. Needs a workspace admin key.

### `list_template_categories` (~38 tokens)

List template categories

List the template category names this workspace may use, such as News or Generic: the same set that decides which built-in layouts list_templates shows.

### `push_data` (~154 tokens)

Push live data

Send new data to a push source: the whole set of values the slide shows, as one JSON object with the template's field names. Every slide on the source updates, and a slide that was hidden waiting for data appears. Returns receivedAt. A push-only (isk_dp_) key bound to the source can call this, so hand that key to the system that sends the data. Set dryRun=true to check the data without storing it.

Input parameters:

- `data` (object, required): The values, as a JSON object with the template's field names.
- `dryRun` (boolean): Check the data without storing it.
- `sourceId` (string, required): Id of the push source (the sourceId returned by add_dynamic_slide).

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `insert_ai_slides` (~88 tokens)

Insert generated AI slides

Add the previews of a Ready AI slide job to the slideshow, after the person approved them. Safe to repeat: it does not add them twice. Queues a re-render.

Input parameters:

- `jobId` (string, required): Id of the Ready job.
- `position` (integer|null): Zero-based position; appended when omitted.
- `slideshowId` (string, required): The slideshow the job belongs to.

### `get_source_status` (~129 tokens)

Get content source status

Check a source. For a push source: when data last arrived (lastReceivedAt), whether its slides are showing data (isShowingData, false before the first push or after the data went stale), the staleness timeout, and which slides it feeds; use it to confirm a system is actually sending. For a fetched source (RSS, weather, etc.): lastFetchedAt and health (Healthy, Degraded or Failing) with lastError in plain words, consecutiveFailures and lastSuccessAt, with the push fields empty.

Input parameters:

- `sourceId` (string, required): Id of the source.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `revoke_api_key` (~76 tokens)

Revoke API key

Cut off a credential immediately — a leaked key, a system being decommissioned, someone who has left. Takes effect at once and cannot be undone; anything still using that key stops working, so confirm with the user before revoking.

Input parameters:

- `keyId` (string, required): Id of the key to revoke (from list_api_keys).

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `get_device_status` (~77 tokens)

Get screen status

Find out whether a screen is actually on and what it is showing right now — is the TV live, when did it last check in, which content is playing. This is the tool to reach for when someone says the screen is blank, frozen, or showing the wrong thing.

Input parameters:

- `deviceId` (string, required): Id of the device.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `delete_template` (~64 tokens)

Delete slide template

Delete a layout the workspace owns, for good. Confirm with the person first. Refused while a slide uses it: the error lists those slides, so change or remove them first. Built-in layouts cannot be deleted.

Input parameters:

- `templateId` (string, required): Id of the template.

### `create_broadcast_device` (~115 tokens)

Create broadcast channel

Create a broadcast channel: one stream that plays a slideshow on any number of screens or in a browser, with no pairing. Optionally give the slideshow it plays. Its watch link comes from get_stream_link. Needs a plan with broadcast channels and counts against the screen limit; the error carries an upgrade link otherwise.

Input parameters:

- `name` (string, required): Name of the channel, e.g. 'Lobby channel'.
- `slideshowId` (string|null): The slideshow it plays; set later with play_slideshow_find_device when omitted.

### `list_templates` (~54 tokens)

List slide templates

See the self-updating screen layouts available to this workspace, each with an example of the data it expects. Check that example before pushing values with update_source, and use this to find a ready-made layout instead of building one.

Output parameters:

- `data` (array|null)
- `undo` (object)
- `warnings` (array|null)

### `get_stream_link` (~178 tokens)

Get screen player link

Get the link that makes the content appear on the TV — the last step of any setup. Hand over playerUrl: opened in the smart TV's browser or the InfoSlides TV app, it plays the content correctly whichever way this screen is set up to play — the usual rendered-video stream or a live HTML/CSS loop. hlsUrl is the raw HLS manifest for something that only speaks HLS (an ffplay-style player, an old TV app build); it comes back null whenever the screen is playing an HTML loop, so check it before handing it out — do not assume it is always populated. The links are stable, so the screen keeps working as content changes. A StreamNotReady warning means nothing is playable yet — usually because the content is still rendering.

Input parameters:

- `deviceId` (string, required): Id of the device.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `get_show_status` (~97 tokens)

Get show progress

Check a photo or video sent with show_media_on_device: one combined percent for the video processing and the slideshow render, and status Processing, Ready or Failed. Poll at most every 5 seconds.

Input parameters:

- `deviceId` (string, required): Id of the screen.
- `mediaAssetId` (string, required): mediaAssetId from the show_media_on_device result.
- `slideshowId` (string, required): slideshowId from the show_media_on_device result.

### `import_slide` (~119 tokens)

Copy slide from shared slideshow

Copy one page of a shared slideshow to the end of this slideshow. Both must come from a PowerPoint or PDF file; slideNumber must be one of the source's importableSlideNumbers from list_shared_slideshows. The copy does not change when the source does. There is no undo: remove the page with delete_slide.

Input parameters:

- `slideNumber` (integer, required): The page number to copy.
- `slideshowId` (string, required): The slideshow that receives the page.
- `sourceSlideshowId` (string, required): The shared slideshow to copy from.

### `remove_team_member` (~39 tokens)

Remove team member

Remove a person from this workspace (ids from list_team). Confirm with the person first.

Input parameters:

- `memberId` (string, required): Id of the member.

### `get_slideshow_plays` (~109 tokens)

Get slideshow play time

"Where did the Q1 slideshow run last week?" Estimated minutes per day on each screen that played the slideshow, with a total and an approximate loop count. Estimated from screen heartbeats, not exact, and there are no per-slide counts: say so when you report it.

Input parameters:

- `from` (string, required): Start date, yyyy-MM-dd (UTC day).
- `slideshowId` (string, required): The slideshow.
- `to` (string, required): End date, yyyy-MM-dd (UTC day).

### `get_slideshow` (~135 tokens)

Get slideshow details

Look inside one piece of screen content: every slide (its type, whether it is hidden, how long it is shown, a thumbnailUrl, and every rule about when it appears), the order they play in, the ticker, clock and default duration, which screens are playing it (screens, each with a playerUrl to hand to the person) and renderStatus. Use this before editing so you know what is already there, and again after an edit: the change is on the screen once renderStatus is Completed. To look at a slide, call preview_slide.

Input parameters:

- `slideshowId` (string, required): Id of the slideshow.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `upload_media` (~104 tokens)

Upload media file

Send a picture or video from the user's own computer to their workspace — a photo of the specials board, a poster, a logo, a promo clip. Use this when the file is local and has no public web address. Returns an asset id; pass it to add_media_slide as mediaAssetId to put it on the screen. For a large file, check get_upload_limits first.

Input parameters:

- `filePath` (string, required): Absolute path to the image or video file on disk.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `create_source_key` (~155 tokens)

Create source API key

Create a push-only key for a push source, to give to the system that sends its data. The key can push to this one source and do nothing else. It is returned once: show it to the user or store it where the system can read it, because it cannot be shown again. The answer also has quickUpdateUrl, a phone page with large buttons and no login where a person updates the board by hand: give that link to the person when nobody has a system to send the data. Revoking the key ends the link.

Input parameters:

- `name` (string|null): A label for the key, e.g. the system that will use it.
- `sourceId` (string, required): Id of the push source.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `get_article` (~77 tokens)

Read InfoSlides article

Read one InfoSlides help article, blog post or release note as Markdown, with the same fields as a search result. Pass on what matters to the person in your own words and link the url.

Input parameters:

- `slug` (string, required): The slug from search_articles or get_platform_version.
- `type` (string, required): help, blog or release-note.

### `create_source` (~322 tokens)

Create content source

Create a content source InfoSlides fetches by itself, e.g. a news RSS feed for the ticker or a weather forecast for a slide. adapterType and the config fields come from list_adapters. For weather, config needs the place location: the latitude and longitude of the town or city the forecast is for, not where the person is. locationName is the place name shown on the slide. InfoSlides does not look up place names, so use the coordinates you know for the named place, ask which one when the name could be several places, and always set locationName. Weather comes as CurrentWeather (conditions now) or WeatherForecast (a 3-day outlook in six 12-hour slots); ask which one the person wants when their words leave it open. To put it on a slideshow, add_dynamic_slide with this source's id as sourceId. For data your own system sends, use a push template instead (create_template with dataMode push, then add_dynamic_slide). Secrets in config (API keys, tokens) are write-only: they are never returned. Plans without live sources return EntitlementRequired with an upgrade link.

Input parameters:

- `adapterType` (string, required): Adapter type from list_adapters, e.g. 'RssFeed'.
- `config` (object|null): Config object as JSON, e.g. {"feedUrl":"https://..."}.
- `fetchIntervalSeconds` (integer|null): Fetch interval in seconds (default 3600).
- `name` (string, required): Display name, e.g. 'RÚV news'.

### `delete_schedule_entry` (~61 tokens)

Delete schedule entry

Remove one timed entry from a screen's schedule (ids from get_schedule). The screen falls back to its default content in that window.

Input parameters:

- `deviceId` (string, required): Id of the screen.
- `entryId` (string, required): Id of the schedule entry.

### `deactivate_member` (~63 tokens)

Turn off team member access

Turn off a team member's access without removing them (ids from list_team); reactivate_member turns it back on. Confirm with the person first. The last active admin cannot be turned off. Workspace admins only.

Input parameters:

- `memberId` (string, required): Id of the member.

### `upload_brand_logo` (~101 tokens)

Upload brand logo

Put a logo image from the user's computer (up to 5 MB) into the brand guide draft, for light backgrounds (slot light), dark backgrounds (dark) or as a small square mark (icon). Returns the brand guide. A person still confirms the draft on the Brand page. Workspace admins only.

Input parameters:

- `filePath` (string, required): Absolute path to the logo image on disk.
- `slot` (string): light (default), dark or icon.

### `update_source` (~181 tokens)

Update live slide data

Put fresh information on the screen: send today's menu, the new price, the current total, the updated opening hours. The display re-renders itself server-side — nobody has to touch the TV. The data must match the shape the template's example defines (see list_templates). For a slide on a push source the data goes to that source, exactly as push_data would send it. A restricted push-only (isk_dp_) key bound to the slide can call this, which is how an external system safely feeds one slide. Set dryRun=true to check the data without changing what is on screen.

Input parameters:

- `data` (object, required): The new values, as a JSON object matching the template's example data.
- `dryRun` (boolean): Check the data without changing what is on screen.
- `slideId` (string, required): Id of the slide to update.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `get_template` (~62 tokens)

Get slide template

Read one self-updating layout: title, sampleJson (its data fields with example values, the shape a push to its source must send), html and css. Read it before changing it with update_template.

Input parameters:

- `templateId` (string, required): Id of the template.

### `update_tenant` (~109 tokens)

Update workspace settings

Set the workspace time zone and/or locale. The time zone decides when schedules switch, what TV clocks show and when time-based slide conditions apply; set it early for a workspace outside Iceland. The locale sets number and date formats in rendered slides (changing it re-renders them).

Input parameters:

- `locale` (string|null): Locale, e.g. 'en-GB' or 'is-IS'.
- `timeZone` (string|null): IANA time zone, e.g. 'Europe/London'.

### `clone_slideshow` (~114 tokens)

Clone slideshow

Copy an existing deck so it can be customised without touching the original — or, with fromGallery=true, start from a ready-made professional design instead of a blank screen. Cloning from the gallery is the fastest way to get something presentable on a TV; call list_gallery first to see what is available.

Input parameters:

- `fromGallery` (boolean): Clone a ready-made gallery design instead of the workspace's own slideshow.
- `sourceId` (string, required): Id of the source slideshow, or gallery item id when fromGallery=true.

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `get_offline_alerts` (~60 tokens)

Get offline alert settings

"When do I get emails about screens going offline?" Shows the workspace's quiet hours and, per screen, whether alerts are on, its own quiet hours and whether it follows its schedule. At most one alert per screen per day is sent.

### `get_template_usage` (~58 tokens)

Get slide template usage

Where a layout is used in this workspace: slideCount, slideshowCount and the slides (slideId, slideshowId, slideshowTitle). Check it before deleting or reworking a layout.

Input parameters:

- `templateId` (string, required): Id of the template.

### `update_slide` (~383 tokens)

Update slide properties

Change one slide that is already in a slideshow: make it stay on screen longer or shorter (durationSeconds, 1 to 300), or hide it and bring it back (hidden), like "hide the Christmas slide", "show the offer for 20 seconds". For a live-data slide it can also change what it shows: switch to another template (templateId) or content source (sourceId), change the value on it (overrideData, e.g. {"price":"1.990 kr"}; only the fields you send change, and null removes one), or set its countdown. Text inside an uploaded PowerPoint page cannot be edited this way: say so, and offer to replace the file with replace_slideshow_file. Only what you pass changes. To take the slide out for good use delete_slide.

Input parameters:

- `countdown` (array|null): Dynamic slides only: an array of countdown objects; [] clears the countdowns.
- `durationSeconds` (number|null): How long the slide stays on screen, in seconds (1 to 300).
- `fieldMapping` (object|null): Dynamic slides only: template field to source path mapping, replacing the current one. Generated automatically when the template or source changes and this is left out.
- `hidden` (boolean|null): true hides the slide from playback, false shows it again.
- `overrideData` (object|null): Dynamic slides only: values to change on the slide, as a JSON object with the template's field names. Merged into the current values; a null value removes a field.
- `slideId` (string, required): Id of the slide.
- `sourceId` (string|null): Dynamic slides only: id of the content source to take data from (from list_sources).
- `templateId` (string|null): Dynamic slides only: id of the template to switch to (from list_templates).

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `clone_template` (~70 tokens)

Copy slide template

Copy a layout, usually a built-in one from list_templates, into the workspace as '<title> (Copy)', so it can be changed with update_template. Needs a plan with live data slides; the error carries an upgrade link otherwise.

Input parameters:

- `templateId` (string, required): Id of the template to copy.

### `list_gallery` (~55 tokens)

List gallery templates

Browse ready-made screen designs — menu boards, welcome screens, notice layouts — that can be copied into the workspace with clone_slideshow(fromGallery=true). Start here when the user wants something on a screen quickly and has no content prepared.

Output parameters:

- `data` (array|null)
- `undo` (object)
- `warnings` (array|null)

### `update_media` (~166 tokens)

Rename, move or share media file

Rename a file in the media library, move it to a folder, or share it with other workspaces. Send only what should change. folderId moves it (moveToRoot puts it back at the top level); shared true lets other workspaces use it, false stops that. Only the workspace's own files can be changed.

Input parameters:

- `folderId` (string|null): Folder to move it to (ids from list_media_folders).
- `mediaAssetId` (string, required): Id of the media file.
- `moveToRoot` (boolean): True to move it out of its folder to the top level.
- `name` (string|null): New name, up to 200 characters.
- `shared` (boolean|null): True shares it with other workspaces, false stops sharing.

### `get_workspace_health` (~104 tokens)

Get workspace health

"How are my screens?" in one call: a sentence to read out ("11 of 12 screens are online; Lobby has been offline since 09:12."), every screen with online and lastSeenAt, usage against the plan, and problems most urgent first (offline screens, failed renders, slideshows no screen plays, expired plan, limits near full), each with a code, a message and a ready-made fix. Empty problems means all is well.

### `create_device` (~194 tokens)

Register screen

Register the physical screen the content will play on — the TV in reception, the menu board above the counter, the noticeboard in the corridor, the display in the waiting room, the monitor in the shop window (Icelandic: upplýsingaskjár, skjár). Do this once per screen. Free accounts allow exactly 1 active screen; a DeviceLimitReached error comes with an upgrade link. Resolution defaults to 1920x1080 for a normal wall-mounted TV — use 1080x1920 for a screen turned on its end, which is common for menu boards and window displays.

Input parameters:

- `height` (integer): Screen height in pixels (default 1080 — landscape).
- `name` (string, required): What this screen is and where it is, e.g. 'Lobby screen' or 'Menu board — counter'.
- `width` (integer): Screen width in pixels (default 1920 — landscape).

Output parameters:

- `data` (object|null)
- `undo` (object)
- `warnings` (array|null)

### `make_ai_slide` (~344 tokens)

Generate slide with AI

AI Studio: design a slide in the workspace's style from a description (handler prompt: headline, details, prices, times), a photo of a poster, menu or whiteboard (photo: mediaAssetId from upload_media, or mediaUrl), a web page (url) or a PDF/Word file (document: mediaAssetId). Returns a job at once: poll get_ai_slide_job every 5 seconds (10 to 60 seconds). By default it stops at Ready with preview images: show them to the person, then insert_ai_slides. To show a photo as it is, use add_media_slide instead. EntitlementRequired comes with an upgrade link; trialAvailable in its details means start_ai_studio_trial is possible: ask the person first.

Input parameters:

- `background` (string|null): auto, none (plain colour) or photo (stock photo).
- `backgroundDescription` (string|null): With background photo: what the photo should show.
- `branding` (boolean|null): True to feature logo and brand colour, false to keep branding subtle; omit to let the prompt decide.
- `handler` (string, required): prompt, photo, url or document.
- `insert` (boolean): True to add the slides straight away without a preview step.
- `mediaAssetId` (string|null): Uploaded media id (photo, document, or a background image for prompt).
- `mediaUrl` (string|null): Public address of a photo.
- `prompt` (string|null): What the slide should say (handler prompt).
- `slideshowId` (string, required): The slideshow to add the slides to.
- `url` (string|null): Page address (handler url).

### `delete_source` (~41 tokens)

Delete content source

Delete a content source. Slides and tickers fed by it stop updating. Confirm with the person first.

Input parameters:

- `sourceId` (string, required): Id of the source.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/arnibj-infoslides/infoslides-mcp#diagnostics

## Score history

- 2026-11-05: 61
- 2026-11-04: 60
- 2026-11-03: 60
- 2026-11-02: 49
- 2026-11-01: 48
- 2026-10-31: 48
- 2026-10-30: 47
- 2026-10-29: 47
- 2026-10-28: 46
- 2026-10-27: 46
- 2026-10-26: 46
- 2026-10-25: 45
- 2026-10-24: 45
- 2026-10-23: 44
- 2026-10-22: 44
- 2026-10-21: 40
- 2026-10-20: 40
- 2026-10-19: 40
- 2026-10-18: 40
- 2026-10-17: 40
- 2026-10-16: 40
- 2026-10-15: 40
- 2026-10-14: 10
- 2026-10-13: 10
- 2026-10-12: 10
- 2026-10-10: 10
- 2026-10-09: 10
- 2026-10-07: 10

## Common questions

### What is the InfoSlides — put content on a TV or screen MCP server?

InfoSlides — put content on a TV or screen is an MCP server listed in the public MCP registry as io.github.arnibj/infoslides. Put a PowerPoint, PDF, photo, or live data on any smart TV, menu board, or lobby screen. This page covers its MCPB bundle (https://github.com/arnibj/InfoSlides.MCP/releases/download/v1.9.0/infoslides-mcp-v1.9.0.mcpb).

### Is the InfoSlides — put content on a TV or screen MCP server safe to use?

InfoSlides — put content on a TV or screen scores 61 out of 100 on VerifyMCP. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the InfoSlides — put content on a TV or screen MCP server expose?

InfoSlides — put content on a TV or screen exposes 120 tools: invite_team_member, update_template, test_source_config, report_issue, list_brand_previews, and 115 more. Their descriptions and schemas cost roughly 16,532 tokens of context every time the server is loaded.

### What licence is the InfoSlides — put content on a TV or screen MCP server under?

InfoSlides — put content on a TV or screen declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- Repository: https://github.com/arnibj/InfoSlides.MCP
- Website: https://infoslides.app/
- Changelog RSS feed: https://verifymcp.io/servers/arnibj-infoslides/infoslides-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/arnibj-infoslides/infoslides-mcp.json
- HTML version of this page: https://verifymcp.io/servers/arnibj-infoslides/infoslides-mcp
