MCP 서버

Andrii Co. Notary & Apostille Assistant

net.andrii/booking
비즈니스 및 운영 법률 및 컴플라이언스 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Provides Washington notary and apostille information, quotes, availability, booking requests, appointment management, and status tracking.

book_appointment
Schedule an appointment tied to the signed-in customer's account — still a request until the notary confirms it, never guaranteed. PREFER this over request_booking whenever the customer is signed in: only a booking on their own account can later be listed, rescheduled or cancelled through this connector. Guests go through request_booking. Accepts: `service` (e.g. office, mobile, apostille, loan), `scheduled_at` — a slot's startUnix from search_availability, omitted for a call-me request — plus `address` for mobile, `notes`, `document_count`. Returns a Pending reference; fails if not signed in.
외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['service'], 'properties': {'notes': {'type': ['string', 'null'], 'default': None, 'description': 'Anything else the notary should know.'}, 'address': {'type': ['string', 'null'], 'default': None, 'description': 'Meeting address (required for "mobile"; omit for office/apostille).'}, 'service': {'type': 'string', 'description': 'Service: office | mobile | apostille | loan.'}, 'scheduled_at': {'type': ['integer', 'null'], 'format': 'int64', 'default': None, 'description': 'The chosen slot\'s `startUnix` (from search_availability). Omit for a\n"call me to schedule" request (no time held).'}, 'document_count': {'type': ['integer', 'null'], 'format': 'int64', 'default': None, 'description': 'Number of documents. Default 1.'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'message'], 'properties': {'ok': {'type': 'boolean', 'const': True}, 'status': {'type': 'string', 'description': "Account tools: the booking's status after this call (Pending after book_appointment)."}, 'message': {'type': 'string', 'description': 'Customer-facing outcome; relay it as written â\x80\x94 bookings are requests until the notary confirms.'}, 'manageUrl': {'type': ['string', 'null'], 'description': 'Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).'}, 'onAccount': {'type': 'boolean', 'description': "True when the request was filed on the signed-in customer's own account â\x80\x94 they can then list it with my_bookings and change it with reschedule_booking / cancel_booking. Absent or false means a guest request, managed through the emailed link."}, 'reference': {'type': 'string', 'description': 'Request / order reference for check_request_status (guest tools) or my_bookings (account tools).'}, 'appendedToExisting': {'type': 'boolean', 'description': 'True when existing_reference was given and the request was extended, not duplicated.'}, 'ourComparableQuoteCents': {'type': 'integer', 'description': 'request_price_match only, when computable.'}}}
cancel_booking
Cancel a booking on the signed-in account — Pending or Scheduled only. Use when the visit is no longer needed; guests cancel via their emailed manage link instead. Accepts: `order_id` (e.g. copied from my_bookings). Returns a cancellation notice; fails if the booking is not yours, is neither Pending nor Scheduled, or not signed in.
파괴적 작업 외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['order_id'], 'properties': {'order_id': {'type': 'string', 'description': "The booking's order id (from my_bookings)."}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'message'], 'properties': {'ok': {'type': 'boolean', 'const': True}, 'status': {'type': 'string', 'description': "Account tools: the booking's status after this call (Pending after book_appointment)."}, 'message': {'type': 'string', 'description': 'Customer-facing outcome; relay it as written â\x80\x94 bookings are requests until the notary confirms.'}, 'manageUrl': {'type': ['string', 'null'], 'description': 'Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).'}, 'onAccount': {'type': 'boolean', 'description': "True when the request was filed on the signed-in customer's own account â\x80\x94 they can then list it with my_bookings and change it with reschedule_booking / cancel_booking. Absent or false means a guest request, managed through the emailed link."}, 'reference': {'type': 'string', 'description': 'Request / order reference for check_request_status (guest tools) or my_bookings (account tools).'}, 'appendedToExisting': {'type': 'boolean', 'description': 'True when existing_reference was given and the request was extended, not duplicated.'}, 'ourComparableQuoteCents': {'type': 'integer', 'description': 'request_price_match only, when computable.'}}}
check_request_status
Check what became of a previously submitted request — no sign-in needed, guests welcome. Use when the customer asks whether the notary confirmed, moved, cancelled, or merged it. Accepts: `reference` — the id returned at submission or the token from the emailed confirm link. Returns the service plus status and timing (PII-minimal — never address, name, or notes; Pacific time, e.g. scheduledAtPacific). Fails if the reference is wrong — a not found reply.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['reference'], 'properties': {'reference': {'type': 'string', 'description': 'The reference id returned when the request was submitted (also accepts\nthe token from the emailed confirm link).'}}}
출력 스키마
{'type': 'object', 'required': ['reference', 'service', 'status', 'awaitingCustomerConfirmation', 'note'], 'properties': {'note': {'type': 'string'}, 'status': {'type': 'string', 'description': 'Pending | Scheduled | EnRoute | InProgress | Completed | Notarized | PickedUp | Cancelled | NoShow | MergedWithOther. `note` says what the word means for the customer; read that rather than branching on this.'}, 'service': {'type': ['string', 'null'], 'description': 'office | apostille | mobile | loan | ron | apostille_mail; null on a legacy row.'}, 'reference': {'type': 'string'}, 'mergedInto': {'type': 'object', 'properties': {'status': {'type': 'string'}, 'scheduledAt': {'type': ['integer', 'null']}, 'scheduledAtPacific': {'type': 'string'}}, 'description': "Only for MergedWithOther: the surviving appointment's status and time."}, 'scheduledAt': {'type': ['integer', 'null'], 'description': 'Unix seconds.'}, 'requestedTime': {'type': ['integer', 'null'], 'description': 'Unix seconds the customer asked for on a lead, or null.'}, 'scheduledAtPacific': {'type': ['string', 'null']}, 'awaitingCustomerConfirmation': {'type': 'boolean'}}, 'description': 'PII-minimal status of a request â\x80\x94 never the address, name or notes.'}
check_service_area
Check whether an address sits inside our Washington coverage and resolves precisely enough to book. Use when the customer wants an area answer without searching slots — search_availability already validates the area itself. Accepts: `address` (e.g. a Seattle street or ZIP) and optional `service` — notary or apostille rules differ. Returns withinServiceArea, distanceMiles, precise; if the address cannot be resolved the message says not found.
읽기 전용 외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['address'], 'properties': {'address': {'type': 'string', 'description': 'Street address, city, or ZIP to check (Washington State service area).'}, 'service': {'type': ['string', 'null'], 'default': None, 'description': '"notary" (default) or "apostille" â\x80\x94 the service-area rules differ slightly.'}}}
출력 스키마
{'type': 'object', 'required': ['withinServiceArea', 'precise'], 'properties': {'label': {'type': ['string', 'null'], 'description': 'Formatted address, or null when the address could not be resolved.'}, 'region': {'type': ['string', 'null']}, 'country': {'type': ['string', 'null']}, 'message': {'type': ['string', 'null'], 'description': 'Why the place is not bookable as given, or null.'}, 'precise': {'type': 'boolean', 'description': 'False when a street and city are still needed to pin the spot.'}, 'distanceMiles': {'type': 'number', 'description': 'Straight-line miles from the Bothell office (display only, not a routed leg).'}, 'withinServiceArea': {'type': 'boolean'}}}
get_apostille_requirements
Check whether a document can get an apostille and how: certified vital records mail in as-is, private papers (e.g. a diploma or POA) need notarization first, federal ones go to the US Department of State. Use when the customer asks is this apostillable. Accepts: `document` in plain words, optional `issuing_state`, `destination_country`. Returns the category, the honest do-it-yourself path and our offer; unclear wording yields an `unknown` category, never an error.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['document'], 'properties': {'document': {'type': 'string', 'description': 'The document in plain words (e.g. "Washington birth certificate",\n"university diploma", "FBI background check", "power of attorney").'}, 'issuing_state': {'type': ['string', 'null'], 'default': None, 'description': 'The US state that issued or notarized it (default Washington).'}, 'destination_country': {'type': ['string', 'null'], 'default': None, 'description': 'The country the apostilled document is for.'}}}
출력 스키마
{'type': 'object', 'required': ['document', 'issuingState', 'category', 'eligibleForMailInAsIs', 'explanation', 'diyPath', 'ourOffer'], 'properties': {'diyPath': {'type': 'object', 'properties': {'stateFee': {'type': 'string'}, 'yourself': {'type': 'string'}, 'whenToUseUs': {'type': 'string'}}}, 'category': {'type': 'string', 'description': 'Document class: vital_record_mailin_ready, needs_notarized_copy, notarized_document, court_document, federal_authentication, unknown.'}, 'document': {'type': 'string'}, 'ourOffer': {'type': 'object', 'properties': {'fullServiceTiers': {'type': 'string'}, 'typicalTurnaround': {'type': ['object', 'null']}, 'typicalTurnaroundTier': {'type': 'string'}, 'mailInApostilleFromCents': {'type': ['integer', 'null']}, 'inPersonApostilleFromCents': {'type': ['integer', 'null']}}}, 'disclaimer': {'type': 'string'}, 'destination': {'type': ['object', 'null'], 'required': ['country', 'status'], 'properties': {'note': {'type': 'string'}, 'status': {'type': 'string', 'description': 'member | coming_soon | non_member.'}, 'country': {'type': 'string'}, 'effectiveDate': {'type': 'string'}}}, 'explanation': {'type': 'string'}, 'howToProceed': {'type': 'string'}, 'issuingState': {'type': 'string'}, 'eligibleForMailInAsIs': {'type': 'boolean', 'description': 'True when no notarial act is needed first.'}}}
get_price_quote
Calculate a server-authoritative USD price estimate before shipping — pure, no side effects, nothing booked. Use when the customer asks about cost. Accepts: `document_count`, `mobile`, `after_hours`, `apostille` plus `tier` (e.g. expedited, priority, standard, mailin); set `needs_notarization` false for already-certified records. Returns amountCents and line items; fails if `apostille` is true and `tier` is invalid (with `apostille` false, `tier` is ignored).
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'tier': {'type': ['string', 'null'], 'default': None, 'description': 'Apostille tier when `apostille`: expedited | priority | standard | mailin.'}, 'mobile': {'type': 'boolean', 'default': False, 'description': 'True if we travel to the customer (adds the flat travel fee).'}, 'apostille': {'type': 'boolean', 'default': False, 'description': 'True to include a Secretary-of-State apostille.'}, 'after_hours': {'type': 'boolean', 'default': False, 'description': 'Mobile only: the chosen slot is after 6pm or on a weekend.'}, 'document_count': {'type': ['integer', 'null'], 'format': 'int64', 'default': None, 'description': 'Number of documents (1â\x80\x9320). Default 1.'}, 'needs_notarization': {'type': ['boolean', 'null'], 'default': None, 'description': 'Set false for a mail-in apostille of already-certified public records\n(birth/marriage/death certificates) that need no notarial act.'}}}
출력 스키마
{'type': 'object', 'required': ['currency', 'amountCents', 'lineItems', 'prepaymentRequired', 'howToProceed'], 'properties': {'currency': {'type': 'string'}, 'lineItems': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'amountCents'], 'properties': {'label': {'type': 'string'}, 'amountCents': {'type': 'integer'}}}}, 'amountCents': {'type': 'integer'}, 'howToProceed': {'type': 'string'}, 'prepaymentRequired': {'type': 'boolean'}}}
get_services
List the service catalog — Washington notary and apostille offerings with USD prices and accepted payment options (e.g. card, PayPal, Venmo, cash). Optional — the server instructions already summarize the flow; use when the customer asks what we offer or how to pay. Takes: no arguments. Returns `services` plus payment notes — a static catalog (no error if repeated).
읽기 전용
입력 스키마
{'type': 'object', 'properties': {}}
출력 스키마
{'type': 'object', 'required': ['business', 'serviceArea', 'paymentOptions', 'paymentNote', 'services'], 'properties': {'business': {'type': 'string'}, 'location': {'type': 'string'}, 'services': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'description'], 'properties': {'name': {'type': 'string'}, 'description': {'type': 'string'}}}}, 'languages': {'type': 'array', 'items': {'type': 'string'}}, 'priceMatch': {'type': 'string'}, 'priceQuote': {'type': 'string', 'description': 'Which tool gives an exact figure.'}, 'paymentNote': {'type': 'string'}, 'serviceArea': {'type': 'string'}, 'paymentOptions': {'type': 'array', 'items': {'type': 'string'}}, 'remoteOnlineNotarization': {'type': 'boolean'}}, 'description': 'Static service catalog, coverage summary and accepted payment options.'}
get_turnaround_estimate
Calculate typical turnaround — apostille processing days plus mailing and delivery legs. Ranges, never guarantees; exact appointment times come from search_availability. Use when the customer asks how long. Accepts: `service` (e.g. notarization, apostille, apostille_mail, loan_signing), optional `tier`, `shipping`, `destination_country`. Returns staged day estimates; an unknown `tier` falls back to the standard figure, not an error.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['service'], 'properties': {'tier': {'type': ['string', 'null'], 'default': None, 'description': 'Apostille speed tier when service is apostille: expedited | priority | standard.'}, 'service': {'type': 'string', 'description': 'Service: notarization | apostille | apostille_mail | loan_signing.'}, 'shipping': {'type': ['string', 'null'], 'default': None, 'description': 'Delivery: pickup | us | ukraine | international. If omitted, inferred from\ndestination_country (apostille legs default to US shipping).'}, 'destination_country': {'type': ['string', 'null'], 'default': None, 'description': 'Destination country (used to infer shipping when `shipping` is omitted).'}}}
출력 스키마
{'type': 'object', 'required': ['service', 'stages', 'typicalTotalDaysLow', 'typicalTotalDaysHigh', 'disclaimer'], 'properties': {'tier': {'type': 'string'}, 'stages': {'type': 'array', 'items': {'type': 'object', 'required': ['stage'], 'properties': {'note': {'type': 'string'}, 'stage': {'type': 'string'}, 'businessDays': {'type': 'integer'}, 'calendarDaysLow': {'type': 'integer'}, 'calendarDaysHigh': {'type': 'integer'}}}}, 'service': {'type': 'string'}, 'disclaimer': {'type': 'string'}, 'howToProceed': {'type': 'string'}, 'typicalTotalDaysLow': {'type': 'integer'}, 'typicalTotalDaysHigh': {'type': 'integer'}}, 'description': 'Staged day estimates â\x80\x94 ranges, never guarantees.'}
my_bookings
List every booking on the signed-in customer's own account, sorted by scheduled time, latest first. Use when an authenticated customer asks what is scheduled, or to grab an `order_id` before reschedule_booking or cancel_booking. Takes: no arguments. Returns orderId, service, status, scheduledAt, location per row (e.g. Scheduled vs Pending); fails if not signed in.
읽기 전용
입력 스키마
{'type': 'object', 'properties': {}}
출력 스키마
{'type': 'object', 'required': ['bookings'], 'properties': {'bookings': {'type': 'array', 'items': {'type': 'object', 'required': ['orderId', 'service', 'status'], 'properties': {'status': {'type': 'string'}, 'orderId': {'type': 'string', 'description': 'Pass to reschedule_booking / cancel_booking as order_id.'}, 'service': {'type': ['string', 'null']}, 'location': {'type': 'string'}, 'scheduledAt': {'type': ['integer', 'null'], 'description': 'Unix seconds; null for a call-me request with no time held.'}}}, 'description': 'Latest first.'}}}
request_apostille
Submit a mail-in apostille request — a lead for already-certified Washington public records needing NO notarization (e.g. birth or marriage certificates). Use when get_apostille_requirements says they qualify. Requires: `documents`, `name`, and an email or phone; the notary replies with mailing instructions and a quote — nothing charged until approved. Pass `existing_reference` to extend an open request. Returns a reference; fails if the name or a valid contact is missing.
외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['documents', 'name'], 'properties': {'name': {'type': 'string', 'description': "The customer's FULL LEGAL NAME exactly as on their government-issued ID\n(never a nickname) â\x80\x94 apostille filings print it."}, 'email': {'type': ['string', 'null'], 'default': None, 'description': 'Email. Collect BOTH an email AND a phone in one question when possible;\nat least one is required.'}, 'notes': {'type': ['string', 'null'], 'default': None, 'description': 'Anything else the notary should know.'}, 'phone': {'type': ['string', 'null'], 'default': None, 'description': 'Phone with country code â\x80\x94 the notary confirms fastest by phone/SMS.'}, 'documents': {'type': 'string', 'description': 'What documents, in plain words (e.g. "2 birth certificates for Ukraine").'}, 'existing_reference': {'type': ['string', 'null'], 'default': None, 'description': "To ADD these documents to an EXISTING request instead of creating a\nsecond one, pass that request's reference id (with the same email/phone\nso we can verify the customer). Nothing new is created."}, 'destination_country': {'type': ['string', 'null'], 'default': None, 'description': 'Destination country the apostilled documents are for.'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'message'], 'properties': {'ok': {'type': 'boolean', 'const': True}, 'status': {'type': 'string', 'description': "Account tools: the booking's status after this call (Pending after book_appointment)."}, 'message': {'type': 'string', 'description': 'Customer-facing outcome; relay it as written â\x80\x94 bookings are requests until the notary confirms.'}, 'manageUrl': {'type': ['string', 'null'], 'description': 'Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).'}, 'onAccount': {'type': 'boolean', 'description': "True when the request was filed on the signed-in customer's own account â\x80\x94 they can then list it with my_bookings and change it with reschedule_booking / cancel_booking. Absent or false means a guest request, managed through the emailed link."}, 'reference': {'type': 'string', 'description': 'Request / order reference for check_request_status (guest tools) or my_bookings (account tools).'}, 'appendedToExisting': {'type': 'boolean', 'description': 'True when existing_reference was given and the request was extended, not duplicated.'}, 'ourComparableQuoteCents': {'type': 'integer', 'description': 'request_price_match only, when computable.'}}}
request_booking
Submit a booking request — a lead, NOT a confirmed appointment; the notary follows up. Use when ready to book AND the customer is not signed in; a signed-in customer goes through book_appointment instead. Requires: `service` (e.g. office, mobile, loan), the FULL LEGAL NAME as on government ID, and an email or phone (collect both). Pass the chosen startUnix from search_availability as `desired_time_unix`; to modify an open request pass `existing_reference`, never a duplicate. Returns a reference for check_request_status; fails if the name or a valid contact is missing.
외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['service', 'name'], 'properties': {'name': {'type': 'string', 'description': "The customer's FULL LEGAL NAME exactly as on their government-issued ID\n(never a nickname or chat display name) â\x80\x94 notarial records and apostille\nfilings print it. Ask if you only know a first name."}, 'email': {'type': ['string', 'null'], 'default': None, 'description': 'Email. Collect BOTH an email AND a phone in one question when possible;\nat least one is required.'}, 'notes': {'type': ['string', 'null'], 'default': None, 'description': 'Anything else the notary should know.'}, 'phone': {'type': ['string', 'null'], 'default': None, 'description': 'Phone with country code (e.g. +1...). The notary confirms fastest by\nphone/SMS â\x80\x94 ask for it even when an email is known.'}, 'address': {'type': ['string', 'null'], 'default': None, 'description': 'Meeting address â\x80\x94 MOBILE ONLY. Office and apostille visits automatically\nuse our Bothell office; omit this for them.'}, 'service': {'type': 'string', 'description': 'Service: office | mobile | apostille | loan.'}, 'desired_time': {'type': ['string', 'null'], 'default': None, 'description': 'The wanted time in plain words, when no exact slot was chosen (rides the\nnotes; the notary confirms a real time).'}, 'document_count': {'type': ['integer', 'null'], 'format': 'int64', 'default': None, 'description': 'Number of documents. Default 1.'}, 'desired_time_unix': {'type': ['integer', 'null'], 'format': 'int64', 'default': None, 'description': "The chosen slot's `startUnix` from search_availability (Unix seconds).\nPass it so the request carries the exact wanted time â\x80\x94 still a request,\nnever a hold."}, 'existing_reference': {'type': ['string', 'null'], 'default': None, 'description': 'To ADD to or change an EXISTING request instead of creating a second one\n(e.g. "also apostille it", "make it 3 documents"), pass that request\'s\nreference id here â\x80\x94 the same email/phone must be provided so we can\nverify it\'s the same customer. Nothing new is created.'}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'message'], 'properties': {'ok': {'type': 'boolean', 'const': True}, 'status': {'type': 'string', 'description': "Account tools: the booking's status after this call (Pending after book_appointment)."}, 'message': {'type': 'string', 'description': 'Customer-facing outcome; relay it as written â\x80\x94 bookings are requests until the notary confirms.'}, 'manageUrl': {'type': ['string', 'null'], 'description': 'Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).'}, 'onAccount': {'type': 'boolean', 'description': "True when the request was filed on the signed-in customer's own account â\x80\x94 they can then list it with my_bookings and change it with reschedule_booking / cancel_booking. Absent or false means a guest request, managed through the emailed link."}, 'reference': {'type': 'string', 'description': 'Request / order reference for check_request_status (guest tools) or my_bookings (account tools).'}, 'appendedToExisting': {'type': 'boolean', 'description': 'True when existing_reference was given and the request was extended, not duplicated.'}, 'ourComparableQuoteCents': {'type': 'integer', 'description': 'request_price_match only, when computable.'}}}
request_price_match
Request a price-match review of a competitor's WRITTEN quote from a comparable licensed notary — it never sets our price automatically. Use when the customer found a cheaper offer. Requires: `competitor_name`, `competitor_price_usd`, `service` (e.g. office, mobile, apostille), `name`, and an email or phone. Returns a logged reference and, where computable, our comparable quote; the notary decides within one business day. Fails if the name or a valid contact is missing.
외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'service', 'competitor_name', 'competitor_price_usd'], 'properties': {'name': {'type': 'string', 'description': "The customer's name."}, 'email': {'type': ['string', 'null'], 'default': None, 'description': 'Email â\x80\x94 provide an email OR a phone so we can reach them.'}, 'notes': {'type': ['string', 'null'], 'default': None, 'description': 'Anything else the notary should know.'}, 'phone': {'type': ['string', 'null'], 'default': None, 'description': 'Phone â\x80\x94 provide an email OR a phone so we can reach them.'}, 'service': {'type': 'string', 'description': 'Service: office | mobile | apostille | apostille_mail | loan.'}, 'competitor_url': {'type': ['string', 'null'], 'default': None, 'description': "Link to the competitor's quote/page, if any (stored for the operator,\nnever fetched)."}, 'document_count': {'type': ['integer', 'null'], 'format': 'int64', 'default': None, 'description': 'Number of documents, for our comparison quote. Default 1.'}, 'competitor_name': {'type': 'string', 'description': "The competitor's business name."}, 'competitor_price_usd': {'type': 'number', 'format': 'double', 'description': "The competitor's quoted price, in US dollars."}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'message'], 'properties': {'ok': {'type': 'boolean', 'const': True}, 'status': {'type': 'string', 'description': "Account tools: the booking's status after this call (Pending after book_appointment)."}, 'message': {'type': 'string', 'description': 'Customer-facing outcome; relay it as written â\x80\x94 bookings are requests until the notary confirms.'}, 'manageUrl': {'type': ['string', 'null'], 'description': 'Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).'}, 'onAccount': {'type': 'boolean', 'description': "True when the request was filed on the signed-in customer's own account â\x80\x94 they can then list it with my_bookings and change it with reschedule_booking / cancel_booking. Absent or false means a guest request, managed through the emailed link."}, 'reference': {'type': 'string', 'description': 'Request / order reference for check_request_status (guest tools) or my_bookings (account tools).'}, 'appendedToExisting': {'type': 'boolean', 'description': 'True when existing_reference was given and the request was extended, not duplicated.'}, 'ourComparableQuoteCents': {'type': 'integer', 'description': 'request_price_match only, when computable.'}}}
reschedule_booking
Move one of the signed-in customer's own bookings to a new slot. Use when an authenticated customer wants a different time: find the `order_id` via my_bookings, take a fresh startUnix from search_availability (e.g. a morning slot), send it as `scheduled_at`. Returns a done confirmation; fails if the new time is not genuinely available, the booking is not yours, or not signed in.
외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['order_id', 'scheduled_at'], 'properties': {'order_id': {'type': 'string', 'description': "The booking's order id (from my_bookings)."}, 'scheduled_at': {'type': 'integer', 'format': 'int64', 'description': "The new slot's `startUnix` (from search_availability)."}}}
출력 스키마
{'type': 'object', 'required': ['ok', 'message'], 'properties': {'ok': {'type': 'boolean', 'const': True}, 'status': {'type': 'string', 'description': "Account tools: the booking's status after this call (Pending after book_appointment)."}, 'message': {'type': 'string', 'description': 'Customer-facing outcome; relay it as written â\x80\x94 bookings are requests until the notary confirms.'}, 'manageUrl': {'type': ['string', 'null'], 'description': 'Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).'}, 'onAccount': {'type': 'boolean', 'description': "True when the request was filed on the signed-in customer's own account â\x80\x94 they can then list it with my_bookings and change it with reschedule_booking / cancel_booking. Absent or false means a guest request, managed through the emailed link."}, 'reference': {'type': 'string', 'description': 'Request / order reference for check_request_status (guest tools) or my_bookings (account tools).'}, 'appendedToExisting': {'type': 'boolean', 'description': 'True when existing_reference was given and the request was extended, not duplicated.'}, 'ourComparableQuoteCents': {'type': 'integer', 'description': 'request_price_match only, when computable.'}}}
search_availability
Find open appointment slots (validating the meeting area too). Use when the customer wants a time. Requires: `service` (office, mobile, apostille); mobile needs an `address`, e.g. a Bothell street. Returns resolved location, up to 7 recommended slots with startUnix, and per-day windows — the k-th start is startUnixFrom + k*stepSec for k < startCount; hand the picked startUnix to request_booking as `desired_time_unix`. An ungeocodable address is flagged not found.
읽기 전용 외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['service'], 'properties': {'address': {'type': ['string', 'null'], 'default': None, 'description': 'The address to meet at â\x80\x94 required for "mobile"; ignored for "office".'}, 'service': {'type': 'string', 'description': '"office" (at our office), "mobile" (we come to you), or "apostille".'}, 'document_count': {'type': ['integer', 'null'], 'format': 'int64', 'default': None, 'description': 'Number of documents (drives the appointment length). Default 1.'}}}
출력 스키마
{'type': 'object', 'required': ['resolved', 'days', 'recommended'], 'properties': {'days': {'type': 'array', 'items': {'type': 'object', 'required': ['date', 'windows'], 'properties': {'date': {'type': 'string', 'description': 'YYYY-MM-DD, Pacific.'}, 'closed': {'type': 'string', 'description': 'Present only on a day with no bookable slot: closed | full.'}, 'windows': {'type': 'array', 'items': {'type': 'object', 'required': ['from', 'until', 'fit', 'startUnixFrom', 'startCount', 'stepSec'], 'properties': {'fit': {'type': 'string', 'description': 'great | good | fair | far.'}, 'from': {'type': 'string', 'description': 'HH:MM of the first start.'}, 'until': {'type': 'string', 'description': 'HH:MM end of the last slot.'}, 'stepSec': {'type': 'integer'}, 'afterHours': {'type': 'boolean'}, 'startCount': {'type': 'integer'}, 'startUnixFrom': {'type': 'integer'}}}}}}}, 'resolved': {'type': 'object', 'required': ['withinServiceArea', 'precise'], 'properties': {'label': {'type': ['string', 'null'], 'description': 'Formatted address, or null when the address could not be resolved.'}, 'region': {'type': ['string', 'null']}, 'country': {'type': ['string', 'null']}, 'message': {'type': ['string', 'null'], 'description': 'Why the place is not bookable as given, or null.'}, 'precise': {'type': 'boolean', 'description': 'False when a street and city are still needed to pin the spot.'}, 'distanceMiles': {'type': 'number', 'description': 'Straight-line miles from the Bothell office (display only, not a routed leg).'}, 'withinServiceArea': {'type': 'boolean'}}}, 'recommended': {'type': 'array', 'items': {'type': 'object', 'required': ['date', 'start', 'startUnix', 'durationMin', 'fit'], 'properties': {'fit': {'type': 'string', 'description': 'great | good | fair | far.'}, 'date': {'type': 'string'}, 'start': {'type': 'string', 'description': 'HH:MM Pacific.'}, 'startUnix': {'type': 'integer', 'description': 'Pass to request_booking as desired_time_unix (or to book_appointment as scheduled_at).'}, 'durationMin': {'type': 'integer'}}}}, 'afterHoursSurchargeCents': {'type': 'integer', 'description': 'Mobile services only: the surcharge an afterHours slot adds.'}}, 'description': 'Open slots over the booking horizon (Pacific time). `recommended` is what to offer; `days[].windows` encodes every bookable start losslessly: the k-th start is startUnixFrom + k*stepSec for k < startCount.'}
search_documentation
Search the text of andrii.co — every service page, the terms and privacy notices, and the 110-jurisdiction apostille handbook (who issues an apostille, accepted documents, forms, offices, fees, payment). Use for reference questions the other tools do not answer, and to cite a page. Accepts: `query` (keywords, not prose — there is no semantic matching), optional `lang`, `section`, `limit`. Returns ranked page excerpts with a URL and a Markdown URL to read in full; no match is an empty list. Reference text, not a live quote — use get_price_quote and check_service_area for what we charge and where we go.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'lang': {'type': ['string', 'null'], 'default': None, 'description': 'Restrict to one language. Only `en` is indexed today; any other value\nreturns no results rather than silently ignoring the filter.'}, 'limit': {'type': ['integer', 'null'], 'format': 'uint32', 'default': None, 'minimum': 0, 'description': 'How many results (default 10, max 20).'}, 'query': {'type': 'string', 'description': 'What to look for. Keywords beat prose: this is a lexical index with no\nsemantic fallback, so "mail-in apostille birth certificate" finds the\npage that "can I post my documents instead" does not.'}, 'section': {'type': ['string', 'null'], 'default': None, 'description': 'Restrict to sections whose heading contains this text (e.g. "What it\ncosts"). Heading TEXT, not a URL fragment â\x80\x94 the pages carry no anchors.'}}}
출력 스키마
{'type': 'object', 'required': ['query', 'count', 'results', 'note'], 'properties': {'note': {'type': 'string'}, 'count': {'type': 'integer'}, 'query': {'type': 'string'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'url', 'markdownUrl', 'excerpt'], 'properties': {'url': {'type': 'string', 'description': 'Canonical page URL to cite.'}, 'title': {'type': 'string'}, 'excerpt': {'type': 'string'}, 'section': {'type': 'string'}, 'markdownUrl': {'type': 'string', 'description': 'Markdown twin of the page â\x80\x94 fetch to read it in full.'}}}}}}
추가됨
search_documentation
2026년 9월 17일 12:54 PM
추가됨
search_availability
2026년 9월 17일 12:54 PM
추가됨
reschedule_booking
2026년 9월 17일 12:54 PM
추가됨
request_price_match
2026년 9월 17일 12:54 PM
추가됨
request_booking
2026년 9월 17일 12:54 PM
추가됨
request_apostille
2026년 9월 17일 12:54 PM
추가됨
my_bookings
2026년 9월 17일 12:54 PM
추가됨
get_turnaround_estimate
2026년 9월 17일 12:54 PM
추가됨
get_services
2026년 9월 17일 12:54 PM
추가됨
get_price_quote
2026년 9월 17일 12:54 PM
추가됨
get_apostille_requirements
2026년 9월 17일 12:54 PM
추가됨
check_service_area
2026년 9월 17일 12:54 PM
추가됨
check_request_status
2026년 9월 17일 12:54 PM
추가됨
cancel_booking
2026년 9월 17일 12:54 PM
추가됨
book_appointment
2026년 9월 17일 12:54 PM