ReelQuoteAI Survey Tool
by reelquoteai.com · remote · no sign-in to list tools · v1.1.0 · published by com.reelquoteai
Filmed moving surveys, itemized inventories, firm quotes and bookings for moving companies.
32 tools: 1 can delete or cancel things, 1 do something that can't be undone, 20 change things and 10 only read.
Scanned Oct 21, 2026
- Deletes or cancels1Claude Code: deny: see these tools
- Can't be undone1Claude Code: ask: see these tools
- Changes things20Claude Code: ask: see these tools
- Only reads10Claude Code: allow: see these tools
2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http survey-tool https://widget.reelquoteai.com/mcp --header 'Authorization: <your-authorization>'Findings
Matches of fixed checks, with the text they matched.
- Warnrevoke_key
The server marks "revoke_key" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}; The name "revoke_key" says "revoke": a word for removing or ending something.
- Warnresolve_address
The server marks "resolve_address" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}; The name "resolve_address" says "resolve": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
32 tools
Deletes or cancels 1Claude Code: deny
revoke_keyRevoke a key immediately.1 finding
Why it is in this group
- The name "revoke_key" says "revoke": a word for removing or ending something.
- The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.
Findings
- Warn
The server marks "revoke_key" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}; The name "revoke_key" says "revoke": a word for removing or ending something.
Description, as the server wrote it Revoke a key immediately. The only live publishable key is refused (409) — rotate it instead. A test key cannot revoke a live key (403 `mode_mismatch`). Scope: keys.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
Can't be undone 1Claude Code: ask
send_resume_linkEmail the customer their resume link.No findings
Why it is in this group
- The name "send_resume_link" says "send": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it Email the customer their resume link. Only on explicit request. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
Changes things 20Claude Code: ask
acknowledge_gapsRecord the customer's answer to the capture-gap prompts (inventory.gaps on GET /jobs/{id}).No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Record the customer's answer to the capture-gap prompts (inventory.gaps on GET /jobs/{id}). Body: { acknowledged: true } stamps "nothing is missing"; false clears it. The prompts themselves are recomputed from the current inventory on every read, so fixing a gap removes its prompt without this call. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
approve_inventoryCustomer sign-off on the inventory, plus free-text notes.No findings
Why it is in this group
- The name "approve_inventory" says "approve": a word for a change.
Description, as the server wrote it Customer sign-off on the inventory, plus free-text notes. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
ballpark_estimateInstant estimate range from home size + addresses.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Instant estimate range from home size + addresses. Free; never bookable. Scope: quote.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
complete_uploadAssemble a chunked upload.No findings
Why it is in this group
- The name "complete_upload" says "upload": a word for a change.
Description, as the server wrote it Assemble a chunked upload. Body: { upload_id, parts: [{ part_number, etag }] }. Only after every part has been PUT; then call /submit. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
confirm_accessConfirm floors / elevator / stairs / carry distance for both ends.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Confirm floors / elevator / stairs / carry distance for both ends. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
create_jobStart a job (the survey container).No findings
Why it is in this group
- The name "create_job" says "create": a word for a change.
Description, as the server wrote it Start a job (the survey container). Contact details are NOT accepted here — funnel rule. Send `Idempotency-Key` so a retry cannot create a second job. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
create_keyMint a key.No findings
Why it is in this group
- The name "create_key" says "create": a word for a change.
Description, as the server wrote it Mint a key. The raw secret is in THIS response only. A key can never mint one broader than itself; a test key mints only test keys; a live secret key may mint the sandbox pair. Scope: keys.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
create_upload_urlPresigned upload for the walkthrough video.No findings
Why it is in this group
- The name "create_upload_url" says "create": a word for a change.
Description, as the server wrote it Presigned upload for the walkthrough video. Requires stored contact email. Body: { content_type, consent, size }. Send the byte size: at or above 16 MB the response carries `multipart` (an upload_id, a part_size and a presigned PUT per part) instead of `upload`, and each part is retried on its own rather than restarting the whole video. Report each part's ETag to /upload-complete. Below the threshold, or if opening a multipart upload fails, the response is a single `upload`. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
edit_itemsEdit inventory (quantity, exclude, add by item_key).No findings
Why it is in this group
- The name "edit_items" says "edit": a word for a change.
Description, as the server wrote it Edit inventory (quantity, exclude, add by item_key). Response carries the re-priced quote. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
hand_off_videoServer-side handoff: give us a public https URL of the walkthrough instead of uploading it from a browser.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Server-side handoff: give us a public https URL of the walkthrough instead of uploading it from a browser. Secret key only. We fetch it (up to 500 MB, streamed) and the job runs exactly as an upload would — poll GET /jobs/{id}. Needs the stored contact email and consent, like /upload-url. Replaces /upload-url, /upload-complete and /submit for a caller that already holds the file. A job whose fetch failed (`error`) may be handed a new URL. Counts toward the mover's daily analysis cap (429). Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
quote_inventoryDirect pricing for agents: items or total_cuft in, firm quote out.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Direct pricing for agents: items or total_cuft in, firm quote out. Secret key only. Scope: quote.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
replay_webhook_deliveryRe-send one delivery to its endpoint: the same body byte for byte (same envelope id, so your dedupe still works) under a fresh signature, with the usual retries.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Re-send one delivery to its endpoint: the same body byte for byte (same envelope id, so your dedupe still works) under a fresh signature, with the usual retries. Returns the replay's own delivery record. Deliveries of the other mode are not found (404). Scope: keys.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
report_outcomeReport actuals (hours, final cents, crew).No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Report actuals (hours, final cents, crew). Secret key only. Scope: outcomes.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
request_bookingRequest the booking.No findings
Why it is in this group
- The name "request_booking" says "request": a word for a change.
Description, as the server wrote it Request the booking. Idempotent per job; requires approve:true (types-name-as-signature approval of the inventory + quote, stored with a quote snapshot) and accept_terms when the mover has terms. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
resolve_addressResolve a suggestion to a full address (same session_token).1 finding
Why it is in this group
- The name "resolve_address" says "resolve": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "resolve_address" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}; The name "resolve_address" says "resolve": a word for reading.
Description, as the server wrote it Resolve a suggestion to a full address (same session_token). Scope: quote.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
rotate_keyReplace a key with its twin (same kind, mode, scopes, label).No findings
Why it is in this group
- The description's first verb is "replace": a word for a change.
Description, as the server wrote it Replace a key with its twin (same kind, mode, scopes, label). The old key keeps working until `replaced.expires_at` so a deploy can swap values without a gap. Needs the `keys` scope even to rotate itself — rotate a scoped key with a full key or from the dashboard. A key is rotated once: rotating it again is a 409 `key_already_rotated`, and during its grace the old key cannot mint, rotate, revoke or read deliveries (403 `key_rotated`). A test key cannot rotate a live key (403 `mode_mismatch`). Scope: keys.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
set_contactStore customer email + optional name + move date.No findings
Why it is in this group
- The name "set_contact" says "set": a word for a change.
Description, as the server wrote it Store customer email + optional name + move date. Sends NOTHING — required before upload-url. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
set_move_dateSet or clear the move date; invalidates and recomputes the quote.No findings
Why it is in this group
- The name "set_move_date" says "set": a word for a change.
Description, as the server wrote it Set or clear the move date; invalidates and recomputes the quote. Refused after a booking is requested. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
submit_jobQueue the uploaded video for analysis.No findings
Why it is in this group
- The name "submit_job" says "submit": a word for a change.
Description, as the server wrote it Queue the uploaded video for analysis. Poll GET /jobs/{id} for status. Scope: jobs:write.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
suggest_addressesAddress autocomplete (proxied; send session_token).No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Address autocomplete (proxied; send session_token). Scope: quote.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- openWorldHint: false
Only reads 10Claude Code: allow
get_availabilityWhich days the mover has marked off, before a job exists.No findings
Why it is in this group
- The name "get_availability" says "get": a word for reading.
Description, as the server wrote it Which days the mover has marked off, before a job exists. Soft: a marked day can still be requested — the mover confirms and calls first — so steer to an open day when the customer has a choice. Scope: quote.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_cube_sheet_csvItemized cube sheet as CSV (Excel-ready): rooms, volumes, weights, exclusions.No findings
Why it is in this group
- The name "get_cube_sheet_csv" says "get": a word for reading.
Description, as the server wrote it Itemized cube sheet as CSV (Excel-ready): rooms, volumes, weights, exclusions. Secret key only. Scope: jobs:read.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_date_pricesThis job's quote priced across a ~2-week window from the mover's date rules.No findings
Why it is in this group
- The name "get_date_prices" says "get": a word for reading.
Description, as the server wrote it This job's quote priced across a ~2-week window from the mover's date rules. flat=true means every day prices the same. Scope: jobs:read.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_jobFull job state: status, inventory, quote, access, terms, move_date.No findings
Why it is in this group
- The name "get_job" says "get": a word for reading.
Description, as the server wrote it Full job state: status, inventory, quote, access, terms, move_date. Scope: jobs:read.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
get_sessionResolve the key to its mover (name, branding, config).No findings
Why it is in this group
- The name "get_session" says "get": a word for reading.
Description, as the server wrote it Resolve the key to its mover (name, branding, config). Scope: quote.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
list_home_profilesHome sizes for the ballpark step (2br_apt, 3br_house, …).No findings
Why it is in this group
- The name "list_home_profiles" says "list": a word for reading.
Description, as the server wrote it Home sizes for the ballpark step (2br_apt, 3br_house, …). Scope: quote.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
list_jobsList jobs for the tenant, newest first.No findings
Why it is in this group
- The name "list_jobs" says "list": a word for reading.
Description, as the server wrote it List jobs for the tenant, newest first. Secret key only. Paged: pass `limit` (1–100, default 25), optional `status`, and `cursor` from the previous page's `next_cursor` (null on the last page; a bad cursor is a 400). Scope: jobs:read.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
list_keysList the account's API keys — live and test, active and revoked.No findings
Why it is in this group
- The name "list_keys" says "list": a word for reading.
Description, as the server wrote it List the account's API keys — live and test, active and revoked. Never a raw secret. Secret key with the `keys` scope. Scope: keys.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
list_webhook_deliveriesThe delivery log: every webhook POST for 30 days, newest first, with its outcome and the exact body sent.No findings
Why it is in this group
- The name "list_webhook_deliveries" says "list": a word for reading.
Description, as the server wrote it The delivery log: every webhook POST for 30 days, newest first, with its outcome and the exact body sent. Secret key with the `keys` scope. A key reads the deliveries of its own mode: live keys the live log, test keys the sandbox log. Scope: keys.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
search_catalogSearch the cube-sheet catalog (?q=sofa).No findings
Why it is in this group
- The name "search_catalog" says "search": a word for reading.
Description, as the server wrote it Search the cube-sheet catalog (?q=sofa). Scope: quote.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.1.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http survey-tool https://widget.reelquoteai.com/mcp --header 'Authorization: <your-authorization>'Run in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__survey-tool__get_session",
"mcp__survey-tool__list_home_profiles",
"mcp__survey-tool__list_jobs",
"mcp__survey-tool__get_job",
"mcp__survey-tool__get_cube_sheet_csv",
"mcp__survey-tool__get_date_prices",
"mcp__survey-tool__get_availability",
"mcp__survey-tool__list_keys",
"mcp__survey-tool__list_webhook_deliveries",
"mcp__survey-tool__search_catalog"
],
"ask": [
"mcp__survey-tool__ballpark_estimate",
"mcp__survey-tool__create_job",
"mcp__survey-tool__set_contact",
"mcp__survey-tool__create_upload_url",
"mcp__survey-tool__complete_upload",
"mcp__survey-tool__submit_job",
"mcp__survey-tool__hand_off_video",
"mcp__survey-tool__confirm_access",
"mcp__survey-tool__edit_items",
"mcp__survey-tool__approve_inventory",
"mcp__survey-tool__acknowledge_gaps",
"mcp__survey-tool__send_resume_link",
"mcp__survey-tool__request_booking",
"mcp__survey-tool__report_outcome",
"mcp__survey-tool__set_move_date",
"mcp__survey-tool__quote_inventory",
"mcp__survey-tool__create_key",
"mcp__survey-tool__rotate_key",
"mcp__survey-tool__replay_webhook_delivery",
"mcp__survey-tool__suggest_addresses",
"mcp__survey-tool__resolve_address"
],
"deny": [
"mcp__survey-tool__revoke_key"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as survey-tool. Review it before you use it.