Find jobs near you. Search over 4 million openings by role, place, pay, visa and more.
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Jobs — Apply to a job for the user: Worklittle fills out and submits the application in a browser. Pass job_id from search_jobs. For a Worklittle-hosted posting also include name, email and resume. It submits by default; pass auto_submit false when the user wants to review first, then show them the answers from check_application_status and send it with submit_application only after they say so.
Worklittle job id from search_jobs / get_job_details.
Default true: submit when the form is complete. false: stop at review (status awaiting_submit) so the user can check every answer; send it with submit_application.
Optional resume HTML to seed.
Optional cover letter HTML to seed.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Jobs — Apply to a job for the user: Worklittle fills out and submits the application in a browser. Pass job_id from search_jobs. For a Worklittle-hosted posting also include name, email and resume. It submits by default; pass auto_submit false when the user wants to review first, then show them the answers from check_application_status and send it with submit_application only after they say so.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | Worklittle job id from search_jobs / get_job_details. |
| auto_submit | boolean | Default true: submit when the form is complete. false: stop at review (status awaiting_submit) so the user can check every answer; send it with submit_application. |
| resume_html | string | Optional resume HTML to seed. |
| cover_letter_html | string | Optional cover letter HTML to seed. |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"description": "Worklittle job id from search_jobs / get_job_details.",
"x-mcp-header": "Job-Id"
},
"auto_submit": {
"type": "boolean",
"description": "Default true: submit when the form is complete. false: stop at review (status awaiting_submit) so the user can check every answer; send it with submit_application."
},
"resume_html": {
"type": "string",
"description": "Optional resume HTML to seed."
},
"cover_letter_html": {
"type": "string",
"description": "Optional cover letter HTML to seed."
}
}
}Jobs — Check an application Worklittle is filling out: its status, which form fields are filled, and a live view link. Only the status completed means it was submitted.
| Argument | Type | Description |
|---|---|---|
| session_id* | string |
{
"type": "object",
"required": [
"session_id"
],
"properties": {
"session_id": {
"type": "string",
"x-mcp-header": "Session-Id"
}
}
}Jobs — Delete the user's saved resume from their profile.
No arguments.
{
"type": "object",
"properties": {}
}Jobs — Fetch detailed information about a specific job, including full responsibilities, qualifications, and company details. Pass job_id from search_jobs when you have one. If the user asks for full details of a role without an id (e.g. the first software engineer job in Austin), pass query and optional location instead — the tool loads the first matching live listing.
| Argument | Type | Description |
|---|---|---|
| query | string | Role/title search used when job_id is missing (picks the first live match). |
| job_id | string | The job ID from a previous search_jobs result when available. |
| summary | boolean | If true, request first-time AI generation via GET /jobs/:id?summary=true. Default is raw plus cached AI only. |
| location | string | Optional location substring when resolving details by query. |
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Role/title search used when job_id is missing (picks the first live match)."
},
"job_id": {
"type": "string",
"description": "The job ID from a previous search_jobs result when available.",
"x-mcp-header": "Job-Id"
},
"summary": {
"type": "boolean",
"description": "If true, request first-time AI generation via GET /jobs/:id?summary=true. Default is raw plus cached AI only."
},
"location": {
"type": "string",
"description": "Optional location substring when resolving details by query."
}
}
}Jobs — Returns aggregate job-market statistics from Worklittle. Call with no args for the full indexed market (counts, workplace mix, top hiring companies). When the user names a role and/or city (e.g. product managers in San Francisco), pass query and location. The filtered slice includes match count, top companies in the sample, and salary signals from listings that publish pay.
| Argument | Type | Description |
|---|---|---|
| query | string | Role or title filter for a market slice (e.g. product manager). |
| location | string | Location substring for a market slice (e.g. San Francisco). |
| workplace_type | string | Optional workplace filter for the slice. |
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Role or title filter for a market slice (e.g. product manager)."
},
"location": {
"type": "string",
"description": "Location substring for a market slice (e.g. San Francisco)."
},
"workplace_type": {
"enum": [
"remote",
"hybrid",
"on_site"
],
"type": "string",
"description": "Optional workplace filter for the slice."
}
}
}Jobs — Get the user's Worklittle profile (name, location, contact details and job preferences). If they have not linked their account it returns connected false; use get_my_resume or apply_for_job to sign them in.
No arguments.
{
"type": "object",
"properties": {}
}Jobs — Get the user's saved resume: its status (ready, processing or missing) and, when ready, the resume text and profile details read from it. Use it to tailor advice or an application to the user's real experience.
No arguments.
{
"type": "object",
"properties": {}
}Jobs — List the user's applications that Worklittle is filling out right now (queued, running, or waiting on the user), with job_id and session_id. Use it to find which one to stop or check.
No arguments.
{
"type": "object",
"properties": {}
}Jobs — List the user's recent Worklittle chats (title and status) for the app sidebar.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max chats (default 20, max 50). |
| cursor | string | next_cursor from the previous page. |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max chats (default 20, max 50)."
},
"cursor": {
"type": "string",
"description": "next_cursor from the previous page."
}
}
}Jobs — Sign the user out of Worklittle in this app.
No arguments.
{
"type": "object",
"properties": {}
}Jobs — Create a sign-in link so the Worklittle app can open the user's chats on worklittle.com.
No arguments.
{
"type": "object",
"properties": {}
}Jobs — Save standing facts about the user that Worklittle's Apply with AI uses on every future application: work authorization and visa sponsorship by country, relocation, notice period, desired salary, languages, qualifications, who referred them, or other standing answers they ask applications to use. Stored as the 'More about you' text in their Settings. Pass the complete text to keep (read get_my_profile first and merge with what is there, so nothing is lost). Write it in the user's words; never invent facts.
| Argument | Type | Description |
|---|---|---|
| about_me* | string | The full More about you text to store (replaces the old text). |
{
"type": "object",
"required": [
"about_me"
],
"properties": {
"about_me": {
"type": "string",
"description": "The full More about you text to store (replaces the old text)."
}
}
}Jobs — Search the Worklittle market company index by name or slug (ranked typeahead). Returns id, name, slug, logo_url, and enrichment fields for employers with open jobs. Use when the user names an employer and you need a real slug/id for search_jobs company= filters, job alerts, or automations. If zero hits, try alternate spellings or related employer names from further search_companies calls — do not invent company ids or slugs. If still empty, tell the user that employer is not in the index yet and offer any close matches you found.
| Argument | Type | Description |
|---|---|---|
| q* | string | Company name or slug query (min 2 characters, max 80). |
| limit | number | Max results to return. Default 5, max 20. |
{
"type": "object",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"description": "Company name or slug query (min 2 characters, max 80)."
},
"limit": {
"type": "number",
"maximum": 20,
"minimum": 1,
"description": "Max results to return. Default 5, max 20."
}
}
}Jobs — Opens the Worklittle jobs MAP for a place and an optional role. This is a map query, not a list of jobs: the map recenters on the place and shows jobs there, so send the place and the role as SEPARATE fields. Never write 'product manager in San Francisco' as one query. PLACE: always pass near_lat + near_lng (the city's coordinates, which you know) and location as the display name (e.g. 'San Francisco, CA'). radius_km 25-50 for a city. If the user names no place, omit all place fields; the map opens at the user's approximate (IP-based) area. When a nearby search runs short, results widen to the rest of the country and then worldwide (search.scope says which: near, country or world), so say where the roles are. ROLE: query holds only the job title text (e.g. 'product manager') and may be omitted for 'any job'. Search Worklittle job listings. People say Worklittle plus a role, city, company, or filters (or just 'jobs') — they will not name this tool. Call it whenever they want Worklittle jobs. Search by keyword, company, location, job type, seniority, or recency. Use for ANY industry (retail, finance, healthcare, tech, etc.). Search matches title and filter text (substring / FTS), not vector embeddings. Role / title text goes in query (+ optional keywords). The API matches job TITLE substrings only for that text — it does not mix company names into the same field. Preserve negative title terms with a leading dash, e.g. 'software engineer, -senior' excludes titles containing senior. Use company for employer slugs (include or exclude). Never concatenate many job titles into one query unless the user supplied comma-separated roles. Do not add seniority_level, stacks, or resume-derived terms unless they asked. Omit seniority_level unless they explicitly name a level as an inclusion filter (never infer from profile). Expand abbreviations only; umbrella phrases use neutral roles and/or company slugs. Umbrella or vague phrases ('big tech', 'FAANG', 'top retailers'): interpret intent, then one search_jobs with comma-separated company slugs and/or a broad role query — prefer one API call over many. company MUST be employer slug(s): bare slugs include (OR), e.g. meta,google,apple. Prefix a slug with '-' to exclude, e.g. -lucid-motors,-tesla. Same leading-dash rule as title negatives, but in company not query. Expand 'no car companies' / 'don't show Lucid' into -slug tokens. Never pass display names as query. If unsure of slug, try lowercase hyphenated brand. Add skills or stack to query/keywords only when the user mentioned them — not from profile by default. When an include company filter returns 0 results, try a broader query (drop include company, use role keywords) before telling the user nothing matched. Pass cursor from a previous response to paginate. Search is anonymous. Do not call get_account, apply, or ask the user to Connect to search or skip. Connect / OAuth is only when they apply. After the map renders, briefly say what was found and where (listed pay shows on each job). For visa / H-1B: set visa_sponsorship to 'yes' (plus optional query). Postings must be explicitly tagged. When visa_sponsorship is set and posted_within_days is omitted, do not apply the default 7-day recency cutoff — tagged visa roles are sparse. For regional / nearby intent: near_lat, near_lng, radius_km (e.g. 50–65). Prefer this over the location substring when coordinates are known. For two or more metros in one user message (e.g. SF or NYC), pass location_or as comma-separated place names — one API request matches ANY listed place. Do not use near_* for multi-metro; use location_or or location with 'or' between cities. Recency: set posted_within_days from the user's words — today/just posted → 1; past few days → 3; this week → 7; past two weeks → 14; this month → 30. Omit when they did not mention timing (defaults to the last 7 days, the map's default). Set 0 only when they want any age / no date limit. Never put today/new/this week into query. Filters are the same as the map's filter chips, and nothing else: posted_within_days (Past 24 hours / 3 / 7 / 14 / 30 days), seniority_level (Experience: intern, entry/new grad, senior, manager, director/executive), employment_type (Type: full-time, part-time, contract), and visa_sponsorship (Visa). Prefer no filters: use one only when the user explicitly asks for it, because each filter shrinks the results a lot. There is no salary, remote/hybrid, or benefits filter. If the user asks to filter by salary, search without it and say they can see salaries on the map (listed pay shows on each job).
| Argument | Type | Description |
|---|---|---|
| limit | number | Number of results to return. Default 10, max 50. |
| query | string | Job title or role phrase (merged with keywords). Sent as API title= — matches job TITLE text only, separate from company. Preserve negative title terms with a leading dash, e.g. 'product manager, software engineer, -senior'. If they want any role / all jobs, omit. Never merge many titles into one string unless the user supplied comma-separated roles. Expand shorthand (swe, pm, sre) when applicable. |
| cursor | string | Pagination cursor from a previous search_jobs response to fetch the next page. |
| company | string | Employer slug(s): bare slug or comma-separated OR include (e.g. meta,google,apple). Prefix with '-' to exclude (e.g. -lucid-motors,-tesla). Mix allowed (meta,google,-amazon). Lowercase hyphenated. Mid-slug hyphens are part of the slug; only a leading '-' excludes. If include-only returns 0, retry without include slugs. |
| country | string | ISO 3166-1 alpha-2 country filter (e.g. US, GB, DE). Returns jobs in that country or workplace_type remote. |
| keywords | string | Only if the user named skills or stacks in this turn. Omit by default — do not pull from resume or profile. |
| location | string | Display name of the place (e.g. 'San Francisco, CA'). When near_lat/near_lng are set this is only a label and is NOT used as a text filter. Otherwise a text filter on job location strings (partial match). For metro-area or 'near me' intent, prefer near_lat + near_lng + radius_km (50–65 km typical) so results are not tied to one city spelling. Use location only when you cannot geocode, or as a fallback. Avoid long 'City, Country' strings; use country for country filters. For multiple metros, prefer location_or. |
Jobs — Change what an application in progress fills in, without stopping it. Use when the user says something about an application Worklittle is filling right now ("say my notice period is one month", "my friend Ana Ruiz referred me", "I need visa sponsorship for the US", "make that answer shorter"). Pass their wish as plain instructions with their exact facts; never add facts. Works while the application is running, ready to submit, or waiting for answers. Needs the session_id from apply_for_job or list_active_applications. For facts that should apply to every future application too, also call save_about_me.
| Argument | Type | Description |
|---|---|---|
| session_id* | string | |
| instructions* | string | What to change, in plain words. |
{
"type": "object",
"required": [
"session_id",
"instructions"
],
"properties": {
"session_id": {
"type": "string",
"x-mcp-header": "Session-Id"
},
"instructions": {
"type": "string",
"description": "What to change, in plain words."
}
}
}Jobs — Stop an application that Worklittle is filling out for the user. This cancels the application in progress and it cannot be resumed; the user would have to start it again. Needs the session_id from apply_for_job or list_active_applications.
| Argument | Type | Description |
|---|---|---|
| session_id* | string |
{
"type": "object",
"required": [
"session_id"
],
"properties": {
"session_id": {
"type": "string",
"x-mcp-header": "Session-Id"
}
}
}Jobs — Send an application that stopped for review (apply_for_job with auto_submit false, status awaiting_submit). Call it only after the user has seen the answers from check_application_status and said to send it.
| Argument | Type | Description |
|---|---|---|
| session_id* | string |
{
"type": "object",
"required": [
"session_id"
],
"properties": {
"session_id": {
"type": "string",
"x-mcp-header": "Session-Id"
}
}
}Jobs — Add a job to the user's Applied or Saved list, or change its status, so they can find it later.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | Worklittle job id from search_jobs or get_job_details. |
| method | string | How the user applied. Defaults to apply. |
| status | string | Pipeline stage when known. Use saved for heart/save, skipped for Job Cards / deck Skip. Defaults to in_progress for apply / apply_with_ai, applied for api. |
| apply_url | string | Optional employer apply URL. |
| job_title* | string | |
| company_name* | string |
{
"type": "object",
"required": [
"job_id",
"job_title",
"company_name"
],
"properties": {
"job_id": {
"type": "string",
"description": "Worklittle job id from search_jobs or get_job_details."
},
"method": {
"enum": [
"apply",
"apply_with_ai",
"api"
],
"type": "string",
"description": "How the user applied. Defaults to apply."
},
"status": {
"enum": [
"saved",
"in_progress",
"applied",
"interview",
"offer",
"rejected",
"withdrawn",
"skipped"
],
"type": "string",
"description": "Pipeline stage when known. Use saved for heart/save, skipped for Job Cards / deck Skip. Defaults to in_progress for apply / apply_with_ai, applied for api."
},
"apply_url": {
"type": "string",
"description": "Optional employer apply URL."
},
"job_title": {
"type": "string"
},
"company_name": {
"type": "string"
}
}
}Jobs — Update the user's Worklittle profile, such as name, location, phone, links or the kind of job they want. Only send the fields to change.
| Argument | Type | Description |
|---|---|---|
| phone | string | |
| x_url | string | |
| you_name | string | |
| you_work | string | |
| github_url | string | |
| tiktok_url | string | |
| you_school | string | |
| youtube_url | string | |
| facebook_url | string | |
| linkedin_url | string | |
| instagram_url | string | |
| school_degree | string | |
| you_interests | string | |
| phone_national | string | |
| drivers_license | string | valid | none | empty to clear |
| huggingface_url | string | |
| phone_country_iso | string | |
| personal_website_url | string | |
| profile_clear_fields | array | Field names to clear when empty |
| work_authorization_countries | array | ISO2 country codes |
{
"type": "object",
"properties": {
"phone": {
"type": "string"
},
"x_url": {
"type": "string"
},
"you_name": {
"type": "string"
},
"you_work": {
"type": "string"
},
"github_url": {
"type": "string"
},
"tiktok_url": {
"type": "string"
},
"you_school": {
"type": "string"
},
"youtube_url": {
"type": "string"
},
"facebook_url": {
"type": "string"
},
"linkedin_url": {
"type": "string"
},
"instagram_url": {
"type": "string"
},
"school_degree": {
"type": "string"
},
"you_interests": {
"type": "string"
},
"phone_national": {
"type": "string"
},
"drivers_license": {
"type": "string",
"description": "valid | none | empty to clear"
},
"huggingface_url": {
"type": "string"
},
"phone_country_iso": {
"type": "string"
},
"personal_website_url": {
"type": "string"
},
"profile_clear_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Field names to clear when empty"
},
"work_authorization_countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "ISO2 country codes"
}
}
}Jobs — Save the resume the user attached in the chat (PDF, Word, text or image) to their Worklittle profile so it can be used to apply. Pass the attached file as resume_file.
| Argument | Type | Description |
|---|---|---|
| mime | string | MIME type, e.g. application/pdf |
| filename | string | Original file name, e.g. resume.pdf (widget upload). |
| resume_file | object | The resume file the user attached in the chat. |
| content_base64 | string | Base64-encoded file bytes (data: URLs accepted; strip prefix ok). |
{
"type": "object",
"properties": {
"mime": {
"type": "string",
"description": "MIME type, e.g. application/pdf"
},
"filename": {
"type": "string",
"description": "Original file name, e.g. resume.pdf (widget upload)."
},
"resume_file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "The resume file the user attached in the chat."
},
"content_base64": {
"type": "string",
"description": "Base64-encoded file bytes (data: URLs accepted; strip prefix ok)."
}
}
}| near_lat | number | Latitude for distance search. Use with near_lng. Typical source: browser geolocation or geocoded city. |
| near_lng | number | Longitude for distance search. Required with near_lat. |
| radius_km | number | Radius in kilometers around near_lat/near_lng. Default 50, max 500. |
| exclude_ids | string | Comma-separated job IDs to exclude (e.g. postings already shown in the conversation). |
| location_or | string | Comma-separated place substrings when the user names two or more metros at once (e.g. San Francisco,New York). The API returns jobs whose location text matches ANY term. Mutually exclusive with distance search (near_lat/near_lng). |
| exclude_remote | boolean | When using near_lat/near_lng: false includes remote-only jobs; true (default) excludes them so results are geographically local. |
| employment_type | string | Type of employment contract. |
| seniority_level | string | Omit unless the user explicitly asked for a band. Never infer from profile. Enum when set: |
| visa_sponsorship | string | Filter by explicit visa sponsorship text in the posting (AI-extracted). Use 'yes' for jobs that sponsor visas (H-1B, etc.). Use 'no' only when the user wants roles that explicitly state no sponsorship. Omit when not relevant. |
| posted_within_days | number | Days of posted-date lookback. Omit → default 7 (map default). 0 → no cutoff (any age). 1 → today/last 24h. 7 → this week. Any positive integer allowed (e.g. 90, 365). Never encode recency words in query. |
| description_language | string | ISO 639-1 code for the language of the job posting body. Examples: en, es, de, fr, pt. |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Number of results to return. Default 10, max 50."
},
"query": {
"type": "string",
"description": "Job title or role phrase (merged with keywords). Sent as API title= — matches job TITLE text only, separate from company. Preserve negative title terms with a leading dash, e.g. 'product manager, software engineer, -senior'. If they want any role / all jobs, omit. Never merge many titles into one string unless the user supplied comma-separated roles. Expand shorthand (swe, pm, sre) when applicable.",
"x-mcp-header": "Query"
},
"cursor": {
"type": "string",
"description": "Pagination cursor from a previous search_jobs response to fetch the next page."
},
"company": {
"type": "string",
"description": "Employer slug(s): bare slug or comma-separated OR include (e.g. meta,google,apple). Prefix with '-' to exclude (e.g. -lucid-motors,-tesla). Mix allowed (meta,google,-amazon). Lowercase hyphenated. Mid-slug hyphens are part of the slug; only a leading '-' excludes. If include-only returns 0, retry without include slugs.",
"x-mcp-header": "Company"
},
"country": {
"type": "string",
"description": "ISO 3166-1 alpha-2 country filter (e.g. US, GB, DE). Returns jobs in that country or workplace_type remote."
},
"keywords": {
"type": "string",
"description": "Only if the user named skills or stacks in this turn. Omit by default — do not pull from resume or profile."
},
"location": {
"type": "string",
"description": "Display name of the place (e.g. 'San Francisco, CA'). When near_lat/near_lng are set this is only a label and is NOT used as a text filter. Otherwise a text filter on job location strings (partial match). For metro-area or 'near me' intent, prefer near_lat + near_lng + radius_km (50–65 km typical) so results are not tied to one city spelling. Use location only when you cannot geocode, or as a fallback. Avoid long 'City, Country' strings; use country for country filters. For multiple metros, prefer location_or."
},
"near_lat": {
"type": "number",
"description": "Latitude for distance search. Use with near_lng. Typical source: browser geolocation or geocoded city."
},
"near_lng": {
"type": "number",
"description": "Longitude for distance search. Required with near_lat."
},
"radius_km": {
"type": "number",
"maximum": 500,
"minimum": 1,
"description": "Radius in kilometers around near_lat/near_lng. Default 50, max 500."
},
"exclude_ids": {
"type": "string",
"description": "Comma-separated job IDs to exclude (e.g. postings already shown in the conversation)."
},
"location_or": {
"type": "string",
"description": "Comma-separated place substrings when the user names two or more metros at once (e.g. San Francisco,New York). The API returns jobs whose location text matches ANY term. Mutually exclusive with distance search (near_lat/near_lng)."
},
"exclude_remote": {
"type": "boolean",
"description": "When using near_lat/near_lng: false includes remote-only jobs; true (default) excludes them so results are geographically local."
},
"employment_type": {
"enum": [
"full_time",
"part_time",
"contract",
"internship",
"temporary"
],
"type": "string",
"description": "Type of employment contract."
},
"seniority_level": {
"enum": [
"new_grad",
"entry",
"mid",
"senior",
"staff",
"manager",
"director",
"executive"
],
"type": "string",
"description": "Omit unless the user explicitly asked for a band. Never infer from profile. Enum when set:"
},
"visa_sponsorship": {
"enum": [
"yes",
"no"
],
"type": "string",
"description": "Filter by explicit visa sponsorship text in the posting (AI-extracted). Use 'yes' for jobs that sponsor visas (H-1B, etc.). Use 'no' only when the user wants roles that explicitly state no sponsorship. Omit when not relevant."
},
"posted_within_days": {
"type": "number",
"minimum": 0,
"description": "Days of posted-date lookback. Omit → default 7 (map default). 0 → no cutoff (any age). 1 → today/last 24h. 7 → this week. Any positive integer allowed (e.g. 90, 365). Never encode recency words in query."
},
"description_language": {
"type": "string",
"description": "ISO 639-1 code for the language of the job posting body. Examples: en, es, de, fr, pt."
}
}
}