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/mcpA few lines of config and your AI is talking to Meridian. Pick your client.
$ claude mcp add --transport http meridian https://usemeridian.app/mcp$ gemini mcp add --transport http meridian https://usemeridian.app/mcp// ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"meridian": { "url": "https://usemeridian.app/mcp" }
}
}// Settings → MCP → Add server (or .cursor/mcp.json)
{
"mcpServers": {
"meridian": { "url": "https://usemeridian.app/mcp" }
}
}Settings → Custom connectors → Add Name meridian URL https://usemeridian.app/mcp Transport Streamable HTTP
Settings → Connectors → Add custom connector Name meridian URL https://usemeridian.app/mcp Transport Streamable HTTP Auth OAuth (or None for read-only)
Transport Streamable HTTP URL https://usemeridian.app/mcp Auth Optional bearer token (get one at /integrations)
The skill bundles the readiness loop so your assistant knows when and how to call these tools. Works in Claude Code, Claude.ai web, Cursor, Codex CLI, and Goose.
Five commands from your terminal. meridian login + meridian check NG-GB hit the same tools you'd wire into an AI client.
Stripe-shaped reference for auth, versioning, pagination, and the Requirements API contract.
18 tools. Expand any row to see what it does and what it accepts.
A few terms you'll see
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.
passport_isorequiredISO-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_isorequiredISO-3166 alpha-2 code of the destination country (e.g., 'TH' for Thailand, 'DE' for Germany, 'US' for United States). Case-insensitive.
residence_isooptionalOptional 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.
purposeoptionalOptional 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.
passport_isorequiredISO-3166 alpha-2 passport country.
destination_isorequiredISO-3166 alpha-2 destination country.
residence_isooptionalOptional ISO-3166 alpha-2 residence country (where the traveler lives long-term). Defaults to passport_iso when omitted.
purposerequiredTravel purpose (e.g. tourism, business).
sentimentrequiredThumbs up = positive; thumbs down = negative. For route requests (kind='request'), use 'negative'.
kindrequired'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).
bodyoptionalOptional 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.
passportoptionalOptional ISO-3166 alpha-2 passport country. Falls back to the user's vault passport when authenticated; elicited from the user when missing and unauthenticated.
destinationoptionalOptional 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.
purposeoptionalOptional 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.
visa_application_idrequiredApplication 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.
include_archivedoptionalInclude cancelled/withdrawn applications.
limitoptionalMax 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).
destination_isorequiredDestination country (ISO-3166 alpha-2).
visa_typerequiredVisa category (e.g. 'tourist', 'business').
trip_detailsoptionalOptional 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'.
visa_application_idrequiredApplication public_id ('vsa_*') or numeric DB id.
sectionrequiredSection 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.
dataoptionalSection 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_dateoptionalsection=trip only: ISO yyyy-mm-dd arrival date. Trip fields may be passed at the top level or inside `data`.
departure_dateoptionalsection=trip only: ISO yyyy-mm-dd departure date.
return_dateoptionalsection=trip only: ISO yyyy-mm-dd return date.
purposeoptionalsection=trip only: travel purpose (e.g. tourism, business); normalized server-side.
accept_suggestionoptionalApply a stashed extraction suggestion to a single field. Provide {field, doc_id} matching an entry from vault.extraction_suggestions[section].
dismiss_suggestionoptionalClear 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.
visa_application_idrequiredThe visa application public_id ('vsa_*') or numeric DB id. For task-scoped tokens, must match the task's linked application.
portal_urloptionalOptional: the consulate application portal URL. Auto-resolved from the route when omitted. Must be https://.
verification_emailoptionalOptional 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_blockersoptionalWhen 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.
visa_application_idrequiredThe visa application public_id ('vsa_*') or numeric DB id.
outcomeoptionalOne of: 'submitted', 'withdrawn', 'approved', 'rejected'. When omitted, the tool elicits the value from the user.
notesoptionalOptional 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.
visa_application_idrequiredThe 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.
visa_application_idrequiredThe 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.
visa_application_idrequiredApplication public_id ('vsa_*') or numeric DB id.
requirement_idoptionalOptional. 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).
visa_application_idrequiredApplication public_id ('vsa_*') or numeric DB id.
document_idoptionalBIND mode: existing document public_id ('doc_*'). Requires requirement_id. Mutually exclusive with file_base64 / file_url / document_type.
document_typeoptionalUPLOAD mode: document type.
file_base64optionalUPLOAD mode: base64-encoded file content. Supply this or file_url.
file_urloptionalUPLOAD mode: pre-signed URL the server fetches. Supply this or file_base64.
filenameoptionalUPLOAD mode: original filename.
content_typeoptionalUPLOAD mode: MIME type (image/jpeg, image/png, application/pdf).
requirement_idoptionalClaims 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.
visa_application_idrequiredApplication public_id ('vsa_*') or numeric DB id.
letter_typerequiredThe letter to draft.
customizationoptionalOptional 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).
visa_application_idrequiredApplication public_id ('vsa_*') or numeric DB id.
document_idrequiredDocument 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.
visa_application_idrequiredApplication this task is tied to.
task_typerequiredNon-reserved task type. form_fill and appointment_book are rejected here.
portal_urloptionalURL the worker opens (https only).
verification_emailoptionalEmail used for portal verification challenges.
override_soft_blockersoptionalWhen 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.
visa_application_idrequiredThe visa application public_id ('vsa_*') or numeric DB id.
consulate_refoptionalOptional. The consulate or visa-center the appointment is for (e.g. 'VFS-Lagos-DE').
locationoptionalOptional. Human-readable location of the appointment.
slot_windowoptionalOptional preferred date window, e.g. {earliest: '2026-07-01', latest: '2026-07-31'}. The worker picks an available slot inside it.
verification_emailoptionalOptional email address the booking portal uses for verification challenges.
override_soft_blockersoptionalWhen 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.
appointment_idrequiredThe appointment public_id ('apt_*') or numeric DB id.
Free tools work with no key. Applications, vault edits, and the Meridian Computer worker need an account. Sign in to connect your client.