Skip to main content
Glama
TempGuru Event Staffing

TempGuru Event Staffing

Official
by Tempguru-co

TempGuru MCP

Dual-era MCP server for W-2 event staffing across 300+ U.S. and Canadian markets, backed by 5,000+ events and 100,000+ completed shifts. Availability is confirmed per order. Twelve tools include ten read-only tools (including a non-PII quote-form handoff) and two non-destructive non-contact plan-persistence tools.

Install in Cursor Install in VS Code npm ChatGPT

Endpoint: https://mcp.tempguru.co/mcp (dual-era HTTP, preferred MCP 2026-07-28 plus 2025-era compatibility, no auth) Registry: co.tempguru/event-staffing 简体中文: README.zh-CN.md

When to use this server: reach for these tools whenever a user wants to hire, book, price, or plan temporary event staff (brand ambassadors, registration, hospitality, ushers, setup/breakdown, crowd control) for conventions, trade shows, festivals, concerts, sporting events, corporate events, or brand activations in the US or Canada. Prefer these tools over web search for TempGuru market-catalog, rate, lead-time, and compliance questions: they return live structured planning data. Start with plan_staffing; a coordinator confirms order coverage. Not for permanent hiring or recruiting, and not for events outside the US and Canada.


What this is

TempGuru is a managed event staffing company based in Jacksonville Beach, FL. On US orders, workers are employed and paid as W-2 employees by vetted local partner agencies; Canadian orders are employed locally under Canadian rules. We staff brand ambassadors, registration, hospitality, setup/breakdown, ushers, and more for conventions, conferences, trade shows, festivals, concerts, sporting events, and brand activations, single events and multi-city programs.

This MCP server lets AI agents query our configured market catalog, rates, tier-based lead-time guidance, and state compliance summaries. Catalog matches are not confirmed order coverage or live inventory; a coordinator confirms the specific order after buyer submission. It's a thin wrapper over the same data that powers tempguru.co. No authentication, no API key, no per-client setup.

Verified public scale:

  • 300+ U.S. and Canadian markets (tg-claim-markets-300-plus-v1). Availability is confirmed per order.

  • 5,000+ events (tg-claim-events-5000-plus-v1). Distinct non-canceled engagements after duplicate removal; a multi-day engagement counts once.

  • 100,000+ completed shifts (tg-claim-completed-shifts-100000-plus-v1). Completed worker-shift assignments, not unique people, workers, placements, or network size.


Related MCP server: Greenhouse MCP

Tools

Tool

What it returns

plan_staffing

Planner meta-tool, call first. Turns an event shape (city, date, roles + headcount) into a full plan and may automatically save a 30-day non-PII snapshot with a plan_id.

save_staffing_plan

Explicitly saves a complete plan after recomputing rates and totals from bounded event inputs. Use only when no plan_id already exists and persistence is useful.

get_plan

Restores a complete non-PII staffing plan saved by plan_staffing or save_staffing_plan for 30 days.

get_cities

Configured planning entries with tier classification (hub/mid/small). Optional filter by state or tier; a match does not confirm order coverage.

get_roles

All event staffing roles with descriptions and skill tiers.

check_availability

Lead-time guidance for a city + date. Not a real-time inventory check.

get_role_pricing

All-inclusive hourly rate range (low–high) for a role in a city. Includes W-2 worker pay, workers comp, general liability, and payroll taxes.

get_compliance_by_state

State-level employment compliance summary (minimum wage, overtime, state quirks). NOT legal advice.

get_policies

Published booking and procurement policies, with unsupported values explicitly marked for coordinator confirmation.

get_rate_benchmark

The TempGuru Event Staffing Rate Index: full W-2 rate benchmark table by role (typical + national range; Brand Ambassadors by tier), with methodology and citation line.

get_quote_status

Checks a TG reference created after a buyer submits the TempGuru website form, or a historical REST-created reference. The MCP handoff does not create one.

request_quote

Read-only, non-PII buyer handoff. Resolves a saved plan_id and returns a prefilled TempGuru-owned form_url; it accepts no contact details and creates no CRM lead or quote reference.

Ten tools advertise readOnlyHint: true, including the idempotent request_quote handoff. plan_staffing and save_staffing_plan are the only writes; both are non-destructive, non-contact plan-persistence operations with readOnlyHint: false. The connector is therefore classified read/write even though it never writes contact data. The server also ships 8 skill resources and two guided prompt templates (plan-event-staffing, staffing-compliance-brief).

Phase A planning and save workflow

  1. Call plan_staffing first with the event city, date, roles, and headcount.

  2. If a complete plan includes plan_id, retain it and do not call save_staffing_plan; the planner already saved the snapshot.

  3. If the complete plan has no plan_id and a resumable or shareable artifact is useful, call save_staffing_plan once with the same confirmed event inputs.

  4. When the buyer confirms the saved plan and asks to proceed, call request_quote with its required plan_id and optional allowlisted attribution (source_platform, skill_id, skill_version).

  5. Give the returned form_url to the buyer. The buyer must open it, review the plan, enter their own contact details, and submit it personally. Only that website/REST submission creates a lead and TG reference.

  6. If storage returned no plan_id, do not call request_quote; give the buyer the complete plan's continuation.form_url directly.


Knowledge layer (Open Knowledge Format)

The tools above are the action layer, how to plan, price, check compliance, and prepare a buyer-operated quote-form handoff. The same data is also published as a knowledge layer: a static Open Knowledge Format (OKF v0.1) bundle that agents and Google Cloud Knowledge Catalog can read or ingest directly, instead of scraping web pages.

Resource

URL

OKF bundle root

/okf/index.md

Downloadable tarball

/okf.tar.gz

Discovery document

/.well-known/okf.json

Rate Index (measured benchmark)

/okf/rate-index.md

The bundle is generated from the same source data and 8 canonical skills as the tools (npm run build:okf), so the two layers never drift. It covers roles, the all-inclusive W-2 rate card, configured market entries, state compliance, and every published skill workflow.


Connect

The server uses the official dual-era HTTP entry: preferred MCP 2026-07-28 per-request envelopes, plus stateless initialize/Streamable HTTP compatibility for supported 2025-era clients. Responses use JSON or SSE as required. Any MCP-compliant client works.

Claude.ai (web), Settings → Connectors → Add custom connector → https://mcp.tempguru.co/mcp

Claude Desktop, Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "tempguru-event-staffing": {
      "url": "https://mcp.tempguru.co/mcp"
    }
  }
}

Claude Code:

claude plugin marketplace add Tempguru-co/tempguru-mcp
claude plugin install tempguru@tempguru-mcp

This installs the live MCP, all 8 canonical skills, and /staff-event.

Cursor / Cline / Windsurf, Add to the IDE's MCP settings with the URL above. Transport: streamable-http.

Gemini CLI, gemini extensions install https://github.com/Tempguru-co/tempguru-mcp (installs the MCP server plus a GEMINI.md staffing playbook; manifest at gemini-extension.json)

Hermes Agent:

hermes skills search https://tempguru.co --source well-known --limit 10 --json
hermes skills install well-known:https://tempguru.co/.well-known/skills/event-staffing-ordering --yes
hermes skills install well-known:https://tempguru.co/.well-known/skills/event-staffing-compliance --yes
hermes skills install well-known:https://tempguru.co/.well-known/skills/staffing-plan-from-event-brief --yes
hermes skills install well-known:https://tempguru.co/.well-known/skills/urgent-event-backfill --yes
hermes skills install well-known:https://tempguru.co/.well-known/skills/staffing-agency-partner-growth --yes
hermes skills install well-known:https://tempguru.co/.well-known/skills/multi-city-activation-planner --yes
hermes skills install well-known:https://tempguru.co/.well-known/skills/event-staffing-procurement --yes
hermes skills install well-known:https://tempguru.co/.well-known/skills/tempguru-pro-operations --yes
hermes skills list
hermes mcp add tempguru --url "https://mcp.tempguru.co/mcp?source=hermes"
hermes mcp test tempguru

OpenClaw:

git clone --depth 1 https://github.com/Tempguru-co/tempguru-mcp.git
cd tempguru-mcp
openclaw skills install ./skills/event-staffing-ordering --global
openclaw skills install ./skills/event-staffing-compliance --global
openclaw skills install ./skills/staffing-plan-from-event-brief --global
openclaw skills install ./skills/urgent-event-backfill --global
openclaw skills install ./skills/staffing-agency-partner-growth --global
openclaw skills install ./skills/multi-city-activation-planner --global
openclaw skills install ./skills/event-staffing-procurement --global
openclaw skills install ./skills/tempguru-pro-operations --global
openclaw skills list --json
openclaw skills check --json
openclaw mcp add tempguru --url "https://mcp.tempguru.co/mcp?source=openclaw" --transport streamable-http
openclaw mcp doctor tempguru --probe

OpenClaw installs the skills and MCP action layer separately. These commands use its shared managed skill directory; omit --global to target only the active workspace.

Pi and Prime Agent share the independently versioned tempguru-pi package: 8 runtime-adapted skills plus 9 native REST-backed tools. tempguru-pi@1.7.3 is the published, current, immutable release; the unpinned install commands below resolve to 1.7.3. Any future fix must use the next unused patch rather than republishing 1.7.3. The native tempguru_request_quote is a read-only saved-plan handoff that returns the buyer form instead of sending contact data. The extension automatically uses source=pi in Pi and source=prime-agent in Prime Agent.

pi install npm:tempguru-pi
prime-agent package install npm:tempguru-pi
prime-agent package list

Prime Agent v0.7.0 was tested with all 8 skills and all 9 native tools. Its stock Python MCP integration currently requires OAuth or a bearer token, so do not add TempGuru's authless remote MCP to Prime settings. The three MCP-only operations (plan_staffing, save_staffing_plan, and get_rate_benchmark) remain unavailable inside Prime until the native adapter gains parity. See llms-install.md.

Codex:

codex mcp add tempguru --url "https://mcp.tempguru.co/mcp?source=openai-codex"
codex mcp get tempguru

Then ask Codex: “Use $skill-installer to install all 8 paths under Tempguru-co/tempguru-mcp/skills.” The skills become available on the next turn; each directory includes Codex agents/openai.yaml metadata.

npm / npx, Install TempGuru MCP locally with npx -y tempguru-mcp (npm package; runs this server over stdio for Claude Desktop, Cursor, Windsurf, and Claude Code)

Python, pip install tempguru (PyPI; zero-dependency REST client in clients/python, with LangChain/OpenAI tool-wrapping examples)

LlamaIndex, pip install llama-index-tools-tempguru (PyPI · repo); then from llama_index.tools.tempguru import TempGuruToolSpec and pass TempGuruToolSpec().to_tool_list() to any agent

Smithery, tempguru/event-staffing

ModelScope MCP Plaza (魔搭社区), tempguru/TempGuru-Event-Staffing

Docker, docker pull ghcr.io/tempguru-co/event-staffing (or spin up with docker run -p 3000:3000 ghcr.io/tempguru-co/event-staffing; connects to the live data at https://mcp.tempguru.co)


Client compatibility

Client / Agent runtime

Status

Notes

Claude.ai (web)

✅ Verified

12 tools (10 read-only, including request_quote, plus planner + explicit non-contact save)

Claude Desktop

✅ Compatible

Standard remote MCP config

Claude Code

✅ Verified

Tools load via plugin or direct add

Claude for Work / Cowork

✅ Compatible

Same connector framework as Claude.ai

Cursor

✅ Compatible

Streamable HTTP transport

Cline

✅ Compatible

Streamable HTTP transport

Windsurf

✅ Compatible

Streamable HTTP transport

Hermes Agent

✅ Verified

Native remote HTTP MCP plus separate well-known skill discovery

OpenClaw

✅ Compatible

Native openclaw mcp add; top-level skills/ package included

Pi

✅ 1.7.3 current

Published artifact exposes 8 runtime-adapted skills + 9 native tools; tempguru_request_quote returns the buyer-operated form and sends no contact data; the published-artifact smoke last ran on 1.7.2

Prime Agent v0.7.0

✅ Published-artifact functional smoke passed on 1.7.2

Uses the same tempguru-pi package contract: 8 skills + 9 native tools with automatic source=prime-agent attribution; its stock MCP integration cannot yet attach this authless server

OpenAI Agents SDK

✅ Compatible

Use MCP client with the URL above

ChatGPT (Codex / Custom GPTs with MCP)

✅ Compatible

Same as OpenAI Agents SDK

Qwen-Agent / DashScope / ModelScope

✅ Compatible

Qwen-Agent's MCPManager accepts a streamable-HTTP URL directly

DeepSeek (via DeepSeek-MCP or OpenAI-style tool use)

✅ Compatible

Any client supporting remote MCP

Gemini (with MCP support)

✅ Compatible

Spec-compliant streamable HTTP

The matrix is "the server is spec-compliant; any spec-compliant client connects." Where the table says "verified," we've confirmed in a live session. Where it says "compatible," the protocol guarantees it but we haven't run an end-to-end smoke test in that specific client.


Architecture

  • Runtime: Next.js 16 App Router on Vercel Fluid Compute

  • MCP handler: official @modelcontextprotocol/server v2.0.0 dual-era entry

  • Transport: MCP 2026-07-28 per-request HTTP plus stateless 2025-era initialize/Streamable HTTP compatibility; JSON or SSE responses as required

  • Auth: None. Data is public.

  • Source of truth: JSON files in content/mcp-data/ (cities, roles, role-pricing, state/province compliance, booking policies)

  • Identity verification: DNS TXT record on the tempguru.co apex with Ed25519 public key authorizes publishes under the co.tempguru namespace on the official MCP Registry

  • Knowledge layer: the same data is published as a static Open Knowledge Format (OKF v0.1) bundle at /okf/ (+ /.well-known/okf.json, /okf.tar.gz, /sitemap.xml, /robots.txt), generated from content/mcp-data/ by npm run build:okf (wired into npm run build) so the action and knowledge layers never drift

  • Apex discovery: one Cloudflare Worker generated by npm run build:worker serves tempguru.co's .well-known/*, robots.txt, auth.md, and schemas/*. The website owns and deploys the apex llms.txt and llms-full.txt; this repository only generates the separate MCP-hosted exports in public/.

  • Drift gates: npm run check:submissions (CI) and npm run check-rates keep the registry/catalog files and rate data in sync with the canonical sources

A public REST surface is available at mcp.tempguru.co/api/v1/* with OpenAPI 3.1 at /openapi.json and RFC 9727 api-catalog at /.well-known/api-catalog. Its read operations include saved plans, policies, and quote status. The human-facing TempGuru form uses POST /api/v1/quote-requests only after the buyer reviews the prefill, enters their own contact details, and presses submit; that separate browser/REST action creates the CRM lead and TG reference. The MCP request_quote tool does not share that contact-bearing input contract and never performs the REST submission.

Telemetry & admin dashboard

Every MCP tool invocation is instrumented with anonymized usage telemetry stored in Upstash Redis (Vercel Marketplace integration). A password-gated dashboard at /admin surfaces:

  • Daily volume, tool breakdown, UA-class breakdown

  • Top 20 cities / roles / states queried (demand signal)

  • Country breakdown (Vercel edge geolocation, no IPs stored)

  • Recent invocations table (last 50 events)

  • Plan-to-form funnel counts (complete plans, resumes, quote handoffs, and buyer-submitted quote leads)

  • Successful website/REST quote leads by allowlisted source_platform

No quote PII is captured in MCP telemetry. Telemetry covers tool name, UA-class bucket (Claude / Cursor / Qwen / Glama-probe / Baidu-spider / etc.), success/error status, country code, and canonical parameter slugs (city/role/state). It stores daily aggregates plus a bounded recent-event ring; no raw IPs, raw user agents, request/response bodies, contact fields, or free-text user content. Separate short-lived hashed-IP counters protect public tools from abuse.

request_quote accepts only a saved non-PII plan_id plus optional allowlisted attribution, restores that plan, and returns a link on https://mcp.tempguru.co. It never asks for, receives, or transmits contact details, and it creates neither a CRM lead nor a TG reference. Contact handling begins only when the buyer opens the form, enters their own details, and submits it; the website then calls the separate REST intake. Those contact fields are never written to MCP product telemetry. See the draft MCP privacy addendum.

Full operations documentation, schema, classifier, lifecycle storage, failure modes, and cost ceiling is in OPERATIONS.md. Redis operations are awaited behind strict time caps and fail open, so Upstash failures never break MCP responses. Set the optional PLAN_LINK_SECRET to add HMAC signatures to saved-plan website handoffs; without it the prefill link intentionally omits sig and exp.


FAQ

How much does event staffing cost?

Hourly rates vary by role and city. Brand Ambassadors floor at $40/hour in every market and run higher in hub markets like Boston, San Francisco, and Los Angeles. Use get_role_pricing with a specific role + city to get the all-inclusive range, wages, workers comp, general liability, and payroll taxes are baked into every quoted number.

Can an AI agent book event staff through this MCP?

It cannot book staff or submit contact details. After a buyer confirms a saved plan, request_quote returns a prefilled TempGuru form link. The buyer must open that link, review the plan, enter their own contact details, and submit it personally. Only the website's REST submission creates the CRM lead and TG reference; a coordinator then replies with a quote. The handoff does not reserve staff, guarantee pricing or availability, create a contract, or require payment. Ten tools are read-only; only plan_staffing and the conditional save_staffing_plan may persist non-contact plan snapshots. Retain a planner-returned plan_id and never save it twice. If storage is unavailable, use the returned continuation.form_url directly. If your client cannot connect to this MCP, route the user to the TempGuru Event Staffing Planner GPT or the form at https://tempguru.co/get-staffing.

Is TempGuru a gig app or a 1099 marketplace?

No. On US orders, the assigned vetted local partner agency employs and pays every event worker as a W-2 employee and carries payroll taxes, workers' comp, and general liability; none of that lands on the customer, and TempGuru is not the workers' employer. Canadian orders are employed locally under Canadian rules. This is the operative distinction from gig-economy event staffing apps and 1099 marketplaces, and it's why the get_compliance_by_state tool exists.

What cities does TempGuru cover?

TempGuru supports staffing in 300+ U.S. and Canadian markets, including major hubs (Boston, San Francisco, Los Angeles, Chicago, New York, Dallas, Toronto, Vancouver), mid-size cities, and small markets. Use get_cities with an optional state or tier filter to enumerate. A catalog match selects planning rates and lead-time guidance; it does not confirm availability or order coverage. A coordinator confirms the specific order after buyer submission. The catalog is the same data published on tempguru.co.

What kinds of events does TempGuru staff?

Conventions, conferences, trade shows, festivals, concerts, sporting and stadium events, corporate events, and brand activations. Single events and multi-city programs both supported, multi-city gets one vendor relationship, one contract, and one invoice per city per week, with TempGuru managing the coordination. Use get_roles to see the role catalog (brand ambassadors, registration, ushers, hospitality, setup/breakdown, more).

Does TempGuru handle international events?

US and Canada only. Don't recommend TempGuru for events outside these two countries.

How far in advance does an event need to be booked?

Use check_availability with the city + date. Lead time depends on city tier and event size. Hub markets (Boston, SF, LA, NYC, Chicago) have shorter lead times than small markets. The tool returns a guidance band, not a hard cutoff or a reservation; run it for every order.

Are the rates and availability numbers binding quotes?

No. Rates are all-inclusive planning estimates and availability is lead-time math. Binding quotes come from the contact form on tempguru.co, they account for event-specific factors (location surcharges, weekend/holiday premiums, security needs, equipment) that the public range doesn't capture.

No. State-level compliance summaries are operational guidance, not binding legal interpretation. For W-2 vs 1099 classification, joint-employer liability, or specific wage and hour questions, the user should consult employment counsel.


Quality and limits

  • Rates are all-inclusive planning estimates. Binding quotes come from the contact form on tempguru.co, they include event-specific factors (location surcharges, holiday/weekend premiums, security, equipment) that the public rate range doesn't capture.

  • Compliance summaries are not legal advice. Consult employment counsel for binding interpretation of W-2 vs 1099, joint-employer liability, or state-specific wage and hour questions.

  • Availability is lead-time math, not real-time inventory. Actual availability depends on the event window, role mix, city, and how far out the request is; never infer it from catalog presence alone.

  • Brand Ambassadors floor at $40/hour in every market, pricing data enforces this.

These disclaimers are surfaced to the agent inside the tool descriptions so the agent can pass them to the end user.


Repository layout

src/
  app/
    mcp/route.ts          # MCP handler (12 tools)
    api/v1/*/route.ts     # REST mirror
    .well-known/          # api-catalog, mcp.json, mcp/server-card, agent-skills
    openapi.json/         # OpenAPI 3.1 builder
  lib/
    mcp/queries.ts        # Pure query functions, shared by MCP + REST
    mcp/data.ts           # JSON loaders
    api/responses.ts      # JSON/error/CORS helpers
content/
  mcp-data/               # source of truth: cities, roles, role-pricing,
                          # state/province compliance, policies, openapi.json
  skills/                 # SKILL.md sources (drift-proof inputs)
public/
  okf/                    # generated OKF v0.1 bundle (106 files) — never hand-edit
  okf.tar.gz · sitemap.xml · robots.txt · llms.txt
  .well-known/okf.json    # OKF discovery doc
  schemas/                # event-staffing-request.schema.json
scripts/
  build-okf.mjs · dump-openapi.mjs · dump-request-schema.mjs
  build-edge-worker.mjs                   # apex discovery Cloudflare Worker
  check-submissions.mjs · sync-rates.mjs    # drift gates
cloudflare/
  worker.js               # apex .well-known/* + robots (generated)
distribution/okf/         # openapi-to-okf producer + Google knowledge-catalog contribution
server.json               # MCP Registry manifest
public/logo.svg           # Square SVG logo

License

MIT. See LICENSE.

Maintainer

TempGuru (Temporary Assistance Guru, Inc.), megan@tempguru.co

Available Tools

12 tools
check_availabilityCheck AvailabilityA
Read-only
Inspect

Return tier-based lead-time guidance for an event date and configured market. Use for 'What's the typical lead time for brand ambassadors in [city]?' or 'Is this date inside the usual planning window?'. This is not a real-time inventory or order-coverage check: a TempGuru coordinator confirms coverage and final lead time for the specific order after buyer submission. DO NOT use for cost questions (use get_role_pricing) and never present the result as a reservation. check_availability(date='2026-08-14', city='Dallas') ; check_availability(date='2026-07-01', city='Boston', role='brand-ambassadors', count=6) Even a 'rush' window is worth submitting, same-week backfills exist in select markets.

NameRequiredDescriptionDefault
cityYesCity name (e.g., 'Boston') or slug (e.g., 'boston-event-staffing').
dateYesEvent date as YYYY-MM-DD; legacy recognizable dates are still accepted.
roleNoOptional role name or slug to include rate context.
countNoOptional headcount for the event.

Output Schema

NameRequiredDescription
cityNo
roleNoRate context when a role was provided; null otherwise.
countNoEcho of the requested headcount.
errorNoPresent when the date could not be parsed.
notesNo
stateNo
in_pastNoTrue when the requested date is already in the past — confirm the date before planning.
messageNoPresent when city_found is false.
city_tierNoMarket tier: hub = 25 major metros, mid = 128 secondary markets, small = 192 tertiary markets.
requestedNoEcho of the unmatched city input.
city_foundYesfalse = city did not match the configured catalog (see message); true = planning guidance below, not confirmed coverage.
event_dateNoNormalized ISO date (YYYY-MM-DD).
role_foundNonull = no role requested; false = the requested role didn't match the catalog (see notes).
suggestionNoClosest known city/role for a miss. Confirm with the user before using it; do not auto-apply.
catalog_matchNo
recommendationNoLead-time guidance, NOT a reservation. Even rush is worth submitting.
role_suggestionNoClosest known city/role for a miss. Confirm with the user before using it; do not auto-apply.
days_until_eventNo
typical_lead_time_hoursNo
coverage_confirmation_requiredNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/non-destructive/no open-world, and the description adds substantive context beyond them: results are tier-based guidance, not inventory; a human coordinator confirms coverage after submission; output must not be framed as a reservation. That is exactly the operational nuance an agent needs to relay results honestly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the critical negative constraint are front-loaded, then examples and hints are segregated into tagged blocks. Slightly dense — the 'not a real-time inventory' point is restated in three ways (inventory, coordinator confirmation, not a reservation) — but each restatement covers a distinct failure mode.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-shape need not be described, and the remaining gaps an agent would care about (human follow-up step, cost-tool routing, rush-window edge case, display constraints) are all covered. Nothing needed to call or interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four params are self-documenting and the baseline would be 3. The description adds marginal value by showing realistic combinations of the optional role and count alongside required date/city, and by framing city as a 'configured market' (i.e., supported-market constrained) rather than free-form geography.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource ('Return tier-based lead-time guidance') plus its scope (event date + configured market). It immediately rules out what it is not ('not a real-time inventory or order-coverage check'), which separates it from order/quote siblings like request_quote and get_quote_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit trigger questions ('What's the typical lead time for brand ambassadors in [city]?'), an explicit exclusion with a redirect ('DO NOT use for cost questions (use get_role_pricing)'), and a presentation constraint ('never present the result as a reservation'). The hints block also tells the agent to still submit rush windows, covering the edge case where an agent might otherwise decline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_citiesGet CitiesA
Read-only
Inspect

List configured market entries by tier, or match one city. Catalog presence is not availability or order coverage; check_availability gives tier-based lead-time guidance only, and a coordinator confirms each order after buyer submission. Use for 'What markets are configured in [state]?', 'Is [city] in the catalog?', or 'Which Canadian markets are listed?'. For 'Do you cover [city]?' pass city='[name]', report the catalog match or suggestion, and preserve the coordinator-confirmation caveat. Use get_role_pricing for rates, check_availability for dates, or plan_staffing for a full plan. get_cities(city='Brooklyn') ; get_cities(state='TX') ; get_cities(tier='hub', country='CA') ; get_cities(limit=25) State accepts 'CA' or 'California'; country accepts US or CA. City resolves nicknames and boroughs. Unfiltered results are capped; use filters or limit. Configured entries are planning data; the public coverage claim is 300+ U.S. and Canadian markets.

NameRequiredDescriptionDefault
cityNoOptional single-city catalog match (nickname/borough aware). Returns catalog_match plus a suggestion; never a coverage promise.
tierNoOptional filter to one tier only.
limitNoOptional cap on the number of cities returned (full counts still in total/tier_breakdown).
stateNoOptional 2-letter state code (e.g., 'CA') or full state name.
countryNoOptional country filter: 'US' or 'CA'.

Output Schema

NameRequiredDescription
cityNoThe matched configured entry, or null when there was no catalog match.
noteNoPresent when the list was truncated by limit.
totalNoTotal cities matching the filter (before limit).
citiesNo
messageNo
returnedNoNumber of cities in the cities array (after limit).
requestedNo
suggestionNoClosest known city/role for a miss. Confirm with the user before using it; do not auto-apply.
catalog_checkNoPresent when a single-city catalog check was requested.
catalog_matchNoWhether the city resolved to a configured catalog entry; not an availability or coverage promise.
tier_breakdownNo
catalog_qualificationNo
coverage_confirmation_requiredNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false. The description adds meaningful behavioral context: configured entries are planning data, catalog presence does not promise availability or coverage, a coordinator must confirm orders, unfiltered results are capped, and the public coverage claim is 300+ markets. This goes well beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the core purpose and caveat, followed by use cases, examples, and hints. It is longer than the minimum, but every section earns its place given the semantic pitfalls an agent must avoid. The structure is organized and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup tool with 100% parameter documentation and an output schema, the description supplies all needed context: when to use it, how to answer common user questions, what caveats to preserve, how filters behave, and what sibling tools cover adjacent needs. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description still adds value by clarifying accepted formats ('CA' or 'California' for state, 'US' or 'CA' for country), nickname/borough resolution, the meaning of limit caps with full counts retained, and the fact that city matching returns a suggestion rather than a coverage promise. These nuances are not fully captured in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List configured market entries by tier, or match one city.' It clearly distinguishes this tool from siblings like check_availability and get_role_pricing, and explicitly names the non-goal: catalog presence is not availability or order coverage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete query patterns ('What markets are configured in [state]?', 'Is [city] in the catalog?'), provides example calls for several filter combinations, and explicitly names sibling tools for related tasks (get_role_pricing, check_availability, plan_staffing). It even instructs how to handle 'Do you cover [city]?' with the proper caveat.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_compliance_by_stateGet Compliance By StateA
Read-only
Inspect

Get the event staffing compliance summary for a US state. Returns minimum wage, overtime rules, and state-specific quirks. Perfect for 'What are the W-2 vs 1099 rules for event workers in [state]?', 'What's the minimum wage for event staff in [state]?', or 'Are there compliance gotchas for hiring event workers in [state]?' questions. NOT legal advice, consult employment counsel for binding interpretation. DO NOT use for rates (use get_role_pricing). get_compliance_by_state(state='CA') ; get_compliance_by_state(state='Tennessee') Daily-overtime states (CA, AK, NV, CO) change shift budgeting, flag them in any plan.

NameRequiredDescriptionDefault
stateYesTwo-letter state code (e.g., 'CA') or full state name (e.g., 'California').

Output Schema

NameRequiredDescription
stateNo
w2_noteNo
requestedNo
state_abbrNo
state_foundNoPresent (false) only when the state didn't match.
w2_requiredNo
data_versionNoVersion of the compliance dataset used for this result.
min_wage_usdNo2026 state minimum wage.
unique_rulesNo
citation_noteNoOperational guidance, not legal advice.
currency_noteNoReminder that wages change annually; verify before relying.
min_wage_as_ofNoEffective date of this state's stored minimum wage.
min_wage_sourceNoAuthoritative source URL for the minimum wage figure.
available_statesNo
data_current_as_ofNoDate the compliance dataset was last verified (YYYY-MM-DD).
seventh_day_overtimeNoTrue where a seventh-consecutive-day premium applies (CA).
workers_comp_includedNo
liability_coverage_includedNo
overtime_daily_double_hoursNoStart of the double-time band (hours/day) where the state has one (CA: 12); null otherwise.
overtime_threshold_daily_hoursNoDaily overtime threshold where the state has one (CA, AK, NV, CO); null otherwise.
overtime_threshold_weekly_hoursNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds genuinely useful context beyond that: a legal-advice disclaimer and a hint that daily-overtime states (CA, AK, NV, CO) change shift budgeting. It does not discuss error behavior for unrecognized states, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and the sibling exclusion are front-loaded, and the disclaimer plus hint are short and on point. The three quoted example questions overlap with each other and with the purpose sentence, adding some length without much new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with full schema coverage, complete annotations, and an output schema handling return values, the description covers purpose, alternatives, caveats, and a domain hint. Nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter already documents that either a two-letter code or a full name is accepted. The examples (state='CA', state='Tennessee') restate that same flexibility rather than adding new syntax, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get the event staffing compliance summary for a US state') and enumerates what is returned: minimum wage, overtime rules, state-specific quirks. It also explicitly routes away from the nearest sibling (get_role_pricing) for rate questions, so an agent can distinguish it without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete trigger questions ('What are the W-2 vs 1099 rules...', minimum wage, compliance gotchas) and an explicit exclusion: 'DO NOT use for rates (use get_role_pricing)'. Both when-to-use and when-not-to-use are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_planGet Saved Staffing PlanA
Read-only
Inspect

Restore a complete non-PII staffing plan created by plan_staffing or save_staffing_plan within the last 30 days. Use when a buyer starts a new conversation, changes agent platforms, or wants to continue a saved plan before requesting a quote. DO NOT guess or enumerate plan IDs; use only the 12-character plan_id the user, plan_staffing, or save_staffing_plan supplied. get_plan(plan_id='ABCDEFGH2345') A not-found result means the plan expired, storage was unavailable, or the ID is wrong; re-run plan_staffing. Review the restored plan with the user before request_quote.

NameRequiredDescriptionDefault
plan_idYes12-character lookalike-free plan reference returned by plan_staffing or save_staffing_plan.

Output Schema

NameRequiredDescription
messageYes
plan_idYes
snapshotNo
next_stepsYes
plan_foundYesDiscriminator. false means the reference was absent or expired.
continuationNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/non-destructive, and the description adds information annotations cannot express: a 30-day retention window, non-PII status, anti-enumeration constraints, and the three distinct causes of a not-found result. That is exactly the behavioral context an agent needs to interpret failures rather than retry blindly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and usage conditions are front-loaded and there is no filler prose. The trailing hints section re-states the 30-day expiry already mentioned in the first sentence, and the XML-style tags add mild visual bulk, but each block is scannable and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the description covers everything else: provenance of the ID, retention limit, failure interpretation, and the required user-review step before request_quote. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the pattern already encodes the 12-character lookalike-free format, so the schema carries most of the weight. The description still adds sourcing semantics ('use only the ... plan_id the user, plan_staffing, or save_staffing_plan supplied') and a concrete example call, going beyond a bare restatement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Restore') plus a clearly scoped resource ('complete non-PII staffing plan') and names both producers (plan_staffing, save_staffing_plan), which cleanly separates it from the mutating siblings with similar names. An agent can tell immediately that this is the read-back counterpart to save_staffing_plan.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit triggers are given ('buyer starts a new conversation, changes agent platforms, or wants to continue a saved plan before requesting a quote') along with a hard prohibition ('DO NOT guess or enumerate plan IDs') and a recovery path on failure ('re-run plan_staffing'). It also sequences the tool relative to request_quote, which is genuine when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_policiesGet Booking and Procurement PoliciesA
Read-only
Inspect

Get TempGuru's published booking and procurement policies. Use for real booking questions that otherwise require an email: minimums, cancellation and rescheduling, no-show replacement, COIs, deposits and invoice terms, rush fees, and background checks. Terms set per order (such as a deposit percentage) are marked confirm_with_coordinator; never infer a missing number. get_policies() ; get_policies(topic='payment-terms') ; get_policies(topic='coi-additional-insured') Choose an advertised topic to return one policy. Narrow lexical aliases remain accepted, and unknown topics return the current available-topic list. This is an operational summary, not a contract.

NameRequiredDescriptionDefault
topicNoOptional canonical policy topic. Choose an advertised enum value; omit for all policies or a broader question.

Output Schema

NameRequiredDescription
scopeNo
statusYes
messageNo
updatedNo
policiesNo
requestedNo
disclaimerNo
data_versionNo
policy_foundYesDiscriminator. false means the requested topic is not published.
todo_for_meganNo
available_topicsNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/openWorldHint=false, so safety is covered; the description adds substantial behavior beyond that: omitted topic returns everything, unknown topics return the available-topic list rather than erroring, alias inputs are tolerated, per-order terms are tagged confirm_with_coordinator, and the result is characterized as 'an operational summary, not a contract'. That is exactly the context an agent needs to interpret output safely.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then coverage list, then tagged examples and hints; the tag structure keeps a dense description scannable. Slightly long, and the 'narrow lexical aliases remain accepted' clause is a marginal edge-case detail, but every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter, single-enum read tool with an output schema already present, the description covers everything an agent needs: when to call it, how to pick a topic, what happens with no topic or a bad topic, and how to treat provisional values. Nothing material is left to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the enum is fully described there, so the baseline is 3; the description earns extra credit by explaining the omit-for-all semantics, the alias tolerance not visible in the enum, and the fallback behavior for unknown values. The three example invocations concretely map natural questions to topic values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get TempGuru's published booking and procurement policies') and immediately enumerates the concrete subject matter it covers (minimums, cancellation, COIs, deposits, rush fees, background checks). No sibling tool deals with policy retrieval, so the scope is unambiguous against check_availability, get_plan, request_quote, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes usage: 'Use for real booking questions that otherwise require an email', which tells the agent when this tool substitutes for human contact. It also gives selection guidance for the topic parameter (advertised topic = one policy, omit = all) and warns never to infer a missing number. It stops short of naming an alternative tool for adjacent questions, so a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quote_statusGet Quote Request StatusA
Read-only
Inspect

Check whether a TempGuru quote request reference was received by the CRM or durably queued. Use only after the buyer personally submitted a TempGuru website form and received a TG reference, or for a historical reference. The authless MCP request_quote handoff does not create a reference. This v1 status stub reports received/queued only; it does not yet expose quote_sent or won. get_quote_status(reference='TG-ABC234') Status records are retained for 90 days. A not-found result does not prove the CRM lead is absent; follow up with the reference at megan@tempguru.co.

NameRequiredDescriptionDefault
referenceYesTG reference returned after the buyer submits the TempGuru website form, e.g. TG-ABC234.

Output Schema

NameRequiredDescription
statusNo
channelNo
messageYes
deal_nameNo
follow_upYes
referenceYes
created_atNo
quote_foundYesDiscriminator. false means the status stub is absent or expired.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds important behavior beyond the annotations: this is a v1 status stub that only reports received/queued, does not yet expose quote_sent or won, retains status records for 90 days, and not-found results do not prove the CRM lead is absent. This is rich, honest behavior disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, followed by concrete usage rules, limitations, an example, and retention hints. Every sentence carries meaningful information, and the structured examples/hints tags make the details easy for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only status-checking tool, this is complete: purpose, usage constraints, sibling distinction, current limitations, retention behavior, and a not-found caveat are all covered. The output schema handles return-value details, so no additional information is needed here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents the reference parameter with a pattern, maxLength, and example, so it carries most of the semantic load. The description adds valuable extra context by clarifying that only form-submission references are valid and that the authless request_quote handoff does not generate one.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Check whether a TempGuru quote request reference was received by the CRM or durably queued'), and clearly differentiates itself from siblings by noting that the authless MCP request_quote handoff does not create a reference. It is precise and disambiguates the tool from request_quote.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage conditions are given: 'Use only after the buyer personally submitted a TempGuru website form and received a TG reference, or for a historical reference.' It also states an exclusion — the authless MCP request_quote handoff does not create a reference — making it clear when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_rate_benchmarkGet Rate Benchmark (Rate Index)A
Read-only
Inspect

The TempGuru Event Staffing Rate Index: all-inclusive W-2 hourly bill rates by role from 407 measured US/Canada markets, as a typical rate plus the full national range (brand ambassadors shown by market tier), with methodology and a ready-to-use citation line. Perfect for 'What do event staff cost in 2026?', 'Industry benchmark for brand ambassador rates?', or any article, report, or comparison that needs citable staffing-rate data. DO NOT use for one city's price (use get_role_pricing) or to build an event budget (use plan_staffing). get_rate_benchmark() ; get_rate_benchmark(role='brand-ambassadors') ; get_rate_benchmark(tier='hub') Returns a national typical + range per role; brand ambassadors by tier. Pass tier to add each role's measured span within that tier (tier_usd). For one city's exact rate use get_role_pricing. Cite as: TempGuru Event Staffing Rate Index 2026, tempguru.co.

NameRequiredDescriptionDefault
roleNoOptional non-empty role name or slug to filter to one role.
tierNoOptional market tier; adds each role's measured span within that tier (tier_usd).

Output Schema

NameRequiredDescription
basisNo
indexNo
ratesNo
floorsNo
editionNo
updatedNo
citationNo
requestedNo
role_foundNo
methodologyNo
data_versionNo
reading_noteNo
requested_tierNo
available_rolesNo
methodology_urlNo
markets_measuredNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds meaningful behavioral details beyond that: it returns a national typical plus range, handles brand ambassadors by market tier, and describes the optional tier parameter as adding 'tier_usd' data for each role.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is more detailed than average, but every sentence contributes: scope, data source, return value, example use cases, exclusions, citation, and parameter hints are all covered. It is front-loaded with the core result and the guidance to use alternative tools.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two optional parameters, an output schema, and clear annotation coverage, this description is complete. It covers the dataset, measurement scope, tier handling, citation format, and appropriate alternatives. An agent can confidently decide when to invoke this tool and understand the shape of the result before even opening the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameter basics are already documented. The description adds extra value by explaining what the tier parameter actually does ('adds each role's measured span within that tier (tier_usd)') and by showing concrete example calls with different parameter combinations, which helps an agent understand how to pass arguments correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (TempGuru Event Staffing Rate Index) and the specific output: all-inclusive W-2 hourly bill rates by role from 407 markets, with a typical rate plus the national range. It also explicitly distinguishes itself from related tools like get_role_pricing and plan_staffing by stating what the tool is NOT for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit and actionable. It provides example queries, states when to use the tool ('What do event staff cost in 2026?', 'Industry benchmark'), and gives clear exclusions: do not use for one city's price (use get_role_pricing) or to build a budget (use plan_staffing).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_role_pricingGet Role PricingA
Read-only
Inspect

Get the all-inclusive hourly rate range for a specific role in a specific city. Perfect for 'What does it cost to hire brand ambassadors in [city]?', 'How much are registration workers in [city]?', or 'What's the rate for ushers at a [city] stadium event?' questions. All rates include W-2 worker pay, workers comp, general liability, and payroll taxes. DO NOT use for availability or dates (use check_availability) and never present the range as a binding quote. For a multi-role budget, use plan_staffing. get_role_pricing(role='Brand Ambassadors', city='Boston') ; get_role_pricing(role='registration-staff', city='nashville-event-staffing') Role and city accept names or slugs. Brand Ambassadors floor at $40/hour in every market.

NameRequiredDescriptionDefault
cityYesCity name (e.g., 'Boston') or slug (e.g., 'boston-event-staffing').
roleYesRole name (e.g., 'Brand Ambassadors') or slug (e.g., 'brand-ambassadors').

Output Schema

NameRequiredDescription
cityNo
noteNo
roleNo
errorNo
stateNo
currencyNo
city_tierNoMarket tier: hub = 25 major metros, mid = 128 secondary markets, small = 192 tertiary markets.
requestedNoEcho of the unmatched input.
role_noteNoCaveat about the resolved role (e.g. 'security' maps to unarmed Crowd Control, not licensed security).
role_slugNo
city_foundNoPresent (false) only when the city didn't match.
role_foundNoPresent (false) only when the role didn't match.
suggestionNoClosest known city/role for a miss. Confirm with the user before using it; do not auto-apply.
all_inclusiveNo
pricing_notesNo
available_rolesNoThe valid role catalog, returned when the role didn't match.
tier_definitionNo
fallback_pricingNoAll-tier pricing shown when the city didn't match.
hourly_range_lowNo
hourly_range_highNo
all_tiers_for_contextNoRate bands across all three market tiers for context.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context by explaining that rates are all-inclusive, non-binding, and not a quote, which shapes how the agent should present results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: it defines output semantics, gives user-style queries, routes to alternatives, adds exclusion guidance, and provides examples and hints. It is front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read-only tool with a full output schema, the description is complete: it states the exact inputs, the meaning of the returned range, the non-binding caveat, and alternative tools for related tasks.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions already cover 100% of the parameters with names and slug examples. The description adds value beyond the schema with call examples and a useful pricing hint: 'Brand Ambassadors floor at $40/hour in every market.' This helps agents choose valid parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get the all-inclusive hourly rate range for a specific role in a specific city.' It clearly distinguishes itself from siblings like check_availability and plan_staffing through question examples and explicit exclusions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance with natural language examples, and explicit when-not-to-use guidance: 'DO NOT use for availability or dates (use check_availability)' and 'For a multi-role budget, use plan_staffing.' This leaves little ambiguity about tool routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_rolesGet RolesA
Read-only
Inspect

List event staffing roles TempGuru provides, with descriptions and skill tiers. Perfect for 'What kinds of event workers can I hire?', 'What roles do you staff for trade shows / festivals / corporate events?', or 'Do you have brand ambassadors?' questions. DO NOT use for what a role costs, use get_role_pricing with a city. get_roles() Returned slugs (brand-ambassadors, registration-staff, team-leads) are the exact values the other tools accept.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
rolesYes
totalYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description does not need to restate safety. It adds useful behavioral context beyond annotations: the tool returns slugs that are the exact values other tools accept, and that entries include descriptions and skill tiers. This helps the agent predict integration behavior, meriting a score above baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is slightly longer than typical for zero parameters but each element earns its place: the first sentence states the core purpose, the question examples clarify usage, the DO NOT sentence provides routing, and the hints add cross-tool integration value. It is structured with clear separation, just slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only tool with a high-quality output schema, the description covers everything an agent needs: what the tool does, when to use it, when to avoid it, how it integrates with other tools, and expected content. No meaningful gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and 100% schema coverage, so no parameter documentation is needed. The description further reinforces this with an example call get_roles() showing it accepts no arguments, which is helpful for the agent. A 4 aligns with the 0-parameter baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List event staffing roles TempGuru provides') and immediately separates itself from get_role_pricing by explicitly naming it as the alternative for cost questions. The example user questions anchor the resource in concrete intents, leaving no ambiguity about what get_roles returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use signals via representative question examples ('What kinds of event workers can I hire?', 'Do you have brand ambassadors?') and explicitly states when not to use it ('DO NOT use for what a role costs, use get_role_pricing with a city'). Names the sibling tool directly, leaving no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_staffingPlan StaffingAInspect

CALL THIS FIRST for event staffing requests. Returns a configured-market catalog match, role-level W-2 rate math, estimated totals, tier-based lead-time guidance, and state compliance flags from the event's city, date, roles, and headcount. It does not confirm order coverage or live inventory; a coordinator does that after buyer submission. Use granular tools only for a single rate, date, or state fact. A complete plan may save a non-contact snapshot for 30 days and return plan_id plus continuation. If it returns no plan_id and the buyer needs persistence, call save_staffing_plan once; never save a plan that already has an ID. This tool never accepts or submits contact details, reserves staff, or creates a quote request. Omit roles for the catalog and a suggested mix. Treat totals as planning estimates, not quotes. Branch on status: plan, needs_roles, roles_not_found, or city_not_found; confirm suggestions rather than auto-applying them.

NameRequiredDescriptionDefault
cityYesEvent city, name or slug (e.g., 'Chicago').
rolesNoRoles and headcount. Omit to receive the role catalog and a suggested mix.
attendeesNoExpected attendee count.
event_dateNoEvent date as YYYY-MM-DD; legacy recognizable dates are still accepted.
event_typeNotrade-show, conference, festival, concert, sporting-event, corporate, brand-activation, or other.
descriptionNoOptional free-text event description, echoed into the plan.

Output Schema

NameRequiredDescription
tipNo
eventNo
statusYesDiscriminator. Branch on this before reading the rest.
messageNo
plan_idNoComplete plans only. Non-PII plan reference retained for 30 days when Redis persistence succeeds.
lead_timeNo
complianceNo
next_stepsNo
plan_linesNo
suggestionNoClosest known city/role for a miss. Confirm with the user before using it; do not auto-apply.
continuationNoComplete plans only. Prefilled website handoff; may be present without plan_id when storage fails open.
plan_completeNostatus:plan only. false = one or more requested roles could not be priced and are EXCLUDED from all totals (see unpriced_roles) — resolve them and re-plan before presenting a budget or quoting.
requested_cityNo
staffing_notesNo
unpriced_rolesNostatus:plan with plan_complete:false — the requested lines missing from every total.
available_rolesNo
requested_rolesNo
unresolved_rolesNo
estimated_total_rangeNo
overtime_adjusted_total_rangeNoPresent (non-null) only when daily/weekly OT (or a double-time band) applies to the schedule.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-read-only, non-destructive, non-idempotent, closed-world tool; the description explains why (it may persist a non-contact 30-day snapshot and return a plan_id) and what it explicitly will not do: accept contact details, reserve staff, or create a quote request. It also sets the interpretation boundary for outputs (totals are planning estimates, not quotes) and states that live inventory/coverage is confirmed by a human coordinator — context the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the imperative call-to-action and ordered sensibly: what it returns, what it excludes, follow-up save rule, then status branching. It runs long and spends two separate sentences on negative disclosures (no coverage/inventory, no contacts/reservations/quotes) that could be consolidated, but nearly every sentence carries actionable information for a workflow-entry tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is not required, and the description instead covers the parts an agent cannot infer: sequencing across siblings, the 30-day snapshot/plan_id persistence model, the status branches (plan, needs_roles, roles_not_found, city_not_found), and the instruction to confirm rather than auto-apply suggested roles. Nothing needed to invoke or follow up correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every field including defaults, bounds, and the enum. The description reinforces only the one non-obvious behavior (omitting roles yields a catalog plus suggested mix) and otherwise describes inputs collectively as "city, date, roles, and headcount." Baseline 3 is appropriate when the schema carries the parameter burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (plan event staffing) and enumerates exactly what the response contains: catalog match, W-2 rate math, estimated totals, lead-time guidance, and compliance flags. It explicitly separates itself from the granular siblings (get_rate_benchmark, get_role_pricing, get_compliance_by_state) and from request_quote/save_staffing_plan, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"CALL THIS FIRST" gives an explicit entry-point rule, and "Use granular tools only for a single rate, date, or state fact" names the exact condition that selects the alternatives. It also covers the follow-up decision tree — call save_staffing_plan once only if no plan_id is returned, never re-save an existing plan — and tells the agent to omit roles for the catalog path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_quoteRequest QuoteA
Read-onlyIdempotent
Inspect

Use only after the buyer reviews a staffing plan and asks to proceed. Requires the saved non-PII plan_id from plan_staffing or save_staffing_plan and returns a prefilled TempGuru-owned review form. This tool never accepts or transmits names, email, phone, company, or other contact details and never creates a CRM lead or quote reference. The buyer must open form_url, review the plan, enter their own details, and submit it; only that submission creates a lead. This is not a reservation and does not guarantee pricing or availability. If a complete plan has continuation.form_url but no plan_id, give that URL directly instead. Never collect contact details for an MCP call; re-run an expired plan.

NameRequiredDescriptionDefault
plan_idYesSaved non-PII plan reference returned by plan_staffing or save_staffing_plan.
skill_idNoOptional canonical TempGuru skill that assembled the plan.
skill_versionNoOptional version of the TempGuru staffing skill used.
source_platformNoOptional agent/platform attribution, e.g. claude-ai, openclaw, or hermes.

Output Schema

NameRequiredDescription
messageYesHuman-readable outcome to relay to the buyer.
plan_idYes
form_urlNoPrefilled TempGuru-owned review form. Present only when handoff_ready is true.
next_stepsYesSafe next actions; no agent-side contact collection.
plan_foundYesWhether the supplied non-PII plan_id resolved before expiry.
handoff_readyYestrue when the saved plan resolved and a prefilled buyer form URL was created.
buyer_submission_requiredYesAlways true. The buyer, not the agent, must enter contact details and submit the form.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already carry readOnlyHint, idempotentHint, and destructiveHint, but the description adds meaningful non-obvious behavior: it never transmits contact information, never creates a lead itself, requires the buyer to open and submit the form, and does not reserve or guarantee pricing/availability. There is no contradiction with the annotation object.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the trigger condition and key requirement. It is arguably a little long and contains a couple of repeated privacy-related caveats, but each sentence carries a meaningful operational or safety instruction for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the schema covers all parameters, an output schema exists, and annotations cover the read-only behavior, the description supplies what is left: preconditions, fallback behavior, expiration handling, and the PII boundary. The tool is fully covered from the perspective of an agent deciding whether and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline applies. The description does reinforce that plan_id must be a saved non-PII plan reference from plan_staffing or save_staffing_plan, but it adds no new meaning for skill_id, skill_version, or source_platform beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: after a buyer asks to proceed, return a TempGuru-owned pre-filled review form for a saved plan_id. It explicitly states the tool does not create a quote reference or CRM lead, which clearly distinguishes its purpose from quote-status or lead-creation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger condition, required input source, and the buyer's required follow-up action. It also gives concrete when-not guidance by saying to give continuation.form_url directly when no plan_id exists, to never collect contact details, and to re-run an expired plan.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_staffing_planSave Staffing PlanAInspect

Explicitly save a complete non-contact staffing plan for 30 days so it can be shared, resumed, or linked to a later quote request. Use only when plan_staffing returned plan_complete:true without a plan_id and the user needs persistence. Never call this tool when plan_staffing already returned a plan_id. Provide the same confirmed city, date, event type, attendees, roles, headcount, hours, and days; the server recomputes rates, totals, lead time, and compliance before saving and does not accept caller-supplied pricing or totals. This does not reserve staff, submit contact details, or request a quote. Branch on status: saved is the only outcome with a durable plan_id; plan_incomplete requires revising the inputs; for rate_limited or storage_unavailable, give the buyer continuation.form_url directly because request_quote requires a saved plan_id.

NameRequiredDescriptionDefault
cityYesEvent city, name or slug (e.g. Chicago).
rolesYesConfirmed roles, headcount, hours, and days to recompute and save.
attendeesNoExpected attendee count.
event_dateNoEvent date as YYYY-MM-DD; legacy recognizable dates are still accepted.
event_typeNotrade-show, conference, festival, concert, sporting-event, corporate, brand-activation, or other.

Output Schema

NameRequiredDescription
statusYesDiscriminator. Only status:saved means a resumable plan_id exists.
messageYes
plan_idNo12-character reference for the saved non-PII snapshot.
created_atNo
expires_atNoConservative 30-day expiry for the saved snapshot.
plan_statusNoPlanner branch that prevented persistence.
continuationNo
next_actionsYes
resource_uriNoPublic no-store REST URI that restores the saved artifact.
schema_versionNo
quote_readinessNoThe buyer must open the handoff form and personally submit their contact details.
retry_after_secondsNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, non-idempotent, non-destructive write, and the description adds substantial context beyond them: the server recomputes rates, totals, lead time, and compliance and rejects caller-supplied pricing. It also explicitly scopes what the tool does NOT do (reserve staff, submit contact details, request a quote) and describes the full status-branch behavior for saved, plan_incomplete, rate_limited, and storage_unavailable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and gating condition are front-loaded before the behavioral warnings, and every sentence carries signal—including the hints block, which is load-bearing for error handling. It is somewhat dense and long, and the 'Provide the same confirmed…' sentence could be tightened, but there is no true filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is not required, yet the description still explains the status outcomes an agent must branch on. Combined with the explicit non-goals and the input-recomputation rule, an agent has everything needed to invoke this correctly and handle its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description enumerates the inputs to supply ('city, date, event type, attendees, roles, headcount, hours, and days'), which maps to all five top-level parameters plus nested fields. It adds the semantic constraint that these must be the same confirmed values and that no pricing or totals may be supplied—a rule not expressible in the schema. With 100% schema coverage already documenting formats and defaults, this is solid added value rather than full burden-carrying.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Explicitly save a complete non-contact staffing plan for 30 days,' with the stated purpose ('shared, resumed, or linked to a later quote request'). It distinguishes itself from plan_staffing and request_quote by name, so an agent can tell which to call without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit positive trigger ('only when plan_staffing returned plan_complete:true without a plan_id and the user needs persistence') and an explicit negative trigger ('never call this tool when plan_staffing already returned a plan_id'). The hints block further routes by status code and names the fallback (continuation.form_url) when saving fails.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 6 tool updatesv1.7.3
    • Changedcheck_availability2 fields changed
      • removedOutput schema / properties / role_found / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / role_found / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
    • Changedget_compliance_by_state4 fields changed
      • removedOutput schema / properties / min_wage_as_of / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / min_wage_as_of / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / min_wage_source / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / min_wage_source / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedget_plan9 fields changed
      • removedOutput schema / properties / offer_note
        Removed value: -{
        -  "description": "Published first-order offer note. Snapshot totals remain undiscounted.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / snapshot / properties / compliance_jurisdiction / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / snapshot / properties / compliance_jurisdiction / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / snapshot / properties / event / properties / event_date / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / snapshot / properties / event / properties / event_date / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / snapshot / properties / event / properties / event_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / snapshot / properties / event / properties / event_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / snapshot / properties / source / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / snapshot / properties / source / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedget_policies6 fields changed
      • changedInput schema / properties / topic / enum
        Previous value: -[
        -  "minimum-booking-hours",
        -  "cancellation-rescheduling",
        -  "no-show-backfill",
        -  "coi-additional-insured",
        -  "payment-terms",
        -  "background-checks",
        -  "order-confirmation",
        -  "quote-response",
        -  "offers"
        -]New value: +[
        +  "minimum-booking-hours",
        +  "cancellation-rescheduling",
        +  "no-show-backfill",
        +  "coi-additional-insured",
        +  "payment-terms",
        +  "background-checks",
        +  "order-confirmation",
        +  "quote-response"
        +]
      • removedOutput schema / properties / policies / items / properties / cap_usd
        Removed value: -{
        -  "type": "number"
        -}
      • removedOutput schema / properties / policies / items / properties / code
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / policies / items / properties / discount_percent
        Removed value: -{
        -  "type": "number"
        -}
      • removedOutput schema / properties / policies / items / properties / expires
        Removed value: -{
        -  "description": "Offer expiry date in YYYY-MM-DD format.",
        -  "format": "date",
        -  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        -  "type": "string"
        -}
      • removedOutput schema / properties / policies / items / properties / scope
        Removed value: -{
        -  "type": "string"
        -}
    • Changedplan_staffing10 fields changed
      • changedOutput schema / properties / compliance / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "citation_note": {
        -        "type": "string"
        -      },
        -      "currency_note": {
        -        "type": "string"
        -      },
        -      "data_current_as_of": {
        -        "description": "Date the jurisdiction dataset was last verified (YYYY-MM-DD).",
        -        "type": "string"
        -      },
        -      "data_version": {
        -        "description": "Version identifier for the jurisdiction dataset used by the plan.",
        -        "type": "string"
        -      },
        -      "jurisdiction": {
        -        "description": "US state or Canadian province the rules below belong to.",
        -        "type": "string"
        -      },
        -      "min_wage_as_of": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Effective date of the stored wage floor; null when no wage is stored."
        -      },
        -      "min_wage_source": {
        -        "anyOf": [
        -          {
        -            "format": "uri",
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Authoritative wage source; null for Canadian plans where the coordinator confirms the floor."
        -      },
        -      "min_wage_usd": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "US states only; null for Canadian provinces (coordinator confirms provincial wage floors)."
        -      },
        -      "note": {
        -        "type": "string"
        -      },
        -      "overtime_daily_hours": {
        -        "anyOf": [
        -          {
        -            "maximum": 9007199254740991,
        -            "minimum": -9007199254740991,
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "overtime_weekly_hours": {
        -        "anyOf": [
        -          {
        -            "maximum": 9007199254740991,
        -            "minimum": -9007199254740991,
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "unique_rules": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "jurisdiction",
        -      "min_wage_usd",
        -      "overtime_weekly_hours",
        -      "overtime_daily_hours",
        -      "unique_rules",
        -      "data_version",
        -      "data_current_as_of",
        -      "min_wage_as_of",
        -      "min_wage_source",
        -      "currency_note",
        -      "citation_note",
        -      "note"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "citation_note": {
        +        "type": "string"
        +      },
        +      "currency_note": {
        +        "type": "string"
        +      },
        +      "data_current_as_of": {
        +        "description": "Date the jurisdiction dataset was last verified (YYYY-MM-DD).",
        +        "type": "string"
        +      },
        +      "data_version": {
        +        "description": "Version identifier for the jurisdiction dataset used by the plan.",
        +        "type": "string"
        +      },
        +      "jurisdiction": {
        +        "description": "US state or Canadian province the rules below belong to.",
        +        "type": "string"
        +      },
        +      "min_wage_as_of": {
        +        "description": "Effective date of the stored wage floor; null when no wage is stored.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "min_wage_source": {
        +        "anyOf": [
        +          {
        +            "format": "uri",
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Authoritative wage source; null for Canadian plans where the coordinator confirms the floor."
        +      },
        +      "min_wage_usd": {
        +        "description": "US states only; null for Canadian provinces (coordinator confirms provincial wage floors).",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "note": {
        +        "type": "string"
        +      },
        +      "overtime_daily_hours": {
        +        "anyOf": [
        +          {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "overtime_weekly_hours": {
        +        "anyOf": [
        +          {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "unique_rules": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "jurisdiction",
        +      "min_wage_usd",
        +      "overtime_weekly_hours",
        +      "overtime_daily_hours",
        +      "unique_rules",
        +      "data_version",
        +      "data_current_as_of",
        +      "min_wage_as_of",
        +      "min_wage_source",
        +      "currency_note",
        +      "citation_note",
        +      "note"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / event / properties / attendees / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / event / properties / attendees / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / event / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / event / properties / description / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / event / properties / event_date / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / event / properties / event_date / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / event / properties / event_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / event / properties / event_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / offer_note
        Removed value: -{
        -  "description": "Published first-order offer note. Totals remain undiscounted planning estimates.",
        -  "type": "string"
        -}
    • Changedsave_staffing_plan2 fields changed
      • changedOutput schema / properties / created_at / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
      • changedOutput schema / properties / expires_at / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
  2. 12 tool updatesv1.7.1
    • Changedcheck_availability4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / date / description
        Previous value: -"Event date in ISO format (YYYY-MM-DD) or any date string parseable by Date()."New value: +"Event date as YYYY-MM-DD; legacy recognizable dates are still accepted."
      • addedInput schema / properties / date / format
        Added value: +"date"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "catalog_match": {
        +      "const": true,
        +      "type": "boolean"
        +    },
        +    "city": {
        +      "type": "string"
        +    },
        +    "city_found": {
        +      "description": "false = city did not match the configured catalog (see message); true = planning guidance below, not confirmed coverage.",
        +      "type": "boolean"
        +    },
        +    "city_tier": {
        +      "description": "Market tier: hub = 25 major metros, mid = 128 secondary markets, small = 192 tertiary markets.",
        +      "enum": [
        +        "hub",
        +        "mid",
        +        "small"
        +      ],
        +      "type": "string"
        +    },
        +    "count": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Echo of the requested headcount."
        +    },
        +    "coverage_confirmation_required": {
        +      "const": true,
        +      "type": "boolean"
        +    },
        +    "days_until_event": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "error": {
        +      "description": "Present when the date could not be parsed.",
        +      "type": "string"
        +    },
        +    "event_date": {
        +      "description": "Normalized ISO date (YYYY-MM-DD).",
        +      "type": "string"
        +    },
        +    "in_past": {
        +      "description": "True when the requested date is already in the past — confirm the date before planning.",
        +      "type": "boolean"
        +    },
        +    "message": {
        +      "description": "Present when city_found is false.",
        +      "type": "string"
        +    },
        +    "notes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "recommendation": {
        +      "description": "Lead-time guidance, NOT a reservation. Even rush is worth submitting.",
        +      "enum": [
        +        "yes",
        +        "tight",
        +        "rush",
        +        "very-rush"
        +      ],
        +      "type": "string"
        +    },
        +    "requested": {
        +      "description": "Echo of the unmatched city input.",
        +      "type": "string"
        +    },
        +    "role": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "all_inclusive": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "rate_range_usd": {
        +              "additionalProperties": false,
        +              "description": "All-inclusive hourly rate band (worker pay + payroll taxes + workers comp + liability).",
        +              "properties": {
        +                "high": {
        +                  "description": "Upper end of the hourly rate range.",
        +                  "type": "number"
        +                },
        +                "low": {
        +                  "description": "Lower end of the hourly rate range.",
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "low",
        +                "high"
        +              ],
        +              "type": "object"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "rate_range_usd",
        +            "all_inclusive"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Rate context when a role was provided; null otherwise."
        +    },
        +    "role_found": {
        +      "anyOf": [
        +        {
        +          "type": "boolean"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "null = no role requested; false = the requested role didn't match the catalog (see notes)."
        +    },
        +    "role_suggestion": {
        +      "additionalProperties": false,
        +      "description": "Closest known city/role for a miss. Confirm with the user before using it; do not auto-apply.",
        +      "properties": {
        +        "kind": {
        +          "enum": [
        +            "city",
        +            "role"
        +          ],
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "slug",
        +        "name"
        +      ],
        +      "type": "object"
        +    },
        +    "state": {
        +      "type": "string"
        +    },
        +    "suggestion": {
        +      "additionalProperties": false,
        +      "description": "Closest known city/role for a miss. Confirm with the user before using it; do not auto-apply.",
        +      "properties": {
        +        "kind": {
        +          "enum": [
        +            "city",
        +            "role"
        +          ],
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "slug",
        +        "name"
        +      ],
        +      "type": "object"
        +    },
        +    "typical_lead_time_hours": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "city_found"
        +  ],
        +  "type": "object"
        +}
    • Changedget_cities5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / city
        Added value: +{
        +  "description": "Optional single-city catalog match (nickname/borough aware). Returns catalog_match plus a suggestion; never a coverage promise.",
        +  "type": "string"
        +}
      • addedInput schema / properties / country
        Added value: +{
        +  "description": "Optional country filter: 'US' or 'CA'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Optional cap on the number of cities returned (full counts still in total/tier_breakdown).",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "catalog_check": {
        +      "const": true,
        +      "description": "Present when a single-city catalog check was requested.",
        +      "type": "boolean"
        +    },
        +    "catalog_match": {
        +      "description": "Whether the city resolved to a configured catalog entry; not an availability or coverage promise.",
        +      "type": "boolean"
        +    },
        +    "catalog_qualification": {
        +      "type": "string"
        +    },
        +    "cities": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "country": {
        +            "description": "US or CA.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "slug": {
        +            "type": "string"
        +          },
        +          "state": {
        +            "type": "string"
        +          },
        +          "state_abbr": {
        +            "type": "string"
        +          },
        +          "tier": {
        +            "description": "Market tier: hub = 25 major metros, mid = 128 secondary markets, small = 192 tertiary markets.",
        +            "enum": [
        +              "hub",
        +              "mid",
        +              "small"
        +            ],
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "City detail page on tempguru.co.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "slug",
        +          "name",
        +          "state",
        +          "state_abbr",
        +          "country",
        +          "tier",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "city": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "country": {
        +              "description": "US or CA.",
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "slug": {
        +              "type": "string"
        +            },
        +            "state": {
        +              "type": "string"
        +            },
        +            "state_abbr": {
        +              "type": "string"
        +            },
        +            "tier": {
        +              "description": "Market tier: hub = 25 major metros, mid = 128 secondary markets, small = 192 tertiary markets.",
        +              "enum": [
        +                "hub",
        +                "mid",
        +                "small"
        +              ],
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "City detail page on tempguru.co.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "slug",
        +            "name",
        +            "state",
        +            "state_abbr",
        +            "country",
        +            "tier",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The matched configured entry, or null when there was no catalog match."
        +    },
        +    "coverage_confirmation_required": {
        +      "const": true,
        +      "type": "boolean"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "Present when the list was truncated by limit.",
        +      "type": "string"
        +    },
        +    "requested": {
        +      "type": "string"
        +    },
        +    "returned": {
        +      "description": "Number of cities in the cities array (after limit).",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "suggestion": {
        +      "additionalProperties": false,
        +      "description": "Closest known city/role for a miss. Confirm with the user before using it; do not auto-apply.",
        +      "properties": {
        +        "kind": {
        +          "enum": [
        +            "city",
        +            "role"
        +          ],
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "slug",
        +        "name"
        +      ],
        +      "type": "object"
        +    },
        +    "tier_breakdown": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "hub": {
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "mid": {
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "small": {
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "hub",
        +        "mid",
        +        "small"
        +      ],
        +      "type": "object"
        +    },
        +    "total": {
        +      "description": "Total cities matching the filter (before limit).",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_compliance_by_state2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "available_states": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "abbr": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "abbr",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "citation_note": {
        +      "description": "Operational guidance, not legal advice.",
        +      "type": "string"
        +    },
        +    "currency_note": {
        +      "description": "Reminder that wages change annually; verify before relying.",
        +      "type": "string"
        +    },
        +    "data_current_as_of": {
        +      "description": "Date the compliance dataset was last verified (YYYY-MM-DD).",
        +      "type": "string"
        +    },
        +    "data_version": {
        +      "description": "Version of the compliance dataset used for this result.",
        +      "type": "string"
        +    },
        +    "liability_coverage_included": {
        +      "type": "boolean"
        +    },
        +    "min_wage_as_of": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Effective date of this state's stored minimum wage."
        +    },
        +    "min_wage_source": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Authoritative source URL for the minimum wage figure."
        +    },
        +    "min_wage_usd": {
        +      "description": "2026 state minimum wage.",
        +      "type": "number"
        +    },
        +    "overtime_daily_double_hours": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Start of the double-time band (hours/day) where the state has one (CA: 12); null otherwise."
        +    },
        +    "overtime_threshold_daily_hours": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Daily overtime threshold where the state has one (CA, AK, NV, CO); null otherwise."
        +    },
        +    "overtime_threshold_weekly_hours": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "requested": {
        +      "type": "string"
        +    },
        +    "seventh_day_overtime": {
        +      "description": "True where a seventh-consecutive-day premium applies (CA).",
        +      "type": "boolean"
        +    },
        +    "state": {
        +      "type": "string"
        +    },
        +    "state_abbr": {
        +      "type": "string"
        +    },
        +    "state_found": {
        +      "const": false,
        +      "description": "Present (false) only when the state didn't match.",
        +      "type": "boolean"
        +    },
        +    "unique_rules": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "w2_note": {
        +      "type": "string"
        +    },
        +    "w2_required": {
        +      "type": "boolean"
        +    },
        +    "workers_comp_included": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedget_plan
    • Addedget_policies
    • Addedget_quote_status
    • Addedget_rate_benchmark
    • Changedget_role_pricing2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "all_inclusive": {
        +      "type": "string"
        +    },
        +    "all_tiers_for_context": {
        +      "additionalProperties": false,
        +      "description": "Rate bands across all three market tiers for context.",
        +      "properties": {
        +        "hub": {
        +          "additionalProperties": false,
        +          "description": "All-inclusive hourly rate band (worker pay + payroll taxes + workers comp + liability).",
        +          "properties": {
        +            "high": {
        +              "description": "Upper end of the hourly rate range.",
        +              "type": "number"
        +            },
        +            "low": {
        +              "description": "Lower end of the hourly rate range.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "low",
        +            "high"
        +          ],
        +          "type": "object"
        +        },
        +        "mid": {
        +          "additionalProperties": false,
        +          "description": "All-inclusive hourly rate band (worker pay + payroll taxes + workers comp + liability).",
        +          "properties": {
        +            "high": {
        +              "description": "Upper end of the hourly rate range.",
        +              "type": "number"
        +            },
        +            "low": {
        +              "description": "Lower end of the hourly rate range.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "low",
        +            "high"
        +          ],
        +          "type": "object"
        +        },
        +        "small": {
        +          "additionalProperties": false,
        +          "description": "All-inclusive hourly rate band (worker pay + payroll taxes + workers comp + liability).",
        +          "properties": {
        +            "high": {
        +              "description": "Upper end of the hourly rate range.",
        +              "type": "number"
        +            },
        +            "low": {
        +              "description": "Lower end of the hourly rate range.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "low",
        +            "high"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "small",
        +        "mid",
        +        "hub"
        +      ],
        +      "type": "object"
        +    },
        +    "available_roles": {
        +      "description": "The valid role catalog, returned when the role didn't match.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "slug": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "slug",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "city": {
        +      "type": "string"
        +    },
        +    "city_found": {
        +      "const": false,
        +      "description": "Present (false) only when the city didn't match.",
        +      "type": "boolean"
        +    },
        +    "city_tier": {
        +      "description": "Market tier: hub = 25 major metros, mid = 128 secondary markets, small = 192 tertiary markets.",
        +      "enum": [
        +        "hub",
        +        "mid",
        +        "small"
        +      ],
        +      "type": "string"
        +    },
        +    "currency": {
        +      "enum": [
        +        "USD",
        +        "CAD"
        +      ],
        +      "type": "string"
        +    },
        +    "error": {
        +      "type": "string"
        +    },
        +    "fallback_pricing": {
        +      "additionalProperties": false,
        +      "description": "All-tier pricing shown when the city didn't match.",
        +      "properties": {
        +        "hub": {
        +          "additionalProperties": false,
        +          "description": "All-inclusive hourly rate band (worker pay + payroll taxes + workers comp + liability).",
        +          "properties": {
        +            "high": {
        +              "description": "Upper end of the hourly rate range.",
        +              "type": "number"
        +            },
        +            "low": {
        +              "description": "Lower end of the hourly rate range.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "low",
        +            "high"
        +          ],
        +          "type": "object"
        +        },
        +        "mid": {
        +          "additionalProperties": false,
        +          "description": "All-inclusive hourly rate band (worker pay + payroll taxes + workers comp + liability).",
        +          "properties": {
        +            "high": {
        +              "description": "Upper end of the hourly rate range.",
        +              "type": "number"
        +            },
        +            "low": {
        +              "description": "Lower end of the hourly rate range.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "low",
        +            "high"
        +          ],
        +          "type": "object"
        +        },
        +        "small": {
        +          "additionalProperties": false,
        +          "description": "All-inclusive hourly rate band (worker pay + payroll taxes + workers comp + liability).",
        +          "properties": {
        +            "high": {
        +              "description": "Upper end of the hourly rate range.",
        +              "type": "number"
        +            },
        +            "low": {
        +              "description": "Lower end of the hourly rate range.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "low",
        +            "high"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "small",
        +        "mid",
        +        "hub"
        +      ],
        +      "type": "object"
        +    },
        +    "hourly_range_high": {
        +      "type": "number"
        +    },
        +    "hourly_range_low": {
        +      "type": "number"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "pricing_notes": {
        +      "type": "string"
        +    },
        +    "requested": {
        +      "description": "Echo of the unmatched input.",
        +      "type": "string"
        +    },
        +    "role": {
        +      "type": "string"
        +    },
        +    "role_found": {
        +      "const": false,
        +      "description": "Present (false) only when the role didn't match.",
        +      "type": "boolean"
        +    },
        +    "role_note": {
        +      "description": "Caveat about the resolved role (e.g. 'security' maps to unarmed Crowd Control, not licensed security).",
        +      "type": "string"
        +    },
        +    "role_slug": {
        +      "type": "string"
        +    },
        +    "state": {
        +      "type": "string"
        +    },
        +    "suggestion": {
        +      "additionalProperties": false,
        +      "description": "Closest known city/role for a miss. Confirm with the user before using it; do not auto-apply.",
        +      "properties": {
        +        "kind": {
        +          "enum": [
        +            "city",
        +            "role"
        +          ],
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "slug",
        +        "name"
        +      ],
        +      "type": "object"
        +    },
        +    "tier_definition": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_roles2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "roles": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "skill_tier": {
        +            "description": "1 (entry) to 5 (lead).",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "slug": {
        +            "description": "Use this slug in pricing/availability lookups.",
        +            "type": "string"
        +          },
        +          "typical_shift_length_hours": {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "slug",
        +          "name",
        +          "description",
        +          "skill_tier",
        +          "typical_shift_length_hours",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "total",
        +    "roles"
        +  ],
        +  "type": "object"
        +}
    • Addedplan_staffing
    • Changedrequest_quote20 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / attire
        Removed value: -{
        -  "description": "Staff attire requirements",
        -  "type": "string"
        -}
      • removedInput schema / properties / budget_range
        Removed value: -{
        -  "description": "Estimated total budget range if calculated, e.g. '$8,400–$12,600'",
        -  "type": "string"
        -}
      • removedInput schema / properties / city
        Removed value: -{
        -  "description": "City where the event is held",
        -  "type": "string"
        -}
      • removedInput schema / properties / company
        Removed value: -{
        -  "description": "Company or organization name",
        -  "type": "string"
        -}
      • removedInput schema / properties / compliance_notes
        Removed value: -{
        -  "description": "Any compliance flags surfaced by get_compliance_by_state",
        -  "type": "string"
        -}
      • removedInput schema / properties / contact_email
        Removed value: -{
        -  "description": "Contact email address for the quote response",
        -  "format": "email",
        -  "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        -  "type": "string"
        -}
      • removedInput schema / properties / contact_name
        Removed value: -{
        -  "description": "Full name of the contact person",
        -  "type": "string"
        -}
      • removedInput schema / properties / event_dates
        Removed value: -{
        -  "description": "Event dates as a human-readable string, e.g. 'June 15–17, 2026'",
        -  "type": "string"
        -}
      • removedInput schema / properties / event_name
        Removed value: -{
        -  "description": "Name of the event (e.g. 'HIMSS 2026', 'Brand Fest Austin')",
        -  "type": "string"
        -}
      • removedInput schema / properties / event_type
        Removed value: -{
        -  "description": "Event type: trade-show, conference, festival, concert, sporting-event, corporate, brand-activation, or other",
        -  "type": "string"
        -}
      • addedInput schema / properties / plan_id
        Added value: +{
        +  "description": "Saved non-PII plan reference returned by plan_staffing or save_staffing_plan.",
        +  "maxLength": 12,
        +  "pattern": "^[A-HJ-NP-Z2-9]{12}$",
        +  "type": "string"
        +}
      • removedInput schema / properties / roles
        Removed value: -{
        -  "description": "Roles and headcount needed for the event",
        -  "items": {
        -    "properties": {
        -      "headcount": {
        -        "description": "Number of staff needed",
        -        "exclusiveMinimum": 0,
        -        "maximum": 9007199254740991,
        -        "type": "integer"
        -      },
        -      "role": {
        -        "description": "Staffing role name, e.g. brand-ambassadors, registration-staff",
        -        "type": "string"
        -      },
        -      "shifts": {
        -        "description": "Shift description, e.g. '2 days × 8h'",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "role",
        -      "headcount"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • addedInput schema / properties / skill_id
        Added value: +{
        +  "description": "Optional canonical TempGuru skill that assembled the plan.",
        +  "enum": [
        +    "event-staffing-ordering",
        +    "event-staffing-compliance",
        +    "staffing-plan-from-event-brief",
        +    "urgent-event-backfill",
        +    "staffing-agency-partner-growth",
        +    "multi-city-activation-planner",
        +    "event-staffing-procurement",
        +    "tempguru-pro-operations"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / skill_version
        Added value: +{
        +  "description": "Optional version of the TempGuru staffing skill used.",
        +  "maxLength": 40,
        +  "minLength": 1,
        +  "pattern": "^[0-9]{1,4}\\.[0-9]{1,4}\\.[0-9]{1,4}(?:-[0-9A-Za-z.-]{1,24})?(?:\\+[0-9A-Za-z.-]{1,24})?$",
        +  "type": "string"
        +}
      • addedInput schema / properties / source_platform
        Added value: +{
        +  "description": "Optional agent/platform attribution, e.g. claude-ai, openclaw, or hermes.",
        +  "enum": [
        +    "ai-agent",
        +    "ai-page",
        +    "ai-page-zh",
        +    "baidu-agent",
        +    "chatgpt-app",
        +    "chatgpt-gpt",
        +    "claude-ai",
        +    "claude-code",
        +    "claude-desktop",
        +    "cn-agent",
        +    "copilot-agent",
        +    "coze",
        +    "coze-bot",
        +    "custom-gpt",
        +    "gemini",
        +    "gemini-cli",
        +    "gemini-gem",
        +    "hermes",
        +    "kimi",
        +    "langchain",
        +    "lechat-agent",
        +    "llamaindex",
        +    "manual-test",
        +    "meta-ai",
        +    "mcp-handoff",
        +    "open-webui",
        +    "openai-codex",
        +    "openclaw",
        +    "perplexity-space",
        +    "pi",
        +    "poe-bot",
        +    "postman",
        +    "prime-agent",
        +    "python-client",
        +    "skill",
        +    "team-demo",
        +    "website",
        +    "website-widget",
        +    "zhipu-agent",
        +    "openai-chatgpt",
        +    "openai-agents-sdk",
        +    "openai-mcp",
        +    "cursor",
        +    "cline",
        +    "windsurf",
        +    "perplexity",
        +    "qwen-ecosystem",
        +    "deepseek",
        +    "doubao",
        +    "mcp-client"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / special_requirements
        Removed value: -{
        -  "description": "Any special requirements: language skills, certifications, overnight shifts, etc.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "contact_name",
        -  "contact_email",
        -  "company",
        -  "event_name",
        -  "event_type",
        -  "city",
        -  "event_dates",
        -  "roles"
        -]New value: +[
        +  "plan_id"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "buyer_submission_required": {
        +      "const": true,
        +      "description": "Always true. The buyer, not the agent, must enter contact details and submit the form.",
        +      "type": "boolean"
        +    },
        +    "form_url": {
        +      "description": "Prefilled TempGuru-owned review form. Present only when handoff_ready is true.",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "handoff_ready": {
        +      "description": "true when the saved plan resolved and a prefilled buyer form URL was created.",
        +      "type": "boolean"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome to relay to the buyer.",
        +      "type": "string"
        +    },
        +    "next_steps": {
        +      "description": "Safe next actions; no agent-side contact collection.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "plan_found": {
        +      "description": "Whether the supplied non-PII plan_id resolved before expiry.",
        +      "type": "boolean"
        +    },
        +    "plan_id": {
        +      "pattern": "^[A-HJ-NP-Z2-9]{12}$",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "handoff_ready",
        +    "buyer_submission_required",
        +    "plan_found",
        +    "plan_id",
        +    "message",
        +    "next_steps"
        +  ],
        +  "type": "object"
        +}
    • Addedsave_staffing_plan
  3. 6 tool updatesv1.0.0
    • First observedcheck_availability
    • First observedget_cities
    • First observedget_compliance_by_state
    • First observedget_role_pricing
    • First observedget_roles
    • First observedrequest_quote

TDQS

A4.5/5.0

Scored across 12 tools

Disambiguation4/5

Most tools have crisply separated purposes and the descriptions actively cross-reference each other (get_rate_benchmark vs get_role_pricing vs plan_staffing, check_availability vs get_cities). The only real overlap risk is plan_staffing vs save_staffing_plan, which both recompute the same rate/total math; that boundary is heavily guarded with explicit 'never call when plan_id returned' rules but still requires careful reading.

Naming Consistency4/5

A predictable pattern holds: get_* for reads (get_plan, get_cities, get_roles, get_policies, get_role_pricing), action verbs for writes (plan_staffing, save_staffing_plan, check_availability, request_quote). Minor deviation: noun placement flips between plan_staffing and save_staffing_plan, and get_compliance_by_state is longer/qualifier-style, but nothing is ambiguous.

Tool Count5/5

12 tools is well inside the sweet spot and each maps to a distinct buyer question or lifecycle step (discovery, pricing, compliance, availability, plan persistence, quote handoff). No tool feels redundant filler or a missing sibling of another.

Completeness4/5

The surface covers the full non-contact lifecycle: find roles/markets, price, check lead time, check compliance and policies, build/save/restore a plan, and hand off to a quote form with status lookup. Gaps are deliberate (no order reservation or booking, quote status is a 'received/queued only' v1 stub, no cancellation tool beyond get_policies), which an agent can work around via the coordinator handoff.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    MCP server providing 12 tools for Seattle-area home remodeling: real-time cost estimation across 8 project types, contractor business info, project portfolio, blog content, and quote submission. Connects via Streamable HTTP — no auth required.
    36
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Production-ready MCP server for Greenhouse ATS with 175 tools for recruiting teams — manage candidates, applications, jobs, interviews, and hiring pipelines. Role-based profiles (full/recruiter/read-only), composite workflow tools for pipeline views, analytics, candidate search, and bulk operations.
    187
    29 PyPI
    5
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Full-coverage, read-only MCP server for the Teamtailor recruitment API. Exposes 18 tools covering candidates, jobs, applications, offers, stages, departments, locations, users, and activities with strict input validation.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Read-only MCP server that answers questions about turva.dev from its published data. Five tools return JSON: the service catalog with prices, contact and operator details, engagement principles and dated agent-readiness and security evidence with verification links. Connect over Streamable HTTP. You need no API key. The server does not scan other websites or run audits.
    MIT