{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T17:56:28.834Z","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public","markdownUrl":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public.md","server":{"slug":"com-coppoak-canopy","name":"Canopy by Copp Oak","registryName":"com.coppoak/canopy","description":"Book local service pros from your AI assistant: real availability, instant booking, easy cancels.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"mcp-public","type":"remote","identifier":"https://canopy-mcp-production.up.railway.app/mcp/public","withdrawn":false,"url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public","version":"0.1.0","transport":null,"scoredAt":"2026-11-05T10:29:08.136Z"},"score":{"total":63,"tier":"medium","status":"scored","weekDelta":null,"history":[{"date":"2026-11-05","total":63},{"date":"2026-11-04","total":63},{"date":"2026-11-03","total":63},{"date":"2026-11-02","total":63}]},"categories":[{"name":"Endpoint Security","score":11,"verdict":"fail","reasons":["TLS not yet verified: we couldn't open a connection to check the certificate.","Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.","HTTPS is enforced; there's no plaintext access path.","HSTS not yet verified: we couldn't read the response headers to check for it.","DNSSEC check failed: this domain isn't protected by DNSSEC."],"codes":[{"code":"tls.unreachable","args":{}},{"code":"auth.unreachable","args":{}},{"code":"https.enforced","args":{}},{"code":"headers.inconclusive","args":{}},{"code":"dnssec.absent","args":{}}]},{"name":"Transport & Reachability","score":0,"verdict":"fail","reasons":["Transport check failed: declared streamable-http, but we couldn't connect to verify it."],"codes":[{"code":"transport.unreachable","args":{"transport":"streamable-http"}}]},{"name":"Schema Quality & AI Usability","score":0,"verdict":"unverified","reasons":["Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list."],"codes":[{"code":"schema.unreachable","args":{}}]},{"name":"Stability & Change Management","score":0,"verdict":"unverified","reasons":["Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"codes":[{"code":"stability.insufficient_history","args":{}}]},{"name":"Tool Coverage","score":0,"verdict":"unverified","reasons":["Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list."],"codes":[{"code":"toolquality.unreachable","args":{}}]},{"name":"Tool Safety","score":0,"verdict":"unverified","reasons":["Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list."],"codes":[{"code":"toolsafety.unreachable","args":{}}]},{"name":"Capabilities","score":0,"verdict":"unverified","reasons":["Capabilities not yet verified: we couldn't read the endpoint's capabilities."],"codes":[{"code":"cap.unreachable","args":{}}]}],"inconclusive":["TLS not yet verified: we couldn't open a connection to check the certificate.","Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.","HSTS not yet verified: we couldn't read the response headers to check for it.","Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.","Stability not yet verified: not enough scan history yet (needs a 30-day window).","Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.","Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.","Capabilities not yet verified: we couldn't read the endpoint's capabilities."],"malware":[],"components":[{"slug":"mcp-public","type":"remote","identifier":"https://canopy-mcp-production.up.railway.app/mcp/public","withdrawn":false,"score":63,"current":true,"url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public","markdownUrl":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public.md"}],"facts":[{"label":"Endpoint","value":"https://canopy-mcp-production.up.railway.app/mcp/public"},{"label":"Transports","value":"streamable-http"},{"label":"Auth","value":"none"},{"label":"Version","value":"0.1.0"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"canopy_check_bookable","title":"Check which businesses are bookable","description":"Given businesses you already found for the user (name plus phone, website or address), report which ones can be booked through Canopy and how (booking_mode). Results come back in exactly the order you sent them. Canopy never ranks, filters or recommends businesses. Results are returned in the same order as the input.","inputs":[{"name":"businesses","type":"array","required":true,"description":"1 to 50 businesses, in your order. Results keep this order."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":96},{"name":"resolve_business","title":"Look up one business on Canopy","description":"Match one business the user named to its Canopy listing, by phone, website, or name (add the city, state or ZIP code when you know it). Returns at most one match, with its booking_mode and locations, or found=false. When a name alone is not certain, found=false comes with up to 5 candidates in alphabetical order for the user to choose from.","inputs":[{"name":"address","type":"object","required":false,"description":"City, state and ZIP code of the business."},{"name":"business_name","type":"string","required":false,"description":"Business name as you found it. With no phone or website, add the address city, state or ZIP when known."},{"name":"phone","type":"string","required":false,"description":"Business phone number."},{"name":"website","type":"string","required":false,"description":"Business website URL or domain."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":154},{"name":"get_availability","title":"Get open appointment times","description":"List open appointment slots for a Canopy business, optionally for one service and one location, between two dates. Slots are cached from the business calendar (see synced_at); the time is re-checked live when you book.","inputs":[{"name":"customer_zip","type":"string","required":false,"description":"Customer's ZIP code, if known. For a business with several locations, Canopy uses the location nearest to it unless location_id (or a slot or service tied to one location) decides. The result names t…"},{"name":"from_date","type":"string","required":false,"description":"First day, YYYY-MM-DD. Default: today."},{"name":"location_id","type":"string","required":false,"description":"Location for multi-location businesses."},{"name":"operator_id","type":"string","required":true,"description":"operator_id from canopy_check_bookable or resolve_business."},{"name":"service_id","type":"string","required":false,"description":"Only slots for this service."},{"name":"timezone","type":"string","required":false,"description":"IANA time zone for dates and returned times."},{"name":"to_date","type":"string","required":false,"description":"Last day (inclusive), YYYY-MM-DD, at most 31 days after from_date. Default: 13 days after from_date."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":219},{"name":"request_booking","title":"Start a booking","description":"Start a booking with a Canopy-connected business. Canopy automatically routes to the correct flow based on the operator's booking mode: auto-confirm (booked right away in the business's calendar; the customer is emailed a confirmation), request-times (propose preferred times), or submission-only (callback request). Summarize the booking and get the customer's go-ahead before calling.","inputs":[{"name":"agent_callback_url","type":"string","required":false,"description":"Optional HTTPS URL that receives a webhook when the business responds."},{"name":"customer","type":"object","required":true,"description":"The customer the appointment or callback is for."},{"name":"customer_zip","type":"string","required":false,"description":"Customer's ZIP code, if known. For a business with several locations, Canopy uses the location nearest to it unless location_id (or a slot or service tied to one location) decides. The result names t…"},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Reuse the same key when retrying so nothing is created twice. Derived automatically if omitted."},{"name":"location_id","type":"string","required":false,"description":"Location for multi-location businesses."},{"name":"notes","type":"string","required":false,"description":"Extra details for the business (added to the customer notes)."},{"name":"operator_id","type":"string","required":true,"description":"operator_id from canopy_check_bookable or resolve_business."},{"name":"preferred_times","type":"array","required":false,"description":"1 to 3 preferred time windows (businesses that review requests)."},{"name":"service_id","type":"string","required":false,"description":"Service to book (from get_availability). Needed for instant-confirm and preferred-times businesses."},{"name":"slot_id","type":"string","required":false,"description":"Open slot from get_availability (instant-confirm businesses)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":316},{"name":"propose_times","title":"Propose preferred times","description":"Propose preferred times to a business that reviews booking requests. The business will approve one time (that books it; the customer is emailed a confirmation) or propose an alternative (the customer confirms it from an emailed code). Check status with get_request_status.","inputs":[{"name":"agent_callback_url","type":"string","required":false,"description":"Optional HTTPS URL that receives a webhook when the business responds."},{"name":"customer","type":"object","required":true,"description":"The customer the appointment or callback is for."},{"name":"customer_zip","type":"string","required":false,"description":"Customer's ZIP code, if known. For a business with several locations, Canopy uses the location nearest to it unless location_id (or a slot or service tied to one location) decides. The result names t…"},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Reuse the same key when retrying so nothing is created twice. Derived automatically if omitted."},{"name":"location_id","type":"string","required":false,"description":"Location for multi-location businesses."},{"name":"notes","type":"string","required":false,"description":"Extra details for the business (added to the customer notes)."},{"name":"operator_id","type":"string","required":true,"description":"operator_id from canopy_check_bookable or resolve_business."},{"name":"preferred_times","type":"array","required":true,"description":"1 to 3 preferred time windows, in order of preference."},{"name":"service_id","type":"string","required":true,"description":"Service the customer wants (from get_availability)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":264},{"name":"request_callback","title":"Request a callback","description":"Request a callback from a business. They will contact the customer directly. No calendar booking is created.","inputs":[{"name":"agent_callback_url","type":"string","required":false,"description":"Optional HTTPS URL that receives a webhook when the business responds."},{"name":"customer","type":"object","required":true,"description":"The customer the appointment or callback is for."},{"name":"customer_zip","type":"string","required":false,"description":"Customer's ZIP code, if known. For a business with several locations, Canopy uses the location nearest to it unless location_id (or a slot or service tied to one location) decides. The result names t…"},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Reuse the same key when retrying so nothing is created twice. Derived automatically if omitted."},{"name":"location_id","type":"string","required":false,"description":"Location for multi-location businesses."},{"name":"notes","type":"string","required":false,"description":"Extra details for the business (added to the customer notes)."},{"name":"operator_id","type":"string","required":true,"description":"operator_id from canopy_check_bookable or resolve_business."},{"name":"service_id","type":"string","required":false,"description":"Service the customer is asking about, if known."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":212},{"name":"get_request_status","title":"Check a booking request","description":"Check the status of a booking request (preferred times or callback). Returns pending, approved, rejected, counter_proposed, expired, or converted. Needs the manage_token that came back when the request was made.","inputs":[{"name":"manage_token","type":"string","required":true,"description":"manage_token returned with that request_id when the request was created."},{"name":"request_id","type":"string","required":true,"description":"request_id returned by request_booking, propose_times or request_callback."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":91},{"name":"reschedule_booking","title":"Ask to move a booking to another time","description":"Ask to move a booking the customer already confirmed (booked with the business) to another open slot of the same service and location (slot_id from get_availability). Nothing moves right away: Canopy emails the customer a link to approve the new time, and the business calendar changes only after they approve. A hold the customer has not confirmed yet cannot be moved. Calling again with the same slot_id reports whether it was approved. Needs the manage_token that came back with the booking_id.","inputs":[{"name":"booking_id","type":"string","required":true,"description":"booking_id of the confirmed booking to move (from request_booking or get_request_status)."},{"name":"manage_token","type":"string","required":true,"description":"manage_token returned with that booking_id (by request_booking when the booking was created, or as booking_manage_token by get_request_status)."},{"name":"reason","type":"string","required":false,"description":"Short reason for the move, if the customer gave one."},{"name":"slot_id","type":"string","required":true,"description":"The new open slot (from get_availability, same service and location). The customer must approve the move by email."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":215},{"name":"cancel_booking","title":"Cancel a booking","description":"Cancel a booking made through Canopy. The appointment is called off in the business's calendar right away and the customer is emailed. This cannot be undone: confirm with the customer before calling. An appointment that has already started cannot be cancelled here. Needs the manage_token that came back with the booking_id.","inputs":[{"name":"booking_id","type":"string","required":true,"description":"booking_id of the booking to cancel (from request_booking or get_request_status)."},{"name":"manage_token","type":"string","required":true,"description":"manage_token returned with that booking_id (by request_booking when the booking was created, or as booking_manage_token by get_request_status)."},{"name":"reason","type":"string","required":false,"description":"Short reason for cancelling, if the customer gave one."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":143},{"name":"get_business_terms","title":"Get a business's prices and terms","description":"Get the prices of a Canopy business's bookable services, its fees and its cancellation terms, exactly as the business has them on file. Anything the business has not put on file comes back as on_file=false: tell the customer it is not on file (they can ask the business) and never estimate or fill in a value.","inputs":[{"name":"operator_id","type":"string","required":true,"description":"operator_id from canopy_check_bookable or resolve_business."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":95}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T10:29:08.000Z","track":"remote","endpoint":"https://canopy-mcp-production.up.railway.app/mcp/public","declaredUrl":null,"truncated":false,"tls":{"outcome":"unreached","label":"Not reached","version":null,"cipherSuite":null,"chainError":null,"certificates":[]},"dnssec":{"result":"insecure","label":"Not signed","name":"canopy-mcp-production.up.railway.app.","steps":[{"zone":".","outcome":"verified","label":"Verified"},{"zone":"app.","outcome":"verified","label":"Verified"},{"zone":"railway.app.","outcome":"insecure_proven","label":"Unsigned (proven)"}]},"auth":{"outcome":"inconclusive","label":"Inconclusive","gate":null,"gateLabel":null,"status":null,"authorizationServers":[]},"httpsRedirect":{"outcome":"https_enforced","label":"HTTPS enforced","status":null},"transports":[{"transport":"streamable-http","outcome":"unreachable","label":"Unreachable","status":null,"followed":false}],"provenance":null,"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-11-02","recent":[{"id":"chg_01a1ab41-55bf-7970-8e77-0c5ea053d7bc","kind":"score.total_changed","summary":"Trust score (63 → 4)","materiality":"functional","direction":"regression","scoreDelta":-59,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1ab41-55bf-7970-8e77-0c5ea053d7bc"},{"id":"chg_01a1a617-bb51-7774-a314-58baf1ab7d56","kind":"check.unverifiable","summary":"Authorization (fail → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb51-7774-a314-58baf1ab7d56"},{"id":"chg_01a1a617-bb52-7657-9911-88b34c128d19","kind":"check.unverifiable","summary":"HSTS header (fail → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb52-7657-9911-88b34c128d19"},{"id":"chg_01a1a617-bb52-7b66-94ee-4223a5c2c8a1","kind":"check.unverifiable","summary":"Tool safety (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb52-7b66-94ee-4223a5c2c8a1"},{"id":"chg_01a1a617-bb53-70ae-af58-c92157256a79","kind":"check.unverifiable","summary":"TLS certificate (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb53-70ae-af58-c92157256a79"},{"id":"chg_01a1a617-bb53-757a-b36e-6bdd65666d6b","kind":"check.unverifiable","summary":"Stability (0.03 → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb53-757a-b36e-6bdd65666d6b"},{"id":"chg_01a1a617-bb53-7aab-8d0a-cf87bfae0b9d","kind":"check.verdict","summary":"Transport (pass → fail)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb53-7aab-8d0a-cf87bfae0b9d"},{"id":"chg_01a1a617-bb53-7f06-812b-ad6727d649c4","kind":"check.unverifiable","summary":"Capabilities (pass → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb53-7f06-812b-ad6727d649c4"},{"id":"chg_01a1a617-bb54-7450-b288-c59b3e4bc1af","kind":"check.unverifiable","summary":"Tool coverage (100 → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb54-7450-b288-c59b3e4bc1af"},{"id":"chg_01a1a617-bb54-7939-915b-4db0fc265020","kind":"check.appeared","summary":"First check of Schema quality (unverified)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb54-7939-915b-4db0fc265020"},{"id":"chg_01a1a617-bb54-7e77-b832-8f209c974083","kind":"capture.status_changed","summary":"Endpoint reachability (reachable → unreachable)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb54-7e77-b832-8f209c974083"},{"id":"chg_01a1a617-bb55-7393-99f6-be9a5cf7bf1d","kind":"score.total_changed","summary":"Trust score (63 → 4)","materiality":"functional","direction":"regression","scoreDelta":-59,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a617-bb55-7393-99f6-be9a5cf7bf1d"},{"id":"chg_01a1a0f2-3ced-727e-b3ef-66aac40e0d1c","kind":"check.reverified","summary":"Stability (unverified → 0.03)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a1a0f2-3ced-727e-b3ef-66aac40e0d1c"},{"id":"chg_01a19dd9-224f-76fe-ae28-0f67938d48ef","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public#chg-chg_01a19dd9-224f-76fe-ae28-0f67938d48ef"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public/changelog.json"},"links":{"html":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public","markdown":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public.md","changelogJson":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public/changelog.json","changelogRss":"https://verifymcp.io/servers/com-coppoak-canopy/mcp-public.xml","external":[{"label":"Remote endpoint","href":"https://canopy-mcp-production.up.railway.app/mcp/public"},{"label":"Website","href":"https://coppoak.com/canopy/"}]}}