ESQ Matching Engine

com.esqcopilotPublished by esqcopilot.comOfficial publisherv3.0.0Updated Nov 6, 2026

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

Overview

AI-generated overview

Remote listing service that lets an assistant search, compare, price and contact licensed U.S. lawyers, with sources and no legal advice.

What you can do
  • Search and filter licensed U.S. lawyers by state, legal issue, location, timing and budget, with sorting and saved criteria
  • Compare two to five lawyers side by side and read a single lawyer's profile, license status, fees, availability and contact details
  • Estimate legal costs from published fees, confirmed quotes or sourced market figures, labeled by source
  • Draft a first message to one chosen lawyer, preview it with the exact recipient, shared details and consent text, then send it after an explicit yes
  • Track, cancel or confirm a contact request and report listing errors or give optional ratings
  • Start from an ESQ CoPilot directory profile and read coverage, practice-area, data-source and…
When to use it
Useful when someone wants to find, compare or price a lawyer for a U.S. legal issue, or wants help writing a first message to one lawyer they picked. It is a listing service, not a referral service, and it does not give legal advice.
Requirements
A remote streamable HTTP endpoint at match.esqcopilot.com; no package, environment variables or headers are declared. Contact status and cancellation need the private status token returned when a message is sent.
Before you install
Sending a message shares the person's details with a lawyer, so it should only happen after they see the exact text and consent and say yes. Contact status and cancellation rely on a private status token. Fees and availability are self-reported or sourced and may be stale or unknown; the server does not give legal advice or rank lawyers.

Installation

In SourceWeft

  1. Open ESQ Matching Engine in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/com.esqcopilot%2Fmatching-engine/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

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

Tools

24

start_from_directory_profile

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.

Parametersplatformattorney_idprofile_url

preview_client_message

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.

Parametersstaterequiredbudgettimingcontactrequiredmessageentry_idassistanceattorney_idrequiredpractice_areamatter_locationpreferred_contact_methodrequired

get_search_filters

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.

Parameterszipcitycourtstatecountyurgencycategorylanguagesremote_okbudget_maxbudget_minpriorities+21 more

search_attorneys

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). Pass sort when the person picks an order (nearest_office by default, last_name, years_licensed, free_consultation_first, published_fees_first, availability_reported_first) and page for more. Returns a plain summary, the filters applied, shared_notes that apply to every listing (read once), up to three ask_the_user questions, and each listing's own facts: which filters it meets, what is not known, license status, source and date, fees and availability where published, profile link, contact and citation; or an honest 'no listings meet your filters' with legal-aid options. No scores. Show every listing in the order 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.

Parameterszipcitypagesortcourtlimitstatecountyurgencycategorylanguagesremote_ok+28 more

compare_attorneys

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 in the order given, with no scores and 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.

Parameterscriteriamatch_idprioritiesattorney_idsrequired

check_attorney_availability

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.

Parameterstime_zonewanted_byattorney_idsrequiredappointment_type

get_attorney_profile

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.

Parametersattorney_idrequired

send_client_message

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. 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.

Parametersstaterequiredconsentrequiredcontactrequiredentry_idmatch_idpending_okattorney_idrequiredapproval_codepractice_areamatter_summaryrequiredidempotency_keyattribution_token+4 more

get_contact_request_status

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.

Parametersstatus_tokencontact_request_idrequired

cancel_contact_request

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.

Parametersstatus_tokenrequiredcontact_request_idrequired

update_listing_criteria

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.

Parameterscriteriarequiredclear_fieldspreference_set_id

submit_listing_feedback

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.

Parameterscommentmatch_idretainedrelevancereferral_idstatus_tokenresponsivenesspricing_accuracysatisfaction_matchsatisfaction_processavailability_accuracysatisfaction_attorney

report_listing_error

Report wrong details on a listing

Use when the person (or the listed lawyer) says a detail on a listing is wrong, missing or out of date: phone, website, office, firm, practice areas, license status, languages, fees, availability or name. Pass the listing's attorney_id, which detail, and optionally the correct value. ESQ CoPilot checks each report against the official record or the lawyer's own website and corrects the listing in the next update. A report never changes the order or placement of any lawyer. No case details and no contact details of the person reporting. This is a listing service, not a lawyer referral service. No lawyer pays for placement or ranking of any kind.

Parametersnotefieldrequiredissuerequiredreporterattorney_idrequiredcorrect_value

prepare_introduction

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.

Parametersstaterequiredbudgettimingcontactrequiredmessageentry_idassistanceattorney_idrequiredpractice_areamatter_locationpreferred_contact_methodrequired

get_matching_requirements

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.

Parameterszipcitycourtstatecountyurgencycategorylanguagesremote_okbudget_maxbudget_minpriorities+21 more

find_attorneys

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). Pass sort when the person picks an order (nearest_office by default, last_name, years_licensed, free_consultation_first, published_fees_first, availability_reported_first) and page for more. Returns a plain summary, the filters applied, shared_notes that apply to every listing (read once), up to three ask_the_user questions, and each listing's own facts: which filters it meets, what is not known, license status, source and date, fees and availability where published, profile link, contact and citation; or an honest 'no listings meet your filters' with legal-aid options. No scores. Show every listing in the order 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.

Parameterszipcitypagesortcourtlimitstatecountyurgencycategorylanguagesremote_ok+28 more

request_attorney_introduction

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. 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.

Parametersstaterequiredconsentrequiredcontactrequiredentry_idmatch_idpending_okattorney_idrequiredapproval_codepractice_areamatter_summaryrequiredidempotency_keyattribution_token+4 more

update_matching_preferences

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.

Parameterscriteriarequiredclear_fieldspreference_set_id

submit_matching_feedback

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.

Parameterscommentmatch_idretainedrelevancereferral_idstatus_tokenresponsivenesspricing_accuracysatisfaction_matchsatisfaction_processavailability_accuracysatisfaction_attorney

get_introduction_status

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.

Parametersreferral_idrequiredstatus_token

get_referral_status

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.

Parametersreferral_idrequiredstatus_token

cancel_introduction

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.

Parametersreferral_idrequiredstatus_tokenrequired

confirm_introduction

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.

Parametersreferral_idrequiredstatus_tokenrequireduser_confirmedrequiredopposing_party_nameintake_notice_acknowledged

Version history

2
  1. v3.0.0LatestNov 6, 2026
  2. v1.4.0Oct 25, 2026

Score

72% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts

    Publish an icon in the registry entry.

  • Documentation15 pts

    Declare a GitHub repository with a README, or serve resource_documentation in the OAuth protected-resource metadata.

  • LicenseNot applicable

    A hosted service is used under its provider's terms, so no license is expected here. This check is left out of the percentage.