Skip to main content
Glama
shelf-nu-mcp

shelf-nu-mcp

by takeoff-pdm

shelf-nu-mcp

MCP server for self-hosted shelf.nu instances. It lets Claude search and manage assets, custody, locations, kits and bookings.

It talks to Shelf's /api/mobile/* REST API, the same one the official companion app uses. It logs in with your Shelf email and password and refreshes the session automatically. A few kit features exist only in the web app, so for those it submits the web forms with a cookie session.

Requirements

  • Node.js 20+

  • A Shelf account with password login. Use a dedicated user with only the role it needs: the server can do anything that user can.

Related MCP server: ServiceNow MCP Server

Install in Claude

Claude Code

claude mcp add shelf -s user \
  -e SHELF_URL=https://storage.takeoff-pdm.de \
  -e SHELF_EMAIL=you@example.com \
  -e SHELF_PASSWORD='your-password' \
  -- npx -y github:takeoff-pdm/shellf-nu-mcp

Run /mcp in Claude Code to check that shelf is connected.

Claude Desktop

Add this to claude_desktop_config.json (Settings → Developer → Edit Config), then restart Claude Desktop:

{
  "mcpServers": {
    "shelf": {
      "command": "npx",
      "args": ["-y", "github:takeoff-pdm/shellf-nu-mcp"],
      "env": {
        "SHELF_URL": "https://storage.takeoff-pdm.de",
        "SHELF_EMAIL": "you@example.com",
        "SHELF_PASSWORD": "your-password"
      }
    }
  }
}

From a local checkout

git clone git@github.com:takeoff-pdm/shellf-nu-mcp.git
cd shellf-nu-mcp && npm install    # also builds dist/
claude mcp add shelf -s user -e SHELF_EMAIL=… -e SHELF_PASSWORD=… -- node "$PWD/dist/index.js"

Configuration

Env var

Required

Description

SHELF_EMAIL

yes

Shelf login email

SHELF_PASSWORD

yes

Shelf login password

SHELF_URL

no

Instance URL (default https://storage.takeoff-pdm.de)

SHELF_ORG_ID

no

Default workspace. Without it, your last-selected or personal one is used

Credentials are only read from the environment. Never commit them.

Tools

  • Account: shelf_whoami, shelf_set_workspace, shelf_dashboard

  • Assets: list, get, create, update, delete, add note, change location, adjust quantity, manage placements, upload image, look up a QR code or barcode, link a QR code

  • Reference data: locations, categories, tags (+ create), custom fields, team members

  • Custody: assign or release (works in bulk and with quantities), move many assets to one location

  • Kits: list, get, create (optionally with assets), add or remove assets, assign or release custody in bulk, change location

  • Bookings: list, calendar, get, available assets, create, update, add or remove assets, reserve, check out, check in, cancel, archive, duplicate, delete, booking tags

Every tool takes an optional orgId. Tools that delete or cancel things are marked with destructiveHint.

Not covered yet: audits, partial check-in/check-out, model requests.

Kit creation and kit contents use Shelf's web forms instead of the mobile API, so a Shelf update may break them.

Development

npm install
npm run dev     # tsc --watch

License

MIT

Available Tools

46 tools
shelf_add_asset_noteB

Add a note to an asset's activity log.

Inputs: assetId (required), content (required), orgId.

shelf_adjust_quantityB

Adjust stock of a quantity-tracked asset (restock, correction, or loss).

Inputs: assetId (required), category (required), quantity (required), direction (required), +2 more.

shelf_archive_bookingC

Archive a completed/cancelled booking.

Inputs: bookingId (required), orgId.

shelf_assign_custodyB

Give one or more assets into a team member's custody. For quantity-tracked assets pass quantities {assetId: qty}.

Inputs: assetIds (required), custodianId (required), orgId, quantities.

shelf_available_assetsC
Read-only

Assets available for booking in a given period.

Inputs: bookingTo (required), bookingFrom (required), page, orgId, +3 more.

shelf_booking_add_assetsC

Add assets and/or kits to a booking.

Inputs: bookingId (required), orgId, kitIds, assetIds.

shelf_booking_remove_assetsB

Remove assets and/or kits from a booking.

Inputs: bookingId (required), orgId, kitIds, assetIds.

shelf_bookings_calendarB
Read-only

Bookings overlapping a date range (ISO 8601 dates).

Inputs: end (required), start (required), orgId, search, +1 more.

shelf_bulk_update_locationC

Move several assets to one location.

Inputs: assetIds (required), locationId (required), orgId.

shelf_cancel_bookingC
Destructive

Cancel a booking.

Inputs: bookingId (required), orgId, cancellationReason.

shelf_checkin_bookingA

Check in an ongoing/overdue booking (all assets).

Inputs: bookingId (required), orgId, timeZone.

shelf_checkout_bookingB

Check out a reserved booking (all assets).

Inputs: bookingId (required), orgId, timeZone.

shelf_create_assetA

Create a new asset. Use shelf_list_categories/locations/tags/custom_fields to look up IDs first.

Inputs: title (required), qrId, tags, orgId, +5 more.

shelf_create_bookingA

Create a booking (as DRAFT). Use shelf_reserve_booking afterwards to reserve it.

Inputs: name (required), endDate (required), startDate (required), custodianTeamMemberId (required), +5 more.

shelf_create_kitC

Create a new kit, optionally filled with assets right away. Returns the created kit.

Inputs: name (required), orgId, assetIds, categoryId, +3 more.

shelf_create_tagC

Create a new tag.

Inputs: name (required), orgId.

shelf_dashboardC
Read-only

Workspace dashboard: asset/booking counts, overdue items, etc.

Inputs: orgId.

shelf_delete_assetA
Destructive

Permanently delete an asset. Irreversible – confirm with the user first.

Inputs: assetId (required), orgId.

shelf_delete_bookingA
Destructive

Permanently delete a booking. Irreversible – confirm with the user first.

Inputs: bookingId (required), orgId.

shelf_duplicate_bookingB

Duplicate a booking into a new draft.

Inputs: bookingId (required), orgId.

shelf_get_assetB
Read-only

Get full details of an asset (location, custody, bookings, notes, custom fields, quantities).

Inputs: assetId (required), orgId.

shelf_get_bookingB
Read-only

Get booking details incl. assets and kits.

Inputs: bookingId (required), orgId.

shelf_get_kitB
Read-only

Get kit details incl. contained assets.

Inputs: kitId (required), orgId.

shelf_kit_actionB

Bulk action on kits: assign custody, release custody, or move to a location.

Inputs: intent (required), kitIds (required), orgId, custodianId, +1 more.

shelf_kit_add_assetsC

Add assets to an existing kit (existing contents are kept).

Inputs: kitId (required), assetIds (required), orgId, quantities.

shelf_kit_remove_assetsC

Remove assets from a kit.

Inputs: kitId (required), assetIds (required), orgId.

shelf_list_assetsC
Read-only

Search/list assets in the workspace.

Inputs: page, orgId, search, status, +2 more.

shelf_list_bookingsC
Read-only

Search/list bookings.

Inputs: page, orgId, search, sortBy, +3 more.

shelf_list_booking_tagsC
Read-only

List booking tags.

Inputs: orgId.

shelf_list_categoriesC
Read-only

List asset categories.

Inputs: orgId.

shelf_list_custom_fieldsA
Read-only

List active custom field definitions (optionally those applying to one category).

Inputs: orgId, categoryId.

shelf_list_kitsC
Read-only

Search/list kits.

Inputs: page, orgId, search, status, +2 more.

shelf_list_locationsC
Read-only

List/search locations.

Inputs: page, orgId, search, perPage.

shelf_list_tagsC
Read-only

List asset tags.

Inputs: orgId.

shelf_list_team_membersB
Read-only

List/search team members (needed as custodians for custody and bookings).

Inputs: page, orgId, search, perPage.

shelf_lookup_codeA
Read-only

Resolve a scanned Shelf QR code ID or a barcode value to the asset/kit it belongs to.

Inputs: qrId, orgId, barcode.

shelf_manage_placementsA

Set how many units of a quantity-tracked asset sit at each location (full replacement).

Inputs: assetId (required), placements (required), orgId.

shelf_release_custodyC

Release custody of one or more assets. For quantity-tracked assets pass quantities {assetId: qty}.

Inputs: assetIds (required), orgId, quantities.

shelf_reserve_bookingC

Reserve a DRAFT booking.

Inputs: bookingId (required), orgId, timeZone.

shelf_set_asset_imageA

Upload a local image file (jpg/png/webp) as the asset's main image.

Inputs: assetId (required), filePath (required), orgId.

shelf_set_workspaceA

Set the default workspace (organization) for subsequent calls in this session.

Inputs: orgId (required).

shelf_update_assetB

Update fields of an asset. Omitted fields stay unchanged. tags replaces the full tag set.

Inputs: assetId (required), tags, orgId, title, +4 more.

shelf_update_asset_locationA

Move an asset to a location. For quantity-tracked assets, optionally pass a quantity.

Inputs: assetId (required), locationId (required), orgId, quantity.

shelf_update_bookingB

Update a booking's name, dates, custodian, description or tags (all core fields required).

Inputs: name (required), endDate (required), bookingId (required), startDate (required), +5 more.

shelf_whoamiA
Read-only

Show the logged-in user and the workspaces (organizations) they belong to, incl. IDs and roles. The first workspace is the default.

Inputs: no named parameters.

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 46 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes and descriptions clarify overlaps (e.g., quantity vs placement, single vs bulk location moves). A few related tools (shelf_update_asset_location, shelf_bulk_update_location, shelf_manage_placements, shelf_adjust_quantity) could still be confused, but the set is largely unambiguous.

    Naming Consistency4/5

    All tools use a consistent shelf_ prefix and snake_case, with no camelCase mixing. Most follow a verb_noun pattern, though a few are noun-first (shelf_dashboard, shelf_kit_action, shelf_bookings_calendar), a minor deviation.

    Tool Count2/5

    46 tools is excessive for practical agent use; even a broad asset/booking domain doesn't require this many separate tools, and the count exceeds the threshold for 'too many' (25+).

    Completeness4/5

    Core CRUD and lifecycle coverage is strong for assets, kits, bookings, custody, and QR codes. Gaps exist in managing reference data (no update/delete for tags, locations, categories, custom fields, team members) and some minor lifecycle operations (unlink QR, kit updates).

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      B
      maintenance
      Connects BookStack knowledge bases to Claude through 47+ tools covering complete CRUD operations for books, pages, chapters, shelves, users, search, attachments, and permissions. Enables full management of BookStack content and configuration through natural language.
      56
      394 npm
      104
      MIT
    • A
      license
      C
      quality
      D
      maintenance
      Enables Claude to interact with ServiceNow instances to manage incidents, service catalogs, workflows, and knowledge bases through the ServiceNow API. It supports comprehensive operations including record querying, script execution, and user management using various authentication methods.
      66
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Connects Claude to your self-hosted or cloud-based Seafile storage for managing libraries and files through natural language. It enables users to browse directories, read file contents, and perform file operations like moving, renaming, or searching across their private infrastructure.
      4
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Provides Claude with access to IT Glue documentation and asset management, enabling searching and retrieval of organizations, configurations, passwords, documents, and more.
      24
      Apache 2.0