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

Find and compare licensed US lawyers from official licensing records, with sources. No legal advice.

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

## Components

- remote · `match.esqcopilot.com`: 70/100 (this document), [markdown](https://verifymcp.io/servers/com-esqcopilot-matching-engine/mcp-c-eyjrijoiy29ubmvjdg9yiiwiasi6imnvbl9ty3bfcmvnaxn0cnlfzxnxiiwicci6im1jcc1yzw.md), [page](https://verifymcp.io/servers/com-esqcopilot-matching-engine/mcp-c-eyjrijoiy29ubmvjdg9yiiwiasi6imnvbl9ty3bfcmvnaxn0cnlfzxnxiiwicci6im1jcc1yzw)

## Channel facts

- Endpoint: `https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.4.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-05.

- **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 (send_client_message).
  - 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**: 70/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 7410 tokens (~274/item across 27 items; 23 tools + 4 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 37/100
  - Stability observed for 11 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.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 25 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/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00, 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 com-esqcopilot-matching-engine 'https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00'
```

### Cursor

```json
{
  "mcpServers": {
    "com-esqcopilot-matching-engine": {
      "url": "https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-esqcopilot-matching-engine": {
      "type": "http",
      "url": "https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-esqcopilot-matching-engine]
url = "https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-esqcopilot-matching-engine": {
      "type": "remote",
      "url": "https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-esqcopilot-matching-engine --url 'https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-esqcopilot-matching-engine:
    url: "https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00"
```

### Netclaw

```json
{
  "McpServers": {
    "com-esqcopilot-matching-engine": {
      "Transport": "http",
      "Url": "https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-esqcopilot-matching-engine -t streamable-http -u 'https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00'
```

### Other

```json
{
  "mcpServers": {
    "com-esqcopilot-matching-engine": {
      "type": "http",
      "url": "https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00"
    }
  }
}
```

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-05 (score 70, +1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] New tool “cancel_contact_request”, which the server declares destructive
- [security] New tool “cancel_introduction”, which the server declares destructive
- [security] New tool “send_client_message”, which the server declares destructive
- [security] New tool “update_listing_criteria”, which the server declares destructive
- [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
- [security] Tool “submit_matching_feedback” rewrote its description, which is the text the model reads
- [security] Tool “update_matching_preferences” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 196 → 274
- [functional improvement] Tool coverage: 42% → 48%
- [functional] Destructive annotations: pass → 100
- [functional] Server version: 1.5.0 → 2.0.0
- [functional] New tool “confirm_introduction”
- [functional] New tool “get_contact_request_status”
- [functional] New tool “get_introduction_status”
- [functional] New tool “get_search_filters”
- [functional] New tool “prepare_introduction”
- [functional] New tool “preview_client_message”
- [functional] New tool “search_attorneys”
- [functional] New tool “start_from_directory_profile”
- [functional] New tool “submit_listing_feedback”
- [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”
- [cosmetic] “compare_attorneys” reworded the description of “match_id”
- [cosmetic] “find_attorneys” reworded the description of “preference_set_id”
- [cosmetic] “get_referral_status” reworded the description of “status_token”
- [cosmetic] “request_attorney_introduction” reworded the description of “idempotency_key”
- [cosmetic] Tool “find_attorneys” changed its title: Find a licensed lawyer → Search the lawyer listing (older name)
- [cosmetic] Tool “get_matching_requirements” changed its title: What to ask before finding a lawyer → What to ask before searching for a lawyer (older name)
- [cosmetic] Tool “get_referral_status” changed its title: Check an introduction's status → Check a message's status (older name)
- [cosmetic] Tool “request_attorney_introduction” changed its title: Help me request an introduction (needs my yes) → Send my message to the lawyer I picked (needs my yes) (older name)
- [cosmetic] Tool “submit_matching_feedback” changed its title: Give feedback on a match or introduction → Give feedback on search results or a message (older name)
- [cosmetic] Tool “update_matching_preferences” changed its title: Save or change matching criteria → Save or change search filters (older name)

### 2026-11-02 (score 69, +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 68, +1)

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

### 2026-10-29 (score 67, +1)

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

### 2026-10-27 (score 66, +1)

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

### 2026-10-26 (score 65, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-25 (score 65)

First indexed and scored.

## MCP tools (23)

### `start_from_directory_profile` (~308 tokens)

Start with a lawyer from the ESQ CoPilot directory

Use FIRST when the person names or pastes an ESQ CoPilot directory listing (directory.esqcopilot.com/attorney/...) or says they want help with a lawyer they were viewing, e.g. "help me check and contact Jeffrey Roy Hartmann, California bar 150013: https://directory.esqcopilot.com/attorney/jeffrey-hartmann-ca-150013". Finds that exact lawyer in 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 options, and the few questions still open. Do not run search_attorneys first when the exact listing is given. Looking at a listing is not an endorsement or a statement about availability. Records an anonymous count only. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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`
- `legal_aid`
- `notices`
- `selected_lawyer`
- `selection_notice`
- `test_data`
- `unknowns`

### `preview_client_message` (~368 tokens)

Preview my message to one lawyer (nothing is sent)

Use when the person wants to contact ONE lawyer they picked ("write my message"). Builds a short, editable first message from general facts the person gives (type of legal issue, location, help wanted, timing, optional budget, contact method), asks the lawyer what is unknown (handles this kind of issue? taking new clients? consultation fee?), and returns the exact recipient, message, contact fields, notice, consent text and an approval_code. Stores and sends nothing. Show all of it to the person; only after an explicit yes call send_client_message with after_yes.arguments. Any change by the person means calling this again and asking again. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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_search_filters` (~594 tokens)

What to ask before searching for a lawyer

Use first when someone wants a lawyer but the state or type of legal issue is unclear ("I need a lawyer", "help me with my landlord"). Returns the few filters still needed (state, type of issue, location, timing, budget) and what was understood, for the person to confirm. Does not answer the legal question and stores nothing. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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`

### `search_attorneys` (~806 tokens)

Search the lawyer listing

Use when someone wants to find a lawyer for a U.S. legal issue, e.g. "tenant lawyers in Santa Ana" or "employment lawyers in Los Angeles". Needs the state and type of legal issue (or a short description the person confirms). Returns licensed lawyers that meet the person's filters, with which filters each listing meets, a separate data_confidence level, license source and check date, whether they are known to take private clients, directory profile links, how to contact each one and a suggested citation, or an honest 'no listings meet your filters' with legal-aid options. Show the listings as returned; never present one lawyer as the pick for the person. 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. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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): Deprecated since 2026-11-04 and ignored. Every listed lawyer is shown and can be contacted the same way.
- `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 filters from update_listing_criteria
- `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` (~157 tokens)

Compare lawyers side by side

Use when the person asks to compare lawyers from search_attorneys. Compares 2 to 5 lawyers on practice areas, location, years licensed, fees, availability, data confidence and gaps, side by side, without picking one. Pass match_id to use the person's filters. Says when prices or timing cannot be compared because the data is unknown. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

Input parameters:

- `attorney_ids` (array, required)
- `criteria` (array)
- `match_id` (string): The match_id from search_attorneys, so comparisons use the same filters
- `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` (~180 tokens)

What will representation cost?

Use when the person asks what a lawyer or a type of legal issue 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. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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` (~121 tokens)

Check if a lawyer is taking clients

Use when the person 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. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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` (~112 tokens)

Get a lawyer's profile and sources

Use when the person wants details on one listed lawyer. 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, how to contact the lawyer and a suggested citation. Also returns the exact consent text to show before a message is sent. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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`

### `send_client_message` (~517 tokens)

Send my message to the lawyer I picked (needs my yes)

Use only when the person asked to contact ONE specific lawyer they picked, has seen the lawyer's name, the exact message and details to be shared and the consent text, and said yes. Never call it on your own initiative or for several lawyers at once. Call preview_client_message first and pass its approval_code: if the recipient or the text changed since the person's yes, it is refused. Stores only the approved fields; retries with the same idempotency_key do not duplicate, and reusing a key for different details is refused. The same rule applies to every listed lawyer. IMPORTANT: sending to lawyers is currently switched off, so the message is RECORDED, NOT SENT; tell the person "Your message is ready. It has not been sent." and give them the lawyer's phone, website or profile link. Returns a contact_request_id, its lifecycle_state and a private status token. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

Input parameters:

- `approval_code` (string): The approval_code from preview_client_message 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 message
- `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): Deprecated since 2026-11-04 and ignored. Messages no longer wait for anything a lawyer buys.
- `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_contact_request_status` (~133 tokens)

Check a message's status

Use when the person asks what happened with a message they sent. Returns lifecycle_state (recorded, queued, sent, delivered, responded, consultation_requested, consultation_confirmed, cancelled, completed, failed), whether it reached the lawyer and the lawyer's response. Needs the private status_token. A consultation counts only when confirmed. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

Input parameters:

- `contact_request_id` (string, required): The contact_request_id returned by send_client_message
- `status_token` (string): The status_token returned when the message 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_contact_request` (~104 tokens)

Cancel my message

Use when the person wants to cancel a message that has not been sent to the lawyer. Needs the private status_token. Deletes the person's shared details at once; nothing is sent afterwards. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

Input parameters:

- `contact_request_id` (string, required): The contact_request_id returned by send_client_message
- `status_token` (string, required): The status_token returned when the message 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`

### `update_listing_criteria` (~115 tokens)

Save or change search filters

Save or change search filters (location, budget, timing, practice area, language, sort priorities) for this conversation. No personal contact details. Deleted automatically after 24 hours. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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_listing_feedback` (~166 tokens)

Give feedback on search results or a message

Optional 1-5 ratings on how useful the listings were, lawyer responsiveness, pricing and availability accuracy, satisfaction, and whether the lawyer was hired. No case details. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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`

### `prepare_introduction` (~390 tokens)

Preview my message to one lawyer (nothing is sent) (older name)

Older name of preview_client_message, kept until 2026-12-15; use preview_client_message. Use when the person wants to contact ONE lawyer they picked ("write my message"). Builds a short, editable first message from general facts the person gives (type of legal issue, location, help wanted, timing, optional budget, contact method), asks the lawyer what is unknown (handles this kind of issue? taking new clients? consultation fee?), and returns the exact recipient, message, contact fields, notice, consent text and an approval_code. Stores and sends nothing. Show all of it to the person; only after an explicit yes call send_client_message with after_yes.arguments. Any change by the person means calling this again and asking again. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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` (~617 tokens)

What to ask before searching for a lawyer (older name)

Older name of get_search_filters, kept until 2026-12-15; use get_search_filters. Use first when someone wants a lawyer but the state or type of legal issue is unclear ("I need a lawyer", "help me with my landlord"). Returns the few filters still needed (state, type of issue, location, timing, budget) and what was understood, for the person to confirm. Does not answer the legal question and stores nothing. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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` (~828 tokens)

Search the lawyer listing (older name)

Older name of search_attorneys, kept until 2026-12-15; use search_attorneys. Use when someone wants to find a lawyer for a U.S. legal issue, e.g. "tenant lawyers in Santa Ana" or "employment lawyers in Los Angeles". Needs the state and type of legal issue (or a short description the person confirms). Returns licensed lawyers that meet the person's filters, with which filters each listing meets, a separate data_confidence level, license source and check date, whether they are known to take private clients, directory profile links, how to contact each one and a suggested citation, or an honest 'no listings meet your filters' with legal-aid options. Show the listings as returned; never present one lawyer as the pick for the person. 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. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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): Deprecated since 2026-11-04 and ignored. Every listed lawyer is shown and can be contacted the same way.
- `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 filters from update_listing_criteria
- `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`

### `request_attorney_introduction` (~541 tokens)

Send my message to the lawyer I picked (needs my yes) (older name)

Older name of send_client_message, kept until 2026-12-15; use send_client_message. Use only when the person asked to contact ONE specific lawyer they picked, has seen the lawyer's name, the exact message and details to be shared and the consent text, and said yes. Never call it on your own initiative or for several lawyers at once. Call preview_client_message first and pass its approval_code: if the recipient or the text changed since the person's yes, it is refused. Stores only the approved fields; retries with the same idempotency_key do not duplicate, and reusing a key for different details is refused. The same rule applies to every listed lawyer. IMPORTANT: sending to lawyers is currently switched off, so the message is RECORDED, NOT SENT; tell the person "Your message is ready. It has not been sent." and give them the lawyer's phone, website or profile link. Returns a contact_request_id, its lifecycle_state and a private status token. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

Input parameters:

- `approval_code` (string): The approval_code from preview_client_message 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 message
- `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): Deprecated since 2026-11-04 and ignored. Messages no longer wait for anything a lawyer buys.
- `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`

### `update_matching_preferences` (~138 tokens)

Save or change search filters (older name)

Older name of update_listing_criteria, kept until 2026-12-15; use update_listing_criteria. Save or change search filters (location, budget, timing, practice area, language, sort priorities) for this conversation. No personal contact details. Deleted automatically after 24 hours. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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` (~188 tokens)

Give feedback on search results or a message (older name)

Older name of submit_listing_feedback, kept until 2026-12-15; use submit_listing_feedback. Optional 1-5 ratings on how useful the listings were, lawyer responsiveness, pricing and availability accuracy, satisfaction, and whether the lawyer was hired. No case details. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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`

### `get_introduction_status` (~147 tokens)

Check a message's status (older name)

Older name of get_contact_request_status, kept until 2026-12-15; use get_contact_request_status. Use when the person asks what happened with a message they sent. Returns lifecycle_state (recorded, queued, sent, delivered, responded, consultation_requested, consultation_confirmed, cancelled, completed, failed), whether it reached the lawyer and the lawyer's response. Needs the private status_token. A consultation counts only when confirmed. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

Input parameters:

- `referral_id` (string, required)
- `status_token` (string): The status_token returned when the message 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` (~147 tokens)

Check a message's status (older name)

Older name of get_contact_request_status, kept until 2026-12-15; use get_contact_request_status. Use when the person asks what happened with a message they sent. Returns lifecycle_state (recorded, queued, sent, delivered, responded, consultation_requested, consultation_confirmed, cancelled, completed, failed), whether it reached the lawyer and the lawyer's response. Needs the private status_token. A consultation counts only when confirmed. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

Input parameters:

- `referral_id` (string, required)
- `status_token` (string): The status_token returned when the message 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` (~79 tokens)

Cancel my message (older name)

Older name of cancel_contact_request, kept until 2026-12-15; use cancel_contact_request. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

Input parameters:

- `referral_id` (string, required)
- `status_token` (string, required): The status_token returned when the message 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` (~147 tokens)

Older pending requests (ended)

Kept until 2026-12-15 so older connections get a plain answer: pending requests ended on 2026-11-04 and nothing was shared. Use preview_client_message, then send_client_message. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

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`

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-esqcopilot-matching-engine/mcp-c-eyjrijoiy29ubmvjdg9yiiwiasi6imnvbl9ty3bfcmvnaxn0cnlfzxnxiiwicci6im1jcc1yzw#diagnostics

## Score history

- 2026-11-05: 70
- 2026-11-04: 69
- 2026-11-03: 69
- 2026-11-02: 69
- 2026-11-01: 68
- 2026-10-31: 68
- 2026-10-30: 67
- 2026-10-29: 67
- 2026-10-28: 66
- 2026-10-27: 66
- 2026-10-26: 65
- 2026-10-25: 65

## Common questions

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

ESQ Matching Engine is an MCP server listed in the public MCP registry as com.esqcopilot/matching-engine. Find and compare licensed US lawyers from official licensing records, with sources. No legal advice. This page covers its hosted endpoint (https://match.esqcopilot.com/mcp/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9…).

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

ESQ Matching Engine scores 70 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 23 tools: start_from_directory_profile, preview_client_message, get_search_filters, search_attorneys, compare_attorneys, and 18 more. Their descriptions and schemas cost roughly 6,903 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 5 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/c/eyJrIjoiY29ubmVjdG9yIiwiaSI6ImNvbl9tY3BfcmVnaXN0cnlfZXNxIiwicCI6Im1jcC1yZWdpc3RyeSJ9.3b61cb285412dd02ba328c4c5ccd0b00
- Website: https://match.esqcopilot.com/ai-agents
- Changelog RSS feed: https://verifymcp.io/servers/com-esqcopilot-matching-engine/mcp-c-eyjrijoiy29ubmvjdg9yiiwiasi6imnvbl9ty3bfcmvnaxn0cnlfzxnxiiwicci6im1jcc1yzw.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-esqcopilot-matching-engine/mcp-c-eyjrijoiy29ubmvjdg9yiiwiasi6imnvbl9ty3bfcmvnaxn0cnlfzxnxiiwicci6im1jcc1yzw.json
- HTML version of this page: https://verifymcp.io/servers/com-esqcopilot-matching-engine/mcp-c-eyjrijoiy29ubmvjdg9yiiwiasi6imnvbl9ty3bfcmvnaxn0cnlfzxnxiiwicci6im1jcc1yzw
