# ESQ Matching Engine (remote · match.esqcopilot.com)

Find, compare and price licensed U.S. lawyers from official licensing records. Not legal advice.

- Trust score: 72/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-04

## Components

- remote · `match.esqcopilot.com`: 72/100 (this document), [markdown](https://verifymcp.io/servers/sustany-alcbar-match/match-2.md), [page](https://verifymcp.io/servers/sustany-alcbar-match/match-2)

## Channel facts

- Endpoint: `https://match.esqcopilot.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.3.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-04.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (request_attorney_introduction).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 72/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4310 tokens (~226/item across 19 items; 15 tools + 4 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 50/100
  - Stability observed for 15 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 85/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 48% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the ESQ Matching Engine MCP server?

ESQ Matching Engine is a hosted endpoint at https://match.esqcopilot.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http sustany-alcbar-match 'https://match.esqcopilot.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "sustany-alcbar-match": {
      "url": "https://match.esqcopilot.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "sustany-alcbar-match": {
      "type": "http",
      "url": "https://match.esqcopilot.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.sustany-alcbar-match]
url = "https://match.esqcopilot.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sustany-alcbar-match": {
      "type": "remote",
      "url": "https://match.esqcopilot.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add sustany-alcbar-match --url 'https://match.esqcopilot.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  sustany-alcbar-match:
    url: "https://match.esqcopilot.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "sustany-alcbar-match": {
      "Transport": "http",
      "Url": "https://match.esqcopilot.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add sustany-alcbar-match -t streamable-http -u 'https://match.esqcopilot.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "sustany-alcbar-match": {
      "type": "http",
      "url": "https://match.esqcopilot.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 72, +1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] New tool “cancel_introduction”, which the server declares destructive
- [security] New tool “confirm_introduction”, which the server declares destructive
- [security] Tool “find_attorneys” rewrote its description, which is the text the model reads
- [security] Tool “get_attorney_profile” rewrote its description, which is the text the model reads
- [security] Tool “get_referral_status” rewrote its description, which is the text the model reads
- [security] Tool “request_attorney_introduction” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 196 → 226
- [functional improvement] Tool coverage: 42% → 48%
- [functional] Server version: 1.5.0 → 1.7.0
- [functional] New tool “get_introduction_status”
- [functional] New tool “prepare_introduction”
- [functional] New tool “start_from_directory_profile”
- [cosmetic] “find_attorneys” added an optional parameter “introduction_ready_only”
- [cosmetic] “request_attorney_introduction” added an optional parameter “approval_code”
- [cosmetic] “request_attorney_introduction” added an optional parameter “entry_id”
- [cosmetic] “request_attorney_introduction” added an optional parameter “pending_ok”

### 2026-11-02 (score 71, +1)

- [functional] Server version: 1.4.0 → 1.5.0
- [cosmetic] “request_attorney_introduction” added an optional parameter “intake_notice_acknowledged”
- [cosmetic] “request_attorney_introduction” added an optional parameter “opposing_party_name”

### 2026-10-31 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 68, +1)

- [functional] Server version: 1.3.0 → 1.4.0

### 2026-10-24 (score 67, +5)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “check_attorney_availability” rewrote its description, which is the text the model reads
- [security] Tool “compare_attorneys” rewrote its description, which is the text the model reads
- [security] Tool “estimate_legal_cost” rewrote its description, which is the text the model reads
- [security] Tool “find_attorneys” rewrote its description, which is the text the model reads
- [security] Tool “get_attorney_profile” rewrote its description, which is the text the model reads
- [security] Tool “get_matching_requirements” rewrote its description, which is the text the model reads
- [security] Tool “get_referral_status” rewrote its description, which is the text the model reads
- [security] Tool “request_attorney_introduction” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 215 → 252
- [functional improvement] Schema quality: 215 → 192
- [functional improvement] Tool “compare_attorneys” now declares an output schema
- [functional improvement] Tool “check_attorney_availability” now declares an output schema
- [functional improvement] Tool “estimate_legal_cost” now declares an output schema
- [functional improvement] Tool “find_attorneys” now declares an output schema
- [functional improvement] Tool “get_attorney_profile” now declares an output schema
- [functional improvement] Tool “get_matching_requirements” now declares an output schema
- [functional improvement] Tool “get_referral_status” now declares an output schema
- [functional improvement] Tool “request_attorney_introduction” now declares an output schema
- [functional improvement] Tool “submit_matching_feedback” now declares an output schema
- [functional improvement] Tool “update_matching_preferences” now declares an output schema
- [functional] The server now declares the “resources” capability
- [functional] First check of Schema quality: 100
- [functional] First check of Tool coverage: 100
- [functional] New resource “citation-policy”
- [functional] New resource “coverage”
- [functional] New resource “data-sources”
- [functional] New resource “practice-areas”
- [functional] Server version: match-2026.10.24 → 1.3.0
- [functional] Server version: match-2026.10.15 → match-2026.10.24
- [cosmetic] “find_attorneys” added an optional parameter “verbosity”
- [cosmetic] Tool “check_attorney_availability” changed its title: Check lawyer availability → Check if a lawyer is taking clients
- [cosmetic] Tool “estimate_legal_cost” changed its title: What will a lawyer cost? → What will representation cost?
- [cosmetic] Tool “find_attorneys” changed its title: Find and rank lawyers for a legal matter → Find a licensed lawyer
- [cosmetic] Tool “get_attorney_profile” changed its title: Get a lawyer's matching profile → Get a lawyer's profile and sources
- [cosmetic] Tool “get_matching_requirements” changed its title: What ESQ Matching Engine needs to match a lawyer → What to ask before finding a lawyer
- [cosmetic] Tool “request_attorney_introduction” changed its title: Request an introduction to a lawyer (needs consent) → Help me request an introduction (needs my yes)

### 2026-10-22 (score 62, +1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] The server changed its declared name: esq-copilot-matching → esq-matching-engine
- [security] Tool “check_attorney_availability” rewrote its description, which is the text the model reads
- [security] Tool “compare_attorneys” rewrote its description, which is the text the model reads
- [security] Tool “get_referral_status” rewrote its description, which is the text the model reads
- [cosmetic] “request_attorney_introduction” reworded the description of “attribution_token”
- [cosmetic] “find_attorneys” reworded the description of “deadline_date”
- [cosmetic] “get_matching_requirements” reworded the description of “client_side”
- [cosmetic] “get_matching_requirements” reworded the description of “deadline_date”
- [cosmetic] “find_attorneys” reworded the description of “attribution_token”
- [cosmetic] “find_attorneys” reworded the description of “client_side”
- [cosmetic] “request_attorney_introduction” reworded the description of “idempotency_key”
- [cosmetic] “get_referral_status” reworded the description of “status_token”
- [cosmetic] Tool “get_matching_requirements” changed its title: What ESQ CoPilot needs to match a lawyer → What ESQ Matching Engine needs to match a lawyer

### 2026-10-21 (score 61, 0)

- [security] Tool “update_matching_preferences” is now declared destructive
- [functional improvement] Stability: unverified → 0.03

## MCP tools (15)

### `start_from_directory_profile` (~291 tokens)

Start with a lawyer from the ESQ CoPilot directory

Use FIRST when the user names or pastes an ESQ CoPilot directory profile (directory.esqcopilot.com/attorney/...) or says they want help with a lawyer they were viewing, e.g. "help me assess and contact Jeffrey Roy Hartmann, California bar 150013: https://directory.esqcopilot.com/attorney/jeffrey-hartmann-ca-150013". Resolves that exact lawyer from the directory's own records (no web fetch, no similar-name substitute) and returns the lawyer's facts with sources and dates, what is unknown, the contact routes, and the first thing to say and the few questions to ask. Do not run find_attorneys first when the exact listing is given. Choosing a listing is not a verified match, availability or endorsement. Records an anonymous count only.

Input parameters:

- `attorney_id` (string): The lawyer's stable id, if known. When both are given they must name the same lawyer.
- `platform` (string): Which assistant the user chose on the listing, if they said so. Not consent to anything.
- `profile_url` (string): The directory profile address the user came from, e.g. https://directory.esqcopilot.com/attorney/jeffrey-hartmann-ca-150013. Only directory.esqcopilot.com profile addresses are accepted; the page is…

Output parameters:

- `api_version`
- `assessment`
- `attribution`
- `contact_options`
- `conversation`
- `entry_id`
- `entry_version`
- `facts`
- `harness_required`
- `legal_aid`
- `notices`
- `selected_lawyer`
- `selection_notice`
- `test_data`
- `unknowns`

### `prepare_introduction` (~343 tokens)

Prepare my message to one lawyer (nothing is sent)

Use when the user wants to contact ONE lawyer ("prepare my message"). Builds a short, editable first message from general facts (matter type, matter location, help wanted, the user's own timing, optional budget, contact method), asks the lawyer what is unknown (handles this matter? taking new clients? consultation fee?), and returns the exact recipient, message, contact fields, intake notice, consent text and an approval_code. Stores and sends nothing. Show all of it to the user; only after an explicit yes call request_attorney_introduction with after_yes.arguments. Any change by the user means calling this again and asking again.

Input parameters:

- `assistance` (string): What help the user wants, in a few words (e.g. 'a will and a trust', 'advice on an eviction notice')
- `attorney_id` (string, required)
- `budget` (string): Optional budget in the user's words
- `contact` (object, required): Only the contact details the user chose to give for this lawyer
- `entry_id` (string)
- `matter_location` (string): City or county of the matter, as the user said it
- `message` (string): The user's edited message. Omit to get a short draft; pass the user's final wording after any edit.
- `practice_area` (string): General matter type in plain words, e.g. 'estate planning'
- `preferred_contact_method` (string, required)
- `state` (string, required): State where the MATTER is (not the lawyer's office state). Ask the user; do not infer it.
- `timing` (string): Timing as the USER reported it. Not checked or calculated.

Output parameters:

- `after_yes`
- `api_version`
- `approval_code`
- `blockers`
- `can_request_introduction`
- `consent_text`
- `coverage_notice`
- `delivery`
- `fields_authorized`
- `fields_to_share`
- `if_blocked_say`
- `intake_notice`
- `legal_aid`
- `message`
- `message_is_draft`
- `notices`
- `recipient`
- `show_user`
- `stored`

### `get_matching_requirements` (~566 tokens)

What to ask before finding a lawyer

Use first when someone asks for a lawyer but the state or type of legal matter is unclear ("I need a lawyer", "help me with my landlord"). Returns the few questions still needed (state, matter type, location, timing, budget) and what was understood. Does not answer the legal question and stores nothing.

Input parameters:

- `accessibility_needs` (string)
- `billing_preference` (string)
- `budget_max` (number): Total budget the user mentioned, in US dollars
- `budget_min` (number)
- `category` (string)
- `city` (string)
- `client_side` (string): Which side the user is on. ESQ Matching Engine has no record of which side lawyers usually represent, so results carry a warning to ask.
- `communication` (string)
- `consultation_by` (string): Latest date the user wants a first consultation
- `county` (string)
- `court` (string)
- `deadline_date` (string): A deadline the USER reported (hearing, filing, response). ESQ Matching Engine does not verify or calculate deadlines.
- `deadline_type` (string)
- `description` (string): Short description of the legal need in the user's words. Used only to pick a practice area; not stored.
- `exclude_attorney_ids` (array)
- `include_unconfirmed_practice_area` (boolean): Also include licensed lawyers whose practice areas are not on record (labeled clearly)
- `language_required` (boolean): True if the language is essential, not just preferred
- `languages` (array)
- `matter_type` (string)
- `max_consultation_fee` (number): 0 means the user wants a free first consultation
- `min_years_licensed` (integer)
- `payment_plan_needed` (boolean)
- `practice_area` (string): Practice area, e.g. 'Landlord-Tenant Law', 'Family Law', 'Criminal Law'
- `priorities` (array): What matters most, in order. Shifts ranking weights.
- `procedural_stage` (string)
- `reduced_fee_eligible` (boolean): User may qualify for pro bono, legal aid or reduced fees
- `remote_ok` (boolean): User is willing to work with a lawyer remotely (phone or video) anywhere in the state
- `representation_start_by` (string): Date as YYYY-MM-DD
- `service_needed` (string)
- `state` (string): US state, two-letter code or name, e.g. CA or California
- `subpractice_area` (string)
- `urgency` (string)
- `zip` (string): 5-digit ZIP code, only if the user agreed to share it

Output parameters:

- `api_version`
- `can_search`
- `guidance`
- `missing`
- `notice`
- `preliminary_search_possible`
- `understood`
- `urgency_notice`

### `find_attorneys` (~809 tokens)

Find a licensed lawyer

Use when someone wants a lawyer for a U.S. legal matter, e.g. "find an affordable tenant lawyer in Santa Ana" or "I was fired after complaining, who can help in Los Angeles". Needs state and matter type (or a short description). Returns up to 5 licensed lawyers with reasons, a relevance score, a separate data_confidence level, license source and check date, whether they are known to take private clients, directory profile links, a first_contact line (how to contact each lawyer first) and a suggested citation, or an honest no-match with legal-aid options. Set introduction_ready_only to list only lawyers who can receive an introduction through ESQ CoPilot now (activated free EsqHarness). Unknown fees and availability are labeled unknown. Court and government lawyers are left out unless they said they take private clients. Records an anonymous search log only. Not legal advice.

Input parameters:

- `accessibility_needs` (string)
- `attribution_token` (string): Signed campaign/partner token issued by ESQ Matching Engine, if the user arrived through a partner link
- `billing_preference` (string)
- `budget_max` (number): Total budget the user mentioned, in US dollars
- `budget_min` (number)
- `category` (string)
- `city` (string)
- `client_side` (string): Which side the user is on. ESQ Matching Engine has no record of which side lawyers usually represent, so results carry a warning to ask.
- `communication` (string)
- `consultation_by` (string): Latest date the user wants a first consultation
- `county` (string)
- `court` (string)
- `deadline_date` (string): A deadline the USER reported (hearing, filing, response). ESQ Matching Engine does not verify or calculate deadlines.
- `deadline_type` (string)
- `description` (string): Short description of the legal need in the user's words. Used only to pick a practice area; not stored.
- `exclude_attorney_ids` (array)
- `include_unconfirmed_practice_area` (boolean): Also include licensed lawyers whose practice areas are not on record (labeled clearly)
- `introduction_ready_only` (boolean): true returns only lawyers who can receive an introduction through ESQ CoPilot right now (activated free EsqHarness that accepts this state and matter). Default false: every licensed lawyer is listed,…
- `language_required` (boolean): True if the language is essential, not just preferred
- `languages` (array)
- `limit` (integer)
- `matter_type` (string)
- `max_consultation_fee` (number): 0 means the user wants a free first consultation
- `min_years_licensed` (integer)
- `payment_plan_needed` (boolean)
- `practice_area` (string): Practice area, e.g. 'Landlord-Tenant Law', 'Family Law', 'Criminal Law'
- `preference_set_id` (string): Saved criteria from update_matching_preferences
- `priorities` (array): What matters most, in order. Shifts ranking weights.
- `procedural_stage` (string)
- `reduced_fee_eligible` (boolean): User may qualify for pro bono, legal aid or reduced fees
- `remote_ok` (boolean): User is willing to work with a lawyer remotely (phone or video) anywhere in the state
- `representation_start_by` (string): Date as YYYY-MM-DD
- `service_needed` (string)
- `state` (string): US state, two-letter code or name, e.g. CA or California
- `subpractice_area` (string)
- `urgency` (string)
- `verbosity` (string): compact leaves out the repeated license-check details on each result (status, source and dates stay); default full
- `zip` (string): 5-digit ZIP code, only if the user agreed to share it

Output parameters:

- `api_version`
- `attribution`
- `covered_states`
- `data_coverage`
- `eligible_by_practice_evidence`
- `eligible_count`
- `engine_version`
- `excluded_by_rule`
- `how_ranked`
- `legal_aid`
- `license_source_note`
- `low_cost_options`
- `match_id`
- `message`
- `missing_information`
- `next_steps`
- `notices`
- `outcome`
- `ranking_note`
- `representation_side`
- `results`
- `returned`
- `rules_version`
- `suggestions`
- `unmet_criteria`
- `urgency`

### `compare_attorneys` (~135 tokens)

Compare lawyers side by side

Use when the user asks to compare lawyers from find_attorneys ("which of these is a better fit?"). Compares 2 to 5 lawyers on practice fit, location, years licensed, fees, availability, data confidence and gaps. Pass match_id to use the user's criteria. Says when prices or timing cannot be compared because the data is unknown.

Input parameters:

- `attorney_ids` (array, required)
- `criteria` (array)
- `match_id` (string): The match_id from find_attorneys, so comparisons use the same criteria
- `priorities` (array): What matters most, in order. Shifts ranking weights.

Output parameters:

- `api_version`
- `attorneys`
- `criteria_from_match`
- `differences`
- `note`
- `verification_gaps`
- `weights_percent`

### `estimate_legal_cost` (~156 tokens)

What will representation cost?

Use when the user asks what a lawyer or a type of matter will cost. Returns only published fees, confirmed quotes or sourced market figures, each labeled; says plainly when there is not enough data instead of guessing. Not a quote.

Input parameters:

- `attorney_id` (string)
- `billing_preference` (string)
- `budget_max` (number): Total budget the user mentioned, in US dollars
- `description` (string): Short description of the legal need in the user's words. Used only to pick a practice area; not stored.
- `practice_area` (string)
- `scope` (string)
- `state` (string): US state, two-letter code or name, e.g. CA or California

Output parameters:

- `additional_cost_categories`
- `api_version`
- `attorney`
- `confirmed_quote_available`
- `disclaimer`
- `estimate`
- `practice_area`
- `scope`
- `sources_checked`
- `state`

### `check_attorney_availability` (~98 tokens)

Check if a lawyer is taking clients

Use when the user asks whether a lawyer takes new clients or can meet soon. Returns only what lawyers reported or confirmed, with last-checked time and certainty (reported, tentative, confirmed); unknown when nothing was reported. There is no live calendar access.

Input parameters:

- `appointment_type` (string)
- `attorney_ids` (array, required)
- `time_zone` (string)
- `wanted_by` (string): Latest acceptable consultation date

Output parameters:

- `api_version`
- `attorneys`
- `checked_at`
- `live_calendar_access`
- `next_steps`
- `time_zone`

### `get_attorney_profile` (~88 tokens)

Get a lawyer's profile and sources

Use when the user wants details on one lawyer from a match. Returns license status with its official source and check date, private-client intake evidence, practice areas, service area, fees, availability, languages, data freshness, the directory profile link, a first_contact line and a suggested citation. Also returns the exact consent text to show before an introduction.

Input parameters:

- `attorney_id` (string, required)

Output parameters:

- `api_version`
- `attorney_id`
- `attribution`
- `availability`
- `contact`
- `fees`
- `firm`
- `freshness`
- `languages`
- `license`
- `name`
- `notices`
- `practice_areas`
- `private_client_intake`
- `profile_url`
- `service_area`
- `test_data`
- `years_licensed`

### `request_attorney_introduction` (~556 tokens)

Help me request an introduction (needs my yes)

Use only when the user asks to be introduced to ONE specific lawyer AND has seen that lawyer's name, the exact details to be shared and the consent text from get_attorney_profile, then said yes. Never call it on your own initiative or for several lawyers at once. Prefer prepare_introduction first and pass its approval_code: if the recipient or details changed since the user's yes, the request is refused. Stores only the authorized fields; retries with the same idempotency_key do not duplicate, and reusing a key for different details is refused. ESQ CoPilot introduces users only to lawyers who activated the free EsqHarness: call it only when the lawyer's next_action is request_introduction, or with pending_ok true when next_action is lawyer_not_activated AND the user read the pending terms and opted in. Otherwise it is refused with nothing stored. IMPORTANT: sending to lawyers is currently switched off, so the introduction is RECORDED, NOT SENT; tell the user "Your message is ready. It has not been sent." and give them the lawyer's phone, website or profile link. Returns a referral id, its lifecycle_state and a private status token.

Input parameters:

- `approval_code` (string): The approval_code from prepare_introduction for the exact version the user said yes to. If anything changed since, the request is refused and nothing is stored.
- `attorney_id` (string, required)
- `attribution_token` (string): Signed campaign/partner token issued by ESQ Matching Engine, if the user arrived through a partner link
- `consent` (object, required)
- `contact` (object, required)
- `entry_id` (string): The entry_id from start_from_directory_profile, if the user started from a directory listing. Counts the listing visit; carries no personal data.
- `idempotency_key` (string): Same key on retries prevents a duplicate introduction
- `intake_notice_acknowledged` (boolean): True only after the user read: no attorney-client relationship exists yet and the lawyer may decline
- `match_id` (string)
- `matter_summary` (string, required): Summary the USER read and approved for sharing with this lawyer
- `opposing_party_name` (string): Name of the other side, if any, so the firm can check conflicts. Not shared beyond the firm.
- `pending_ok` (boolean): True only after the user read pending_consent_text and chose to let the request wait for this lawyer to activate the free EsqHarness
- `practice_area` (string)
- `preferred_contact_method` (string, required)
- `preferred_timeframe` (string)
- `state` (string, required): US state, two-letter code or name, e.g. CA or California

Output parameters:

- `api_version`
- `attorney`
- `attorney_response`
- `consent`
- `consent_text_shown`
- `consultation`
- `created_at`
- `delivered_to_lawyer`
- `delivery_notice`
- `destination`
- `duplicate`
- `last_updated`
- `lifecycle_state`
- `match_id`
- `next_step`
- `notice`
- `personal_details_deleted`
- `qualification`
- `referral_id`
- `status`
- `status_check`
- `status_token`
- `submission`

### `get_introduction_status` (~101 tokens)

Check an introduction's status

Use when the user asks what happened with an introduction. Returns lifecycle_state (recorded, queued, sent, delivered, responded, consultation_requested, consultation_confirmed, cancelled, completed, failed), whether it reached the lawyer, the lawyer's response and consultation state. Needs the private status_token. A consultation counts only when confirmed.

Input parameters:

- `referral_id` (string, required)
- `status_token` (string): The status_token returned when the introduction was created

Output parameters:

- `api_version`
- `attorney`
- `attorney_response`
- `consent`
- `consultation`
- `created_at`
- `delivered_to_lawyer`
- `delivery_notice`
- `destination`
- `last_updated`
- `lifecycle_state`
- `match_id`
- `next_step`
- `notice`
- `personal_details_deleted`
- `qualification`
- `referral_id`
- `status`
- `submission`

### `get_referral_status` (~122 tokens)

Check an introduction's status

Older name of get_introduction_status, kept so existing connections keep working; prefer get_introduction_status. Use when the user asks what happened with an introduction. Returns lifecycle_state (recorded, queued, sent, delivered, responded, consultation_requested, consultation_confirmed, cancelled, completed, failed), whether it reached the lawyer, the lawyer's response and consultation state. Needs the private status_token. A consultation counts only when confirmed.

Input parameters:

- `referral_id` (string, required)
- `status_token` (string): The status_token returned when the introduction was created

Output parameters:

- `api_version`
- `attorney`
- `attorney_response`
- `consent`
- `consultation`
- `created_at`
- `delivered_to_lawyer`
- `delivery_notice`
- `destination`
- `last_updated`
- `lifecycle_state`
- `match_id`
- `next_step`
- `notice`
- `personal_details_deleted`
- `qualification`
- `referral_id`
- `status`
- `submission`

### `cancel_introduction` (~75 tokens)

Cancel my introduction request

Use when the user wants to cancel an introduction or a pending request that has not been sent to the lawyer. Needs the private status_token. Deletes the user's shared details at once; nothing is sent afterwards.

Input parameters:

- `referral_id` (string, required)
- `status_token` (string, required): The status_token returned when the introduction was created

Output parameters:

- `api_version`
- `attorney`
- `attorney_response`
- `consent`
- `consultation`
- `created_at`
- `delivered_to_lawyer`
- `delivery_notice`
- `destination`
- `last_updated`
- `lifecycle_state`
- `match_id`
- `next_step`
- `notice`
- `personal_details_deleted`
- `qualification`
- `referral_id`
- `status`
- `submission`

### `confirm_introduction` (~164 tokens)

Confirm a pending introduction

Use only when get_introduction_status shows pending.ready_to_confirm true (the lawyer has since activated the free EsqHarness). Show the user confirm_text_to_show, get an explicit yes, then call this with the private status_token (and intake_notice_acknowledged and opposing_party_name if the firm's rules ask for them). The server checks the lawyer's harness and firm rules again; if anything fails, nothing is shared.

Input parameters:

- `intake_notice_acknowledged` (boolean)
- `opposing_party_name` (string)
- `referral_id` (string, required)
- `status_token` (string, required): The status_token returned when the pending request was created
- `user_confirmed` (boolean, required): true only after the user read confirm_text_to_show and said yes in this conversation

Output parameters:

- `api_version`
- `attorney`
- `attorney_response`
- `consent`
- `consultation`
- `created_at`
- `delivered_to_lawyer`
- `delivery_notice`
- `destination`
- `last_updated`
- `lifecycle_state`
- `match_id`
- `next_step`
- `notice`
- `personal_details_deleted`
- `qualification`
- `referral_id`
- `status`
- `submission`

### `update_matching_preferences` (~90 tokens)

Save or change matching criteria

Save or change matching criteria (location, budget, timing, practice area, language, priorities) for this conversation. No personal contact details. Deleted automatically after 24 hours.

Input parameters:

- `clear_fields` (array)
- `criteria` (object, required): Fields to set or change. Do not include names, emails or phone numbers.
- `preference_set_id` (string): Omit to create a new set

Output parameters:

- `criteria`
- `expires_at`
- `note`
- `preference_set_id`
- `retention`

### `submit_matching_feedback` (~140 tokens)

Give feedback on a match or introduction

Optional 1-5 ratings on match relevance, lawyer responsiveness, pricing and availability accuracy, satisfaction, and whether the lawyer was hired. No case details.

Input parameters:

- `availability_accuracy` (integer)
- `comment` (string): Optional. Do not include case details.
- `match_id` (string)
- `pricing_accuracy` (integer)
- `referral_id` (string)
- `relevance` (integer)
- `responsiveness` (integer)
- `retained` (string)
- `satisfaction_attorney` (integer)
- `satisfaction_match` (integer)
- `satisfaction_process` (integer)
- `status_token` (string)

Output parameters:

- `feedback_id`
- `note`
- `recorded`

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/sustany-alcbar-match/match-2#diagnostics

## Score history

- 2026-11-04: 72
- 2026-11-03: 71
- 2026-11-02: 71
- 2026-11-01: 70
- 2026-10-31: 70
- 2026-10-30: 69
- 2026-10-29: 69
- 2026-10-28: 69
- 2026-10-27: 68
- 2026-10-26: 68
- 2026-10-25: 67
- 2026-10-24: 67
- 2026-10-23: 62
- 2026-10-22: 62
- 2026-10-21: 61
- 2026-10-20: 61

## Common questions

### What is the ESQ Matching Engine MCP server?

ESQ Matching Engine is an MCP server listed in the public MCP registry as io.github.sustany/alcbar-match. Find, compare and price licensed U.S. lawyers from official licensing records. Not legal advice. This page covers its hosted endpoint (https://match.esqcopilot.com/mcp).

### Is the ESQ Matching Engine MCP server safe to use?

ESQ Matching Engine scores 72 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the ESQ Matching Engine MCP server expose?

ESQ Matching Engine exposes 15 tools: start_from_directory_profile, prepare_introduction, get_matching_requirements, find_attorneys, compare_attorneys, and 10 more. Their descriptions and schemas cost roughly 3,734 tokens of context every time the server is loaded.

### Does the ESQ Matching Engine MCP server require authentication?

No. We connected to ESQ Matching Engine without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the ESQ Matching Engine MCP server still maintained?

ESQ Matching Engine is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://match.esqcopilot.com/mcp
- Website: https://directory.esqcopilot.com/
- Changelog RSS feed: https://verifymcp.io/servers/sustany-alcbar-match/match-2.xml
- Changelog JSON feed: https://verifymcp.io/servers/sustany-alcbar-match/match-2.json
- HTML version of this page: https://verifymcp.io/servers/sustany-alcbar-match/match-2
