Part ofbyFounders

MCP server, live.
You're looking at it.

Visa rules, application prep, and automated form-fills for any AI assistant that speaks MCP. Drop this URL into Claude, ChatGPT, Cursor, or anywhere else.

https://usemeridian.app/mcp
18 toolsFree visa lookups, no key neededToken unlocks applications, vault, and the Computer worker

Install

A few lines of config and your AI is talking to Meridian. Pick your client.

bash
$ claude mcp add --transport http meridian https://usemeridian.app/mcp

What your AI gets

18 tools. Expand any row to see what it does and what it accepts.

Static · pre-fetch

A few terms you'll see

Application.
A tracked visa application: one trip, one destination.
Vault.
Your identity store: passport, employer, travel history.
Meridian Computer.
A browser agent that fills out the consulate portal on your behalf.
Corridor.
Passport country + destination (e.g., NG to GB).

Visa requirements for a route (passport country → destination country): documents, fee, processing time, visa-free eligibility. Pass residence_iso when the user lives outside their passport country (residence-permit rules apply). If the passport country is unknown, ask before calling.

Parameters
  • passport_isorequired
    string

    ISO-3166 alpha-2 code of the traveler's passport country (e.g., 'NG', 'DK', 'GB'). Case-insensitive. IMPORTANT: when called with a user-scoped token, Meridian uses the passport on file in the user's vault and ignores this value if it differs. The response includes route.passport_iso_source: 'vault' means we used the stored passport (disclose to user, e.g. 'I'll look this up on your NG passport on file'); 'request' means we used your value. If you don't know the user's passport country and there's no vault, ask before calling.

  • destination_isorequired
    string

    ISO-3166 alpha-2 code of the destination country (e.g., 'TH' for Thailand, 'DE' for Germany, 'US' for United States). Case-insensitive.

  • residence_isooptional
    string

    Optional ISO-3166 alpha-2 code of where the traveler currently lives long-term, separate from their passport country. Examples: 'DK' (Danish resident), 'DE' (German resident). Case-insensitive. When present, Meridian applies residence-permit reciprocity rules (Schengen permit → free movement in Schengen, etc). Defaults to passport country when omitted, preserving existing behavior.

  • purposeoptional
    string

    Optional travel purpose: 'tourism', 'business', 'study', 'transit', 'medical', 'visiting family'. Narrows the document list to the matching visa category and surfaces a mismatch warning if the route doesn't cover that purpose.

Log feedback on a route we returned (kind=feedback) or request a route we don't cover yet (kind=request, when requirements_lookup returned found=false). Requests use sentiment=negative.

Parameters
  • passport_isorequired
    string

    ISO-3166 alpha-2 passport country.

  • destination_isorequired
    string

    ISO-3166 alpha-2 destination country.

  • residence_isooptional
    string

    Optional ISO-3166 alpha-2 residence country (where the traveler lives long-term). Defaults to passport_iso when omitted.

  • purposerequired
    string

    Travel purpose (e.g. tourism, business).

  • sentimentrequired
    string

    Thumbs up = positive; thumbs down = negative. For route requests (kind='request'), use 'negative'.

  • kindrequired
    string

    'feedback' = comment on a route we returned. 'request' = log a route or location we don't yet cover (use when requirements_lookup returned found=false or insufficient data).

  • bodyoptional
    string

    Optional free-text body, max 500 chars. PII-screened on save. For requests, capture what the user is trying to do (visa class, urgency, where they live).

Run the deterministic consistency checks for a corridor against the user's saved vault data: per-check detail (pass/warn/fail/abstain), a `skipped` list of checks that couldn't run yet (each names the document that would unblock it), plus a has_critical_issues flag. Two-tier semantics: ephemeral and deterministic, with NO ready/not_yet verdict field and no persisted Assessment; the narrated, persisted verdict is produced by a full readiness check on an application. Passport and destination fall back to the user's saved info or are elicited when missing. Read-only. For an existing visa application, use applications_evaluate.

Parameters
  • passportoptional
    string

    Optional ISO-3166 alpha-2 passport country. Falls back to the user's vault passport when authenticated; elicited from the user when missing and unauthenticated.

  • destinationoptional
    string

    Optional ISO-3166 alpha-2 destination country. Elicited from the user when missing: the tool returns a structured prompt the agent can surface to ask the user.

  • purposeoptional
    string

    Optional travel purpose used to refine the route's data.

Read one visa application: profile, trip details, status, and latest Computer task_id (when one is running). Pass task_id to tasks/get for live progress.

Parameters
  • visa_application_idrequired
    string | integer

    Application public_id ('vsa_*') or numeric DB id.

List the authenticated user's visa applications. Returns the most-recently-updated first. Cancelled/withdrawn applications are hidden unless include_archived is true.

Parameters
  • include_archivedoptional
    boolean

    Include cancelled/withdrawn applications.

  • limitoptional
    integer

    Max applications to return (1-100).

Start a tracked visa application for the authenticated user. Use once the user has chosen to apply (for general 'what do I need' questions, call requirements_lookup).

Parameters
  • destination_isorequired
    string

    Destination country (ISO-3166 alpha-2).

  • visa_typerequired
    string

    Visa category (e.g. 'tourist', 'business').

  • trip_detailsoptional
    object

    Optional trip data (purpose, dates, accommodations, sponsors).

Write a named section on a visa application. Three shapes: `data` for a full section write; `accept_suggestion: {field, doc_id}` to apply a stashed extraction suggestion to a single field; `dismiss_suggestion: {field, doc_id}` to clear a stash entry without changing the field. Use section 'trip' to set the trip itself (arrival_date, departure_date, return_date in ISO yyyy-mm-dd, and purpose), which lives on the application, not a vault section. Partial writes merge (sending phone+email won't wipe the name). Section data is recorded with source 'mcp_agent'; accept_suggestion is recorded with source 'extraction'.

Parameters
  • visa_application_idrequired
    string | integer

    Application public_id ('vsa_*') or numeric DB id.

  • sectionrequired
    string

    Section key: 'trip' for travel dates + purpose; a vault section (personal, identities, employment_history, finances, education, addresses, relations, travel_history, rejection_history, background, social_media, inviter); or a harmonised EU-form trip section (applicant, guardian, travel_document, eu_relation, home_contact, residence_other, occupation, travel_plan, fingerprints, entry_permit, inviting_party, cost_of_living, person_filling_form, invitation, insurance). See `data` for each section's fields.

  • dataoptional
    object | array

    Section write. SINGLETON sections (e.g. personal, background) take a { field: value } object using the section's canonical keys. LIST sections (employment_history, rejection_history, travel_history, addresses, identities, education, social_media) take an ARRAY of entry objects (or a single entry object), and the write REPLACES the section wholesale. Off-schema keys, and list payloads whose shape can't be read as entries, are rejected. applications_get returns the current shape per section. For section 'trip', pass the trip fields (below) rather than data. Shape and fields per section (each line: `section (shape): fields`): personal (single object): full_name, surname, surname_at_birth, given_names, date_of_birth, place_of_birth, country_of_birth, gender, marital_status, marital_status_other, nationality_at_birth, other_nationalities, national_identity_number, occupation_title, phone, email identities (array of objects): kind, passport_type, passport_type_other, number, country_iso, issue_date, expiry, place_of_birth, date_of_birth, is_current employment_history (array of objects): employer, position, start_date, end_date, current, city, country_iso, monthly_income, currency finances (object { sources: [ { type, description, amount, currency } ] }) education (array of objects): institution, degree, field_of_study, start_date, end_date, current, city, country_iso addresses (array of objects): address_line1, address_line2, city, state_province, postal_code, country_iso, address_type relations (object): spouse: { name, nationality, date_of_birth }, father: { name, nationality }, mother: { name, nationality }, children: [ { name, date_of_birth } ], contacts_in_destination: [ { name, relationship, country_iso } ] travel_history (array of objects): country_iso, entry_date, exit_date, visa_type, purpose rejection_history (array of objects): country_iso, visa_type, rejection_date, reason, identity_kind, identity_country_iso background (single object): military_service_flag, military_service, skills, arrested_flag, security_question_1, overstay_flag, security_question_2, security_explanation social_media (array of objects): platform, handle, url inviter (single object): full_name, relationship, address, phone, email, country_iso, visit_start_date, visit_end_date Harmonised EU-form trip sections (each a single object): applicant: surname, surname_at_birth, given_names, date_of_birth, place_of_birth, country_of_birth, sex, civil_status, civil_status_other, nationality_current, nationality_at_birth, other_nationalities, national_identity_number guardian: has_guardian, surname, first_name, address, postal_code, city, nationality, email, phone travel_document: type, type_other, number, date_of_issue, valid_until, issued_by_country eu_relation: is_related, exercising_free_movement, surname, first_names, date_of_birth, passport_or_id_number, nationality, family_relationship, family_relationship_other home_contact: address, postal_code, city, country_iso, email, phone_country_code, phone_number, additional_phone residence_other: resides_elsewhere, permission_to_return, residence_permit_no, residence_permit_valid_until occupation: works, is_student, is_retired, occupation, title_description, employer_name, employer_address, employer_postal_code, employer_city, employer_country, employer_phone travel_plan: main_destination_state, other_member_states, purpose, purpose_other, other_purposes, additional_purpose_info, number_of_entries, arrival_date, departure_date, return_date, first_entry_country fingerprints: collected_before, collected_date, visa_sticker_number entry_permit: has_permit, issued_by, valid_from, valid_until inviting_party: hosts, company cost_of_living: by_applicant, by_sponsor person_filling_form: surname, first_name, address, email, phone invitation: invited, online_invitation, invitation_id insurance: provider, policy_number, coverage_start, coverage_end, coverage_type, insured_name

  • arrival_dateoptional
    string

    section=trip only: ISO yyyy-mm-dd arrival date. Trip fields may be passed at the top level or inside `data`.

  • departure_dateoptional
    string

    section=trip only: ISO yyyy-mm-dd departure date.

  • return_dateoptional
    string

    section=trip only: ISO yyyy-mm-dd return date.

  • purposeoptional
    string

    section=trip only: travel purpose (e.g. tourism, business); normalized server-side.

  • accept_suggestionoptional
    object

    Apply a stashed extraction suggestion to a single field. Provide {field, doc_id} matching an entry from vault.extraction_suggestions[section].

  • dismiss_suggestionoptional
    object

    Clear a stashed suggestion without changing the field. Same shape as accept_suggestion.

Dispatch Meridian Computer (the browser agent) to fill the consulate portal for a ready visa application. The Computer fills the form and PAUSES before the final submit — this does not file the application; the user submits at the portal and then calls applications_report_status 'submitted'. Runs readiness gating: soft blockers return a non-error blocked envelope unless override_soft_blockers; hard blockers raise validation_error. Idempotent.

Parameters
  • visa_application_idrequired
    string | integer

    The visa application public_id ('vsa_*') or numeric DB id. For task-scoped tokens, must match the task's linked application.

  • portal_urloptional
    string

    Optional: the consulate application portal URL. Auto-resolved from the route when omitted. Must be https://.

  • verification_emailoptional
    string

    Optional override for the email Meridian Computer uses for portal verification. Defaults to the user's provisioned Meridian inbox so receipts route through Resend.

  • override_soft_blockersoptional
    boolean

    When true, bypass soft submission blockers (no readiness check, stale check, not-ready verdict). Hard blockers still apply.

Tell Meridian what's happened with a visa application. Records 'submitted' (the user filed it, whether by hand or after Meridian Computer filled the portal), 'approved' / 'rejected' (embassy decided), or 'withdrawn' (user pulled it post-submission). When called without an outcome, the tool elicits the status from the user via a structured prompt. The 'submitted' outcome bypasses readiness checks because the user has already filed the visa application; readiness is moot at that point. To have Meridian Computer FILL the portal first (it pauses before submit), call applications_apply.

Parameters
  • visa_application_idrequired
    string | integer

    The visa application public_id ('vsa_*') or numeric DB id.

  • outcomeoptional
    string

    One of: 'submitted', 'withdrawn', 'approved', 'rejected'. When omitted, the tool elicits the value from the user.

  • notesoptional
    string

    Optional free-text notes about the outcome (e.g., embassy reason for rejection, date of submission).

Cancel a draft or ready visa application. Refuses post-submission (use applications_report_status with outcome='withdrawn') and refuses when a Computer task is running (cancel it via tasks/cancel first). Idempotent.

Parameters
  • visa_application_idrequired
    string | integer

    The visa application public_id ('vsa_*') or numeric DB id.

Evaluate a specific visa application's readiness to submit. Runs the full deterministic consistency-check suite (the same checks that ground the persisted web readiness verdict) against the visa application's vault, applying_from_iso, destination_iso, and trip_details. Returns per-check status (pass/warn/fail/abstain) with citations, a `skipped` list of checks that couldn't run yet (each names the document that would unblock it), a purpose-scoped `vault_match` document checklist that separates required (`missing`) from optional (`missing_optional`), and a has_critical_issues flag. An empty `checks` array with a populated `skipped` list means 'nothing evaluated yet' — upload the named documents and re-evaluate, not 'all clear'. Two-tier semantics: this is an ephemeral deterministic report with NO ready/not_yet verdict field and no persisted Assessment; the narrated, persisted verdict comes from the application's readiness check on the web surface and may lag this report. A check abstains when we have no extracted route rule to ground it. Use this once a visa application exists; for a route without an application, call requirements_evaluate.

Parameters
  • visa_application_idrequired
    string | integer

    The visa application public_id ('vsa_*') or numeric DB id. For task-scoped tokens, must match the task's linked visa application.

List documents attached to a visa application. Optional requirement_id filters to docs that satisfy a specific document requirement on this route.

Parameters
  • visa_application_idrequired
    string | integer

    Application public_id ('vsa_*') or numeric DB id.

  • requirement_idoptional
    string

    Optional. Filter to docs matching this requirement (req_*).

Attach a document to a visa application. Two modes: UPLOAD (supply file_base64 or file_url + document_type) or BIND EXISTING (supply document_id + requirement_id — binding needs to know which slot the document claims). Re-uploading the same document_type on the same visa application replaces the existing file on the same record (one passport per visa application).

Parameters
  • visa_application_idrequired
    string | integer

    Application public_id ('vsa_*') or numeric DB id.

  • document_idoptional
    string

    BIND mode: existing document public_id ('doc_*'). Requires requirement_id. Mutually exclusive with file_base64 / file_url / document_type.

  • document_typeoptional
    string

    UPLOAD mode: document type.

  • file_base64optional
    string

    UPLOAD mode: base64-encoded file content. Supply this or file_url.

  • file_urloptional
    string

    UPLOAD mode: pre-signed URL the server fetches. Supply this or file_base64.

  • filenameoptional
    string

    UPLOAD mode: original filename.

  • content_typeoptional
    string

    UPLOAD mode: MIME type (image/jpeg, image/png, application/pdf).

  • requirement_idoptional
    string

    Claims a requirement (req_*) so coverage roll-ups mark the slot satisfied. REQUIRED in BIND mode (a bind with no requirement_id is rejected); optional in UPLOAD mode, where the document_type infers the slot.

Start drafting a supporting letter or itinerary for a visa application from the case's own data. The render runs in the background and attaches the letter to the case when it finishes, so this tool returns a 'drafting' acknowledgement (object: application.letter_generation, status: drafting), NOT the document — tell the user it's being drafted and will appear in their checklist shortly, then poll applications_documents_list if you need to confirm it landed. letter_type is one of: cover_letter, invitation_letter, employer_letter, itinerary, sworn_declaration, purpose_of_visit_letter. Pass an optional customization object (free-text emphases, sponsor details) to tailor the draft. When the case is missing details the letter needs, the tool returns a validation_error naming the missing fields so you can ask the user for them BEFORE anything is queued. Use this instead of telling the user Meridian can't draft letters — it can.

Parameters
  • visa_application_idrequired
    string | integer

    Application public_id ('vsa_*') or numeric DB id.

  • letter_typerequired
    string

    The letter to draft.

  • customizationoptional
    object

    Optional per-letter customization (e.g. purpose_detail, sponsor_name, custom_instructions). Unknown keys are ignored.

Remove a document from a visa application. Owner-only. Refuses once the visa application is submitted (the document trail is locked at submission for audit integrity).

Parameters
  • visa_application_idrequired
    string | integer

    Application public_id ('vsa_*') or numeric DB id.

  • document_idrequired
    string

    Document public_id ('doc_*') to delete.

Run Meridian Computer on a non-visa task tied to a visa application (custom portal, ancillary form). For visa form-fill, use applications_apply; for appointment booking, use appointments_book.

Parameters
  • visa_application_idrequired
    string | integer

    Application this task is tied to.

  • task_typerequired
    string

    Non-reserved task type. form_fill and appointment_book are rejected here.

  • portal_urloptional
    string

    URL the worker opens (https only).

  • verification_emailoptional
    string

    Email used for portal verification challenges.

  • override_soft_blockersoptional
    boolean

    When true, dispatch even if a curated entry restriction suspends issuance for this nationality. Issuance stays suspended; a new visa may not be granted.

Dispatch Meridian Computer to book a consulate or visa-center appointment slot on the user's behalf. Use when the user wants Meridian to secure an appointment. Requires an existing visa application (call applications_create first). Idempotent: returns the in-flight booking if one is already running. After dispatch, call appointments_get to check whether the slot is confirmed.

Parameters
  • visa_application_idrequired
    string | integer

    The visa application public_id ('vsa_*') or numeric DB id.

  • consulate_refoptional
    string

    Optional. The consulate or visa-center the appointment is for (e.g. 'VFS-Lagos-DE').

  • locationoptional
    string

    Optional. Human-readable location of the appointment.

  • slot_windowoptional
    object

    Optional preferred date window, e.g. {earliest: '2026-07-01', latest: '2026-07-31'}. The worker picks an available slot inside it.

  • verification_emailoptional
    string

    Optional email address the booking portal uses for verification challenges.

  • override_soft_blockersoptional
    boolean

    When true, book even if a curated entry restriction suspends issuance for this nationality. Issuance stays suspended; a new visa may not be granted.

Read one appointment booking: status, consulate, slot time, and confirmation number once booked. Use after appointments_book to surface progress to the user.

Parameters
  • appointment_idrequired
    string | integer

    The appointment public_id ('apt_*') or numeric DB id.

Want full access?

Free tools work with no key. Applications, vault edits, and the Meridian Computer worker need an account. Sign in to connect your client.