Skip to main content
Glama

AbleSign MCP

A Python Model Context Protocol server for the AbleSign digital signage API.

The purpose of this project is simple: let AI agents operate AbleSign digital signage without making them speak REST by hand. It was fully vibe coded. There is no claim that this is sacred architecture or precious artisanal software. The agents do not care; they just have to do their jobs with it.

It exposes all 44 documented API operations as MCP tools:

  • screens and screen playlists

  • screen groups, membership, and group playlists

  • media folders and media files

  • AbleSign's initiate/finish upload and replacement flows

  • web apps

  • workspaces and workspace users

Requirements

  • Nix, or Python 3.11+ when installing with uv

  • an AbleSign API key, created in AbleSign CMS → Account → API Keys

Related MCP server: CustomGPT MCP Server

Install and run

Install the ablesign-mcp binary from the flake:

nix profile install github:MartinLoeper/ablesign-mcp
ABLESIGN_API_KEY=ak_your_key ablesign-mcp

You can also run it directly without installing it:

ABLESIGN_API_KEY=ak_your_key \
  nix run github:MartinLoeper/ablesign-mcp

To install or run the current checkout instead, replace github:MartinLoeper/ablesign-mcp with ..

Using uv for a source checkout:

cp .env.example .env
# Set ABLESIGN_API_KEY in .env, then export it or use your preferred env loader.
uv sync
ABLESIGN_API_KEY=ak_your_key uv run ablesign-mcp

The default transport is stdio. To run a Streamable HTTP server:

ABLESIGN_API_KEY=ak_your_key \
  ablesign-mcp --transport streamable-http

Clients then connect to http://127.0.0.1:8000/mcp.

MCP client configuration

For a stdio MCP client, use:

{
  "mcpServers": {
    "ablesign": {
      "command": "ablesign-mcp",
      "env": {
        "ABLESIGN_API_KEY": "ak_your_key",
        "ABLESIGN_WORKSPACE_ID": "123"
      }
    }
  }
}

ABLESIGN_WORKSPACE_ID is optional. Without it, AbleSign uses the account's default workspace.

Environment

Variable

Required

Default

Purpose

ABLESIGN_API_KEY

yes

—

Bearer token used for every API request

ABLESIGN_WORKSPACE_ID

no

account default

Sent as Workspace-Id

ABLESIGN_BASE_URL

no

https://api.ablesign.tv/api/v1

API base URL

ABLESIGN_TIMEOUT

no

30

request timeout in seconds

ABLESIGN_MCP_TRANSPORT

no

stdio

stdio, streamable-http, or sse

ABLESIGN_MCP_HOST

no

127.0.0.1

HTTP bind host

ABLESIGN_MCP_PORT

no

8000

HTTP bind port

Media uploads

AbleSign uses a three-step upload flow:

  1. Call initiate_media_upload (or initiate_media_replacement).

  2. Upload the raw file bytes with HTTP PUT to the returned signed URL.

  3. Call complete_media_upload (or complete_media_replacement) with the returned upload ID.

The MCP server exposes the authenticated AbleSign steps. Uploading bytes to the temporary signed storage URL is intentionally left to the caller so the server does not receive arbitrary local filesystem access.

Development

nix build
nix run . -- --help

uv sync --extra dev
uv run pytest
uv run ruff check .
uv run ruff format --check .

The API is currently marked beta by AbleSign. The server returns AbleSign errors with their HTTP status, error code, and message so callers can react to validation and rate-limit failures.

Philosophy and license

This project is released under the MIT License. Do whatever you would like with it. Use it, fork it, break it, fix it, sell it, or rewrite it 1,000 times. I really do not care. My agents do not care either. They just have to do their job with it and make gastronomy great again. lol

Available Tools

44 tools
add_screen_group_playlist_itemsC

Add 1-50 items to a screen group playlist.

Inputs: items (required), group_id (required), position. Returns: object

add_screen_playlist_itemsB

Add 1-50 media-file or web-app items to a screen playlist.

Inputs: items (required), screen_id (required), position. Returns: object

complete_media_replacementC

Finish a replacement after bytes have been PUT to the signed upload URL.

Inputs: upload_id (required). Returns: object

complete_media_uploadA

Finish an upload after bytes have been PUT to the signed upload URL.

Inputs: upload_id (required). Returns: object

create_folderC

Create a media folder, optionally under a parent.

Inputs: title (required), parent_folder_id. Returns: object

create_screen_groupC

Create a screen group.

Inputs: title (required), description. Returns: object

create_web_appB

Create a web app from either a URL or raw HTML.

Inputs: title (required), url, html, description. Returns: object

create_workspaceB

Create a workspace. Color, when supplied, is a #RRGGBB value.

Inputs: title (required), color, description. Returns: object

delete_folderB

Permanently delete a media folder.

Inputs: folder_id (required). Returns: object

delete_media_fileC

Permanently delete a media file.

Inputs: media_file_id (required). Returns: object

delete_screenB

Permanently delete a screen.

Inputs: screen_id (required). Returns: object

delete_screen_groupC

Permanently delete a screen group.

Inputs: group_id (required). Returns: object

delete_web_appC

Permanently delete a web app.

Inputs: web_app_id (required). Returns: object

delete_workspaceA

Permanently delete a non-default, empty workspace.

Inputs: workspace_id (required). Returns: object

get_folderC

Get a media folder.

Inputs: folder_id (required). Returns: object

get_media_fileA

Get media details and a signed download URL.

Inputs: media_file_id (required). Returns: object

get_screenC

Get complete details for a screen.

Inputs: screen_id (required). Returns: object

get_screen_groupC

Get screen group details.

Inputs: group_id (required). Returns: object

get_screen_group_membersA

List the screens assigned to a screen group.

Inputs: group_id (required). Returns: object

get_screen_group_playlistB

Get a screen group's playlist.

Inputs: group_id (required). Returns: object

get_screen_playlistC

Get a screen's playlist and settings.

Inputs: screen_id (required). Returns: object

get_web_appC

Get web app details.

Inputs: web_app_id (required). Returns: object

get_workspaceC

Get workspace details.

Inputs: workspace_id (required). Returns: object

initiate_media_replacementC

Start replacing a media file and return a signed PUT URL.

Inputs: size (required), filename (required), mime_type (required), media_file_id (required). Returns: object

initiate_media_uploadB

Start AbleSign's three-step upload flow and return its signed PUT URL.

Inputs: size (required), filename (required), mime_type (required), folder_id. Returns: object

list_foldersC

List media folders, optionally within a parent folder.

Inputs: limit, title, offset, sort_by, +1 more. Returns: object

list_media_filesC

List media files. Multi-value format/orientation filters are comma-separated.

Inputs: tags, limit, title, offset, +5 more. Returns: object

list_screen_groupsC

List screen groups in the active workspace.

Inputs: limit, title, offset, sort_by. Returns: object

list_screensC

List screens. Comma-separate orientation, online-status, or tag filters.

Inputs: limit, title, offset, sort_by, +3 more. Returns: object

list_web_appsC

List AbleSign web apps.

Inputs: tags, limit, title, offset, +2 more. Returns: object

list_workspacesA

List all workspaces visible to the API key.

Inputs: no named parameters. Returns: object

list_workspace_usersC

List users assigned to a workspace.

Inputs: workspace_id (required). Returns: object

register_screenC

Register a screen using its six-character device pairing code.

Inputs: title (required), orientation (required), registration_code (required), description. Returns: object

save_screen_group_playlistC

Replace a screen group's entire playlist.

Inputs: group_id (required), playlist (required). Returns: object

save_screen_playlistB

Replace a screen's entire playlist. All desired items must be included.

Inputs: playlist (required), screen_id (required). Returns: object

set_screen_group_membersA

Replace a screen group's membership with up to 100 screen IDs.

Inputs: group_id (required), screen_ids (required). Returns: object

update_folderC

Rename a media folder.

Inputs: title (required), folder_id (required). Returns: object

update_media_fileB

Partially update media metadata, dates, or tags.

Inputs: changes (required), media_file_id (required). Returns: object

update_screenC

Partially update a screen using AbleSign API field names in changes.

Inputs: changes (required), screen_id (required). Returns: object

update_screen_groupC

Partially update a screen group.

Inputs: changes (required), group_id (required). Returns: object

update_screen_group_playlist_itemC

Partially update one screen group playlist item.

Inputs: changes (required), item_id (required), group_id (required). Returns: object

update_screen_playlist_itemC

Partially update one screen playlist item without reordering it.

Inputs: changes (required), item_id (required), screen_id (required). Returns: object

update_web_appB

Partially update a web app's metadata, URL, schedule, zoom, or tags.

Inputs: changes (required), web_app_id (required). Returns: object

update_workspaceC

Partially update a workspace.

Inputs: changes (required), workspace_id (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 44 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action. Media upload/replacement have separate initiate and complete steps. Screen playlist operations (save, add, update) are clearly differentiated. No ambiguity between tools.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern in snake_case (e.g., list_media_files, create_web_app, delete_screen). Verbs like list, create, get, update, delete, initiate, complete, register are used predictably.

    Tool Count2/5

    44 tools is excessive for a single server, far exceeding the typical well-scoped range of 3-15. Many operations could be consolidated or split into separate servers.

    Completeness4/5

    The tool set covers all major entities (media, web apps, screens, screen groups, folders, workspaces) with full CRUD and specialized operations like upload flows and playlist management. Minor gaps exist (e.g., no user management beyond workspace users), but core workflows are well-supported.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      An MCP (Multi-Agent Conversation Protocol) Server that enables interaction with the At-Work API (api.at-work.biz), allowing agents to communicate with this service through various transport modes like stdio, SSE, and HTTP.
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server for interacting with QUADS infrastructure systems via API, enabling resource management and automation through LLM applications.
      MIT