Andrii Co. Notary & Apostille Assistant

Book a Washington notary or apostille appointment, get a quote, and track it, via AI assistant.

使うべきか

品質と安全性

A
説明の品質
100%
スキーマの完全性
90%
命名の品質
92%
ポイズニングのリスク
100%
権限の一致
100%
プロトコルへの準拠
100%

ツール定義とプロトコルへの準拠に関する自動分析に基づいています。

コンテキストコスト

~7,824トークン数(ツール定義)
~5.0 KB一般的なレスポンスサイズ
注意への影響は大きい(128k コンテキストの 6.11%)

これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。

インストール

ワンクリックインストール

これを `claude_desktop_config.json` ファイルに追加してください:

{
  "mcpServers": {
    "booking": {
      "url": "https://andrii.net/mcp"
    }
  }
}

リモートエンドポイント

https://andrii.net/mcpstreamable-http

できること

ツール一覧

ツール(15)

🟢 読み取り専用🟡 書き込み🔴 削除⚪ 不明
🟢book_appointment(address, document_count, notes, scheduled_at, service)

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",
  "properties": {
    "address": {
      "default": null,
      "description": "Meeting address (required for \"mobile\"; omit for office/apostille).",
      "type": [
        "string",
        "null"
      ]
    },
    "document_count": {
      "default": null,
      "description": "Number of documents. Default 1.",
      "format": "int64",
      "type": [
        "integer",
        "null"
      ]
    },
    "notes": {
      "default": null,
      "description": "Anything else the notary should know.",
      "type": [
        "string",
        "null"
      ]
    },
    "scheduled_at": {
      "default": null,
      "description": "The chosen slot's `startUnix` (from search_availability). Omit for a\n\"call me to schedule\" request (no time held).",
      "format": "int64",
      "type": [
        "integer",
        "null"
      ]
    },
    "service": {
      "description": "Service: office | mobile | apostille | loan.",
      "type": "string"
    }
  },
  "required": [
    "service"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "appendedToExisting": {
      "description": "True when existing_reference was given and the request was extended, not duplicated.",
      "type": "boolean"
    },
    "manageUrl": {
      "description": "Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).",
      "type": [
        "string",
        "null"
      ]
    },
    "message": {
      "description": "Customer-facing outcome; relay it as written — bookings are requests until the notary confirms.",
      "type": "string"
    },
    "ok": {
      "const": true,
      "type": "boolean"
    },
    "onAccount": {
      "description": "True when the request was filed on the signed-in customer's own account — 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.",
      "type": "boolean"
    },
    "ourComparableQuoteCents": {
      "description": "request_price_match only, when computable.",
      "type": "integer"
    },
    "reference": {
      "description": "Request / order reference for check_request_status (guest tools) or my_bookings (account tools).",
      "type": "string"
    },
    "status": {
      "description": "Account tools: the booking's status after this call (Pending after book_appointment).",
      "type": "string"
    }
  },
  "required": [
    "ok",
    "message"
  ]
}
🔴cancel_booking(order_id)

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",
  "properties": {
    "order_id": {
      "description": "The booking's order id (from my_bookings).",
      "type": "string"
    }
  },
  "required": [
    "order_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "appendedToExisting": {
      "description": "True when existing_reference was given and the request was extended, not duplicated.",
      "type": "boolean"
    },
    "manageUrl": {
      "description": "Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).",
      "type": [
        "string",
        "null"
      ]
    },
    "message": {
      "description": "Customer-facing outcome; relay it as written — bookings are requests until the notary confirms.",
      "type": "string"
    },
    "ok": {
      "const": true,
      "type": "boolean"
    },
    "onAccount": {
      "description": "True when the request was filed on the signed-in customer's own account — 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.",
      "type": "boolean"
    },
    "ourComparableQuoteCents": {
      "description": "request_price_match only, when computable.",
      "type": "integer"
    },
    "reference": {
      "description": "Request / order reference for check_request_status (guest tools) or my_bookings (account tools).",
      "type": "string"
    },
    "status": {
      "description": "Account tools: the booking's status after this call (Pending after book_appointment).",
      "type": "string"
    }
  },
  "required": [
    "ok",
    "message"
  ]
}
🟢check_request_status(reference)

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",
  "properties": {
    "reference": {
      "description": "The reference id returned when the request was submitted (also accepts\nthe token from the emailed confirm link).",
      "type": "string"
    }
  },
  "required": [
    "reference"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "awaitingCustomerConfirmation": {
      "type": "boolean"
    },
    "mergedInto": {
      "description": "Only for MergedWithOther: the surviving appointment's status and time.",
      "properties": {
        "scheduledAt": {
          "type": [
            "integer",
            "null"
          ]
        },
        "scheduledAtPacific": {
          "type": "string"
        },
        "status": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "note": {
      "type": "string"
    },
    "reference": {
      "type": "string"
    },
    "requestedTime": {
      "description": "Unix seconds the customer asked for on a lead, or null.",
      "type": [
        "integer",
        "null"
      ]
    },
    "scheduledAt": {
      "description": "Unix seconds.",
      "type": [
        "integer",
        "null"
      ]
    },
    "scheduledAtPacific": {
      "type": [
        "string",
        "null"
      ]
    },
    "service": {
      "description": "office | apostille | mobile | loan | ron | apostille_mail; null on a legacy row.",
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "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.",
      "type": "string"
    }
  },
  "required": [
    "reference",
    "service",
    "status",
    "awaitingCustomerConfirmation",
    "note"
  ],
  "description": "PII-minimal status of a request — never the address, name or notes."
}
🟢check_service_area(address, service)

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",
  "properties": {
    "address": {
      "description": "Street address, city, or ZIP to check (Washington State service area).",
      "type": "string"
    },
    "service": {
      "default": null,
      "description": "\"notary\" (default) or \"apostille\" — the service-area rules differ slightly.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "address"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "country": {
      "type": [
        "string",
        "null"
      ]
    },
    "distanceMiles": {
      "description": "Straight-line miles from the Bothell office (display only, not a routed leg).",
      "type": "number"
    },
    "label": {
      "description": "Formatted address, or null when the address could not be resolved.",
      "type": [
        "string",
        "null"
      ]
    },
    "message": {
      "description": "Why the place is not bookable as given, or null.",
      "type": [
        "string",
        "null"
      ]
    },
    "precise": {
      "description": "False when a street and city are still needed to pin the spot.",
      "type": "boolean"
    },
    "region": {
      "type": [
        "string",
        "null"
      ]
    },
    "withinServiceArea": {
      "type": "boolean"
    }
  },
  "required": [
    "withinServiceArea",
    "precise"
  ]
}
🟢get_apostille_requirements(destination_country, document, issuing_state)

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",
  "properties": {
    "destination_country": {
      "default": null,
      "description": "The country the apostilled document is for.",
      "type": [
        "string",
        "null"
      ]
    },
    "document": {
      "description": "The document in plain words (e.g. \"Washington birth certificate\",\n\"university diploma\", \"FBI background check\", \"power of attorney\").",
      "type": "string"
    },
    "issuing_state": {
      "default": null,
      "description": "The US state that issued or notarized it (default Washington).",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "document"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "category": {
      "description": "Document class: vital_record_mailin_ready, needs_notarized_copy, notarized_document, court_document, federal_authentication, unknown.",
      "type": "string"
    },
    "destination": {
      "properties": {
        "country": {
          "type": "string"
        },
        "effectiveDate": {
          "type": "string"
        },
        "note": {
          "type": "string"
        },
        "status": {
          "description": "member | coming_soon | non_member.",
          "type": "string"
        }
      },
      "required": [
        "country",
        "status"
      ],
      "type": [
        "object",
        "null"
      ]
    },
    "disclaimer": {
      "type": "string"
    },
    "diyPath": {
      "properties": {
        "stateFee": {
          "type": "string"
        },
        "whenToUseUs": {
          "type": "string"
        },
        "yourself": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "document": {
      "type": "string"
    },
    "eligibleForMailInAsIs": {
      "description": "True when no notarial act is needed first.",
      "type": "boolean"
    },
    "explanation": {
      "type": "string"
    },
    "howToProceed": {
      "type": "string"
    },
    "issuingState": {
      "type": "string"
    },
    "ourOffer": {
      "properties": {
        "fullServiceTiers": {
          "type": "string"
        },
        "inPersonApostilleFromCents": {
          "type": [
            "integer",
            "null"
          ]
        },
        "mailInApostilleFromCents": {
          "type": [
            "integer",
            "null"
          ]
        },
        "typicalTurnaround": {
          "type": [
            "object",
            "null"
          ]
        },
        "typicalTurnaroundTier": {
          "type": "string"
        }
      },
      "type": "object"
    }
  },
  "required": [
    "document",
    "issuingState",
    "category",
    "eligibleForMailInAsIs",
    "explanation",
    "diyPath",
    "ourOffer"
  ]
}
🟢get_price_quote(after_hours, apostille, document_count, mobile, needs_notarization, ...)

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",
  "properties": {
    "after_hours": {
      "default": false,
      "description": "Mobile only: the chosen slot is after 6pm or on a weekend.",
      "type": "boolean"
    },
    "apostille": {
      "default": false,
      "description": "True to include a Secretary-of-State apostille.",
      "type": "boolean"
    },
    "document_count": {
      "default": null,
      "description": "Number of documents (1–20). Default 1.",
      "format": "int64",
      "type": [
        "integer",
        "null"
      ]
    },
    "mobile": {
      "default": false,
      "description": "True if we travel to the customer (adds the flat travel fee).",
      "type": "boolean"
    },
    "needs_notarization": {
      "default": null,
      "description": "Set false for a mail-in apostille of already-certified public records\n(birth/marriage/death certificates) that need no notarial act.",
      "type": [
        "boolean",
        "null"
      ]
    },
    "tier": {
      "default": null,
      "description": "Apostille tier when `apostille`: expedited | priority | standard | mailin.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "amountCents": {
      "type": "integer"
    },
    "currency": {
      "type": "string"
    },
    "howToProceed": {
      "type": "string"
    },
    "lineItems": {
      "items": {
        "properties": {
          "amountCents": {
            "type": "integer"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "label",
          "amountCents"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "prepaymentRequired": {
      "type": "boolean"
    }
  },
  "required": [
    "currency",
    "amountCents",
    "lineItems",
    "prepaymentRequired",
    "howToProceed"
  ]
}
🟢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",
  "properties": {
    "business": {
      "type": "string"
    },
    "languages": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "location": {
      "type": "string"
    },
    "paymentNote": {
      "type": "string"
    },
    "paymentOptions": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "priceMatch": {
      "type": "string"
    },
    "priceQuote": {
      "description": "Which tool gives an exact figure.",
      "type": "string"
    },
    "remoteOnlineNotarization": {
      "type": "boolean"
    },
    "serviceArea": {
      "type": "string"
    },
    "services": {
      "items": {
        "properties": {
          "description": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "description"
        ],
        "type": "object"
      },
      "type": "array"
    }
  },
  "required": [
    "business",
    "serviceArea",
    "paymentOptions",
    "paymentNote",
    "services"
  ],
  "description": "Static service catalog, coverage summary and accepted payment options."
}
🟢get_turnaround_estimate(destination_country, service, shipping, tier)

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",
  "properties": {
    "destination_country": {
      "default": null,
      "description": "Destination country (used to infer shipping when `shipping` is omitted).",
      "type": [
        "string",
        "null"
      ]
    },
    "service": {
      "description": "Service: notarization | apostille | apostille_mail | loan_signing.",
      "type": "string"
    },
    "shipping": {
      "default": null,
      "description": "Delivery: pickup | us | ukraine | international. If omitted, inferred from\ndestination_country (apostille legs default to US shipping).",
      "type": [
        "string",
        "null"
      ]
    },
    "tier": {
      "default": null,
      "description": "Apostille speed tier when service is apostille: expedited | priority | standard.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "service"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "disclaimer": {
      "type": "string"
    },
    "howToProceed": {
      "type": "string"
    },
    "service": {
      "type": "string"
    },
    "stages": {
      "items": {
        "properties": {
          "businessDays": {
            "type": "integer"
          },
          "calendarDaysHigh": {
            "type": "integer"
          },
          "calendarDaysLow": {
            "type": "integer"
          },
          "note": {
            "type": "string"
          },
          "stage": {
            "type": "string"
          }
        },
        "required": [
          "stage"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "tier": {
      "type": "string"
    },
    "typicalTotalDaysHigh": {
      "type": "integer"
    },
    "typicalTotalDaysLow": {
      "type": "integer"
    }
  },
  "required": [
    "service",
    "stages",
    "typicalTotalDaysLow",
    "typicalTotalDaysHigh",
    "disclaimer"
  ],
  "description": "Staged day estimates — 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",
  "properties": {
    "bookings": {
      "description": "Latest first.",
      "items": {
        "properties": {
          "location": {
            "type": "string"
          },
          "orderId": {
            "description": "Pass to reschedule_booking / cancel_booking as order_id.",
            "type": "string"
          },
          "scheduledAt": {
            "description": "Unix seconds; null for a call-me request with no time held.",
            "type": [
              "integer",
              "null"
            ]
          },
          "service": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "orderId",
          "service",
          "status"
        ],
        "type": "object"
      },
      "type": "array"
    }
  },
  "required": [
    "bookings"
  ]
}
🟡request_apostille(destination_country, documents, email, existing_reference, name, ...)

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",
  "properties": {
    "destination_country": {
      "default": null,
      "description": "Destination country the apostilled documents are for.",
      "type": [
        "string",
        "null"
      ]
    },
    "documents": {
      "description": "What documents, in plain words (e.g. \"2 birth certificates for Ukraine\").",
      "type": "string"
    },
    "email": {
      "default": null,
      "description": "Email. Collect BOTH an email AND a phone in one question when possible;\nat least one is required.",
      "type": [
        "string",
        "null"
      ]
    },
    "existing_reference": {
      "default": null,
      "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.",
      "type": [
        "string",
        "null"
      ]
    },
    "name": {
      "description": "The customer's FULL LEGAL NAME exactly as on their government-issued ID\n(never a nickname) — apostille filings print it.",
      "type": "string"
    },
    "notes": {
      "default": null,
      "description": "Anything else the notary should know.",
      "type": [
        "string",
        "null"
      ]
    },
    "phone": {
      "default": null,
      "description": "Phone with country code — the notary confirms fastest by phone/SMS.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "documents",
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "appendedToExisting": {
      "description": "True when existing_reference was given and the request was extended, not duplicated.",
      "type": "boolean"
    },
    "manageUrl": {
      "description": "Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).",
      "type": [
        "string",
        "null"
      ]
    },
    "message": {
      "description": "Customer-facing outcome; relay it as written — bookings are requests until the notary confirms.",
      "type": "string"
    },
    "ok": {
      "const": true,
      "type": "boolean"
    },
    "onAccount": {
      "description": "True when the request was filed on the signed-in customer's own account — 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.",
      "type": "boolean"
    },
    "ourComparableQuoteCents": {
      "description": "request_price_match only, when computable.",
      "type": "integer"
    },
    "reference": {
      "description": "Request / order reference for check_request_status (guest tools) or my_bookings (account tools).",
      "type": "string"
    },
    "status": {
      "description": "Account tools: the booking's status after this call (Pending after book_appointment).",
      "type": "string"
    }
  },
  "required": [
    "ok",
    "message"
  ]
}
🟡request_booking(address, desired_time, desired_time_unix, document_count, email, ...)

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",
  "properties": {
    "address": {
      "default": null,
      "description": "Meeting address — MOBILE ONLY. Office and apostille visits automatically\nuse our Bothell office; omit this for them.",
      "type": [
        "string",
        "null"
      ]
    },
    "desired_time": {
      "default": null,
      "description": "The wanted time in plain words, when no exact slot was chosen (rides the\nnotes; the notary confirms a real time).",
      "type": [
        "string",
        "null"
      ]
    },
    "desired_time_unix": {
      "default": null,
      "description": "The chosen slot's `startUnix` from search_availability (Unix seconds).\nPass it so the request carries the exact wanted time — still a request,\nnever a hold.",
      "format": "int64",
      "type": [
        "integer",
        "null"
      ]
    },
    "document_count": {
      "default": null,
      "description": "Number of documents. Default 1.",
      "format": "int64",
      "type": [
        "integer",
        "null"
      ]
    },
    "email": {
      "default": null,
      "description": "Email. Collect BOTH an email AND a phone in one question when possible;\nat least one is required.",
      "type": [
        "string",
        "null"
      ]
    },
    "existing_reference": {
      "default": null,
      "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 — the same email/phone must be provided so we can\nverify it's the same customer. Nothing new is created.",
      "type": [
        "string",
        "null"
      ]
    },
    "name": {
      "description": "The customer's FULL LEGAL NAME exactly as on their government-issued ID\n(never a nickname or chat display name) — notarial records and apostille\nfilings print it. Ask if you only know a first name.",
      "type": "string"
    },
    "notes": {
      "default": null,
      "description": "Anything else the notary should know.",
      "type": [
        "string",
        "null"
      ]
    },
    "phone": {
      "default": null,
      "description": "Phone with country code (e.g. +1...). The notary confirms fastest by\nphone/SMS — ask for it even when an email is known.",
      "type": [
        "string",
        "null"
      ]
    },
    "service": {
      "description": "Service: office | mobile | apostille | loan.",
      "type": "string"
    }
  },
  "required": [
    "service",
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "appendedToExisting": {
      "description": "True when existing_reference was given and the request was extended, not duplicated.",
      "type": "boolean"
    },
    "manageUrl": {
      "description": "Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).",
      "type": [
        "string",
        "null"
      ]
    },
    "message": {
      "description": "Customer-facing outcome; relay it as written — bookings are requests until the notary confirms.",
      "type": "string"
    },
    "ok": {
      "const": true,
      "type": "boolean"
    },
    "onAccount": {
      "description": "True when the request was filed on the signed-in customer's own account — 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.",
      "type": "boolean"
    },
    "ourComparableQuoteCents": {
      "description": "request_price_match only, when computable.",
      "type": "integer"
    },
    "reference": {
      "description": "Request / order reference for check_request_status (guest tools) or my_bookings (account tools).",
      "type": "string"
    },
    "status": {
      "description": "Account tools: the booking's status after this call (Pending after book_appointment).",
      "type": "string"
    }
  },
  "required": [
    "ok",
    "message"
  ]
}
⚪request_price_match(competitor_name, competitor_price_usd, competitor_url, document_count, email, ...)

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",
  "properties": {
    "competitor_name": {
      "description": "The competitor's business name.",
      "type": "string"
    },
    "competitor_price_usd": {
      "description": "The competitor's quoted price, in US dollars.",
      "format": "double",
      "type": "number"
    },
    "competitor_url": {
      "default": null,
      "description": "Link to the competitor's quote/page, if any (stored for the operator,\nnever fetched).",
      "type": [
        "string",
        "null"
      ]
    },
    "document_count": {
      "default": null,
      "description": "Number of documents, for our comparison quote. Default 1.",
      "format": "int64",
      "type": [
        "integer",
        "null"
      ]
    },
    "email": {
      "default": null,
      "description": "Email — provide an email OR a phone so we can reach them.",
      "type": [
        "string",
        "null"
      ]
    },
    "name": {
      "description": "The customer's name.",
      "type": "string"
    },
    "notes": {
      "default": null,
      "description": "Anything else the notary should know.",
      "type": [
        "string",
        "null"
      ]
    },
    "phone": {
      "default": null,
      "description": "Phone — provide an email OR a phone so we can reach them.",
      "type": [
        "string",
        "null"
      ]
    },
    "service": {
      "description": "Service: office | mobile | apostille | apostille_mail | loan.",
      "type": "string"
    }
  },
  "required": [
    "name",
    "service",
    "competitor_name",
    "competitor_price_usd"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "appendedToExisting": {
      "description": "True when existing_reference was given and the request was extended, not duplicated.",
      "type": "boolean"
    },
    "manageUrl": {
      "description": "Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).",
      "type": [
        "string",
        "null"
      ]
    },
    "message": {
      "description": "Customer-facing outcome; relay it as written — bookings are requests until the notary confirms.",
      "type": "string"
    },
    "ok": {
      "const": true,
      "type": "boolean"
    },
    "onAccount": {
      "description": "True when the request was filed on the signed-in customer's own account — 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.",
      "type": "boolean"
    },
    "ourComparableQuoteCents": {
      "description": "request_price_match only, when computable.",
      "type": "integer"
    },
    "reference": {
      "description": "Request / order reference for check_request_status (guest tools) or my_bookings (account tools).",
      "type": "string"
    },
    "status": {
      "description": "Account tools: the booking's status after this call (Pending after book_appointment).",
      "type": "string"
    }
  },
  "required": [
    "ok",
    "message"
  ]
}
🟡reschedule_booking(order_id, scheduled_at)

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",
  "properties": {
    "order_id": {
      "description": "The booking's order id (from my_bookings).",
      "type": "string"
    },
    "scheduled_at": {
      "description": "The new slot's `startUnix` (from search_availability).",
      "format": "int64",
      "type": "integer"
    }
  },
  "required": [
    "order_id",
    "scheduled_at"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "appendedToExisting": {
      "description": "True when existing_reference was given and the request was extended, not duplicated.",
      "type": "boolean"
    },
    "manageUrl": {
      "description": "Guest requests: the emailed confirm/cancel link, when one was minted (null otherwise).",
      "type": [
        "string",
        "null"
      ]
    },
    "message": {
      "description": "Customer-facing outcome; relay it as written — bookings are requests until the notary confirms.",
      "type": "string"
    },
    "ok": {
      "const": true,
      "type": "boolean"
    },
    "onAccount": {
      "description": "True when the request was filed on the signed-in customer's own account — 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.",
      "type": "boolean"
    },
    "ourComparableQuoteCents": {
      "description": "request_price_match only, when computable.",
      "type": "integer"
    },
    "reference": {
      "description": "Request / order reference for check_request_status (guest tools) or my_bookings (account tools).",
      "type": "string"
    },
    "status": {
      "description": "Account tools: the booking's status after this call (Pending after book_appointment).",
      "type": "string"
    }
  },
  "required": [
    "ok",
    "message"
  ]
}
🟢search_availability(address, document_count, service)

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",
  "properties": {
    "address": {
      "default": null,
      "description": "The address to meet at — required for \"mobile\"; ignored for \"office\".",
      "type": [
        "string",
        "null"
      ]
    },
    "document_count": {
      "default": null,
      "description": "Number of documents (drives the appointment length). Default 1.",
      "format": "int64",
      "type": [
        "integer",
        "null"
      ]
    },
    "service": {
      "description": "\"office\" (at our office), \"mobile\" (we come to you), or \"apostille\".",
      "type": "string"
    }
  },
  "required": [
    "service"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "afterHoursSurchargeCents": {
      "description": "Mobile services only: the surcharge an afterHours slot adds.",
      "type": "integer"
    },
    "days": {
      "items": {
        "properties": {
          "closed": {
            "description": "Present only on a day with no bookable slot: closed | full.",
            "type": "string"
          },
          "date": {
            "description": "YYYY-MM-DD, Pacific.",
            "type": "string"
          },
          "windows": {
            "items": {
              "properties": {
                "afterHours": {
                  "type": "boolean"
                },
                "fit": {
                  "description": "great | good | fair | far.",
                  "type": "string"
                },
                "from": {
                  "description": "HH:MM of the first start.",
                  "type": "string"
                },
                "startCount": {
                  "type": "integer"
                },
                "startUnixFrom": {
                  "type": "integer"
                },
                "stepSec": {
                  "type": "integer"
                },
                "until": {
                  "description": "HH:MM end of the last slot.",
                  "type": "string"
                }
              },
              "required": [
                "from",
                "until",
                "fit",
                "startUnixFrom",
                "startCount",
                "stepSec"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "date",
          "windows"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "recommended": {
      "items": {
        "properties": {
          "date": {
            "type": "string"
          },
          "durationMin": {
            "type": "integer"
          },
          "fit": {
            "description": "great | good | fair | far.",
            "type": "string"
          },
          "start": {
            "description": "HH:MM Pacific.",
            "type": "string"
          },
          "startUnix": {
            "description": "Pass to request_booking as desired_time_unix (or to book_appointment as scheduled_at).",
            "type": "integer"
          }
        },
        "required": [
          "date",
          "start",
          "startUnix",
          "durationMin",
          "fit"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "resolved": {
      "properties": {
        "country": {
          "type": [
            "string",
            "null"
          ]
        },
        "distanceMiles": {
          "description": "Straight-line miles from the Bothell office (display only, not a routed leg).",
          "type": "number"
        },
        "label": {
          "description": "Formatted address, or null when the address could not be resolved.",
          "type": [
            "string",
            "null"
          ]
        },
        "message": {
          "description": "Why the place is not bookable as given, or null.",
          "type": [
            "string",
            "null"
          ]
        },
        "precise": {
          "description": "False when a street and city are still needed to pin the spot.",
          "type": "boolean"
        },
        "region": {
          "type": [
            "string",
            "null"
          ]
        },
        "withinServiceArea": {
          "type": "boolean"
        }
      },
      "required": [
        "withinServiceArea",
        "precise"
      ],
      "type": "object"
    }
  },
  "required": [
    "resolved",
    "days",
    "recommended"
  ],
  "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(lang, limit, query, section)

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",
  "properties": {
    "lang": {
      "default": null,
      "description": "Restrict to one language. Only `en` is indexed today; any other value\nreturns no results rather than silently ignoring the filter.",
      "type": [
        "string",
        "null"
      ]
    },
    "limit": {
      "default": null,
      "description": "How many results (default 10, max 20).",
      "format": "uint32",
      "minimum": 0,
      "type": [
        "integer",
        "null"
      ]
    },
    "query": {
      "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.",
      "type": "string"
    },
    "section": {
      "default": null,
      "description": "Restrict to sections whose heading contains this text (e.g. \"What it\ncosts\"). Heading TEXT, not a URL fragment — the pages carry no anchors.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "query"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "count": {
      "type": "integer"
    },
    "note": {
      "type": "string"
    },
    "query": {
      "type": "string"
    },
    "results": {
      "items": {
        "properties": {
          "excerpt": {
            "type": "string"
          },
          "markdownUrl": {
            "description": "Markdown twin of the page — fetch to read it in full.",
            "type": "string"
          },
          "section": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "description": "Canonical page URL to cite.",
            "type": "string"
          }
        },
        "required": [
          "title",
          "url",
          "markdownUrl",
          "excerpt"
        ],
        "type": "object"
      },
      "type": "array"
    }
  },
  "required": [
    "query",
    "count",
    "results",
    "note"
  ]
}

コミュニティ

このサーバーを評価する

エビデンス

最近の観測

検証済みバージョンは記録されていませんツール 15 件
検証済みバージョンは記録されていませんツール 15 件