LucyESL for AI agents and developers

Everything LucyESL publishes for people is also published for programs: the live board as structured facts, the salary and disclosure statistics as open data, and a Model Context Protocol server so an assistant can search the board on a reader's behalf. Right now that is 464 live listings, updated 2026-09-13.

What you may do, and what you get

  • Statistics are CC BY 4.0. Quote them with the attribution LucyESL, https://lucyesl.com and the page they come from.
  • Listing records are LucyESL's extracted facts — title, employer, region, pay, hours, visas, housing, benefits, dates — and the list of facts the advert left unstated. The advert itself belongs to whoever wrote it. Records never include the description text, any contact route, or a source board's URL; the way to an original is the counted link on the listing page.
  • Most listings are copied from other public boards and say so ("source": "copied"). LucyESL does not verify them. A listing posted here by the employer is "first_party"; "verified_employer": true means the employer's business registration and contact were checked.
  • 600 requests an hour per address across the JSON view and the MCP server, then HTTP 429. Pages are 25 records, at most 50.
  • The keys are a contract. They are pinned by the repository's tests; keys are added, never renamed or removed. null always means the advert did not state it — never zero.

The board as JSON

https://lucyesl.com/jobs?format=json — the same filters as the board, the same order, the same rows. Parameters: region, age, housing, visa, schedule, contract, setting, delivery, specialty, direct=1, smin (one of 2000000, 2300000, 2600000, 3000000), q, page, limit. Every response carries the label for every key under taxonomy.

Examples: jobs in Busan · direct hire, ₩2.6M and up · adult students only.

The statistics: /salaries?format=json and /disclosure?format=json, documented on Salaries and Disclosure.

The MCP server

https://lucyesl.com/mcp — Model Context Protocol over Streamable HTTP, JSON responses, no authentication, no session. Add it where your assistant takes a custom connector or MCP server URL: in ChatGPT under Settings → Apps & Connectors, in Claude under Settings → Connectors, in any MCP client's server list. The search and fetch tools follow the shape ChatGPT's connectors expect; the rest return structured records.

The tools the MCP server offers
ToolWhat it does
searchSearch live English-teaching jobs in South Korea on LucyESL by free text. Returns ids, titles and URLs; use fetch for a listing's details.
fetchFetch one LucyESL job listing by id as a plain-text document with its facts.
search_jobsFilter the live LucyESL board of English-teaching jobs in South Korea: region, student age, housing, visa, schedule, contract, setting, direct hire, minimum salary, free text. Returns structured records; pay in KRW per month unless stated otherwise; null means the advert did not say.
get_jobOne live listing as a structured record.
salary_statsEnglish-teacher salary statistics for South Korea computed from the live listings: median, quartiles, by region, by employer type, effective pay per teaching hour, disclosure rates, housing. CC BY 4.0.
disclosure_statsHow many live Korean ESL job adverts state the salary, hours, severance, pension, insurance, airfare, vacation and split shifts. CC BY 4.0.

A first call, by hand:

curl -s https://lucyesl.com/mcp -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"search_jobs","arguments":{"region":"busan","direct_only":true}}}'

Why this exists

Readers increasingly arrive through an assistant that searched for them. An assistant can only cite what it can read and only search what it can query, so the board is published in the form a program needs, under terms a person would accept. If something here is wrong or missing, tell us.