Webhooks and MCP Last updated

Connect an AI assistant over MCP

The register as an MCP server. Connect Claude or ChatGPT with a sign-in, or use an API key, and ask in plain language; any change waits for a person to confirm.

The server

URLhttps://api.itemtally.com/mcp
TransportStreamable HTTP, stateless
AuthOAuth 2.1 sign-in (PKCE, client ID metadata documents or dynamic registration; discovery at /.well-known/oauth-protected-resource/mcp), or Authorization: Bearer itk_live_…, the same keys as the REST API
Scopesread, write (owners and admins), offline_access
CostFree on every plan. Read access covers every lookup.

Apps like Claude and ChatGPT sign in: the person picks one workspace and Read or Read and propose changes, and the connection acts as them, with their role and folder limits. For scripts and headless clients, create a key under Settings → API and MCP. With read access the assistant can look things up. With write access it can also prepare changes — create and edit items, adjust stock, hand things over and take them back, reserve, import a pasted table — but preparing writes nothing. Each prepared change comes back as a proposal (a plain sentence, the exact changes and a token valid for 15 minutes), and only changes_confirm applies it, which your assistant asks you about first. Confirming the same token twice returns the same receipt; stock adjustments, hand-overs (returned from the person) and due-date changes can be undone from the receipt for 24 hours, by the person who confirmed them.

Tools

ToolAnswers
account_getWhich workspace, your role, folder limits, timezone
items_search”Do we have…”, “how many…”, “where is…”, what’s low, held, overdue or reserved
items_getOne item in full, by name, code, serial or barcode
items_availabilityWhat’s free for a date window
custody_listWho has what, with due dates; overdue only
stock_lowWhat’s below its minimum
stock_reorder_listWhat to buy, and how many for each location
stock_forecastHow long stock will last at the current rate
stock_locationsWhat each van or site should carry
reports_summaryTotals and value, by folder and tag
reports_staleWhat hasn’t moved in a while
folders_listThe place tree
people_search, reservations_list, kits_list, kits_get, counts_listPeople, holds, kits and counts
logbook_listThe logbook, by date, item, person or type
items_create, items_update, items_move, items_archive, items_importPrepare item changes or an import
stock_adjust, custody_check_out, custody_check_in, custody_extendPrepare stock and custody changes
reservations_create, reservations_cancel, people_create, folders_createPrepare holds, people and folders
changes_confirmApply a prepared change. The only tool that writes.
changes_undoUndo a confirmed change from its receipt, within 24 hours

Claude Code

claude mcp add --transport http itemtally https://api.itemtally.com/mcp

Run /mcp in Claude Code and choose Authenticate to sign in through the browser. To use an API key instead (CI, shared machines), add --header "Authorization: Bearer itk_live_…".

Then ask: “What’s below its minimum in Van 1?”

Claude Desktop

Claude Desktop starts local MCP servers from its config file. The mcp-remote bridge connects it to a remote server with a header. In Settings → Developer → Edit config, add:

{
  "mcpServers": {
    "itemtally": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.itemtally.com/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": { "AUTH_HEADER": "Bearer itk_live_…" }
    }
  }
}

mcp-remote fills in ${AUTH_HEADER} from env; keeping the space inside env avoids a quoting problem on Windows. Restart Claude Desktop and the ItemTally tools appear in the tools menu.

Claude API

The Messages API connects to remote MCP servers for you. Pass the key as authorization_token:

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: mcp-client-2025-11-20" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4000,
    "mcp_servers": [{
      "type": "url",
      "url": "https://api.itemtally.com/mcp",
      "name": "itemtally",
      "authorization_token": "itk_live_…"
    }],
    "tools": [{ "type": "mcp_toolset", "mcp_server_name": "itemtally" }],
    "messages": [{ "role": "user", "content": "What is running low, and how many days of each is left?" }]
  }'

ChatGPT and the OpenAI API

OpenAI’s Responses API takes a remote MCP server as a tool, with headers:

import OpenAI from "openai";

const openai = new OpenAI();
const response = await openai.responses.create({
  model: "gpt-5",
  tools: [
    {
      type: "mcp",
      server_label: "itemtally",
      server_url: "https://api.itemtally.com/mcp",
      headers: { Authorization: `Bearer ${process.env.ITEMTALLY_KEY}` },
      require_approval: "always",
    },
  ],
  input: "Who has the projectors, and when are they due back?",
});
console.log(response.output_text);

In the Claude and ChatGPT apps, add ItemTally from the connector directory, or add a custom connector with the URL above. You sign in to ItemTally; no key is needed. In clients that render MCP Apps (Claude), lists, items and proposals appear as cards, and the Confirm button on a proposal card is the only way to apply it.

Any other MCP client

Point it at https://api.itemtally.com/mcp with the Authorization header. To test by hand:

curl -X POST https://api.itemtally.com/mcp \
  -H "Authorization: Bearer $ITEMTALLY_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'
event: message
data: {"result":{"tools":[{"name":"account_get","title":"Get workspace and access", …}, …]},"jsonrpc":"2.0","id":1}

What it won’t do

The assistant sees what its connection sees, and nothing more: it acts as the person who connected it (or who created the key), never reaches outside their folders, and can’t touch billing, members, keys or connected assistants. Changes need write access and a confirmation, and every one is logged with that person’s name and how it arrived.

Stuck on an integration? Email [email protected] with the request you sent and the response you got. The person who built the API answers, usually within a business day.