{"serverId":"mcp-registry/com.movingplace/mcp","tools":[{"name":"add_contact_note","fixed":{"name":"add_contact_note","description":"Adds a note to an existing contact in the partner's CRM and returns the new contact-event id. WRITE ACTION: this modifies partner CRM data. Requires the numeric contactId (e.g. from upsert_contact or find_contact_by_phone_or_email). If the contact does not exist, a plain-text not-found message is returned instead of throwing.","inputSchema":{"type":"object","required":["contactId","notes"],"properties":{"notes":{"type":"string","description":"The content of the note."},"contactId":{"type":"integer","description":"The numeric identifier of the contact to attach the note to."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":174,"tokensAfter":174},{"name":"book_labor_only_order","fixed":{"name":"book_labor_only_order","description":"Creates and books a Labor-Only Order in the marketplace. THIS BOOKS A REAL MOVE. Same-day bookings are not allowed; next-day has restrictions. Returns the raw booking result.","inputSchema":{"type":"object","required":["body"],"properties":{"body":{"type":"object","required":["dateOfJob","typeOfHelpNeeded","primaryLocation","arrivalWindow","contactInformation"],"properties":{"crewSize":{"type":"integer","maximum":12,"minimum":1},"jobNotes":{"type":["string","null"],"maxLength":6000},"dateOfJob":{"type":"string"},"laborHours":{"type":"number","maximum":50,"minimum":2},"arrivalWindow":{"type":"string"},"customReference":{"type":["string","null"],"maxLength":100},"primaryLocation":{"type":"object","required":["street","city","state","zip"],"properties":{"zip":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"street":{"type":"string"},"streetLineTwo":{"type":["string","null"]},"flightsOfStairs":{"type":"integer"}}},"typeOfHelpNeeded":{"enum":["Unknown","Loading","Unloading","LoadingAndUnloading","MoveOnSiteOnly"],"type":"string"},"workerLocationId":{"type":"integer","maximum":2147483647,"minimum":1},"billingInformation":{"type":["object","null"],"required":["firstName","lastName","phoneNum","emailAddress","billingAddress"],"properties":{"lastName":{"type":"string"},"phoneNum":{"type":"string"},"firstName":{"type":"string"},"emailAddress":{"type":"string"},"billingAddress":{"type":"object","required":["street","city","state","zip"],"properties":{"zip":{"type":"string","maxLength":5,"minLength":5},"city":{"type":"string","maxLength":50,"minLength":1},"state":{"type":"string","maxLength":2,"minLength":1},"street":{"type":"string","maxLength":500,"minLength":1},"streetLineTwo":{"type":["string","null"],"maxLength":50}}},"secondaryPhone":{"type":["string","null"]}}},"contactInformation":{"type":"object","required":["firstName","lastName","phoneNum","emailAddress"],"properties":{"lastName":{"type":"string"},"phoneNum":{"type":"string"},"firstName":{"type":"string"},"emailAddress":{"type":"string"},"secondaryPhone":{"type":["string","null"]}}},"heavyItemsSixPlusQty":{"type":["integer","null"]},"heavyItemsUprightPianosQty":{"type":["integer","null"]},"heavyItemsBabyGrandPianosQty":{"type":["integer","null"]},"heavyItemsBetweenFourFiftyAndSixQty":{"type":["integer","null"]},"heavyItemsBetweenThreeAndFourFiftyQty":{"type":["integer","null"]}},"description":"The labor-only order booking request body"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":695,"tokensAfter":695},{"name":"check_availability_for_lead","fixed":{"name":"check_availability_for_lead","description":"Checks the realtime availability (day and arrival windows) for a given LeadId on a given job date.","inputSchema":{"type":"object","required":["dateOfJob","leadId"],"properties":{"leadId":{"type":"integer","description":"The LeadId to check availability for"},"dateOfJob":{"type":"string","description":"The date of the move, in en-US MM/DD/YYYY format"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":114,"tokensAfter":114},{"name":"check_coverage","fixed":{"name":"check_coverage","description":"Checks whether moving-labor coverage is available in one or more United States ZIP codes. Returns which of the given ZIP codes are covered and which are not.","inputSchema":{"type":"object","required":["zipCodes"],"properties":{"zipCodes":{"type":"array","items":{"type":"string"},"description":"One or more 5-digit United States ZIP codes to check for coverage"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"create_job_reschedule_request","fixed":{"name":"create_job_reschedule_request","description":"Initiates a customer request to change the date/time of a job. If the job is Waiting For Helper it may be changed immediately. Returns the raw result.","inputSchema":{"type":"object","required":["jobId","body"],"properties":{"body":{"type":"object","required":["requestedDate","requestedArrivalWindow","note"],"properties":{"note":{"type":"string"},"requestedDate":{"type":"string"},"requestedArrivalWindow":{"type":"string"}},"description":"The reschedule request body (desired new date/time)"},"jobId":{"type":"integer","description":"The Job ID to create the reschedule request for"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":179,"tokensAfter":179},{"name":"create_marketplace_lfs_quote","fixed":{"name":"create_marketplace_lfs_quote","description":"Saves an LFS (local full service) quote and returns the Quote Public Key, Grand Total, and Checkout URL based on the provider selected.","inputSchema":{"type":"object","required":["body"],"properties":{"body":{"type":"object","required":["origin","destination","requestedDate","desiredArrivalWindow","contactInformation"],"properties":{"notes":{"type":["string","null"],"maxLength":6000},"origin":{"type":"object","required":["street","city","state","zip"],"properties":{"zip":{"type":"string","maxLength":5,"minLength":5},"city":{"type":"string","maxLength":50,"minLength":1},"state":{"type":"string","maxLength":2,"minLength":1},"street":{"type":"string","maxLength":500,"minLength":1},"bedrooms":{"type":["integer","null"],"maximum":20,"minimum":0},"streetLineTwo":{"type":["string","null"],"maxLength":50},"flightsOfStairs":{"type":["integer","null"],"maximum":20,"minimum":0}}},"crewSize":{"type":"integer","maximum":12,"minimum":1},"heavyItems":{"type":["array","null"],"items":{"type":"object","required":["itemType"],"properties":{"itemType":{"enum":["Unknown","ItemBetweenThreeAndFourFifty","ItemBetweenFourFiftyAndSix","ItemsSixPlus","Pianos"],"type":"string"},"quantity":{"type":"integer","maximum":100,"minimum":1}}}},"laborHours":{"type":"number","maximum":50,"minimum":2},"destination":{"type":"object","required":["street","city","state","zip"],"properties":{"zip":{"type":"string","maxLength":5,"minLength":5},"city":{"type":"string","maxLength":50,"minLength":1},"state":{"type":"string","maxLength":2,"minLength":1},"street":{"type":"string","maxLength":500,"minLength":1},"bedrooms":{"type":["integer","null"],"maximum":20,"minimum":0},"streetLineTwo":{"type":["string","null"],"maxLength":50},"flightsOfStairs":{"type":["integer","null"],"maximum":20,"minimum":0}}},"requestedDate":{"type":"string"},"customReference":{"type":["string","null"],"maxLength":100},"transportOptionId":{"type":"integer"},"contactInformation":{"type":"object","required":["emailAddress","phoneNumber","firstName","lastName"],"properties":{"lastName":{"type":"string","maxLength":50},"firstName":{"type":"string","maxLength":50},"phoneNumber":{"type":"string"},"emailAddress":{"type":"string","maxLength":300},"secondaryPhoneNumber":{"type":["string","null"]}}},"providerLocationId":{"type":"integer","maximum":2147483647,"minimum":1},"desiredArrivalWindow":{"type":"string"}},"description":"The LFS marketplace create-quote request body"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":693,"tokensAfter":693},{"name":"create_marketplace_quote","fixed":{"name":"create_marketplace_quote","description":"Saves a quote and returns a marketplace Quote ID, for a specific provider. This tool BOOKS a provider -- it does not discover one. Before calling, call list_service_providers (needs only the move date and loading ZIP; optionally accepts labor hours, crew size, sort order, service type, flights of stairs, and resultFormat) to find available providers, then take the chosen provider's location id from that result and pass it as workerLocationID. The input schema marks workerLocationID as optional, ","inputSchema":{"type":"object","required":["body"],"properties":{"body":{"type":"object","required":["contactInformation","serviceType"],"properties":{"load":{"type":["object","null"],"required":["address","desiredArrivalWindow","requestedDate"],"properties":{"notes":{"type":["string","null"],"maxLength":6000},"address":{"type":"object","required":["street","city","state","zip"],"properties":{"zip":{"type":"string","maxLength":5,"minLength":5},"city":{"type":"string","maxLength":50,"minLength":1},"state":{"type":"string","maxLength":2,"minLength":1},"street":{"type":"string","maxLength":500,"minLength":1},"streetLineTwo":{"type":["string","null"],"maxLength":50}}},"crewSize":{"type":"integer","maximum":12,"minimum":1},"laborHours":{"type":"number","maximum":50,"minimum":2},"requestedDate":{"type":"string"},"flightsOfStairs":{"type":["integer","null"],"maximum":20,"minimum":0},"workerLocationID":{"type":["integer","null"],"maximum":2147483647,"minimum":1},"desiredArrivalWindow":{"type":"string"}}},"unload":{"type":["object","null"],"required":["address","desiredArrivalWindow","requestedDate"],"properties":{"notes":{"type":["string","null"],"maxLength":6000},"address":{"$ref":"#/properties/body/properties/load/properties/address"},"crewSize":{"type":"integer","maximum":12,"minimum":1},"laborHours":{"type":"number","maximum":50,"minimum":2},"requestedDate":{"type":"string"},"flightsOfStairs":{"type":["integer","null"],"maximum":20,"minimum":0},"workerLocationID":{"type":["integer","null"],"maximum":2147483647,"minimum":1},"desiredArrivalWindow":{"type":"string"}}},"heavyItems":{"type":["array","null"],"items":{"type":"object","required":["itemType"],"properties":{"itemType":{"enum":["Unknown","ItemBetweenThreeAndFourFifty","ItemBetweenFourFiftyAndSix","ItemsSixPlus","Pianos"],"type":"string"},"quantity":{"type":"integer","maximum":100,"minimum":1}}}},"transports":{"type":["object","null"],"properties":{"areWeMovingContainer":{"type":["boolean","null"]},"areWeMovingRentalTruck":{"type":["boolean","null"]},"areWeMovingFreightTrailer":{"type":["boolean","null"]}}},"serviceType":{"enum":["Unknown","Standard","Elite","MoversPlusTruck","Transport","HybridZS","Container","FreightTrailer","CarShipping","TruckRental","ManagedLaborHourly","ManagedLaborPlus","CorporateRelocation_LaborOnly","CorporateRelocation_LocalFullService"],"type":"string"},"customReference":{"type":["string","null"],"maxLength":100},"contactInformation":{"type":"object","required":["emailAddress","phoneNumber","firstName","lastName"],"properties":{"lastName":{"type":"string","maxLength":50},"firstName":{"type":"string","maxLength":50},"phoneNumber":{"type":"string"},"emailAddress":{"type":"string","maxLength":300},"secondaryPhoneNumber":{"type":["string","null"]}}}},"description":"The marketplace create-quote request body"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":942,"tokensAfter":942},{"name":"delete_job_reschedule_request","fixed":{"name":"delete_job_reschedule_request","description":"Cancels (deletes) a pending reschedule request for a job. Returns the raw result.","inputSchema":{"type":"object","required":["jobId"],"properties":{"jobId":{"type":"integer","description":"The Job ID to delete the reschedule request for"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":83,"tokensAfter":83},{"name":"find_contact_by_phone_or_email","fixed":{"name":"find_contact_by_phone_or_email","description":"Looks up an existing customer contact by phone number or email and returns the contact record along with their quotes and orders within a recent lookback window. At least one of phoneNumber or emailAddress must be supplied. If no matching contact is found, a plain-text \"No matching contact found.\" message is returned instead of JSON; a JSON result with success=true and an empty jobs list means the contact exists but has no recent quote/order activity.","inputSchema":{"type":"object","properties":{"phoneNumber":{"type":["string","null"],"default":null,"description":"The customer's phone number in digits-only en-US format (10 digits). Either this or emailAddress is required."},"emailAddress":{"type":["string","null"],"default":null,"description":"The customer's email address. Either this or phoneNumber is required."},"searchPeriodDays":{"type":["integer","null"],"default":null,"description":"The number of days to look back for associated quotes and orders. Between 1 and 365. Defaults to 60 when omitted."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":300,"tokensAfter":300},{"name":"get_distance_between_coordinates","fixed":{"name":"get_distance_between_coordinates","description":"Calculates the driving distance and time between two geographic coordinates (latitude/longitude pairs).","inputSchema":{"type":"object","required":["lat1","lon1","lat2","lon2"],"properties":{"lat1":{"type":"number","description":"Latitude of the first location"},"lat2":{"type":"number","description":"Latitude of the second location"},"lon1":{"type":"number","description":"Longitude of the first location"},"lon2":{"type":"number","description":"Longitude of the second location"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":151,"tokensAfter":151},{"name":"get_distance_between_zips","fixed":{"name":"get_distance_between_zips","description":"Gets the driving distance, straight-line ('crow flies') distance, and driving time between two United States ZIP codes. Useful for estimating a move from an origin ZIP to a destination ZIP.","inputSchema":{"type":"object","required":["fromZipCode","toZipCode"],"properties":{"toZipCode":{"type":"string","description":"The 5-digit destination (ending) United States ZIP code"},"fromZipCode":{"type":"string","description":"The 5-digit origin (starting) United States ZIP code"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":148,"tokensAfter":148},{"name":"get_distance_between_zips_bulk","fixed":{"name":"get_distance_between_zips_bulk","description":"Calculates distances for many United States ZIP code pairs at once (bulk). Returns the raw result for every pair.","inputSchema":{"type":"object","required":["body"],"properties":{"body":{"type":"object","required":["myPoints"],"properties":{"myPoints":{"type":"array","items":{"type":"object","required":["zip1","zip2"],"properties":{"zip1":{"type":"string","maxLength":5,"minLength":5},"zip2":{"type":"string","maxLength":5,"minLength":5}}},"minItems":1}},"description":"The bulk request containing the ZIP code pairs to calculate distances for"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":169,"tokensAfter":169},{"name":"get_job_reschedule_availability","fixed":{"name":"get_job_reschedule_availability","description":"Gets the list of available dates and arrival windows for the provider on a job, for rescheduling.","inputSchema":{"type":"object","required":["jobId"],"properties":{"jobId":{"type":"integer","description":"The Job ID to look up rescheduling availability for"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":89,"tokensAfter":89},{"name":"get_job_reschedule_request","fixed":{"name":"get_job_reschedule_request","description":"Gets the latest reschedule status for a job (e.g. waiting for provider, successfully changed).","inputSchema":{"type":"object","required":["jobId"],"properties":{"jobId":{"type":"integer","description":"The Job ID to get reschedule details for"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":84,"tokensAfter":84},{"name":"get_lfs_move_estimate","fixed":{"name":"get_lfs_move_estimate","description":"Calculates labor hours, crew size, and truck size range for a local full-service (LFS) move. Takes the full LFS estimator request and returns the raw result.","inputSchema":{"type":"object","required":["body"],"properties":{"body":{"type":"object","required":["originZip","destinationZip","originAddressType"],"properties":{"originZip":{"type":"string"},"destinationZip":{"type":"string"},"originAddressType":{"enum":["Unknown","House","CondoApt","Studio","Office","StorageUnit","Other","Castle"],"type":"string"},"originBedroomCount":{"type":["integer","null"]}},"description":"The local full-service estimator request body"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":188,"tokensAfter":188},{"name":"get_move_size_recommendation","fixed":{"name":"get_move_size_recommendation","description":"Recommends how much moving help a job needs (suggested labor hours and crew size) for the load and unload locations, based on the size of the move. You MUST provide at least one of squareFeet or linearFeet to describe the size of the goods -- a call with neither is rejected. Also provide flights of stairs at each location. Optionally include counts of heavy items, which increase the recommended crew and hours.","inputSchema":{"type":"object","properties":{"pianosQty":{"type":["integer","null"],"default":null,"description":"Number of pianos"},"linearFeet":{"type":["integer","null"],"default":null,"description":"The linear feet (LFT) of the goods to be moved (5-56). Required unless squareFeet is provided; you must supply at least one of squareFeet or linearFeet."},"squareFeet":{"type":["integer","null"],"default":null,"description":"The square feet of the goods to be moved (1-4000). Required unless linearFeet is provided; you must supply at least one of squareFeet or linearFeet."},"loadFlightsOfStairs":{"type":["integer","null"],"default":null,"description":"Flights of stairs at the loading location (0-20)"},"heavyItems600PlusQty":{"type":["integer","null"],"default":null,"description":"Number of heavy items weighing over 600 lbs"},"heavyItems300To450Qty":{"type":["integer","null"],"default":null,"description":"Number of heavy items weighing between 300 and 450 lbs"},"heavyItems450To600Qty":{"type":["integer","null"],"default":null,"description":"Number of heavy items weighing between 450 and 600 lbs"},"unloadFlightsOfStairs":{"type":["integer","null"],"default":null,"description":"Flights of stairs at the unloading location (0-20)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":477,"tokensAfter":477},{"name":"get_order_details","fixed":{"name":"get_order_details","description":"Retrieves complete details for one or more Moves, based on OrderID(s). Returns the raw order details.","inputSchema":{"type":"object","required":["body"],"properties":{"body":{"type":"object","required":["orderIds"],"properties":{"orderIds":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"The order-details request body (the OrderID(s) to look up)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":117,"tokensAfter":117},{"name":"get_provider_details","fixed":{"name":"get_provider_details","description":"Gets detailed profile information for a specific moving provider location, including name, average review rating, years in business, total moves completed, equipment, credentials, and service coverage area (city, state, ZIP, and service radius). Requires a known providerId and providerLocationId.","inputSchema":{"type":"object","required":["providerId","providerLocationId"],"properties":{"providerId":{"type":"integer","description":"The provider's unique identifier"},"serviceType":{"enum":["Standard","Elite","MoversPlusTruck"],"type":"string","default":"Standard","description":"The service type to get details for (Standard, Elite, MoversPlusTruck)"},"providerLocationId":{"type":"integer","description":"The provider location's unique identifier"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":224,"tokensAfter":224},{"name":"get_provider_reviews","fixed":{"name":"get_provider_reviews","description":"Gets customer reviews for a specific moving provider, newest first, paginated. For 'recent' or 'last N months' requests, compute the cutoff date yourself and pass it as startDate (yyyy-MM-dd): only reviews on/after that date are returned and the paging counts reflect the filtered set (a real server-side filter, not a sort). Each review includes rating, summary text, reviewer display name, move location, and date.","inputSchema":{"type":"object","required":["providerId"],"properties":{"pageSize":{"type":["integer","null"],"default":null,"description":"The number of reviews per page (defaults to the API default)"},"startDate":{"type":["string","null"],"default":null,"description":"Optional cutoff date (yyyy-MM-dd). Returns only reviews on/after this date. Compute it yourself for 'last N months' style requests. Omit for all reviews."},"pageNumber":{"type":["integer","null"],"default":null,"description":"The 1-based page number (defaults to the first page)"},"providerId":{"type":"integer","description":"The provider's unique identifier"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":305,"tokensAfter":305},{"name":"get_quote_completion_url","fixed":{"name":"get_quote_completion_url","description":"Gets the completion (checkout) URL for a specific quote by quote key, WITHOUT sending an email or SMS to the customer.","inputSchema":{"type":"object","required":["quoteKey"],"properties":{"quoteKey":{"type":"string","format":"uuid","description":"The quote key (GUID)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":90,"tokensAfter":90},{"name":"get_quote_details","fixed":{"name":"get_quote_details","description":"Gets details and status for a specific quote by its quote key (GUID).","inputSchema":{"type":"object","required":["quoteKey"],"properties":{"quoteKey":{"type":"string","format":"uuid","description":"The quote key (GUID)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":75,"tokensAfter":75},{"name":"get_starting_price","fixed":{"name":"get_starting_price","description":"Retrieves the 'starting at' price for moving labor services in a specific United States ZIP code. The returned price is a flat estimated starting total for the stated hours and crew size, not an hourly rate. Do NOT divide it by hours or by crew to derive a per-hour rate. For the true per-hour figure (extraHourRate) and a full pricing breakdown, call list_service_providers with resultFormat=Full.","inputSchema":{"type":"object","required":["zipCode"],"properties":{"zipCode":{"type":"string","description":"The 5-digit United States ZIP code"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":165,"tokensAfter":165},{"name":"send_quote_completion_link","fixed":{"name":"send_quote_completion_link","description":"Sends a checkout/completion link to the customer for a specific quote (by quote key) via SMS and/or Email. THIS MESSAGES THE CUSTOMER.","inputSchema":{"type":"object","required":["quoteKey","body"],"properties":{"body":{"type":"object","properties":{"sendSms":{"type":["boolean","null"]},"sendEmail":{"type":["boolean","null"]}},"description":"Whether to send via email and/or SMS"},"quoteKey":{"type":"string","format":"uuid","description":"The quote key (GUID)"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":145,"tokensAfter":145},{"name":"upsert_contact","fixed":{"name":"upsert_contact","description":"Creates or updates a Lead contact in the partner's CRM and returns the contact's id. WRITE ACTION: this modifies partner CRM data. At least one of phoneNumber or emailAddress must be supplied. An optional note can be included; the service saves it with the contact on a best-effort basis, so the upsert still succeeds even if the note cannot be saved.","inputSchema":{"type":"object","properties":{"notes":{"type":["string","null"],"default":null,"description":"Optional note to save with the contact. The service attaches it best-effort, so the upsert still succeeds even if the note cannot be saved."},"lastName":{"type":["string","null"],"default":null,"description":"The contact's last name."},"firstName":{"type":["string","null"],"default":null,"description":"The contact's first name."},"companyName":{"type":["string","null"],"default":null,"description":"The company name, if applicable."},"phoneNumber":{"type":["string","null"],"default":null,"description":"The contact's phone number in digits-only en-US format (10 digits). Either this or emailAddress is required."},"emailAddress":{"type":["string","null"],"default":null,"description":"The contact's email address. Either this or phoneNumber is required."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":352,"tokensAfter":352}],"toolsChanged":24,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}